From 1be04037cdba95396eef7728134043ba3ee6fbf4 Mon Sep 17 00:00:00 2001 From: Jef <jef@targetspot.com> Date: Tue, 24 Sep 2024 19:20:53 +0200 Subject: [PATCH] remove it --- Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp | 225 - Src/Plugins/DSP/sc_serv3/ADTSHeader.h | 62 - Src/Plugins/DSP/sc_serv3/FLV.cpp | 322 - Src/Plugins/DSP/sc_serv3/FLV.h | 23 - Src/Plugins/DSP/sc_serv3/GNUmakefile | 237 - Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS | 1 - Src/Plugins/DSP/sc_serv3/GeoIP/COPYING | 509 - Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog | 628 - Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in | 80 - .../DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch | 183 - Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL | 365 - Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am | 11 - Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in | 707 - .../DSP/sc_serv3/GeoIP/Makefile.netware | 301 - Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc | 84 - Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 | 232 - Src/Plugins/DSP/sc_serv3/GeoIP/NEWS | 0 Src/Plugins/DSP/sc_serv3/GeoIP/README | 208 - Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW | 13 - Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX | 35 - .../DSP/sc_serv3/GeoIP/READMEwin32.txt | 44 - .../DSP/sc_serv3/GeoIP/READMEwin32static.txt | 17 - Src/Plugins/DSP/sc_serv3/GeoIP/TODO | 54 - Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 | 8917 -------- .../DSP/sc_serv3/GeoIP/apps/Makefile.am | 26 - .../DSP/sc_serv3/GeoIP/apps/Makefile.in | 544 - .../DSP/sc_serv3/GeoIP/apps/Makefile.vc | 25 - .../DSP/sc_serv3/GeoIP/apps/geoiplookup.c | 401 - .../DSP/sc_serv3/GeoIP/apps/geoiplookup6.c | 255 - .../GeoIP/apps/geoipupdate-pureperl.pl | 260 - .../DSP/sc_serv3/GeoIP/apps/geoipupdate.c | 283 - Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap | 8 - .../sc_serv3/GeoIP/conf/GeoIP.conf.default | 19 - .../DSP/sc_serv3/GeoIP/conf/Makefile.am | 16 - .../DSP/sc_serv3/GeoIP/conf/Makefile.in | 414 - Src/Plugins/DSP/sc_serv3/GeoIP/config.guess | 1533 -- Src/Plugins/DSP/sc_serv3/GeoIP/config.sub | 1693 -- Src/Plugins/DSP/sc_serv3/GeoIP/configure | 13633 ----------- Src/Plugins/DSP/sc_serv3/GeoIP/configure.in | 50 - Src/Plugins/DSP/sc_serv3/GeoIP/data/GeoIP.dat | Bin 1348660 -> 0 bytes .../DSP/sc_serv3/GeoIP/data/Makefile.am | 19 - .../DSP/sc_serv3/GeoIP/data/Makefile.in | 437 - Src/Plugins/DSP/sc_serv3/GeoIP/depcomp | 630 - Src/Plugins/DSP/sc_serv3/GeoIP/geoip.ico | Bin 3062 -> 0 bytes Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk | 14 - Src/Plugins/DSP/sc_serv3/GeoIP/install-sh | 520 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c | 1965 -- .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h | 315 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c | 393 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h | 78 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c | 975 - .../DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h | 69 - .../sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h | 18 - .../DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am | 27 - .../DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in | 567 - .../DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc | 34 - .../DSP/sc_serv3/GeoIP/libGeoIP/global.h | 32 - Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c | 326 - Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h | 40 - .../DSP/sc_serv3/GeoIP/libGeoIP/regionName.c | 12780 ----------- .../DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c | 2077 -- .../DSP/sc_serv3/GeoIP/libGeoIP/types.h | 140 - Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh | 8413 ------- .../DSP/sc_serv3/GeoIP/man/Makefile.am | 29 - .../DSP/sc_serv3/GeoIP/man/Makefile.in | 455 - .../DSP/sc_serv3/GeoIP/man/geoiplookup.1.in | 37 - .../DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in | 42 - .../DSP/sc_serv3/GeoIP/man/geoipupdate.1.in | 68 - Src/Plugins/DSP/sc_serv3/GeoIP/missing | 376 - .../DSP/sc_serv3/GeoIP/test/Makefile.am | 37 - .../DSP/sc_serv3/GeoIP/test/Makefile.in | 657 - .../DSP/sc_serv3/GeoIP/test/Makefile.vc | 29 - .../DSP/sc_serv3/GeoIP/test/benchmark.c | 135 - .../DSP/sc_serv3/GeoIP/test/city_test.txt | 2 - .../DSP/sc_serv3/GeoIP/test/country_test.txt | 69 - .../DSP/sc_serv3/GeoIP/test/country_test2.txt | 29 - .../sc_serv3/GeoIP/test/country_test_name.txt | 1 - .../DSP/sc_serv3/GeoIP/test/region_test.txt | 24 - .../sc_serv3/GeoIP/test/test-geoip-asnum.c | 63 - .../DSP/sc_serv3/GeoIP/test/test-geoip-city.c | 83 - .../DSP/sc_serv3/GeoIP/test/test-geoip-isp.c | 65 - .../sc_serv3/GeoIP/test/test-geoip-netspeed.c | 59 - .../DSP/sc_serv3/GeoIP/test/test-geoip-org.c | 71 - .../sc_serv3/GeoIP/test/test-geoip-region.c | 114 - .../DSP/sc_serv3/GeoIP/test/test-geoip.c | 113 - Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp | 827 - Src/Plugins/DSP/sc_serv3/ID3miniParsers.h | 184 - Src/Plugins/DSP/sc_serv3/MP3Header.cpp | 216 - Src/Plugins/DSP/sc_serv3/MP3Header.h | 34 - Src/Plugins/DSP/sc_serv3/MSG00001.bin | Bin 32 -> 0 bytes Src/Plugins/DSP/sc_serv3/adminList.cpp | 303 - Src/Plugins/DSP/sc_serv3/adminList.h | 41 - Src/Plugins/DSP/sc_serv3/agentList.cpp | 294 - Src/Plugins/DSP/sc_serv3/agentList.h | 44 - Src/Plugins/DSP/sc_serv3/amf.cpp | 759 - Src/Plugins/DSP/sc_serv3/amf.h | 156 - Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile | 2 - .../DSP/sc_serv3/aolxml/_expat/CMake.README | 42 - .../DSP/sc_serv3/aolxml/_expat/CMakeLists.txt | 111 - .../DSP/sc_serv3/aolxml/_expat/COPYING | 22 - .../DSP/sc_serv3/aolxml/_expat/Changes | 205 - .../aolxml/_expat/ConfigureChecks.cmake | 44 - .../DSP/sc_serv3/aolxml/_expat/MANIFEST | 141 - .../DSP/sc_serv3/aolxml/_expat/Makefile.in | 201 - Src/Plugins/DSP/sc_serv3/aolxml/_expat/README | 139 - .../DSP/sc_serv3/aolxml/_expat/aclocal.m4 | 8460 ------- .../DSP/sc_serv3/aolxml/_expat/configure | 18632 ---------------- .../DSP/sc_serv3/aolxml/_expat/configure.in | 155 - .../aolxml/_expat/conftools/PrintPath | 116 - .../_expat/conftools/ac_c_bigendian_cross.m4 | 81 - .../aolxml/_expat/conftools/config.guess | 1517 -- .../aolxml/_expat/conftools/config.sub | 1760 -- .../sc_serv3/aolxml/_expat/conftools/expat.m4 | 43 - .../aolxml/_expat/conftools/get-version.sh | 46 - .../aolxml/_expat/conftools/install-sh | 520 - .../aolxml/_expat/conftools/ltmain.sh | 9642 -------- .../aolxml/_expat/conftools/mkinstalldirs | 40 - .../DSP/sc_serv3/aolxml/_expat/doc/expat.png | Bin 1027 -> 0 bytes .../sc_serv3/aolxml/_expat/doc/reference.html | 2390 -- .../DSP/sc_serv3/aolxml/_expat/doc/style.css | 101 - .../aolxml/_expat/doc/valid-xhtml10.png | Bin 2368 -> 0 bytes .../DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 | 251 - .../DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml | 468 - .../DSP/sc_serv3/aolxml/_expat/expat.dsw | 110 - .../DSP/sc_serv3/aolxml/_expat/expat.pc.in | 11 - .../aolxml/_expat/expat_config.h.cmake | 91 - .../sc_serv3/aolxml/_expat/expat_config.h.in | 102 - .../sc_serv3/aolxml/_expat/lib/Makefile.MPW | 206 - .../sc_serv3/aolxml/_expat/lib/amigaconfig.h | 32 - .../DSP/sc_serv3/aolxml/_expat/lib/ascii.h | 92 - .../DSP/sc_serv3/aolxml/_expat/lib/asciitab.h | 36 - .../DSP/sc_serv3/aolxml/_expat/lib/expat.dsp | 185 - .../DSP/sc_serv3/aolxml/_expat/lib/expat.h | 1047 - .../aolxml/_expat/lib/expat_external.h | 115 - .../aolxml/_expat/lib/expat_static.dsp | 162 - .../aolxml/_expat/lib/expat_static.sln | 26 - .../aolxml/_expat/lib/expat_static.vcproj | 549 - .../DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp | 185 - .../aolxml/_expat/lib/expatw_static.dsp | 162 - .../sc_serv3/aolxml/_expat/lib/iasciitab.h | 37 - .../DSP/sc_serv3/aolxml/_expat/lib/internal.h | 73 - .../sc_serv3/aolxml/_expat/lib/latin1tab.h | 36 - .../sc_serv3/aolxml/_expat/lib/libexpat.def | 73 - .../sc_serv3/aolxml/_expat/lib/libexpatw.def | 73 - .../sc_serv3/aolxml/_expat/lib/macconfig.h | 53 - .../DSP/sc_serv3/aolxml/_expat/lib/nametab.h | 150 - .../DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h | 37 - .../sc_serv3/aolxml/_expat/lib/winconfig.h | 30 - .../DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c | 6403 ------ .../DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c | 1336 -- .../DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h | 114 - .../DSP/sc_serv3/aolxml/_expat/lib/xmltok.c | 1651 -- .../DSP/sc_serv3/aolxml/_expat/lib/xmltok.h | 316 - .../sc_serv3/aolxml/_expat/lib/xmltok_impl.c | 1783 -- .../sc_serv3/aolxml/_expat/lib/xmltok_impl.h | 46 - .../sc_serv3/aolxml/_expat/lib/xmltok_ns.c | 115 - .../sc_serv3/aolxml/_expat/xmlwf/codepage.c | 68 - .../sc_serv3/aolxml/_expat/xmlwf/codepage.h | 6 - .../DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c | 147 - .../sc_serv3/aolxml/_expat/xmlwf/filemap.h | 17 - .../aolxml/_expat/xmlwf/readfilemap.c | 100 - .../aolxml/_expat/xmlwf/unixfilemap.c | 65 - .../aolxml/_expat/xmlwf/win32filemap.c | 96 - .../sc_serv3/aolxml/_expat/xmlwf/xmlfile.c | 244 - .../sc_serv3/aolxml/_expat/xmlwf/xmlfile.h | 20 - .../sc_serv3/aolxml/_expat/xmlwf/xmlmime.c | 163 - .../sc_serv3/aolxml/_expat/xmlwf/xmlmime.h | 19 - .../sc_serv3/aolxml/_expat/xmlwf/xmltchar.h | 36 - .../DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h | 13 - .../DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c | 861 - .../sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp | 139 - .../aolxml/_expat/xmlwf/xmlwin32url.cxx | 395 - Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp | 428 - Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h | 372 - .../DSP/sc_serv3/aolxml/aolxmlutils.cpp | 61 - .../DSP/sc_serv3/aolxml/unix_build_expat | 5 - Src/Plugins/DSP/sc_serv3/auth.cpp | 434 - Src/Plugins/DSP/sc_serv3/auth.h | 69 - Src/Plugins/DSP/sc_serv3/banList.cpp | 431 - Src/Plugins/DSP/sc_serv3/banList.h | 51 - Src/Plugins/DSP/sc_serv3/bandwidth.cpp | 117 - Src/Plugins/DSP/sc_serv3/bandwidth.h | 54 - Src/Plugins/DSP/sc_serv3/base64.cpp | 70 - Src/Plugins/DSP/sc_serv3/base64.h | 54 - Src/Plugins/DSP/sc_serv3/cache.cpp | 104 - Src/Plugins/DSP/sc_serv3/cache.h | 52 - Src/Plugins/DSP/sc_serv3/config.cpp | 2867 --- Src/Plugins/DSP/sc_serv3/config.h | 710 - Src/Plugins/DSP/sc_serv3/cpucount.cpp | 70 - Src/Plugins/DSP/sc_serv3/cpucount.h | 8 - .../DSP/sc_serv3/deps/win32/include/sched.h | 286 - Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp | 681 - Src/Plugins/DSP/sc_serv3/filenameMetadata.h | 25 - Src/Plugins/DSP/sc_serv3/global.cpp | 1177 - Src/Plugins/DSP/sc_serv3/global.h | 218 - Src/Plugins/DSP/sc_serv3/icy.ico | Bin 40585 -> 0 bytes Src/Plugins/DSP/sc_serv3/libcurl_building.txt | 43 - .../sc_serv3/libs/Aol_XML/ARMv6/libexpat.a | Bin 476516 -> 0 bytes .../sc_serv3/libs/Aol_XML/ARMv7/libexpat.a | Bin 512028 -> 0 bytes .../DSP/sc_serv3/libs/Aol_XML/BSD/libexpat.a | Bin 396228 -> 0 bytes .../sc_serv3/libs/Aol_XML/Darwin/libexpat.a | Bin 513008 -> 0 bytes .../libs/Aol_XML/Linux_i686/libexpat.a | Bin 512592 -> 0 bytes .../libs/Aol_XML/Linux_x86_64/libexpat.a | Bin 861176 -> 0 bytes Src/Plugins/DSP/sc_serv3/main.cpp | 1213 - Src/Plugins/DSP/sc_serv3/manifest.xml | 19 - Src/Plugins/DSP/sc_serv3/manifest64.xml | 19 - Src/Plugins/DSP/sc_serv3/messagefile.h | 45 - Src/Plugins/DSP/sc_serv3/messagefile.mc | 6 - Src/Plugins/DSP/sc_serv3/metadata.cpp | 459 - Src/Plugins/DSP/sc_serv3/metadata.h | 151 - Src/Plugins/DSP/sc_serv3/metrics.cpp | 1249 -- Src/Plugins/DSP/sc_serv3/metrics.h | 101 - .../DSP/sc_serv3/nmrCommon/file/fileUtils.cpp | 232 - .../DSP/sc_serv3/nmrCommon/file/fileUtils.h | 117 - Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h | 117 - Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h | 61 - .../DSP/sc_serv3/nmrCommon/memory/refPtr.h | 181 - .../nmrCommon/services/baseOptions.cpp | 76 - .../sc_serv3/nmrCommon/services/baseOptions.h | 32 - .../sc_serv3/nmrCommon/services/logger.cpp | 966 - .../DSP/sc_serv3/nmrCommon/services/logger.h | 461 - .../nmrCommon/services/messagefile.mc | 7 - .../nmrCommon/services/serviceMain.cpp | 876 - .../sc_serv3/nmrCommon/services/serviceMain.h | 72 - .../nmrCommon/services/stdServiceImpl.cpp | 164 - .../nmrCommon/services/stdServiceImpl.h | 322 - .../nmrCommon/services/test/GNUmakefile | 78 - .../sc_serv3/nmrCommon/services/test/main.cpp | 169 - .../nmrCommon/services/test/messagefile.mc | 7 - .../nmrCommon/services/test/resource.h | 14 - .../sc_serv3/nmrCommon/services/test/test.rc | 101 - .../sc_serv3/nmrCommon/services/test/test.sln | 21 - .../nmrCommon/services/test/test.vcproj | 202 - .../nmrCommon/stacktrace/StackTrace.cpp | 868 - .../nmrCommon/stacktrace/StackTrace.h | 135 - .../DSP/sc_serv3/nmrCommon/stl/functors.h | 24 - Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h | 324 - .../DSP/sc_serv3/nmrCommon/stl/stringUtils.h | 383 - .../DSP/sc_serv3/nmrCommon/threading/MT_stl.h | 110 - .../nmrCommon/threading/messageThread.h | 184 - .../sc_serv3/nmrCommon/threading/thread.cpp | 375 - .../DSP/sc_serv3/nmrCommon/threading/thread.h | 575 - .../sc_serv3/nmrCommon/unicode/uniFile.cpp | 88 - .../DSP/sc_serv3/nmrCommon/unicode/uniFile.h | 29 - .../sc_serv3/nmrCommon/unicode/uniString.cpp | 786 - .../sc_serv3/nmrCommon/unicode/uniString.h | 354 - .../DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp | 37 - .../DSP/sc_serv3/nmrCommon/win32/rezFuncs.h | 9 - .../sc_serv3/protocol_FlashPolicyServer.cpp | 44 - .../DSP/sc_serv3/protocol_FlashPolicyServer.h | 33 - .../DSP/sc_serv3/protocol_HTTPClient.cpp | 305 - .../DSP/sc_serv3/protocol_HTTPClient.h | 38 - .../DSP/sc_serv3/protocol_HTTPSource.cpp | 462 - .../DSP/sc_serv3/protocol_HTTPSource.h | 55 - .../DSP/sc_serv3/protocol_HTTPStyle.cpp | 4808 ---- Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h | 152 - .../DSP/sc_serv3/protocol_RTMPClient.cpp | 1681 -- .../DSP/sc_serv3/protocol_RTMPClient.h | 170 - .../DSP/sc_serv3/protocol_admincgi.cpp | 6390 ------ Src/Plugins/DSP/sc_serv3/protocol_admincgi.h | 115 - Src/Plugins/DSP/sc_serv3/protocol_backup.cpp | 538 - Src/Plugins/DSP/sc_serv3/protocol_backup.h | 73 - .../DSP/sc_serv3/protocol_flvClient.cpp | 275 - Src/Plugins/DSP/sc_serv3/protocol_flvClient.h | 46 - .../DSP/sc_serv3/protocol_m4aClient.cpp | 674 - Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h | 42 - Src/Plugins/DSP/sc_serv3/protocol_relay.cpp | 544 - Src/Plugins/DSP/sc_serv3/protocol_relay.h | 73 - .../DSP/sc_serv3/protocol_relay_shoutcast.cpp | 455 - .../DSP/sc_serv3/protocol_relay_shoutcast.h | 57 - .../DSP/sc_serv3/protocol_relay_uvox.cpp | 693 - .../DSP/sc_serv3/protocol_relay_uvox.h | 108 - .../sc_serv3/protocol_shoutcast1Client.cpp | 417 - .../DSP/sc_serv3/protocol_shoutcast1Client.h | 42 - .../sc_serv3/protocol_shoutcast2Client.cpp | 568 - .../DSP/sc_serv3/protocol_shoutcast2Client.h | 53 - .../DSP/sc_serv3/protocol_shoutcastClient.cpp | 1917 -- .../DSP/sc_serv3/protocol_shoutcastClient.h | 209 - .../DSP/sc_serv3/protocol_shoutcastSource.cpp | 439 - .../DSP/sc_serv3/protocol_shoutcastSource.h | 58 - .../DSP/sc_serv3/protocol_uvox2Source.cpp | 1010 - .../DSP/sc_serv3/protocol_uvox2Source.h | 129 - Src/Plugins/DSP/sc_serv3/readme.txt | 89 - Src/Plugins/DSP/sc_serv3/resource.h | 16 - Src/Plugins/DSP/sc_serv3/ripList.cpp | 391 - Src/Plugins/DSP/sc_serv3/ripList.h | 46 - Src/Plugins/DSP/sc_serv3/sc_serv.rc | 112 - Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj | 393 - .../DSP/sc_serv3/sc_serv.vcxproj.filters | 478 - Src/Plugins/DSP/sc_serv3/stats.cpp | 862 - Src/Plugins/DSP/sc_serv3/stats.h | 173 - Src/Plugins/DSP/sc_serv3/streamData.cpp | 5666 ----- Src/Plugins/DSP/sc_serv3/streamData.h | 906 - Src/Plugins/DSP/sc_serv3/threadedRunner.cpp | 1135 - Src/Plugins/DSP/sc_serv3/threadedRunner.h | 428 - Src/Plugins/DSP/sc_serv3/updater.cpp | 354 - Src/Plugins/DSP/sc_serv3/updater.h | 58 - Src/Plugins/DSP/sc_serv3/uvox2Common.cpp | 201 - Src/Plugins/DSP/sc_serv3/uvox2Common.h | 116 - Src/Plugins/DSP/sc_serv3/versions.h | 52 - Src/Plugins/DSP/sc_serv3/w3cLog.cpp | 319 - Src/Plugins/DSP/sc_serv3/w3cLog.h | 20 - Src/Plugins/DSP/sc_serv3/webClient.cpp | 619 - Src/Plugins/DSP/sc_serv3/webClient.h | 153 - Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp | 716 - Src/Plugins/DSP/sc_serv3/webNet/socketOps.h | 182 - Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp | 240 - Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h | 196 - Src/Plugins/DSP/sc_serv3/yp2.cpp | 1233 - Src/Plugins/DSP/sc_serv3/yp2.h | 270 - 310 files changed, 188961 deletions(-) delete mode 100644 Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/ADTSHeader.h delete mode 100644 Src/Plugins/DSP/sc_serv3/FLV.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/FLV.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GNUmakefile delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/COPYING delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.netware delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/NEWS delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/README delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32static.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/TODO delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.vc delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup6.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate-pureperl.pl delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/conf/GeoIP.conf.default delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/config.guess delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/config.sub delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/configure delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/configure.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/data/GeoIP.dat delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/depcomp delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/geoip.ico delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/install-sh delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/global.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/regionName.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/types.h delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup.1.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/man/geoipupdate.1.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/missing delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.am delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.vc delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/benchmark.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/city_test.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test2.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test_name.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/region_test.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-asnum.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-city.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-isp.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-netspeed.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-org.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-region.c delete mode 100644 Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip.c delete mode 100644 Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/ID3miniParsers.h delete mode 100644 Src/Plugins/DSP/sc_serv3/MP3Header.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/MP3Header.h delete mode 100644 Src/Plugins/DSP/sc_serv3/MSG00001.bin delete mode 100644 Src/Plugins/DSP/sc_serv3/adminList.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/adminList.h delete mode 100644 Src/Plugins/DSP/sc_serv3/agentList.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/agentList.h delete mode 100644 Src/Plugins/DSP/sc_serv3/amf.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/amf.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMake.README delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMakeLists.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/COPYING delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/Changes delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/ConfigureChecks.cmake delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/MANIFEST delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/Makefile.in delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/README delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/aclocal.m4 delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure.in delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/PrintPath delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ac_c_bigendian_cross.m4 delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.guess delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.sub delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/expat.m4 delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/get-version.sh delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/install-sh delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ltmain.sh delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/mkinstalldirs delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/expat.png delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/reference.html delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/style.css delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/valid-xhtml10.png delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.dsw delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.pc.in delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.cmake delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.in delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/Makefile.MPW delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/amigaconfig.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/ascii.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/asciitab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_external.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.sln delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.vcproj delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw_static.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/iasciitab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/internal.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/latin1tab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpat.def delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpatw.def delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/macconfig.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/nametab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/winconfig.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_ns.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/filemap.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/readfilemap.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/unixfilemap.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/win32filemap.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmltchar.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwin32url.cxx delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/aolxmlutils.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/aolxml/unix_build_expat delete mode 100644 Src/Plugins/DSP/sc_serv3/auth.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/auth.h delete mode 100644 Src/Plugins/DSP/sc_serv3/banList.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/banList.h delete mode 100644 Src/Plugins/DSP/sc_serv3/bandwidth.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/bandwidth.h delete mode 100644 Src/Plugins/DSP/sc_serv3/base64.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/base64.h delete mode 100644 Src/Plugins/DSP/sc_serv3/cache.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/cache.h delete mode 100644 Src/Plugins/DSP/sc_serv3/config.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/config.h delete mode 100644 Src/Plugins/DSP/sc_serv3/cpucount.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/cpucount.h delete mode 100644 Src/Plugins/DSP/sc_serv3/deps/win32/include/sched.h delete mode 100644 Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/filenameMetadata.h delete mode 100644 Src/Plugins/DSP/sc_serv3/global.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/global.h delete mode 100644 Src/Plugins/DSP/sc_serv3/icy.ico delete mode 100644 Src/Plugins/DSP/sc_serv3/libcurl_building.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv6/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv7/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/BSD/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Darwin/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Linux_i686/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Linux_x86_64/libexpat.a delete mode 100644 Src/Plugins/DSP/sc_serv3/main.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/manifest.xml delete mode 100644 Src/Plugins/DSP/sc_serv3/manifest64.xml delete mode 100644 Src/Plugins/DSP/sc_serv3/messagefile.h delete mode 100644 Src/Plugins/DSP/sc_serv3/messagefile.mc delete mode 100644 Src/Plugins/DSP/sc_serv3/metadata.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/metadata.h delete mode 100644 Src/Plugins/DSP/sc_serv3/metrics.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/metrics.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/memory/refPtr.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/messagefile.mc delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/GNUmakefile delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/main.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/messagefile.mc delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/resource.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.rc delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.sln delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.vcproj delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stl/functors.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stringUtils.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/threading/MT_stl.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/threading/messageThread.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.h delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_admincgi.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_admincgi.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_backup.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_backup.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_flvClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_flvClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_m4aClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.h delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.h delete mode 100644 Src/Plugins/DSP/sc_serv3/readme.txt delete mode 100644 Src/Plugins/DSP/sc_serv3/resource.h delete mode 100644 Src/Plugins/DSP/sc_serv3/ripList.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/ripList.h delete mode 100644 Src/Plugins/DSP/sc_serv3/sc_serv.rc delete mode 100644 Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj delete mode 100644 Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj.filters delete mode 100644 Src/Plugins/DSP/sc_serv3/stats.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/stats.h delete mode 100644 Src/Plugins/DSP/sc_serv3/streamData.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/streamData.h delete mode 100644 Src/Plugins/DSP/sc_serv3/threadedRunner.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/threadedRunner.h delete mode 100644 Src/Plugins/DSP/sc_serv3/updater.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/updater.h delete mode 100644 Src/Plugins/DSP/sc_serv3/uvox2Common.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/uvox2Common.h delete mode 100644 Src/Plugins/DSP/sc_serv3/versions.h delete mode 100644 Src/Plugins/DSP/sc_serv3/w3cLog.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/w3cLog.h delete mode 100644 Src/Plugins/DSP/sc_serv3/webClient.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/webClient.h delete mode 100644 Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/webNet/socketOps.h delete mode 100644 Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h delete mode 100644 Src/Plugins/DSP/sc_serv3/yp2.cpp delete mode 100644 Src/Plugins/DSP/sc_serv3/yp2.h diff --git a/Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp b/Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp deleted file mode 100644 index 36242e07..00000000 --- a/Src/Plugins/DSP/sc_serv3/ADTSHeader.cpp +++ /dev/null @@ -1,225 +0,0 @@ -#include "ADTSHeader.h" -#include "nmrCommon/services/stdServiceImpl.h" - - -enum -{ - ADTS_NOT_PROTECTED = 1, - ADTS_PROTECTED = 0, - ADTS_SYNC = 0xFFF, - ADTS_MAIN = 0x00, - ADTS_LC = 0x01, - ADTS_SSR = 0x10, - ADTS_LTP = 0x11 -}; - -const int aac_adts_parse(const aac_adts_header_t header, const __uint8 *buffer) -{ - header->syncword = ((buffer[0] << 4) | (buffer[1] >> 4)); - - if (header->syncword != ADTS_SYNC) - { - return NErr_LostSynchronization; - } - - header->id = ((buffer[1] >> 3) & 1); - header->layer = ((buffer[1] >> 1) & 3); - if (header->layer != 0) - { - return NErr_WrongFormat; - } - - header->protection = ((buffer[1]) & 1); - header->profile = ((buffer[2] >> 6) & 3); - header->sample_rate_index = ((buffer[2] >> 2) & 0xF); - if (header->sample_rate_index == 15) - { - return NErr_UnsupportedFormat; // might actually be OK if we can separately signal the sample rate - } - - if (header->sample_rate_index > 13) - { - return NErr_Reserved; - } - - header->private_bit = ((buffer[2] >> 1) & 1); - header->channel_configuration = ((buffer[2] & 1) << 2) | ((buffer[3] >> 6) & 3); - header->original = ((buffer[3] >> 5) & 1); - header->home = ((buffer[3] >> 4) & 1); - - header->frame_length = ((buffer[3] & 3) << 11) | (buffer[4]<<3) | ((buffer[5] >> 5) & 7); - header->buffer_fullness = ((buffer[5] & 0x1F) << 6) | (buffer[6] >> 2); - header->num_data_blocks = (buffer[6] & 3); - return NErr_Success; -} - -static const unsigned int aac_sratetab[] = -{ - 96000, - 88200, - 64000, - 48000, - 44100, - 32000, - 24000, - 22050, - 16000, - 12000, - 11025, - 8000, - 7350, -}; -#if 0 -const int aac_adts_match(const aac_adts_header_t header1, const aac_adts_header_t header2) -{ - if (header1->id != header2->id) - { - return NErr_False; - } - - if (header1->profile != header2->profile) - { - return NErr_False; - } - - if (header1->sample_rate_index != header2->sample_rate_index) - { - return NErr_False; - } - - if (header1->channel_configuration != header2->channel_configuration) - { - return NErr_False; - } - - return NErr_True; -} -#endif -const int aac_adts_get_channel_count(const aac_adts_header_t header) -{ - switch (header->channel_configuration) - { - case 7: - { - return 8; - } - default: - { - return header->channel_configuration; - } - } -} - -const __uint16 getADTSFrameInfo(const char *hdr, unsigned int *samplerate, __uint8 *asc_header) -{ - ADTSHeader header = {0}; - if (aac_adts_parse(&header, (const __uint8 *)hdr) == NErr_Success) - { - *samplerate = aac_sratetab[header.sample_rate_index]; - - // we need this when generating flv frames - // as it creates the AudioSpecificConfig - // from the existing ADTS header details - // (is like a mini-ADTS header to create) - if (asc_header) - { - asc_header[0] |= (((header.profile + 1) & 31) << 3) + (header.sample_rate_index >> 1); - asc_header[1] |= ((header.sample_rate_index & 0x1) << 7) + (header.channel_configuration << 3); - } - - //*bitrate = (int)(((header.frame_length / 1/*frames*/) * (aac_sratetab[header.sample_rate_index] / 1024.0)) + 0.5) * 8; - return (__uint16)header.frame_length; - } - return 0; -} - -const char *AAC_FrameInfo::getVersionName() const -{ - if (m_version) - return "v2"; - return "v4"; -} - -const char *AAC_FrameInfo::getAOT() const -{ - switch (m_aot) - { - case 2: return "LC"; - case 5: return "SBR"; - case 29: return "PS"; - default: return "unknown profile"; - } -} - - -int getAACFrameLength (const unsigned char *p, unsigned int len) -{ - if (len < 6) - return -1; - return ((p[3] & 0x3) << 11) + (p[4] << 3) + ((p[5] & 0xE0) >> 5); -} - -int getAACFrameInfo (const unsigned char *p, unsigned int len, AAC_FrameInfo &info) -{ - if (len < 6) - return -1; - if ((((long)p[0])<<4 | (p[1]>>4)) != 0xfff) - return -1; - - int layer = ((p[1] >> 1) & 3); - if (layer != 0) - return -1; - int sample_rate_index = ((p[2] >> 2) & 0xF); - - if (sample_rate_index > 13) - return -1; - int samplerate = aac_sratetab [sample_rate_index]; - if (info.m_samplerate) - { - if (info.m_samplerate != samplerate) - return -1; - } - else - info.m_samplerate = samplerate; - info.m_blocks = (p[6] & 0x3) + 1; - info.m_pattern = (((unsigned long)(p[0])<<24) | (p[1]<<16) | (p[2]<<8) | p[0]) & info.m_mask; - - return getAACFrameLength (p, len); -} - - -int AAC_FrameInfo::verifyFrame (const unsigned char *buf, unsigned int len) -{ - if (len > 6) - { - unsigned long v = (unsigned long)(buf[0])<<24 | (buf[1]<<16) | (buf[2]<<8) | buf[0]; - - if ((v & m_mask) == m_pattern) - { - m_blocks = (buf[6] & 0x3) + 1; - m_version = (buf[1] >> 3) & 1; // 1 mpeg2, 0 mpeg4 - m_aot = ((buf[2] >> 6) & 3) + 1; - return getAACFrameLength (buf, len); - } - // DLOG ("AAC failed sync, retry.."); - return -1; - } - return 0; -} - - -AAC_FrameInfo::AAC_FrameInfo (unsigned long value) : parserInfo (0xFFFEFDC0, value) -{ - m_description = "AAC"; - m_blocks = 0; - m_aot = 0; -} - -AAC_FrameInfo::AAC_FrameInfo(const unsigned char *p, unsigned int len) : parserInfo() -{ - m_mask = 0xFFFEFDC0; - m_description = "AAC"; - m_blocks = 0; - getAACFrameInfo (p, len, *this); -} - diff --git a/Src/Plugins/DSP/sc_serv3/ADTSHeader.h b/Src/Plugins/DSP/sc_serv3/ADTSHeader.h deleted file mode 100644 index ef849f87..00000000 --- a/Src/Plugins/DSP/sc_serv3/ADTSHeader.h +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once -#ifndef _ADTS_HEADER_H -#define _ADTS_HEADER_H - -#include "nmrCommon/intTypes.h" -#include "global.h" -#include "uvox2Common.h" - - -typedef struct ADTSHeader -{ - unsigned int syncword; - unsigned int layer; - unsigned int id; - unsigned int protection; - unsigned int profile; - unsigned int sample_rate_index; - unsigned int private_bit; - unsigned int channel_configuration; - unsigned int original; - unsigned int home; - int frame_length; - unsigned int buffer_fullness; - unsigned int num_data_blocks; -} ADTSHeader, *aac_adts_header_t; - -enum -{ - NErr_Success = 0, - NErr_True = 0, - NErr_False = 8, // returned from a bool-like function to indicate "false" as opposed to "i had an error while figuring it out" - NErr_UnsupportedFormat = 13, - NErr_LostSynchronization = 17, - NErr_WrongFormat = 24, // data was understood but is indicating a different format than expected. e.g. an layer 2 header being encountered by a layer 3 parser - NErr_Reserved = 25 // typically returned when a parser encounters data with a reserved flag set to true -}; - -struct AAC_FrameInfo : public parserInfo -{ - int m_blocks; - int m_aot; - - int verifyFrame (const unsigned char *buf, unsigned int len); - int getUvoxType() { return AAC_LC_DATA; } - const char *getVersionName() const; - const char *getAOT() const; - - AAC_FrameInfo (unsigned long value = 0); - AAC_FrameInfo (const unsigned char *p, unsigned int len); -}; - -int getAACFrameInfo (const unsigned char *hdr, unsigned int len, AAC_FrameInfo &info); - -/* must be 7 bytes */ -const int aac_adts_parse(const aac_adts_header_t header, const __uint8 *buffer); -const int aac_adts_get_channel_count(const aac_adts_header_t header); -#if 0 -const int aac_adts_match(const aac_adts_header_t header1, const aac_adts_header_t header2); -#endif -const __uint16 getADTSFrameInfo(const char *hdr, unsigned int *samplerate, __uint8 *asc_header = 0); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/FLV.cpp b/Src/Plugins/DSP/sc_serv3/FLV.cpp deleted file mode 100644 index b42063b3..00000000 --- a/Src/Plugins/DSP/sc_serv3/FLV.cpp +++ /dev/null @@ -1,322 +0,0 @@ -#include "FLV.h" -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include "streamData.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -/* -** This is a bit messy but it'll generate -** FLV tags for the purpose of streaming. -** -** Where possible values are hard-coded -** so we just re-insert into the output. -*/ - -#define FLV_SIGNATURE {'F', 'L', 'V'} -#define FLV_VERSION ((__uint8)0x1) - -#define FLV_FLAG_VIDEO ((__uint8)0x1) -#define FLV_FLAG_AUDIO ((__uint8)0x4) - -#define FLV_HDR_SIZE ((__uint32)0x9000000) // pre-converted to big-endian - -// ensure we've got the structures correctly packed -#pragma pack(push, 1) -typedef struct { - __uint8 signature[3]; // FLV_SIGNATURE - __uint8 version; // FLV_VERSION - __uint8 flags; // FLV_FLAG_* - __uint32 header_size; // FLV_HDR_SIZE - __uint32 prev_size; // 0 (this is the size of the previous tag including - // its header in bytes i.e. 11 + the 'data_size' - // of the previous tag). we include this in the - // header so that we're always outputting a valid - // start point before the tag structure is added. -} flv_header; -#pragma pack(pop) - -#pragma pack(push, 1) -typedef struct { - __uint8 type; // for first packet set to AMF Metadata ??? - __uint8 data_size[3]; // size of packet data only (24) - __uint8 ts_lower[3]; // for first packet set to NULL (24) - __uint8 ts_upper; // extension to create a __uint32 value - __uint8 stream_id[3]; // for first stream of same type set to NULL (24) - /* data comes after this*/ -} flv_tag; -#pragma pack(pop) - -/* -__uint32 prev_size; // for first packet set to NULL otherwise this is the - // size of the previous tag including its header in B - // and is 11 plus the 'data_size' of the previous tag. -*/ - -// these are pre-encoded for the correct endianess -// though for metadata usage, we convert them back -#define FLV_MP3_AUDIO ((__uint8)0x20) // (((__uint8)0x2) << 4) -#define FLV_AAC_AUDIO ((__uint8)0xA0) // (((__uint8)0xA) << 4) - -#define FLV_SAMPLE_RATE_5 ((__uint8)0x0) // (((__uint8)0x0) << 2) -#define FLV_SAMPLE_RATE_11 ((__uint8)0x4) // (((__uint8)0x1) << 2) -#define FLV_SAMPLE_RATE_22 ((__uint8)0x8) // (((__uint8)0x2) << 2) -#define FLV_SAMPLE_RATE_44 ((__uint8)0xC) // (((__uint8)0x3) << 2) - -#define FLV_SAMPLE_SIZE_8 ((__uint8)0x0) // (((__uint8)0x0) << 1) -#define FLV_SAMPLE_SIZE_16 ((__uint8)0x2) // (((__uint8)0x1) << 1) - -#define FLV_MONO_AUDIO ((__uint8)0x0) -#define FLV_STEREO_AUDIO ((__uint8)0x1) - - -// reads 24 bits from data, converts from big endian, and returns as a 32bit int -inline __uint32 Read24(__uint8* data) -{ - __uint32 returnVal = 0; - __uint8* swap = (__uint8*)&returnVal; - - swap[0] = data[2]; - swap[1] = data[1]; - swap[2] = data[0]; - - return returnVal; -} - -int dataString(vector<__uint8> &out_data, const char *buf) -{ - int amt = (int)strlen(buf); - __uint8 bytes[2] = {(__uint8)((amt >> 8) & 0xff), (__uint8)((amt >> 0) & 0xff)}; - // length of the data string - out_data.insert(out_data.end(), (const __uint8*)&bytes, (const __uint8*)&bytes + sizeof(bytes)); - // body of the data string - out_data.insert(out_data.end(), (const __uint8*)buf, (const __uint8*)buf + amt); - return amt + 2; -} - -int scriptDataType(vector<__uint8> &out_data, const __uint8 type) -{ - out_data.insert(out_data.end(), (const __uint8*)&type, ((const __uint8*)&type) + sizeof(type)); - return 1; -} - -int scriptDataString(vector<__uint8> &out_data, const char *name, const char *value) -{ - return dataString(out_data, name) + scriptDataType(out_data, 0x2) + dataString(out_data, value); -} - -int scriptDataBool(vector<__uint8> &out_data, const char *name, const bool value) -{ - return dataString(out_data, name) + scriptDataType(out_data, 0x1) + scriptDataType(out_data, !!value); -} - -int scriptDataDouble(vector<__uint8> &out_data, const char *name, const double value) -{ - int amt = dataString(out_data, name) + scriptDataType(out_data, 0x0); - - union - { - __uint8 dc[8]; - double dd; - } d; - d.dd = value; - - unsigned char b[8]; - b[0] = d.dc[7]; - b[1] = d.dc[6]; - b[2] = d.dc[5]; - b[3] = d.dc[4]; - b[4] = d.dc[3]; - b[5] = d.dc[2]; - b[6] = d.dc[1]; - b[7] = d.dc[0]; - - out_data.insert(out_data.end(), (const __uint8*)b, (const __uint8*)b + sizeof(b)); - - return amt + 8; -} - -void createMetadataTag(vector<__uint8> &out_data, const bool mp3, - const bool mono, const int bitrate, - const __uint8 flv_sr, const streamData::streamID_t sid) -{ - __uint8 m[] = {'\x12', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'}; - out_data.insert(out_data.end(), (const __uint8*)m, (const __uint8*)m + sizeof(m)); - - __uint32 s = scriptDataType(out_data, 0x2) + - dataString(out_data, "onMetadata") + - // start of the script array data blocks - scriptDataType(out_data, 0x8); - - __uint8 data_size[4] = {'\x00', '\x00', '\x00', '\x0C'/* number of items in the array */}; - out_data.insert(out_data.end(), (const __uint8*)&data_size, ((const __uint8*)&data_size) + sizeof(data_size)); - s += 4; - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - s += scriptDataString(out_data, "name", (!info.m_streamName.empty() ? info.m_streamName.hideAsString().c_str() : "")); - // TODO - as we're not updating as we go at the moment, this will be set to the station name so there's something set - s += scriptDataString(out_data, "title", (!info.m_streamName.empty() ? info.m_streamName.hideAsString().c_str() : "")); - //s += scriptDataString(out_data, "title", (!info.m_currentSong.empty() ? info.m_currentSong.hideAsString().c_str() : "")); - s += scriptDataString(out_data, "genre", (!info.m_streamGenre[0].empty() ? info.m_streamGenre[0].hideAsString().c_str() : "")); - - //s += scriptDataBool(out_data, "hasMetadata", false/* TODO */); - s += scriptDataBool(out_data, "hasAudio", true); - s += scriptDataBool(out_data, "hasVideo", false); - s += scriptDataBool(out_data, "hasKeyframes", false); - - s += scriptDataBool(out_data, "canSeekToEnd", false); - - s += scriptDataBool(out_data, "stereo", !mono); - - s += scriptDataDouble(out_data, "audiodatarate", (double)bitrate); - s += scriptDataDouble(out_data, "audiocodecid", (double)((mp3 ? FLV_MP3_AUDIO : FLV_AAC_AUDIO) >> 4)); - s += scriptDataDouble(out_data, "audiosamplerate", (double)(flv_sr >> 2)); - s += scriptDataDouble(out_data, "audiosamplesize", (double)(FLV_SAMPLE_SIZE_16 >> 1)); - - unsigned char end[] = {'\x00', '\x00', '\x09'}; - out_data.insert(out_data.end(), (const __uint8*)end, (const __uint8*)end + sizeof(end)); - s += 3; - - // now we know how much we've got - // we can update the tags' length - __uint32 s2 = s + 11; - out_data[16] = (s & 0xFF); - s >>= 8; - out_data[15] = (s & 0xFF); - s >>= 8; - out_data[14] = (s & 0xFF); - - // we set this at the end so if we terminate the stream - // then there's more chance of it validating correctly. - data_size[3] = (s2 & 0xFF); - s2 >>= 8; - data_size[2] = (s2 & 0xFF); - s2 >>= 8; - data_size[1] = (s2 & 0xFF); - s2 >>= 8; - data_size[0] = (s2 & 0xFF); - - out_data.insert(out_data.end(), (const __uint8*)&data_size, ((const __uint8*)&data_size) + sizeof(data_size)); -} - -void createFLVTag(vector<__uint8> &out_data, const char *buf, - const int amt, int ×tamp, const bool mp3, - const bool mono, const unsigned int samplerate, - const int bitrate, const __uint8 *asc_header, - const streamData::streamID_t sid) -{ - if (amt > 0) - { - // we need to generate this early so we've got - // it for being provided in createMetadataTag - __uint8 flv_sr = FLV_SAMPLE_RATE_44; - if (mp3) - { - // how do we handle the formats not allowed...? - switch (samplerate) - { - case 22050: - { - flv_sr = FLV_SAMPLE_RATE_22; - break; - } - case 11025: - { - flv_sr = FLV_SAMPLE_RATE_11; - break; - } - } - } - - const bool first = (timestamp == 0); - if (first) - { - const flv_header hdr = {FLV_SIGNATURE, FLV_VERSION, FLV_FLAG_AUDIO, FLV_HDR_SIZE, 0}; - out_data.insert(out_data.end(), (const __uint8*)&hdr, ((const __uint8*)&hdr) + sizeof(flv_header)); - - createMetadataTag(out_data, mp3, mono, bitrate, flv_sr, sid); - - if (!mp3) - { - // we send a simple frame at this point just so for AAC the decoder - // is able to be setup correctly as needed else it'll fail to play. - __uint8 p[] = {'\x08', '\x00', '\x00', '\x04', '\x00', '\x00', '\x00', '\x00', - '\x00', '\x00', '\x00', (__uint8)'\xAF', '\x00', asc_header[0], - asc_header[1], '\x00', '\x00', '\x00', '\x0F'}; - out_data.insert(out_data.end(), (const __uint8*)p, (const __uint8*)p + sizeof(p)); - } - } - - // if we were to do something else, then we'd need to - // change the initial value as needed for it's format - flv_tag tag = {((__uint8)0x8), {0}, {0}, 0, {0}}; - // we need to know the size of things before we output - // the actual frame, so we calculate now and adjust it - // based on the format of the frame needing to be sent - __uint32 v = (first ? (!mp3 ? 2 : 1) : 1 + !mp3) + amt; - - tag.data_size[2] = (v & 0xFF); - v >>= 8; - tag.data_size[1] = (v & 0xFF); - v >>= 8; - tag.data_size[0] = (v & 0xFF); - - // this sets the 24-bit time - v = timestamp; - tag.ts_lower[2] = (v & 0xFF); - v >>= 8; - tag.ts_lower[1] = (v & 0xFF); - v >>= 8; - tag.ts_lower[0] = (v & 0xFF); - // this sets the extended time - // so we provide a 32-bit time - v >>= 8; - tag.ts_upper = (v & 0xFF); - - // depending on the format, we adjust timestamp - // for MP3, we're looking at 26ms / frame - // for AAC, we're looking at 1024 samples / frame - timestamp += (mp3 ? 26 : (1024000 / samplerate)); - - out_data.insert(out_data.end(), (const __uint8*)&tag, ((const __uint8*)&tag) + sizeof(flv_tag)); - - // for AAC data, the default has to be set as 16-bit 44kHZ stereo - // though the decoder will actuall figure things out as required. - // for MP3 data, we fill in things based on the frame data found - __uint8 flv_audio_data_tag = ((mp3 ? FLV_MP3_AUDIO : FLV_AAC_AUDIO) | flv_sr | FLV_SAMPLE_SIZE_16 | (!mono ? FLV_STEREO_AUDIO : FLV_MONO_AUDIO)); - out_data.insert(out_data.end(), (const __uint8*)&flv_audio_data_tag, ((const __uint8*)&flv_audio_data_tag) + sizeof(flv_audio_data_tag)); - - if (!mp3) - { - // this is done so we now distinguish the actual - // raw AAC data sans ADTS header vs the required - // AAC sequence header which is sent before the - // first AAC data frame is sent - __uint8 packet_type = 0x1; - out_data.insert(out_data.end(), (const __uint8*)&packet_type, ((const __uint8*)&packet_type) + sizeof(packet_type)); - } - - // body of the data - out_data.insert(out_data.end(), (const __uint8*)buf, ((const __uint8*)buf) + amt); - - // we set this at the end so if we terminate the stream - // then there's more chance of it validating correctly. - v = (11 + Read24(tag.data_size)); - __uint8 data_size[4] = {0}; - data_size[3] = (v & 0xFF); - v >>= 8; - data_size[2] = (v & 0xFF); - v >>= 8; - data_size[1] = (v & 0xFF); - v >>= 8; - data_size[0] = (v & 0xFF); - - out_data.insert(out_data.end(), (const __uint8*)&data_size, ((const __uint8*)&data_size) + sizeof(data_size)); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/FLV.h b/Src/Plugins/DSP/sc_serv3/FLV.h deleted file mode 100644 index 182e65ef..00000000 --- a/Src/Plugins/DSP/sc_serv3/FLV.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#ifndef _FLV_HEADER_H -#define _FLV_HEADER_H - -#include <stdio.h> -#include <vector> -#include "nmrCommon/intTypes.h" -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include "streamData.h" - -void createFLVTag(std::vector<__uint8> &out_data, const char *buf, - const int amt, int ×tamp, const bool mp3, - const bool mono, const unsigned int samplerate, - const int bitrate, const __uint8 *asc_header, - const streamData::streamID_t sid); - -void createMetadataTag(std::vector<__uint8> &out_data, const bool mp3, - const bool mono, const int bitrate, - const __uint8 flv_sr, const streamData::streamID_t sid); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/GNUmakefile b/Src/Plugins/DSP/sc_serv3/GNUmakefile deleted file mode 100644 index eebf3052..00000000 --- a/Src/Plugins/DSP/sc_serv3/GNUmakefile +++ /dev/null @@ -1,237 +0,0 @@ -SHELL = /bin/sh - -.SUFFIXES: -.SUFFIXES: .cpp .o .d .h - -OS := $(shell uname | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/') -x64 := $(shell uname -m) -ENDIAN := $(shell uname -m) -ENDIAN := $(patsubst i%86,LITTLE_ENDIAN,$(ENDIAN)) -ENDIAN := $(patsubst x86_64,LITTLE_ENDIAN,$(ENDIAN)) -ENDIAN := $(patsubst Power Macintosh,BIG_ENDIAN,$(ENDIAN)) -CXX=g++ -std=c++11 -Wno-deprecated - -########################################################## -########### Platform specific stuff ##################### -########################################################## - -ifeq ($(OS),LINUX) - - ### Raspbian is reported as a Linux OS - ### and reports 'armv6l' via uname -m - ### so we check -m to detect it properly - ifeq ($(x64),armv6l) - - #PLATFORM_DEFINES=-DPLATFORM_ARMv6 - # this is for GCC 4.6.x to make a legacy compatible compile ?? - PLATFORM_DEFINES=-DPLATFORM_ARMv6 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -ffunction-sections -fdata-sections -Wl,--gc-sections - - PLATFORM_LIBS=\ - libs/Aol_XML/ARMv6/libexpat.a\ - libs/libcurl/ARMv6/libcurl.a\ - libs/libcurl/ARMv6/libssl.a\ - libs/libcurl/ARMv6/libcrypto.a\ - libs/zlib/ARMv6/libz.a\ - -lrt\ - -lpthread\ - -ldl - ### the RPi2 is reported as a Linux OS - ### and reports 'armv7l' via uname -m - ### so we check -m to detect it properly - else ifeq ($(x64),armv7l) - # https://www.raspberrypi.org/forums/viewtopic.php?p=684549#p684549 - # this is for GCC 4.6.x - #PLATFORM_DEFINES=-DPLATFORM_ARMv7 -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard - # this is for GCC 4.8.x (default is 4.6.x on Raspbian) - PLATFORM_DEFINES=-DPLATFORM_ARMv7 -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -Wno-unused-result -Wno-ignored-qualifiers -Wno-long-long -Wno-missing-field-initializers -ffunction-sections -fdata-sections -Wl,--gc-sections - # this is for GCC 4.6.x to make a legacy compatible compile ?? - #PLATFORM_DEFINES=-DPLATFORM_ARMv6 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard - - PLATFORM_LIBS=\ - libs/Aol_XML/ARMv7/libexpat.a\ - libs/libcurl/ARMv7/libcurl.a\ - libs/libcurl/ARMv7/libssl.a\ - libs/libcurl/ARMv7/libcrypto.a\ - libs/zlib/ARMv7/libz.a\ - -lrt\ - -lpthread\ - -ldl - else - PLATFORM_DEFINES=-DPLATFORM_LINUX -Wno-unused-result -Wno-ignored-qualifiers -Wno-long-long -Wno-missing-field-initializers -ffunction-sections -fdata-sections -Wl,--gc-sections - - ### Linux platform specific includes - ### with 32-bit and 64-bit handling - ifeq ($(x64),x86_64) - INCLUDES=-Ideps/x86_64/include - PLATFORM_LIBS=\ - -Ldeps/x86_64/lib -lexpat -lcurl -lssl -lcrypto -lpthread -lz -lrt -ldl - else - CXX += -m32 - INCLUDES=-Ideps/i686/include - PLATFORM_LIBS=\ - -Ldeps/i686/lib -lexpat -lcurl -lssl -lcrypto -lpthread -lz -lrt -ldl - endif - endif - -################################### - -else - ifeq ($(OS),FREEBSD) -# CXX=g++44 - PLATFORM_DEFINES=-DPLATFORM_BSD -Wno-long-long -Wno-missing-field-initializers - - PLATFORM_LIBS=\ - libs/Aol_XML/BSD/libexpat.a\ - libs/libcurl/BSD/libcurl.a\ - libs/libcurl/BSD/libssl.a\ - libs/libcurl/BSD/libcrypto.a\ - libs/zlib/BSD/libz.a\ - -lpthread\ -# -R /usr/local/lib/gcc44 - - else - ifeq ($(OS),DARWIN) - PLATFORM_DEFINES=-DPLATFORM_MAC -Wno-long-long -Wno-missing-field-initializers - - PLATFORM_LIBS=\ - libs/Aol_XML/Darwin/libexpat.a\ - libs/libcurl/Darwin/libcurl.a\ - libs/libcurl/Darwin/libssl.a\ - libs/libcurl/Darwin/libcrypto.a\ - libs/zlib/Darwin/libz.a\ - -lpthread - else - ERR = $(error Unknown operating system $(OS)) - endif - endif -endif - -ifneq ($(ENDIAN),LITTLE_ENDIAN) - ifneq ($(ENDIAN),BIG_ENDIAN) - ERR = $(error Unknown endian $(ENDIAN)) - endif -endif - -########################################################## -########################################################## -########################################################## -########################################################## -########################################################## - -INCLUDES += -I. -InmrCommon -#INCLUDES=-I. -InmrCommon -Izlib -Ilibcurl/include -IGeoIP/libGeoIP - -LIBS=$(PLATFORM_LIBS) - -CPPFLAGS=$(PLATFORM_DEFINES) -MMD -MP -D_REENTRANT -DCURL_STATICLIB -Wno-unused-function -Wno-sign-compare -Wno-unknown-pragmas -Wall -Wextra -pedantic - -CFLAGS_RELEASE=-O2 -static-libgcc -static-libstdc++ -rdynamic -CPPFLAGS_RELEASE=$(CPPFLAGS) -O2 -DNDEBUG -g - -CFLAGS_DEBUG=-static-libgcc -static-libstdc++ -rdynamic -CPPFLAGS_DEBUG=$(CPPFLAGS) -ggdb -DDEBUG - -VPATH=nmrCommon/threading nmrCommon/stacktrace nmrCommon/services nmrCommon/file nmrCommon/unicode webNet aolxml -#VPATH=nmrCommon/threading nmrCommon/stacktrace nmrCommon/services nmrCommon/file nmrCommon/unicode webNet aolxml GeoIP/libGeoIP - -C_SOURCES=\ - $(wildcard *.c) - -#C_SOURCES=\ -# $(wildcard *.c)\ -# $(wildcard GeoIP/libGeoIP/*.c) - -CXX_SOURCES=\ - $(wildcard *.cpp)\ - $(wildcard nmrCommon/threading/thread.cpp)\ - $(wildcard nmrCommon/stacktrace/StackTrace.cpp)\ - $(wildcard nmrCommon/services/logger.cpp)\ - $(wildcard nmrCommon/services/serviceMain.cpp)\ - $(wildcard nmrCommon/services/stdServiceImpl.cpp)\ - $(wildcard nmrCommon/file/fileUtils.cpp)\ - $(wildcard nmrCommon/unicode/*.cpp)\ - $(wildcard webNet/*.cpp)\ - $(wildcard aolxml/*.cpp) - -SOURCE_FILES=$(C_SOURCES) $(CXX_SOURCES) - -OBJECT_FILES=$(addsuffix .o,$(basename $(notdir $(SOURCE_FILES)))) -DEBUG_OBJECTS=$(addprefix debug/,$(OBJECT_FILES)) -RELEASE_OBJECTS=$(addprefix release/,$(OBJECT_FILES)) - -.PHONY: default -default: release - -release/config.o debug/config.o: unixversion.h -release/serviceMain.o debug/serviceMain.o: unixversion.h - -############################################################## -### Create unix version header from Win32 resource file -unixversion.h: sc_serv.rc - @grep --text 'PRODUCTVERSION' sc_serv.rc | sed 's/PRODUCTVERSION/static int & \[VENT\]=\{/' | sed 's/[0-9]*,[0-9]*,[0-9]*,[0-9]*/&\};/' > unixversion_tmp.h - @echo '#define VENT 4' | cat - unixversion_tmp.h > unixversion.h - @rm -f unixversion_tmp.h - -################# File rules #########################3 - -debug/%.o: %.cpp - $(CXX) $(CPPFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -debug/%.o: %.c - $(CXX) $(CPPFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: %.cpp - $(CXX) $(CPPFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -release/%.o: %.c - $(CXX) $(CPPFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -#release/%.o: GeoIP/libGeoIP/%.c -# $(CXX) $(CPPFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -############################################################ - -sc_serv_debug: $(DEBUG_OBJECTS) - $(CXX) -o sc_serv_debug $(CFLAGS_DEBUG) $(DEBUG_OBJECTS) $(LIBS) - @./sc_serv_debug -v - @echo - -sc_serv: sc_serv_notstripped - strip -o sc_serv sc_serv_notstripped - @echo - -sc_serv_notstripped: $(RELEASE_OBJECTS) - $(CXX) -o sc_serv_notstripped $(CFLAGS_RELEASE) $(RELEASE_OBJECTS) $(LIBS) - @./sc_serv_notstripped -v - -releasedir: - @mkdir -p release - -debugdir: - @mkdir -p debug - -.PHONY: clean -.PHONY: release -.PHONY: debug - -release: releasedir sc_serv -release_nostrip: releasedir sc_serv_notstripped -debug: debugdir sc_serv_debug - -clean: - @rm -rf debug - @rm -rf release - @rm -f unixversion.h - -.PHONY: err -err: ; $(ERR) - -##################################################3 - -ifeq ($(MAKECMDGOALS),release) --include $(RELEASE_OBJECTS:.o=.d) -else -ifneq ($(MAKECMDGOALS),clean) --include $(DEBUG_OBJECTS:.o=.d) -endif -endif diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS b/Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS deleted file mode 100644 index b1295b9b..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -T.J. Mather <tjmather@maxmind.com> diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/COPYING b/Src/Plugins/DSP/sc_serv3/GeoIP/COPYING deleted file mode 100644 index 45574c3c..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/COPYING +++ /dev/null @@ -1,509 +0,0 @@ -[ Note that while the core GeoIP library is licensed under the -LGPL, the libGeoIPUpdate library depends on md5.c and types.h -which are licensed under the GPL. ] - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog b/Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog deleted file mode 100644 index 572960f0..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/ChangeLog +++ /dev/null @@ -1,628 +0,0 @@ -1.4.8 - * Fix GEOIP_DOMAIN_EDITION_V6 ( Boris Zentner ) - * Add new Datatypes GEOIP_NETSPEED_EDITION_REV1_V6 and - GEOIP_NETSPEED_EDITION_REV1 ( Boris Zentner ) - * Fix possible directory traversal weakness in geoipupdate-pureperl.pl with - malicious update server ( Boris Zentner ) - * Fix GEOIP_ORG_EDITION_V6 and GEOIP_ISP_EDITION_V6 ( Boris Zentner ) -1.4.7 - * Upd timezone.c Add SX, BQ and CW remove AN and FX ( Boris Zentner ) - * Add support for the new types in geoiplookup6 ( Boris Zentner ) - * Add new database types GEOIP_CITY_EDITION_REV0_V6, - GEOIP_CITY_EDITION_REV1_V6, GEOIP_DOMAIN_EDITION_V6, - GEOIP_ORG_EDITION_V6 and GEOIP_ISP_EDITION_V6 ( Boris Zentner ) - * Remove AN and FX. Add SX, BQ and CW ( Boris Zentner ) - * Fix possible segfault in geoipupdate if the connection disappear - unexpected. ( Boris Zentner ) - * Add sanity check for geoipupdate-pureperl.pl ( Boris Zentner ) - * Add GEOIP_USERTYPE_EDITION and GEOIP_USERTYPE_EDITION_V6 - datatypes ( Boris Zentner ) - * Add new functions GeoIP_is_private_ipnum_v4 and GeoIP_is_private_v4 - ( Boris Zentner ) - * Add new functions GeoIP_teredo and GeoIP_enable_teredo. - teredo is enabled by default ( Boris Zentner ) - * Fix output of geoiplookup for unknown or private regions. - ( Boris Zentner ) - * Fix geoipupdate-pureperl.pl to accept more product codes. - ( Boris Zentner ) - * Fix minor output issue in geoipupdate -v ( Boris Zentner ) - * Add support for various databases. ( Boris Zentner ) - * Add experimental teredo support ( Boris Zentner ) - * Fix possible buffer overflow in conjunction with - http_proxies ( Elso Andras ) - * Remove memcpy/bcopy macro for BSD ( Boris Zentner ) - * Add GeoIP_lib_version and GeoIP_cleanup ( Ladar Levison ) - * Upd Makefile.vc ( Thomas Winzig ) - * Fix typo in DK,18,Midtjylland ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100810 ( Boris Zentner ) - * Fix continent codes ( Boris Zentner ) - * Fix 3letter country codes for ATA, BVT, IOT, CXR, CCK, ATF, HMD, - MYT, SGS and UMI ( Boris Zentner ) - * Fix typo/segfault in GeoIP_id_by_name_v6 ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100529 ( Boris Zentner ) - * Remove buffered IO functions, to fix issues with dup'ed file - descriptors ( Boris Zentner ) - * Fix very minor memleak in geoipupdate ( Boris Zentner ) - * Add GEOIP_CITYCONFIDENCEDIST_EDITION, GEOIP_LARGE_COUNTRY_EDITION - and GEOIP_LARGE_COUNTRY_EDITION_V6 database types ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100422 ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100420 ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes 20100221 ( Boris Zentner ) - * Add missing timezones ( Boris Zentner ) - * Add missing include for Windows 2000 ( Jaap Keute ) - * 'GeoIP Database up to date' and 'Updated database' prints to stdout - instead of stderr ( Boris Zentner ) - * Add missing GeoIPRecord_delete to geoiplookup.c ( Piotr Kaczuba ) - * Add some IPv4 helper functions - unsigned long GeoIP_addr_to_num(const char *addr); - char * GeoIP_num_to_addr(unsigned long ipnum); ( Boris Zentner ) - * Fix default name for the accuracy radius database to GeoIPDistance.dat ( Boris Zentner ) - * Add GEOIP_CITYCONFIDENCE_EDITION database type. ( Boris Zentner ) - * geoiplookup use GeoIPDistance.dat files if avail ( Boris Zentner ) - * Fix geoiplookup/geoiplookup6 output, when the databaseinfo string is - not avail. ( Boris Zentner ) - * Change continent code for RU from AS to EU ( Boris Zentner ) - * Add GEOIP_ACCURACYRADIUS_EDITION database type. ( Boris Zentner ) - * Add GEOIP_LOCATIONA_EDITION the database to map back from binary to - the csv database ( Boris Zentner ) - * Change Turkey's continent code from Asia to Europe ( Boris Zentner ) - * Rename _iso_8859_1__utf8 to _GeoIP_iso_8859_1__utf8 ( Boris Zentner ) - * GEOIP_ORG_EDITION, GEOIP_ISP_EDITION, GEOIP_DOMAIN_EDITION and - GEOIP_ASNUM_EDITION databases return UTF8 results, if gi->charset is set - to GEOIP_CHARSET_UTF8 ( Boris Zentner ) - * Avoid unnecesary call to gettimeofday when GEOIP_CHECK_CACHE is not set ( John Douglass ) - * Delayed loading of changed database files for 60 seconds. To avoid - reading halve written databases ( Boris Zentner ) - * Update README.OSX for Leopard and Snow Leopard ( Boris Zentner ) - * Add more IPv6 functions ( Boris Zentner ) - const char *GeoIP_country_code_by_addr_v6 (GeoIP* gi, const char *addr); - const char *GeoIP_country_code_by_name_v6 (GeoIP* gi, const char *host); - const char *GeoIP_country_code3_by_addr_v6 (GeoIP* gi, const char *addr); - const char *GeoIP_country_code3_by_name_v6 (GeoIP* gi, const char *host); - const char *GeoIP_country_name_by_addr_v6 (GeoIP* gi, const char *addr); - const char *GeoIP_country_name_by_name_v6 (GeoIP* gi, const char *host); - * Make sure that GeoIP_*_v6 functions refuse GEOIP_PROXY_EDITION and - GEOIP_NETSPEED_EDITION databases ( Boris Zentner ) - * Update libGeoIP/regionName.c with FIPS codes from 20090723 ( Boris Zentner ) - * Fix geoipupdate's -v option to not change the license filename ( Thom May ) - * Fix geoipupdate's exit code ( Thom May ) - * Add support for ASNUM_EDITION ( Boris Zentner ) - * Fix -i output for larger values, sign issue ( Boris Zentner ) - * Add -i flag for more information on netmask, range_by_ip and the current network range ( Boris Zentner ) - * Add support for DOMAIN_EDITION database type ( Boris Zentner ) - * Fix apps/geoipupdate-pureperl.pl output layer on W32 ( Boris Zentner ) -1.4.6 2009-02-25 - * Fix geoipupdate's my_printf function ( Boris Zentner ) - * Fix typo in apps/geoipupdate-pureperl.pl replace PerlIO::Gzip with PerlIO::gzip ( Boris Zentner ) - * Update region codes in libGeoIP/regionName.c ( Boris Zentner ) - * Fix regioncode/generate_regionName.pl to handle regioncodes with ',' correct ( Boris Zentner ) - * Update fips codes 20090201 ( Boris Zentner ) - * Fix unicode builds on WIN32 and eliminate some warnings ( Stu Redman ) - * Fix sign error in _iso_8859_1__utf8 for PPC64 ( Boris Zentner ) - * Change WIN32 to _WIN32, since _WIN32 is defined by default. _WIN32 is also defined for WIN64 machines ( Boris Zentner ) - ! Remove the WSAStartup call from GeoIP_open. All Applications need to call WSAStartup and WSACleanup to initialize the Windows Socket library. Before they use any of the GeoIP_*_by_name functions. ( Boris Zentner ) - * geoiplookup and test-geoip-* output N/A instead of (null) ( Boris Zentner ) - * Silence various warnings. ( Boris Zentner ) - * Add more timezone region's for Australia - * Fix possible segfault in apps/geoiplookup with null pointers in non gnu printf implementations for example solaris ( Boris Zentner ) - * Add README.OSX to build fat binaries easy ( Boris Zentner ) - * Silence vasprintf warning via AC_GNU_SOURCE ( Boris Zentner ) - * Add several Makefiles to build a static GeoIP.lib for w32 ( Stanislaw Pusep and Randy Kobes ) - * Silence signedness warnings ( Peter Volkov ) - * Remove --with-city configure option. ( Boris Zentner ) - * Remove configure's --with-dbdir option. Use the similar --datadir instead ( Peter Volkov ) - * Various autotools improvements and cleanups. Including parallel - build fix ( Peter Volkov ) - * Fix libGeoIP/timeZone.c ( Martin Haller ) - * Fix timezone/generate_timeZone.pl ( Boris Zenter ) - * Sync FIPS codes again Jan 14th, 2009 ( Boris Zentner ) - * Fix CA,NL regioncode. ( Boris Zentner ) - * Change logic in generate_regionName.pl and GeoIP_region_name_by_code to handle any mixture of two letter fips codes matching [A-Z0-9]{2} the change allow GZ and WE region codes ( Boris Zentner ) - * Sync regionName.c with http://www.maxmind.com/app/fips10_4 from Dec 17th, 2008 ( Boris Zentner ) - * Fix _GeoIP_lookupaddress for 64bit big endian systems like ppc64 ( Peter Volkov ) - * Add proper WIN32/64 support ( Gerald Combs ) - * Escape - in all manpages ( Patrick Matthaei ) - * Add manpage for geoiplookup6 ( Boris Zentner ) - * Fix -d command line option ( Klaus Heinz ) - * GeoIPUpdate.c use vasprintf if avail, otherwise try vsnprintf and sprintf ( Boris Zentner ) - * avoid pre/postincrement and assignment on the same variable ( Boris Zentner ) -1.4.5 2008-09-16 - * metro_code replace the depreciated dma_code field ( Boris Zentner ) - * Add new function GeoIP_range_by_ip_delete - r = GeoIP_range_by_ip(gi, '24.24.24.24'); - ... - GeoIP_range_by_ip_delete(r); ( Boris Zentner ) - * Fix small memoryleak and wrap around in GeoIP_range_by_ip ( Boris Zentner ) - * CHECK_CACHE stat the database file not faster than once a second anymore ( Patrick McManus ) - * Fixed a typo in the geoipupdate(1) manpage and also an non-existent path on Debian (Patrick Matth�i) - * Fixes two little format errors (hyphen used as minus sign) in both manpages (Patrick Matth�i) - * Sync regionName.c with a recent fips code list ( Boris Zentner ) - * Fix segfault when open failed for a custom file (-f) ( Boris Zentner ) - * Fix sync geoiplookup's man page with the code ( Klaus Heinz ) - * remove unused code from GeoIP_country_name_by_addr and GeoIP_country_code3_by_addr ( Boris Zentner ) - * Fix geoiplookup and geoiplookup6 to distinguish between failed namelookups and unknown ips ( Boris Zentner ) - * add geoiplookup6 that can handle the new database type GEOIP_COUNTRY_EDITION_V6 ( Boris Zentner ) - * add new functions to handle ipv6 - - GEOIP_API const char *GeoIP_country_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API const char *GeoIP_country_code_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API const char *GeoIP_country_code3_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API char *GeoIP_org_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API char *GeoIP_org_by_addr_v6 (GeoIP* gi, const char *addr); - GEOIP_API char *GeoIP_org_by_name_v6 (GeoIP* gi, const char *name); - GEOIP_API int GeoIP_id_by_addr_v6 (GeoIP* gi, const char *addr); - GEOIP_API int GeoIP_id_by_name_v6 (GeoIP* gi, const char *host); - GEOIP_API int GeoIP_id_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API GeoIPRegion * GeoIP_region_by_addr_v6 (GeoIP* gi, const char *addr); - GEOIP_API GeoIPRegion * GeoIP_region_by_name_v6 (GeoIP* gi, const char *host); - GEOIP_API GeoIPRegion * GeoIP_region_by_ipnum_v6 (GeoIP *gi, geoipv6_t ipnum); - GEOIP_API void GeoIP_assign_region_by_inetaddr_v6(GeoIP* gi, geoipv6_t inetaddr, GeoIPRegion *gir); - GEOIP_API char *GeoIP_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - GEOIP_API char *GeoIP_name_by_addr_v6 (GeoIP* gi, const char *addr); - GEOIP_API char *GeoIP_name_by_name_v6 (GeoIP* gi, const char *name); - - # allowed input for addr - 2001:4860:0:1001::68 - ::85.8.93.71 - ::1 - ::5508::5d47 - ::ffff:5508::5d47 - - # allowed input for host - ipv6.google.com - 2001:4860:0:1001::68 - ::85.8.93.71 - ::1 - ::5508::5d47 - ::ffff:5508::5d47 - ( Boris Zentner ) - * Fix geoiplookup usage string ( add -d -f ) ( Boris Zentner ) - * Added GeoIP_range_by_ip, returns the start and end IP address for the range containing the IP address. - This range has a constant value in the GeoIP database. - * Add geoipupdate-pureperl.pl a alternative geoipupdate version. with Proxy Server support via via the "http_proxy" environment variable. Easy to customize. ( Boris Zentner ) - * Add WIN64 since WIN32 is not defined on WIN64 Systems ( Boris Zentner ) - * Fix WIN32 compilation by encircle all MMAP functions with #ifdef WIN32 #endif pairs. MMAP is not avail in W32 ( Boris Zentner ) - * Update timezone/generate_timeZone.pl ( Boris Zentner ) - * Update libGeoIP/timeZone.c ( Boris Zentner ) - * Added GeoIP_printf and GeoIP_fprintf as a experimental feature to - libGeoIPUpdate. ( Boris Zentner, Andrew Droffner ) - * Added cast in _iso_8859_1__utf8 function to fix NetWare/Win32 compilation issue (Guenter Knauf) - * Add HTTP Proxy Server support for geoipupdate via the "http_proxy" - environment variable. - ie: export http_proxy="http://proxy-hostname:port" - ( Andrew Droffner, Derek Nicol ) - * Notice, that __YOU__ need to free the results of - - GeoIP_database_info - GeoIP_name_by_ipnum - GeoIP_name_by_addr - GeoIP_name_by_name - GeoIP_org_by_ipnum - GeoIP_org_by_addr - GeoIP_org_by_name - - not libgeoip - ( Boris Zentner, Andrew Cheung ) - * Fixed segfault with geoiplookup, if used with a custom_file database, that - could not be opened. ( Boris Zentner ) - * Add Usage info for options -f and -d in geoipupdate ( Boris Zentner ) - * Fixed segfault with geoipupdate when called with a illformed license file - ( Boris Zentner ) - * Update add more timezones to GeoIP_time_zone_by_country_and_region - ( Boris Zentner ) - * Add array access functions so programs can avoid accessing the - arrays directly which whould break binary compatability (Ludwig Nussel at SUSE) - * Updated README to state API is only thread-safe if GEOIP_CHECK_CACHE is not used - -1.4.4 2008-1-21 - * Updated original geoipupdate to return "Invalid product ID or subscription expired" - * Added BL/Saint Barthelemy, MF/Saint Martin (ISO-3166-1 additions) - * Check for illegal IP strings, return 0 if IP is not well formed IPv4 e.g. 1.2.3.4.5 and 1.2.3 - * Clarified that while core GeoIP library is LGPL, libGeoIPUpdate depends on md5.c and types.h which are GPL. - * speedup the conversion from ipstring to ipnum in _GeoIP_addr_to_num. Doubles the speed of GEOIP_MEMORY_CACHE and GEOIP_MMAP_CACHE - * Added new mmap shared memory caching option, GEOIP_MMAP_CACHE (Peter Shipley, LookSmart) - - mmaps: our maps are shared, but we need only private readonly pages - -1.4.3 2007-8-30 - ! CHANGE with geoiplookup facility: -v flag now returns database info for all databases, not just GeoIP Country - * Added ability to get netmask of network block from last lookup using GeoIP_last_netmask - * Fixed GeoIP_database_info bug with GeoLite City - * Replaced 4 with sizeof(char*) to fix issues with geoipupdate on 64 Bit machines - * Added GeoIP_set_charset function - enables UTF8 output of city name if GEOIP_CHARSET_UTF8 flag is passed - to GeoIP_set_charset - * Fixed segfault issue if calling GeoIP_db_avail before opening a database - * Added continent_code to GeoIP City's record struct (Frank Mather) - -1.4.2 2007-2-8 - * Added -d flag to enable custom path for geoipupdate utility program (Frank Mather) - * Replaced _WIN32 with WIN32 since WIN32 is already set by compilers - * Moved var definitions to top of code, defined size_t (Guenter Knauf) - * Added Makefile.win32, Makefile.netware, get_ver.awk, geoip.ico to EXTRA_DIST in Makefile.am (Guenter Knauf) - -1.4.1 2007-1-2 - * Replaced CS/Serbia and Montenegro with RS/Serbia, removed ZR/Zaire, added ME/Montenegro - * Added AX/Aland Islands, GG/Guernsey, IM/Isle of Man, JE/Jersey (ISO-3166-1 changes) - * Added GeoIP_time_zone_by_country_and_region, to lookup zoneinfo timezone by country and region (Frank Mather) - * Added GeoIP_region_name_by_code, to lookup region name from region code (Frank Mather) - * added -f and -d flags to enable custom paths for geoiplookup utility program (Frank Mather) - * Added benchmarks for GeoIP Region and City in test/benchmark.c (Frank Mather) - * Fixed build issue when using --as-needed flag (Diego 'Flameeyes' Petten�) - * Add sanity checking for filename returned by MaxMind.com server for geoipupdate filename - (Dean Gaudet, arctic.org) - * Fixed memory leaks under error conditions, buffer overflow using sprintf, - and issue where a corrupted cache file could core dump the file - (Nick Galbreath, Right Media Inc) - -1.4.0 2006-8-7 - * Changed license from GPL to LGPL, so that PHP Extension can be included in PECL (Olivier Hill) - * Rewrote GEOIP_CHECK_CACHE code, fixed numerous bugs - - CheckCache now works if GeoIP file is overwriten by mv command - - Fixed bug where CheckCache kept reloading in GEOIP_STANDARD_MODE - - Fixed segfault issue in GEOIP_MEMORY_CACHE mode - - Fixed garbage data appearing in GEOIP_INDEX_CACHE mode - - Fixed realloc in case realloc returns new memory block (Andre Morozov of Stone Steps) - * Updated geoipupdate to print status messages for each database instead of just last database - * Check that gi is not null before running code in GeoIP_delete - * Fixed alpha-3 codes ordering, replaced TLS,TKM,TUN,TON with TKM,TUN,TON,TLS - * TP/East Timor changed to TL/Timor-Leste, reflecting changes in ISO-3166 - * Added Netware and Windows makefiles (Guenter Knauf) - * Fixed NetWare compiler issue with char block[block_size] declaration (Guenter Knauf) - * Updated geoipupdate example to run weekly - -1.3.17 2006-5-14 - * Fixed headers for Windows/Netware compilation (Guenter Knauf) - * Fixed Received Error -21 (Sanity check database_info string failed) - when running geoipupdate with GeoIP Country when UserId and - productIds were not specified. Bug was introduced in 1.3.15. - -1.3.16 2006-4-17 - * Fixed compliation error in GeoIPUpdate.c - -1.3.15 2006-4-14 - * Updated README documentation - * Updated geoipupdate so that it writes file as it is uncompressed instead - of storing entire GeoIP.dat file in memory (Frank Mather) - * Updated geoiplookup so that it returns GeoIP Domain Name if available - (Frank Mather) - * Updated geoipupdate so that it reports whether databases are updated - in non-verbose mode (Frank Mather) - -1.3.14 2005-9-7 - * Check if byte, ushort, ulong, u16, u32 are defined in configure - script. Fixes compilation issue on FreeBSD systems. - * Check for Big Endian byte order (needed for MD5 code in geoipupdate - to work properly on Mac OS X and other Big Endian processors) - * Fixed GEOIP_CHECK_CACHE mode when used with GEOIP_STANDARD to - only refresh upon file change - * Fixed memory leak when refreshing file in GEOIP_CHECK_CACHE mode - * Updated ltmain.sh to support Debian GNU/k*BSD bug #315425 (Marek Habersack) - * Added lookup functions using IP numeric representation as input (Frank Mather) - * Removed geoipexport - * Replaced Yugoslavia with Serbia and Montenegro - * Updated geoiplookup to only perform country lookup once instead of twice by using GeoIP_id_by_name - -1.3.13 2005-8-1 - * Fixed autoconf weirdness that resulted in libraries being - installed without .so suffix - -1.3.12 2005-7-19 - * Removed -lGeoIP from libGeoIPUpdate_la_LIBADD - fixes compilation error - if GeoIP isn't already installed (Thomas Steudten) - -1.3.11 2005-7-7 - * Fixed gcc warnings and bug. Use int - instead of char for checking the return value of getopt in geoipupdate.c. - Moved the internal functions to GeoIP_internal.h to get rid - of those 'implicit declaration' warnings. (Ludwig Nussel/SUSE) - * Cleaned up name space by prefixing internal functions with - _GeoIP* (Ludwig Nussel/SUSE) - * Memory Leak fix for GeoIP City if fread error - * Added more verbose error messages for geoipupdate (Frank Mather) - * Added check for zlib.h to configure.in - -1.3.10 2005-4-17 - * Added types.h to Makefile.am - fixes compilation error - -1.3.9 2005-4-14 - * fixed bug with GEOIP_INDEX_CACHE (Frank Mather) - * fixed segfault issue if GeoIP.dat not found (Frank Mather) - * Updated MD5 checksum code to use GnuPG code which works - on 64bit machines (Frank Mather) - * Fixed memory leak in test-geoip-isp.c and test-geoip-org.c - * Added support for GeoIP Domain Names in geoipupdate - -1.3.8 2004-11-7 - * Updated geoipupdate to report invalid userID and productID errors - * Check if gethostbyname_r is version that returns int or is other version - - should fix compile errors on Solaris and FreeBSD - * Updated URL to get license key, userId, and product Ids in conf/GeoIP.conf.default - * Updated test case, removed www.asahi.com - * Added support for GEOIP_INDEX_CACHE - which just caches - the most frequently access index portion of the database, resulting - in faster lookups than GEOIP_STANDARD, but less memory usage than - GEOIP_MEMORY_CACHE (Frank Mather) - -1.3.7 2004-10-5 - * Updated test case, removed www.bundesregierung.de added www.asahi.com - -1.3.6 2004-8-8 - * Check for gethostbyname_r support in configure (Mac OS X doesn't support gethostbyname_r) - * Made GeoIP City code thread safe - * Fixed bug with geoipupdate reading in product ids - * Added support for GeoIP Netspeed geoipupdate - * Fix memleak in lookupaddress (Ludwig Nussel/SUSE) - * Add prototype for _full_path_to to make 64bit clean - (Ludwig Nussel/SUSE) - * Add return values to test programs (Ludwig Nussel/SUSE) - -1.3.5 2004-7-5 - * Added more documentation to README file - * Made GEOIP_CHECK_CACHE work with GEOIP_STANDARD mode - reloads filehandle - in case file changes. - * Added GeoIP_country_code_by_ipnum and GeoIP_id_by_ipnum to use - existing ulong IP Address in numeric form instead of having to - convert it to string (Boris Hajduk) - * Made code thread safe by replacing gethostbyname with gethostbyname_r - -1.3.4 2004-6-4 - * Fixed bug where *.gz file(s) didn't get removed after geoipupdate - -1.3.3 2004-6-2 - * Added support for NetSpeed lookup to geoiplookup - * inet_addr patch for 64 bit systems (Thomas Steudten) - * Added Support for automated downloads of GeoIP Region, City, ISP and Organization databases (Frank Mather) - * INADDR_NONE Patch for Solaris 9 (John Young) - -1.3.2 2004-4-20 - * Added support for Maxmind NetSpeed - -MinGW patch from Stanislaw Pusep - -I was re-compiling Geolizer (http://sysd.org/log.php#glzr) on Win32 so I firstly needed to put up-to-date Win32 compatibility of libGeoIP itself. Fortunately MinGW plataform evolved a lot since last time I used it to compile libGeoIP. I'm sending you the patch with changes required for libGeoIP to work on both Win32 and UN*X. UN*X behavior is unaffected. Now, detailed explanation of what I did at all: -1) Made correct header imports for both Win32 and UN*X. UN*X imports netdb.h & netinet/in.h and Win32 imports windows.h & winsock.h -2) Win32 gethostbyname() is only able to resolve hostnames, it can't convert "127.0.0.1" string to 32-bit IP address. Thus I added lookupaddress() function that safely resolves any string to IP address and replaced all gethostbyname() calls by it. -3) Database files were referenced by pre-compiled static strings. I malloc()ed buffers for file names so they can be changed "on fly". Thus, on Win32 version GeoIP.dat & other files are being seeked in the same directory as executable file or library. -4) Added README.MinGW file with brief explanation on how to get GeoIP working under MinGW system. - -1.3.1 2003-11-11 - * Check for stdint.h in autoconf (Sean Chittenden) - * prevent the geoipupdate man page from trying to install itself directly in the system directory (Gyepi Sam) - -1.3.0 2003-09-29 - * Fixed includes to compile on Windows (Fabrice Colin) - * Removed the _addr_to_num() calls from GeoIP_*_by_name() - * _seek_record() optimizations (Maurice Cinquini) - �1) Use a single buf ptr inside the loops. - ��� Set to the stack buffer or the cached memory the start of the function. - �2) Unroll the i=0,1 loop to allow constant folding. - �3) Unroll the j loop for the common case of j = STANDARD_RECORD_LENGTH - ��� (I've already done the above changes see attached function.) - ��� With gcc -O2 calculating x[0] and x[1] for STANDARD_RECORD_LENGTH now - ��� only takes 15 (was > 100) i80x86 instructions with 6 byte accesses of RAM. 4) only calculate x[0], x[1] when needed, may be a bigger win - than the above since all the other optimizations above only reduced - CPU instructions operating on CPU cached RAM. - ! IMPORTANT API Change: Changed GeoIPRegion to have region in structure. Saves space and a malloc. - Since GeoIPRegion.region is no longer a pointer but an in-structure - array so test the first byte of region == 0 rather testing if the region - pointer is NULL. (Maurice Cinquini) - * Added GeoIP_assign_region_by_inetaddr which doesn't do any mallocs and made all other region APIs go thru it (Maurice Cinquini) - * Replaced _h_addr_to_num() with ntohl() and removed _h_addr_to_num() (Maurice Cinquini) - * Fixed bug when IP address not found in region rev1 database (Jason Linhart) - * Added added extern "C" to GeoIPCity.h fixes problems when included in C++ library - -1.2.2 2003-08-10 - * Added support for GeoIP ISP Edition identifier - * Fixed bug in GeoIP_database_info (Jason Linhart) - * Added support for GeoIP AS Number Edition - ! renamed GeoIP_org_by_* functions to GeoIP_name_by_* to reduce confusion - since these functions are used by GeoIP ISP and GeoIP ASNum as well - as GeoIP Organization - * Added support for GeoIP Proxy Edition - ! renamed GeoIP_country_id_by_* functions to GeoIP_id_by_* - -1.2.1 2003-07-12 - * Added GeoIP_record_id_by_addr and GeoIP_next_record functions - * Added support for new GeoIP Region format, including Canadian Provinces - -1.2.0 2003-04-26 - * Added support for GeoIP City format revision 1, including dma code and area code - * geoiplookup returns results from GeoIP Region, City, ISP and Organization databases - * Standardized location for GeoIP Region, City, ISP and Organization databases - * Added GeoIP_open_type to open database from default location for other dbs besides country - * Added check to make sure that the appropriate database is loaded for each lookup method - * Updated update code to check for first 12 characters of license key - * Added GeoIP_country_continent array to lookup continent by country ID - -1.1.9 2003-03-10 - * merged windows patch into main code base (Kenneth R. Robinette) - * Changed const int to #define for windows compatibility - -1.1.8 2003-03-04 - * Fixed bug with city database introduced in 1.1.6 - -1.1.7 2003-03-04 - * Fixed bug introduced in 1.1.6 when run in GEOIP_STANDARD mode - * Added test to test GEOIP_STANDARD - -1.1.6 2003-03-03 - * Added spec for building RPMs (Ryan Weaver) - * Added support for 4byte records for Organization database - * Changed Taiwan, Province of China to Taiwan - -1.1.5 2003-02-10 - * Added support for GeoIP Organization database - -1.1.4 2002-12-30 - * Cast number to int in _num_to_addr in geoipexport (Ralf S. Engelschall) - * Removed printf debug statements from geoipexport - * correct library build ordering (Ralf S. Engelschall) - * ulong -> unsigned long (Sean Chittenden) - -1.1.3 2002-12-24 - * Added GeoIPUpdate.h to EXTRA_DISTS - * Compile fixes for Solaris, FreeBSD (Michael McClennen, Corris Randall) - * Handle NULL in printf in test-geoip-region - -1.1.2 2002-12-16 - * Added support for postal codes - * Added geoipexport, program to export bit binary file to - binary tree format and csv format - * Split update code into separate library, GeoIPUpdate.la - * Allow passing NULL callback to GeoIP_update_database function - (Sean Chittenden) - * Added geoipexport program, exports to CSV file - * Added GeoIP_database_edition method - * Changed DATADIR to GEOIPDATADIR - -1.1.1 2002-11-07 - * Fixed segfault issue with GeoIPRegion_delete - * Handle test failures where lookup returns NULL more gracefully - -1.1.0 2002-11-06 - * Perform sanity checking before installing datebase using geoipupdate - * Removed file locking, since we install file by renaming instead of writing to it. - * Fixed geoipupdate to check for NULL return value - * Added constants for different editions - * Added O1 code for "Other country", used in per-country city editions - * fixed multi-line string literals warning in test-geoip.c - * Use enum constants for GeoIP_update_database values - * Added GEOIP_CHECK_CACHE option (not working yet) - -1.0.10 2002-10-28 - * IMPORTANT API Change - Return NULL instead of '--' and 'N/A' - Be sure to check the return value for NULL to avoid segmentation faults!!!! - * Added callback to print messages from GeoIP_update_database - * Moved GeoIPConfFile to geoipupdate.c - * Changed databaseSegments to unsigned int (Chris Gibbs) - * Fixed compiler warnings (Chris Gibbs) - * API Change - GeoIPRegion region member set to NULL when no region available - * Change short int to int (Chris Gibbs) - * Added write/read file locking for GeoIPUpdate.c/GeoIP.c - -1.0.9 2002-10-16 - * removed -ansi from Makefile.am to avoid compile error on Solaris 8 - * Compile fix for FreeBSD Stable (Kimura Fuyuki) - -1.0.8 2002-10-05 - * Included header required for *BSD (Akinori Musha) - -1.0.7 2002-10-05 - * Fixed compilation error with GeoIPUpdate.c - -1.0.6 2002-10-04 - * Moved update code into separate file - * Added md5 checksums to update code - * Fixed memory leak when running geoiplookup -v - * Moved const RECORD_LENGTH to #define RECORD_LENGTH for Windows compatibility - (Randy Kobes) - * Cleaned up GeoIP_new code - -1.0.5 2002-09-23 - * Supports GeoIP Regional Edition - * Macau is now "Macao" per ISO 3166-1 change - * Romania "ROM" is now "ROU" per ISO 3166-1 change - * Added #define for memcpy -> BSD's bcopy (Chris Gibbs) - * Removed "private" functions from GeoIP.h - -1.0.4 2002-08-27 - * rewrote _seek_country to use loop instead of recursion for faster performance - * Removed "orphan" nodes from demo database resulting in smaller size (Jason Linhart) - * Moved changes for building windows DLL into separate patch - * Fixed segfaults when passed malformed IP addresses - -1.0.3 2002-08-26 - * Added more changes for windows compatibility - (Stanislaw Pusep) - * Added benchmark program - -1.0.2 2002-08-21 - * Open database using "rb" for windows compatibility - (Stanislaw Pusep) - * Removed superfluous inet_ntop command (Stanislaw Pusep) - -1.0.1 2002-08-20 - * Fixed bug with resolving hostnames - * More fixes for compiler warnings (Chris Gibbs) - * Changed int to unsigned int in _is_ipaddr (Chris Gibbs) - -1.0.0 2002-08-12 - * Changed license to GPL - * Don't perform Reverse DNS lookups on IP addresses - * Only include getopt.h on Linux (OpenPKG patch) - * Avoid the_license_key_str warning (OpenPKG patch) - * Added license for March 2002 database - -0.3.0 2002-08-04 - * Added support for 'A2', Satellite Providers - -0.2.8 2002-07-30 - * Handle malformed input gracefully - * Added section to README on Solaris workarounds - * Added geoipupdate man page - -0.2.7 2002-07-27 - * Added section to README on automatic updates - * link to socket library on solaris - -0.2.6 2002-07-25 - * optimized GeoIP_open (Chris Gibbs) - * check for partial file read in GeoIP_open (Chris Gibbs) - * optimized _addr_to_num() (Chris Gibbs) - * changed write and read to send and recv for sockets - * Only install GeoIP.conf and GeoIP.dat if not already installed - -0.2.5 2002-07-22 - * Added verbose option to GeoIP_update_database - -0.2.4 2002-07-22 - * Fix for GeoIP_update_database - -0.2.3 2002-07-22 - * Fixes for FreeBSD - * All calls to malloc are checked for NULL pointer (Chris Gibbs) - * Fixed spelling of "Kazakhstan" (Chris Gibbs) - * Initialize cache_buf to NULL (Chris Gibbs) - * More memory leak fixes (Chris Gibbs) - -0.2.2 2002-07-18 - * Added update database function - * Fixed memory leak in GeoIP_new (Chris Gibbs) - -0.2.1 2002-07-03 - * Added support for anonymous proxies - -0.2.0 2002-06-23 - * Added new memory caching option for improved performance - -0.1.7 2002-05-29 - * Only add -lnsl for systems that support libnsl - * Added decl for 3 letter country code array to GeoIP.h - -0.1.6 2002-05-25 - * Added 3 letter country code - -0.1.5 2002-05-23 - * Added -lnsl fixed compile errors - -0.1.4 2002-05-11 - * Fixed bugs in demo March 2002 database - -0.1.3 2002-04-21 - * Fixed bug related to signed int (Brian Grossman) - * Better error handling when hostname not found - * Fixed bug when netmask=32 for netblock - -0.1.2 2002-04-20 - * Added two new functions, GeoIP_country_id_by_addr - and GeoIP_country_id_by_name. - * Made GeoIP_country_code and GeoIP_country_name - viewable outside of library, to be with with - GeoIP_country_id_by_* functions. - -0.1.1 2002-04-07 - * GeoIP.h is now installed to includedir - * constructor and destructor are now provided by - GeoIP_new, GeoIP_open, and GeoIP_delete - -0.1.0 2002-04-07 - * Initial release diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in b/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in deleted file mode 100644 index 072cd1f5..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIP.spec.in +++ /dev/null @@ -1,80 +0,0 @@ -Name: @PACKAGE@ -Version: @VERSION@ -Summary: GeoIP is a C library finds the location of an IP address. -Release: 1 -Group: System Environment/Libraries -URL: http://www.maxmind.com/app/c -Vendor: MaxMind LLC -Source0: http://www.maxmind.com/download/geoip/api/c/GeoIP-%{version}.tar.gz -License: GPL -BuildRoot: %{_tmppath}/%{name}-%{version}-root - -%description -GeoIP is a C library that enables the user to find geographical and -network information of an IP address. -Included is a free GeoLite Country database -that is updated at the beginning of every month. -To download the latest free GeoLite Country database, go to: -http://www.maxmind.com/app/geoip_country - -There is also a free city-level geolocation database, GeoLite City, -available from: -http://www.maxmind.com/app/geolitecity - -%package devel -Summary: GeoIP headers, libraries -Group: Development/Libraries -Requires: %name = %{version} - -%description devel -This package contain the devel files for GeoIP. - -%prep -%setup -q - -%build -%configure -make -make check - -%install -[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT -%makeinstall -# Fixup permissions on shared libraries so that findreqs will work right. -chmod 755 $RPM_BUILD_ROOT/%{_libdir}/* - -%clean -[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT - -%post -p /sbin/ldconfig - -%postun -p /sbin/ldconfig - -%files -%defattr(-,root,root) -%doc AUTHORS COPYING ChangeLog README TODO -%attr(0755,root,root) %{_libdir}/*.so.*.* -%{_bindir}/* -%{_sysconfdir}/* -%dir %{_datadir}/GeoIP -%{_datadir}/GeoIP/* -%{_libdir}/*.so -%{_mandir}/*/* - -%files devel -%{_includedir}/* -%{_libdir}/*.a -%{_libdir}/*.la - -%changelog -* Fri Apr 14 2006 Thomas Mather <tjmather@maxmind.com> -- Updated description to reference free GeoLite City database - -* Thu Jul 7 2005 Thomas Mather <tjmather@maxmind.com> -- Updated description to reflect monthly updates for free country database. - -* Mon Sep 8 2003 Dr. Peter Bieringer -- Fix for RHL 9, created a new devel package definition. - -* Thu Feb 27 2003 Ryan Weaver <ryanw@falsehope.com> -- Initial RPM Build diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch b/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch deleted file mode 100644 index 98119fc2..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/GeoIPWinDLL.patch +++ /dev/null @@ -1,183 +0,0 @@ -Index: GeoIP.c -=================================================================== -RCS file: /home/maxmind/geoip/c/libGeoIP/GeoIP.c,v -retrieving revision 1.32 -retrieving revision 1.33 -diff -u -r1.32 -r1.33 ---- GeoIP.c 25 Aug 2002 22:42:48 -0000 1.32 -+++ GeoIP.c 27 Aug 2002 06:50:02 -0000 1.33 -@@ -23,16 +23,24 @@ - #include <stdio.h> - #include <stdlib.h> - #include <string.h> -+#ifndef _WIN32 - #include <netdb.h> -+#endif /* _WIN32 */ - #include <assert.h> - #include <sys/types.h> /* for fstat */ - #include <sys/stat.h> /* for fstat */ - #include "zlib.h" - #include "time.h" - -+#ifndef _WIN32 -+#include <unistd.h> - #include <netinet/in.h> - #include <arpa/inet.h> - #include <sys/socket.h> -+#else -+#include <io.h> -+#include <windows.h> -+#endif /* _WIN32 */ - - #define COUNTRY_BEGIN 16776960; - const int RECORD_LENGTH = 3; -@@ -57,9 +65,66 @@ - const char *GeoIPUpdateHost = "updates.maxmind.com"; - const char *GeoIPHTTPRequest = "GET /app/update?license_key=%s HTTP/1.0\nHost: updates.maxmind.com\n\n"; - -+#ifdef _WIN32 -+char * _dat_in_module_path () { -+ HMODULE GeoIPdll; -+ struct _stat st; -+ int i; -+ char * buf; -+ -+ buf = (char *) malloc(MAX_PATH); -+ -+ GeoIPdll = GetModuleHandle("GeoIP.dll"); -+ if (!GeoIPdll) -+ { -+ GeoIPdll = GetModuleHandle(NULL); -+ if (!GeoIPdll) -+ return NULL; -+ } -+ GetModuleFileName(GeoIPdll, buf, MAX_PATH); -+ for (i = strlen(buf); (i >= 0) && (buf[i] != '\\'); i--); -+ if (i) -+ { -+ buf[i] = '\0'; -+ strcat(buf, "\\"); -+ strcat(buf, GeoIPDBFileName); -+ if (_stat(buf, &st) == 0) -+ return buf; -+ } -+ -+ free(buf); -+ return NULL; -+} -+ -+char * _dat_path_in_regkey () { -+ DWORD lpdwDisposition, type, size = MAX_PATH; -+ HKEY hkGeoIP; -+ char * buf, * filename; -+ -+ buf = (char *) malloc(MAX_PATH); -+ filename = (char *) malloc(MAX_PATH); -+ -+ if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\MaxMind\\GeoIP", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkGeoIP, &lpdwDisposition) != ERROR_SUCCESS) -+ return NULL; -+ if (RegQueryValueEx(hkGeoIP, "DATADIR", 0, &type, buf, &size) != ERROR_SUCCESS) -+ strcpy(buf, "%SystemRoot%\\SYSTEM32"); -+ if (RegSetValueEx(hkGeoIP, "DATADIR", 0, REG_EXPAND_SZ, buf, strlen(buf)) != ERROR_SUCCESS) -+ return NULL; -+ ExpandEnvironmentStrings(buf, filename, MAX_PATH); -+ -+ free(buf); -+ strcat(filename, "\\"); -+ strcat(filename, GeoIPDBFileName); -+ -+ return filename; -+} -+#endif /* _WIN32 */ -+ - GeoIP* GeoIP_new (int flags) { - char * filename; - GeoIP * gi; -+ -+#ifndef _WIN32 - filename = malloc(sizeof(char) * (strlen(DATADIR)+strlen(GeoIPDBFileName)+2)); - if (filename == NULL) - return NULL; -@@ -67,6 +132,17 @@ - strcat(filename, DATADIR); - strcat(filename, "/"); - strcat(filename, GeoIPDBFileName); -+#else -+ filename = _dat_in_module_path(); -+ if (filename == NULL) -+ filename = _dat_path_in_regkey(); -+ if (filename == NULL) -+ { -+ fprintf(stderr,"Unable to query registry for database location\n"); -+ return NULL; -+ } -+#endif /* _WIN32 */ -+ - gi = GeoIP_open (filename, flags); - free(filename); - return gi; -@@ -96,7 +172,7 @@ - } - gi->cache = (unsigned char *) malloc(sizeof(unsigned char) * buf.st_size); - if (gi->cache != NULL) { -- if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != buf.st_size) { -+ if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (unsigned) buf.st_size) { - fprintf(stderr,"Error reading file %s\n",filename); - free(gi->cache); - free(gi); -Index: GeoIP.h -=================================================================== -RCS file: /home/maxmind/geoip/c/libGeoIP/GeoIP.h,v -retrieving revision 1.19 -retrieving revision 1.20 -diff -u -r1.19 -r1.20 ---- GeoIP.h 20 Aug 2002 00:52:00 -0000 1.19 -+++ GeoIP.h 27 Aug 2002 06:50:02 -0000 1.20 -@@ -45,25 +45,31 @@ - extern const char * GeoIP_country_name[246]; - extern const char * GeoIPConfFile; - --GeoIP* GeoIP_new(int flags); --GeoIP* GeoIP_open(char * filename, int flags); --void GeoIP_delete(GeoIP* gi); --const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr); --const char *GeoIP_country_code_by_name (GeoIP* gi, const char *host); --const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr); --const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *host); --const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr); --const char *GeoIP_country_name_by_name (GeoIP* gi, const char *host); --short int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr); --short int GeoIP_country_id_by_name (GeoIP* gi, const char *host); -+#ifdef _WIN32 -+#define GEOIP_API __declspec(dllexport) -+#else -+#define GEOIP_API -+#endif /* _WIN32 */ - --char *GeoIP_database_info (GeoIP* gi); --short int GeoIP_update_database (GeoIP* gi, char * license_key, int verbose); -+GEOIP_API GeoIP* GeoIP_new(int flags); -+GEOIP_API GeoIP* GeoIP_open(char * filename, int flags); -+GEOIP_API void GeoIP_delete(GeoIP* gi); -+GEOIP_API const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr); -+GEOIP_API const char *GeoIP_country_code_by_name (GeoIP* gi, const char *host); -+GEOIP_API const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr); -+GEOIP_API const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *host); -+GEOIP_API const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr); -+GEOIP_API const char *GeoIP_country_name_by_name (GeoIP* gi, const char *host); -+GEOIP_API short int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr); -+GEOIP_API short int GeoIP_country_id_by_name (GeoIP* gi, const char *host); - --int _seek_country (GeoIP* gi, const int offset, unsigned long ipnum, int depth); --unsigned long _addr_to_num (const char *addr); --unsigned long _h_addr_to_num (unsigned char *addr); --short int _is_ipaddr (const char *name); -+GEOIP_API char *GeoIP_database_info (GeoIP* gi); -+GEOIP_API short int GeoIP_update_database (GeoIP* gi, char * license_key, int verbose); -+ -+GEOIP_API int _seek_country (GeoIP* gi, const int offset, unsigned long ipnum, int depth); -+GEOIP_API unsigned long _addr_to_num (const char *addr); -+GEOIP_API unsigned long _h_addr_to_num (unsigned char *addr); - - #ifdef __cplusplus - } diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL b/Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL deleted file mode 100644 index 7d1c323b..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/INSTALL +++ /dev/null @@ -1,365 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006, 2007, 2008, 2009 Free Software Foundation, Inc. - - Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. This file is offered as-is, -without warranty of any kind. - -Basic Installation -================== - - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `<wchar.h>' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am deleted file mode 100644 index bd4da3a3..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -INCLUDES = -Wall -ansi - -SUBDIRS = \ - libGeoIP \ - apps \ - conf \ - data \ - test \ - man - -EXTRA_DIST = README.OSX READMEwin32static.txt README.MinGW READMEwin32.txt GeoIPWinDLL.patch TODO bootstrap GeoIP.spec GeoIP.spec.in Makefile.netware Makefile.vc Makefile.win32 get_ver.awk geoip.ico diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in deleted file mode 100644 index c2a5d3f5..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.in +++ /dev/null @@ -1,707 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = . -DIST_COMMON = README $(am__configure_deps) $(srcdir)/GeoIP.spec.in \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ - TODO config.guess config.sub depcomp install-sh ltmain.sh \ - missing -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = GeoIP.spec -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir dist dist-all distcheck -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - { test ! -d "$(distdir)" \ - || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr "$(distdir)"; }; } -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -distuninstallcheck_listfiles = find . -type f -print -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -INCLUDES = -Wall -ansi -SUBDIRS = \ - libGeoIP \ - apps \ - conf \ - data \ - test \ - man - -EXTRA_DIST = README.OSX READMEwin32static.txt README.MinGW READMEwin32.txt GeoIPWinDLL.patch TODO bootstrap GeoIP.spec GeoIP.spec.in Makefile.netware Makefile.vc Makefile.win32 get_ver.awk geoip.ico -all: all-recursive - -.SUFFIXES: -am--refresh: - @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ - $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: $(am__configure_deps) - $(am__cd) $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -$(am__aclocal_m4_deps): -GeoIP.spec: $(top_builddir)/config.status $(srcdir)/GeoIP.spec.in - cd $(top_builddir) && $(SHELL) ./config.status $@ - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool config.lt - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz - $(am__remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) - -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @$(am__cd) '$(distuninstallcheck_dir)' \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ - dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ - distcheck distclean distclean-generic distclean-libtool \ - distclean-tags distcleancheck distdir distuninstallcheck dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.netware b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.netware deleted file mode 100644 index 44a569de..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.netware +++ /dev/null @@ -1,301 +0,0 @@ -################################################################### -# -## Makefile for building GeoIP stuff (NetWare version - gnu make) -## To build the binaries you need awk, GNU make and gcc / nlmconv -## or Metrowerks CodeWarrior CommandlineTools. -## Usage: make -f Makefile.netware [all|dist|clean|distclean] -## -## hacked by: Guenter Knauf -# -################################################################### - -# Edit the path below to point to the base of your Novell NDK. -ifndef NDKBASE -NDKBASE = c:/novell -endif - -# Edit the path below to point to your zlib sources and libs. -ifndef ZLIBSDK -ZLIBSDK = d:/projects/cw/zlib-1.2.3 -endif - -ifndef DISTDIR -DISTDIR = GeoIP-$(GEOIP_VERSION_STR)-bin-nw -endif -ARCHIVE = $(DISTDIR).zip - -# Edit the vars below to change NLM target settings. -TARGETS := $(patsubst apps/%.c,%.nlm,$(wildcard apps/*.c)) -DESCR = $(subst .def,,$(notdir $@)) $(GEOIP_VERSION_STR) -COMPANY = MaxMind LLC -COPYR = Copyright (C) 2003-2006 MaxMind LLC All Rights Reserved. -WWWURL = http://www.maxmind.com/app/c -MTSAFE = YES -STACK = 64000 -#SCREEN = none -DATADIR = sys:/etc/GeoIP -CONFDIR = sys:/etc - -# Comment the line below if you dont want to link with the static libz.lib. -LSTATIC = 1 - -# Edit the var below to point to your lib architecture. -ifndef LIBARCH -LIBARCH = LIBC -endif - -# must be equal to DEBUG or NDEBUG -DB = NDEBUG -# DB = DEBUG -# Optimization: -O<n> or debugging: -g -ifeq ($(DB),NDEBUG) - OPT = -O2 - OBJDIR = release -else - OPT = -g - OBJDIR = debug -endif -OBJLIB = lib-$(OBJDIR) - -# Include the version info retrieved from header. --include $(OBJDIR)/version.inc - -# Global tools and toolflags used with all compilers. -ZIP = zip -qzR9 -CP = cp -afv -MV = mv -fv -# RM = rm -f -# if you want to mark the target as MTSAFE you will need a tool for -# generating the xdc data for the linker; here's a minimal tool: -# http://www.gknw.com/development/prgtools/mkxdc.zip -MPKXDC = mkxdc - -# The following line defines your compiler. -ifdef METROWERKS - CC = mwccnlm -else - CC = gcc -endif - -# Global flags for all compilers -CFLAGS = $(OPT) -D$(DB) -DNETWARE -nostdinc -CFLAGS += -DGEOIPDATADIR=\"$(DATADIR)\" -CFLAGS += -DSYSCONFDIR=\"$(CONFDIR)\" - -ifeq ($(CC),mwccnlm) -LD = mwldnlm -LDFLAGS = -nostdlib $(PRELUDE) $(LDLIBS) $(LIBOBJS) $(OBJDIR)/$(basename $@).o -o $@ -commandfile -AR = mwldnlm -ARFLAGS = -type library -w nocmdline $(OBJDIR)/*.o -o -LIBEXT = lib -CFLAGS += -msgstyle gcc -gccinc -opt nointrinsics -proc 586 -CFLAGS += -relax_pointers -#CFLAGS += -w on -ifeq ($(LIBARCH),LIBC) - PRELUDE = $(SDK_LIBC)/imports/libcpre.o - CFLAGS += -align 4 -else - PRELUDE = "$(METROWERKS)/Novell Support/Libraries/runtime/prelude.obj" -# CFLAGS += -include "$(METROWERKS)/Novell Support/Headers/nlm_prefix.h" - CFLAGS += -align 1 -endif -else -LD = nlmconv -LDFLAGS = -T -AR = ar -ARFLAGS = -cq -LIBEXT = lib -CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing -CFLAGS += -Wall -Wno-unused #-Wno-format # -pedantic -ifeq ($(LIBARCH),LIBC) - PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o -else - PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o - CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h -endif -endif -DESCR += ($(LIBARCH)) - $(CC) build - -NDK_ROOT = $(NDKBASE)/ndk -SDK_CLIB = $(NDK_ROOT)/nwsdk -SDK_LIBC = $(NDK_ROOT)/libc - -ifeq ($(LIBARCH),LIBC) - INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks - # INCLUDES += -I$(SDK_LIBC)/include/winsock - CFLAGS += -D_POSIX_SOURCE - # CFLAGS += -D__ANSIC__ -else - INCLUDES += -I$(SDK_CLIB)/include/nlm -I$(SDK_CLIB)/include - # INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete - CFLAGS += -DNETDB_USE_INTERNET -endif - -INCLUDES += -I./libGeoIP -INCLUDES += -I$(ZLIBSDK) -CFLAGS += $(INCLUDES) - -ifeq ($(MTSAFE),YES) - XDCOPT = -n -endif -ifeq ($(MTSAFE),NO) - XDCOPT = -u -endif - -LIBPATH += -L$(ZLIBSDK)/nw/release -ifdef LSTATIC - LDLIBS += $(ZLIBSDK)/nw/release/libz.$(LIBEXT) -else - IMPORTS += @$(ZLIBSDK)/nw/release/libz.imp - MODULES += libz -endif - -ifeq ($(findstring linux,$(OSTYPE)),linux) -DL = ' -#-include $(NDKBASE)/nlmconv/ncpfs.inc -endif - -vpath %.c ./apps ./libGeoIP - -LIBOBJS = $(OBJLIB)/GeoIP.o $(OBJLIB)/GeoIPCity.o -UPDOBJS = $(OBJLIB)/GeoIPUpdate.o $(OBJLIB)/md5.o -LIBOBJS += $(UPDOBJS) - -.PRECIOUS: $(OBJLIB)/%.o $(OBJDIR)/%.o $(OBJDIR)/%.def - - -all: prebuild $(TARGETS) - -prebuild: $(OBJLIB) $(OBJDIR) $(OBJDIR)/version.inc - -dist: $(DISTDIR) all $(DISTDIR)/readme_bin.txt - @$(CP) *.nlm $(DISTDIR) - @$(CP) Changelog $(DISTDIR) - @$(CP) README $(DISTDIR) - @$(CP) conf/GeoIP.conf.default $(DISTDIR) - @$(CP) data/GeoIP.dat $(DISTDIR) - @echo Creating $(ARCHIVE) - @$(ZIP) $(ARCHIVE) $(DISTDIR)/* < $(DISTDIR)/readme_bin.txt - -clean: - -$(RM) -r $(OBJDIR) $(OBJLIB) - -$(RM) $(TARGETS) - -distclean: - -$(RM) -r $(DISTDIR) - -$(RM) $(ARCHIVE) - -%.nlm: $(OBJDIR)/%.def $(LIBOBJS) $(OBJDIR)/%.o $(OBJDIR)/%.xdc - @echo Linking $@ - @-$(RM) $@ - @$(LD) $(LDFLAGS) $< - -$(DISTDIR): - @mkdir $@ - -$(OBJDIR): - @mkdir $@ - -$(OBJLIB): - @mkdir $@ - -$(OBJDIR)/%.o: %.c -# @echo Compiling $< - $(CC) $(CFLAGS) -c $< -o $@ - -$(OBJLIB)/%.o: %.c -# @echo Compiling $< - $(CC) $(CFLAGS) -c $< -o $@ - -$(OBJDIR)/version.inc: configure.in $(OBJDIR) - @echo Creating $@ - @awk -f get_ver.awk $< > $@ - -$(OBJDIR)/%.xdc: Makefile.netware - @echo Creating $@ - @$(MPKXDC) $(XDCOPT) $@ - -$(OBJDIR)/%.def: Makefile.netware - @echo Creating $@ - @echo $(DL)# DEF file for linking with $(LD)$(DL) > $@ - @echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@ - @echo $(DL)# All your changes will be lost!!$(DL) >> $@ - @echo $(DL)#$(DL) >> $@ - @echo $(DL)copyright "$(COPYR)"$(DL) >> $@ - @echo $(DL)description "$(DESCR)"$(DL) >> $@ - @echo $(DL)version $(GEOIP_VERSION)$(DL) >> $@ -ifdef NLMTYPE - @echo $(DL)type $(NLMTYPE)$(DL) >> $@ -endif -ifdef STACK - @echo $(DL)stack $(STACK)$(DL) >> $@ -endif -ifdef SCREEN - @echo $(DL)screenname "$(SCREEN)"$(DL) >> $@ -else - @echo $(DL)screenname "DEFAULT"$(DL) >> $@ -endif -ifeq ($(DB),DEBUG) - @echo $(DL)debug$(DL) >> $@ -endif - @echo $(DL)threadname "$(subst .def,,$(notdir $@))"$(DL) >> $@ -ifdef XDCOPT - @echo $(DL)xdcdata $(@:.def=.xdc)$(DL) >> $@ -endif -ifeq ($(LDRING),0) - @echo $(DL)flag_on 16$(DL) >> $@ -endif -ifeq ($(LDRING),3) - @echo $(DL)flag_on 512$(DL) >> $@ -endif -ifeq ($(LIBARCH),CLIB) - @echo $(DL)start _Prelude$(DL) >> $@ - @echo $(DL)exit _Stop$(DL) >> $@ - @echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@ - @echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@ - @echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@ - @echo $(DL)module clib$(DL) >> $@ -else - @echo $(DL)flag_on 64$(DL) >> $@ - @echo $(DL)pseudopreemption$(DL) >> $@ - @echo $(DL)start _LibCPrelude$(DL) >> $@ - @echo $(DL)exit _LibCPostlude$(DL) >> $@ - @echo $(DL)check _LibCCheckUnload$(DL) >> $@ - @echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@ - @echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@ - @echo $(DL)module libc$(DL) >> $@ -endif -ifdef MODULES - @echo $(DL)module $(MODULES)$(DL) >> $@ -endif -ifdef EXPORTS - @echo $(DL)export $(EXPORTS)$(DL) >> $@ -endif -ifdef IMPORTS - @echo $(DL)import $(IMPORTS)$(DL) >> $@ -endif -ifeq ($(LD),nlmconv) -ifdef LDLIBS - @echo $(DL)input $(LDLIBS)$(DL) >> $@ -endif - @echo $(DL)input $(PRELUDE)$(DL) >> $@ - @echo $(DL)input $(LIBOBJS)$(DL) >> $@ - @echo $(DL)input $(@:.def=.o)$(DL) >> $@ - @echo $(DL)output $(notdir $(@:.def=.nlm))$(DL) >> $@ -endif - -$(DISTDIR)/readme_bin.txt: Makefile.netware - @echo Creating $@ - @echo $(DL)This is a binary distribution for NetWare platform.$(DL) > $@ - @echo $(DL)GeoIP version $(GEOIP_VERSION_STR)$(DL) >> $@ -ifndef LSTATIC - @echo $(DL)These binaries depend on libz.nlm in the search path!$(DL) >> $@ -endif - @echo $(DL)Please download the complete GeoIP package for$(DL) >> $@ - @echo $(DL)any further documentation:$(DL) >> $@ - @echo $(DL)$(WWWURL)$(DL) >> $@ - -info: - @echo Targets to build: $(TARGETS) - - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc deleted file mode 100644 index bd575955..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.vc +++ /dev/null @@ -1,84 +0,0 @@ -#NMAKE makefile for Windows developers. -#Produces a static library (GeoIP.lib). - -################################################################# -# configuration section -################################################################ - -# place to put the GeoIP.dat database file -# !!! Please keep the 2 \\ as directory separators !!! -# -GEOIPDATADIR="C:\\Windows\\SYSTEM32" -# -# System inc, lib, and bin directories -!ifndef INSTDIR -INSTDIR="C:\GeoIP-1.4.5" -!endif - -# Location where GeoIP.lib should be installed my "make install" -INSTALL_LIB=$(INSTDIR)\Lib - -#Location where .h files should be installed by "make install". -INSTALL_INC=$(INSTDIR)\Include - -#Location where programs should be installed by "make install". -INSTALL_BIN=$(INSTDIR)\Bin - -################################################################ -# end configuration section -################################################################ - -DATA_DIR=data - -DATA_FILE=GeoIP.dat - -LIB_DIR = libGeoIP - -TEST_DIR=test - -APP_DIR=apps - -GEOIP_LIB = GeoIP.lib - -APP_PROGRAMS = geoiplookup.exe - -TEST_PROGRAMS = benchmark.exe test-geoip.exe - -all: GeoIP.lib test_progs app_progs - -$(GEOIP_LIB): - cd $(LIB_DIR) - $(MAKE) -nologo -f Makefile.vc GEOIPDATADIR=$(GEOIPDATADIR) - cd .. - -test_progs: - cd $(TEST_DIR) - $(MAKE) -nologo -f Makefile.vc - cd .. - -app_progs: - cd $(APP_DIR) - $(MAKE) -nologo -f Makefile.vc - cd .. - -test: $(GEOIP_LIB) test_progs - cd $(TEST_DIR) - benchmark.exe - test-geoip.exe - cd .. - -install: $(GEOIP_LIB) app_progs - cd $(LIB_DIR) - copy $(GEOIP_LIB) $(INSTALL_LIB) - copy *.h $(INSTALL_INC) - cd ..\$(APP_DIR) - copy $(APP_PROGRAMS) $(INSTALL_BIN) - cd ..\$(DATA_DIR) - copy $(DATA_FILE) $(GEOIPDATADIR) - cd .. - -clean: - del $(LIB_DIR)\*.obj $(LIB_DIR)\*.lib \ - $(APP_DIR)\*.obj $(APP_DIR)\*.exe \ - $(TEST_DIR)\*.obj $(TEST_DIR)\*.exe - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 b/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 deleted file mode 100644 index a8902d67..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/Makefile.win32 +++ /dev/null @@ -1,232 +0,0 @@ -################################################################### -# -## Makefile for building GeoIP stuff (Win32 version - gnu make) -## To build the binaries you need awk, GNU make and MingW32 gcc -## or Metrowerks CodeWarrior CommandlineTools. -## Usage: make -f Makefile.win32 [all|dist|clean|distclean] -## -## hacked by: Guenter Knauf -# -################################################################### - -# Edit the path below to point to your zlib sources and libs. -ifndef ZLIBSDK -ZLIBSDK = d:/projects/mingw32/zlib-1.2.3 -endif - -ifndef DISTDIR -DISTDIR = GeoIP-$(GEOIP_VERSION_STR)-bin-w32 -endif -ARCHIVE = $(DISTDIR).zip - -# Edit the vars below to change EXE target settings. -TARGETS := $(patsubst apps/%.c,%.exe,$(wildcard apps/*.c)) -DESCR = $(subst .rc,,$(notdir $@)) $(GEOIP_VERSION_STR) -COMPANY = MaxMind LLC -COPYR = � 2003-2006 MaxMind LLC All Rights Reserved. -WWWURL = http://www.maxmind.com/app/c -LICENSE = Licensed under LGPL -ICON = geoip.ico -DATADIR = c:/GeoIP -CONFDIR = c:/GeoIP - -# Comment the line below if you dont want to link with the static libz.lib. -LSTATIC = 1 - -# must be equal to DEBUG or NDEBUG -DB = NDEBUG -# DB = DEBUG -# Optimization: -O<n> or debugging: -g -ifeq ($(DB),NDEBUG) - OPT = -O2 - OBJDIR = release -else - OPT = -g - OBJDIR = debug -endif -OBJLIB = lib-$(OBJDIR) - -# Include the version info retrieved from header. --include $(OBJDIR)/version.inc - -# Global tools and toolflags used with all compilers. -ZIP = zip -qzR9 -CP = cp -afv -MV = mv -fv -# RM = rm -f -RE = reimp -d -DLLTOOL = dlltool -DTFLAGS = -k - -# The following line defines your compiler. -ifdef METROWERKS - CC = mwcc -else - CC = gcc -endif - -# Global flags for all compilers -CFLAGS = $(OPT) -D$(DB) -D_WIN32 -# -nostdinc -CFLAGS += -DHAVE_STDINT_H -CFLAGS += -DGEOIPDATADIR=\"$(DATADIR)\" -CFLAGS += -DSYSCONFDIR=\"$(CONFDIR)\" - -ifeq ($(CC),mwcc) -LD = mwld -LDFLAGS = -nostdlib -LIBPATH = -lr "$(METROWERKS)/MSL" -lr "$(METROWERKS)/Win32-x86 Support/Libraries" -CWLIBS = -lMSL_Runtime_x86.lib -lMSL_C_x86.lib -lMSL_Extras_x86.lib -LDLIBS = -lkernel32.lib -luser32.lib $(CWLIBS) -AR = mwld -ARFLAGS = -type library -w nocmdline $(OBJDIR)/*.o -o -LIBEXT = lib -RC = mwwinrc -CFLAGS += -nostdinc -CFLAGS += -msgstyle gcc -gccinc -opt nointrinsics -proc 586 -CFLAGS += -relax_pointers -#CFLAGS += -w on -CFLAGS += -ir "$(METROWERKS)/MSL" -ir "$(METROWERKS)/Win32-x86 Support/Headers" -else -LD = gcc -LDFLAGS = -s -AR = ar -ARFLAGS = -cq -LIBEXT = a -RC = windres -RCFLAGS = -I rc -O coff -i -CFLAGS += -Wall -Wno-unused # -Wno-format #-pedantic -endif - -INCLUDES += -I./libGeoIP -INCLUDES += -I$(ZLIBSDK) -CFLAGS += $(INCLUDES) - -LDLIBS += -lwsock32 -LIBPATH += -L$(ZLIBSDK) -ifdef LSTATIC - LDLIBS += -lz -else - LDLIBS += -lzdll -endif - -ifeq ($(findstring linux,$(OSTYPE)),linux) -DL = ' -#-include $(NDKBASE)/nlmconv/ncpfs.inc -endif - -vpath %.c ./apps ./libGeoIP - -LIBOBJS = $(OBJLIB)/GeoIP.o $(OBJLIB)/GeoIPCity.o -UPDOBJS = $(OBJLIB)/GeoIPUpdate.o $(OBJLIB)/md5.o -LIBOBJS += $(UPDOBJS) - -.PRECIOUS: $(OBJLIB)/%.o $(OBJDIR)/%.o $(OBJDIR)/%.rc - -all: prebuild $(TARGETS) - -prebuild: $(OBJLIB) $(OBJDIR) $(OBJDIR)/version.inc - -dist: $(DISTDIR) all $(DISTDIR)/readme_bin.txt - @$(CP) *.exe $(DISTDIR) - @$(CP) Changelog $(DISTDIR) - @$(CP) README $(DISTDIR) - @$(CP) conf/GeoIP.conf.default $(DISTDIR) - @$(CP) data/GeoIP.dat $(DISTDIR) - @echo Creating $(ARCHIVE) - @$(ZIP) $(ARCHIVE) $(DISTDIR)/* < $(DISTDIR)/readme_bin.txt - -clean: - -$(RM) -r $(OBJDIR) $(OBJLIB) - -$(RM) $(TARGETS) - -distclean: - -$(RM) -r $(DISTDIR) - -$(RM) $(ARCHIVE) - -%.exe: $(OBJDIR)/%.res $(LIBOBJS) $(OBJDIR)/%.o - @echo Linking $@ - @-$(RM) $@ - $(LD) $(LDFLAGS) -o $@ $^ $(LIBPATH) $(LDLIBS) -# $(LD) $(LDFLAGS) $(LIBPATH) $(LIBFILES) -o $@ $^ - -$(DISTDIR): - @mkdir $@ - -$(OBJDIR): - @mkdir $@ - -$(OBJLIB): - @mkdir $@ - -$(OBJDIR)/%.o: %.c -# @echo Compiling $< - $(CC) $(CFLAGS) -c $< -o $@ - -$(OBJLIB)/%.o: %.c -# @echo Compiling $< - $(CC) $(CFLAGS) -c $< -o $@ - -$(OBJDIR)/version.inc: configure.in $(OBJDIR) - @echo Creating $@ - @awk -f get_ver.awk $< > $@ - -$(OBJDIR)/%.res: $(OBJDIR)/%.rc - @echo Creating $@ - @$(RC) $(RCFLAGS) $< -o $@ - -$(OBJDIR)/%.rc: Makefile.win32 - @echo 1 VERSIONINFO > $@ - @echo FILEVERSION $(GEOIP_VERSION),0 >> $@ - @echo PRODUCTVERSION $(GEOIP_VERSION),0 >> $@ - @echo FILEFLAGSMASK 0x3fL >> $@ - @echo FILEOS 0x40004L >> $@ - @echo FILEFLAGS 0x0L >> $@ - @echo FILETYPE 0x1L >> $@ - @echo FILESUBTYPE 0x0L >> $@ - @echo BEGIN >> $@ - @echo BLOCK "StringFileInfo" >> $@ - @echo BEGIN >> $@ - @echo BLOCK "040904E4" >> $@ - @echo BEGIN >> $@ - @echo VALUE "LegalCopyright","$(COPYR)\0" >> $@ -ifdef COMPANY - @echo VALUE "CompanyName","$(COMPANY)\0" >> $@ -endif -ifdef LICENSE - @echo VALUE "License","$(LICENSE)\0" >> $@ -endif - @echo VALUE "ProductName","$(basename $(notdir $@))\0" >> $@ - @echo VALUE "ProductVersion","$(GEOIP_VERSION_STR)\0" >> $@ - @echo VALUE "FileDescription","$(DESCR)\0" >> $@ - @echo VALUE "FileVersion","$(GEOIP_VERSION_STR)\0" >> $@ - @echo VALUE "InternalName","$(basename $(notdir $@))\0" >> $@ - @echo VALUE "OriginalFilename","$(basename $(notdir $@)).exe\0" >> $@ - @echo VALUE "WWW","$(WWWURL)\0" >> $@ - @echo END >> $@ - @echo END >> $@ - @echo BLOCK "VarFileInfo" >> $@ - @echo BEGIN >> $@ - @echo VALUE "Translation", 0x409, 1252 >> $@ - @echo END >> $@ - @echo END >> $@ -ifdef ICON - @echo 10 ICON DISCARDABLE "$(ICON)" >> $@ -endif - -$(DISTDIR)/readme_bin.txt: Makefile.win32 - @echo Creating $@ - @echo $(DL)This is a binary distribution for Win32 platform.$(DL) > $@ - @echo $(DL)GeoIP version $(GEOIP_VERSION_STR)$(DL) >> $@ -ifndef LSTATIC - @echo $(DL)These binaries depend on zlib1.dll in the search path!$(DL) >> $@ -endif - @echo $(DL)Please download the complete GeoIP package for$(DL) >> $@ - @echo $(DL)any further documentation:$(DL) >> $@ - @echo $(DL)$(WWWURL)$(DL) >> $@ - -info: - @echo Targets to build: $(TARGETS) - - - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/NEWS b/Src/Plugins/DSP/sc_serv3/GeoIP/NEWS deleted file mode 100644 index e69de29b..00000000 diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/README b/Src/Plugins/DSP/sc_serv3/GeoIP/README deleted file mode 100644 index a1b67256..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/README +++ /dev/null @@ -1,208 +0,0 @@ - GeoIP 1.4.8 - ----------- - -*** Experimental IPv6 notice *** - -- the experimental IPv6 part of libGeoIP may change in the future. -- It is possible, that geoiplookup and geoiplookup6 will merged. - -*** - -The new perl script geoipupdate-pureperl.pl is a drop in replacement for -geoipupdate. Useful, if you like to customize, pre or postprocess new or -old databases. To archive the databases or signal apache whatever. -Another advantage is, that geoipupdate-pureperl.pl is able to handle proxy -requests even with authentication. - -IMPORTANT API Change for 1.3.x and above users for GeoIP Region database -GeoIPRegion.region is no longer a pointer but an in-structure -array so test the first byte of region == 0 rather testing if the region -pointer is NULL. - -IMPORTANT API Change for 1.1.x and above users - as of GeoIP 1.1.0 the -GeoIP_country_xxx_by_xxx functions return NULL if a country can not -be found (it used to return '--' or 'N/A'. Be sure to check the -return value for NULL, to avoid segmentation faults! - -GeoIP is a C library that enables the user to find geographical and -network information of an IP address. -Included is a free GeoLite Country database -that is updated at the beginning of every month. -To download the latest free GeoLite Country database, go to: -http://www.maxmind.com/app/geoip_country - -There is also a free city-level geolocation database, GeoLite City, -available from: -http://www.maxmind.com/app/geolitecity - -We also offer commercial GeoIP databases with greater accuracy and -additional network information, for more details, see: -http://www.maxmind.com/app/products - -As of version 1.4.5 geoipupdate can handle updates via HTTP Proxy Server. -If the environ variable http_proxy="http://proxy-host:port" is set. -The username:password (as in FTP URLs) is not supported! -Thanks to Andrew Droffner for the patch! - -As of version 1.3.6, the GeoIP C library is thread safe, as long as -GEOIP_CHECK_CACHE is not used. - -This module can be used to automatically select the geographically closest -mirror, to analyze your web server logs to determine the countries of your -visitors, for credit card fraud detection, and for software export controls. - -If you use GeoIP to block access from high risk countries in order -to reduce fraud or abuse, you should also block access from known -proxy servers. For more details, see: -http://www.maxmind.com/app/proxy - -To install, run: - -./configure -make -make check -make install - -The GeoIP C library relies on GNU make, not on BSD make - -MEMORY CACHING AND OTHER OPTIONS - -There are four options available: - -GEOIP_STANDARD - read database from filesystem, uses least memory. - -GEOIP_MEMORY_CACHE - load database into memory, faster performance - but uses more memory - -GEOIP_CHECK_CACHE - check for updated database. If database has been updated, - reload filehandle and/or memory cache. - -GEOIP_INDEX_CACHE - just cache - the most frequently accessed index portion of the database, resulting - in faster lookups than GEOIP_STANDARD, but less memory usage than - GEOIP_MEMORY_CACHE - useful for larger databases such as - GeoIP Organization and GeoIP City. Note, for GeoIP Country, Region - and Netspeed databases, GEOIP_INDEX_CACHE is equivalent to GEOIP_MEMORY_CACHE - -GEOIP_MMAP_CACHE - load database into mmap shared memory ( MMAP is not avail for WIN32 ) - -The options can be combined using bit operators. For example you can -use both GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE by calling: - - GeoIP_open("/path/to/GeoIP.dat", GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE); - -By default, the city name is returned in iso-8859-1 charset. To obtain the -city name in utf8 instead, run: - - GeoIP_set_charset(gi, GEOIP_CHARSET_UTF8); - -To get the netmask of the netblock of the last lookup, use GeoIP_last_netblock(gi). - -EXAMPLES - -See -test/ - test-geoip.c - test-geoip-region.c - test-geoip-city.c - test-geoip-isp.c - test-geoip-org.c - test-geoip-netspeed.c - -for examples of how to use the API. The test-geoip.c program works with both the GeoLite and -GeoIP Country databases. The test-geoip-city.c program works with both the GeoLite and -GeoIP City databases. The other example programs require the paid databases available -from http://www.maxmind.com/app/products - -AUTOMATIC UPDATES - -MaxMind offers a service where you can have your database updated -automically each week. For more details see: - -http://www.maxmind.com/app/license_key - -RESOURCES Mailinglists - -Please join the very low traffic mailinglists you are interested in. - -http://sourceforge.net/mail/?group_id=66844 - -Preformance Patches. - -Patrick McManus provide a patch to enhance the lookupspeed in MEMORY_CACHE mode. If you feel, that the current MEMORY_CACHE mode is to slow try the patch: - -http://sourceforge.net/mailarchive/forum.php?forum_name=geoip-c-discuss&max_rows=25&style=nested&viewmonth=200803 - -TROUBLESHOOTING - -If you run into trouble building your application with GeoIP support, try adding -fms-extensions to your CFLAGS. If you use Solaris and there C-Compiler use -features=extensions instead. These options enable unnamed union support and fix problems like: 'improper member use: dma_code' or 'GeoIPRecord' has no member named 'dma_code'. - -Note that it is recommended that you use GNU make. Also, if you are using -OpenBSD, GeoIP requires OpenBSD 3.1 or greater. - -if you get "cannot load shared object file: No such file or directory" -error, add the directory libGeoIP.so was installed to to /etc/ld.so.conf -and run ldconfig - -On Solaris, if you get a -ld: fatal: relocations remain against allocatable but non-writable sections -error, try running - -# make clean -# ./configure --disable-shared -# make - -If you get a "ar : command not found" error, make sure that ar is -in your path. On Solaris, ar is typically found in /usr/ccs/bin - -If you get a "geoipupdate.c:24: getopt.h: No such file or directory" -error, run - -# export CPPFLAGS="-I/usr/local/include" - -(assuming that getopt.h is in /usr/local/include) - -If you get a "zlib.h: No such file or directory" error, make sure -that the zlib development libraries are installed on your server. -These are typically included in a "zlib-devel" package. - -If you get a "bad interpreter: No such file or directory" error -when running ./configure, make sure that there are no DOS -returns in the configure script. To remove DOS returns, -run perl -pi -e 's!\r!!g' configure. - -If gcc fails while consuming a large amount of memory, try -compiling with CFLAGS=-O1 (or -O0) instead of the default -O2. -It seems that some -versions of gcc have a bug and consume 1 GB of memory when optimizing -certain source files (the other source file where this was reported is -from XORG X-Server). It happens at least with gcc 3.3.1 and with gcc -4.2(.0). Thanks to Kai Sch�tzl for the report. - -If GEOIP_MMAP_CACHE doesn't work on a 64bit machine, try adding -the flag "MAP_32BIT" to the mmap call. - -If you get a "passing argument 3 of 'gethostbyname_r' from incompatible pointer type" -error on AIX, download and/or untar a fresh copy of GeoIP. ( To avoid cached -results from a previous ./configure run ) - -cd ./GeoIP-1.4.6 -then edit the file ./configure - -and delete these two lines: - -#define HAVE_GETHOSTBYNAME_R 1 - -#define GETHOSTBYNAME_R_RETURNS_INT 1 - -then save the configure script - -and build it as usual - -./configure -make -sudo make install - - - -To submit a patch, please contact support@maxmind.com diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW b/Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW deleted file mode 100644 index 8a192f95..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/README.MinGW +++ /dev/null @@ -1,13 +0,0 @@ -# how to build under MinGW/MSYS: -# (first you need to build & "install" zlib) - -export "CFLAGS=-O3 -I/usr/local/include" -export "LDFLAGS=-L/usr/local/lib -lwsock32" -./configure -make -cp data/GeoIP.dat test/ -make check - -# note that GeoIP.dat file should be placed in the -# same place as GeoIP-enabled executable modules! -# there's NO DEFAULT PATH concept on Win32 :) diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX b/Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX deleted file mode 100644 index 4dddf08c..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/README.OSX +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -# -# Building OSX fat binaries is easy. -# -# - start in a clean directory. -# - copy the shell script below to a file and edit the file to your needs. -# -# 1.) modify export GEOIP_ARCH='-arch i386 -arch x86_64 -arch ppc -arch ppc64' -# to include all architectures you need. -# 2.) add whatever you want to the ./configure line. -# 3.) execute the script. -# 4.) do a 'make install' -# -# -# make clean or make distclean before building this -# -# tell systems before leopard that we like to build for 10.5 or higher -# with MACOSX_DEPLOYMENT_TARGET=10.5 -# starting with leopard we have to add -mmacosx-version-min=10.5 -# to the CFLAGS and export MACOSX_DEPLOYMENT_TARGET!? - -## for tiger, leopard and snow leopard you might use this -## export GEOIP_ARCH='-arch i386 -arch x86_64 -arch ppc -arch ppc64' -## export MACOSX_DEPLOYMENT_TARGET=10.4 -## export LDFLAGS=$GEOIP_ARCH -## export CFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk $GEOIP_ARCH" - -# here we go for leopard and snow leopard -export GEOIP_ARCH='-arch i386 -arch x86_64 -arch ppc' -export MACOSX_DEPLOYMENT_TARGET=10.5 -export LDFLAGS=$GEOIP_ARCH -export CFLAGS="-g -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk $GEOIP_ARCH" -./configure --disable-dependency-tracking -perl -i.bak -pe'/^archive_cmds=/ and !/\bGEOIP_ARCH\b/ and s/-dynamiclib\b/-dynamiclib \\\$(GEOIP_ARCH)/' ./libtool -make diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32.txt deleted file mode 100644 index a81795cf..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32.txt +++ /dev/null @@ -1,44 +0,0 @@ -======================================================= - -Environmental variables: - -1. GeoIPDBFileName is hardcoded to "\\windows\\system32\\GeoIP.dat" on -windows in GeoIP.c -2. #ifdef DLL is used to determine whether you want to have a DLL built -in GeoIP.h - -You may want to change these depending on your system configuration -and compiler. - -======================================================= -Thanks to Chris Gibbs for supplying these instructions. - -The GeoIP C library should work under windows. Note that it requires the zlib -DLL. - -To install zlib with GeoIP: - -i) Downloda the zlib prebuilt DLL and static library from -http://www.winimage.com/zLibDll/ look for "pre-built zlib DLL". - -Unzip it to some location on your hard drive, and in Project-->Settings , -go to the Link tab, and add the following 3 libraries: - -ws2_32.lib -zlib.lib -zlibstat.lib - -iii) Go to Tools-->Options, then the Directories tab, and add library paths to -the locations of the zlib static libraries. You will also need to add the -include path to zlib.h to the include paths. - -iv) NOTE: These instructions are for MS VC++ 6.0, but should be similar for -previous versions, and for VC .NET. - -======================================================= -Building GeoIP as a DLL - -Stanislaw Pusep has contributed a patch for building GeoIP as a DLL. -You can find the patch in GeoIPWinDLL.patch - -Note a modified version of this patch is now merged into the main code. diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32static.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32static.txt deleted file mode 100644 index ba403836..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/READMEwin32static.txt +++ /dev/null @@ -1,17 +0,0 @@ -To make a static GeoIP.lib, edit the top level -Makefile.vc to reflect where the GeoIP.dat database -file should be placed, as well as the locations -of the lib, include, and bin directories for installation. -Then give the command - nmake /f Makefile.vc -This will build the GeoIP.lib library, as well as available -application and test programs. The command - nmake /f Makefile.vc test -will run available tests in the test/ subdirectory. - nmake /f Makefile.vc install -will then copy the lib and header files to the locations -specified in the top-level Makefile.vc, as well as -available application programs in the apps/ subdirectory. - nmake /f Makefile.vc clean -will remove intermediate object and executable files. - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/TODO b/Src/Plugins/DSP/sc_serv3/GeoIP/TODO deleted file mode 100644 index 32a6c805..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/TODO +++ /dev/null @@ -1,54 +0,0 @@ -Rutger Okhuizen 7/31/2006 - -Implement waiting algorithm for GEOIP_CHECK_CACHE, -so stat is called on every lookup. - ------------------------ - -Maurice Cinquini - -*** ifndef WIN32 on netdb.h ? *** -In GeoIPCity.c you don't "#ifndef WIN32" the netdb.h include, -but in GeoIP.c you do.� Which one is right? - -*** Warnings in GeoIP-1.2.1 before I made changes *** -GeoIPUpdate.c:73: warning: implicit declaration of function `_setup_dbfilename' -��� I suggest a GeoIP_private.h file to include prototypes for -��� _setup_dbfilename and other private functions also used by GeoIPCity.c - -*** Drop the GeoIP_*_by_addr API calls *** -And now that I think of it, why do you need a seperate -GeoIP_region_by_addr and GeoIP_region_by_name since -the later does the work of the former just as efficently. -For backward compatibility you could #define GeoIP_region_by_addr -to GeoIP_region_by_name - - - - -Performance improvements suggested by Jason Linhart -1. cluster nodes to improve disk performance when using GEOIP_STANDARD -2. evaluate preformance of replacing binary tree with nodes containing 4 children - -Write function to list countries, sorted by name. Chris Gibbs contributed this which could be -used: - - int GeoIP_country_sorted_index[246] = { - 0, 5, 8, 61, 14, 3, 11, 7, 12, 6, 13, 9, 17, 1, 16, 15, 18, 32, 25, 21, - 20,36, 22, 37, 27, 28, 33, 30, 19, 35, 34, 31, 104, 29, 24, 23, 26, -114, 47, 38, 52,121, 41, 207, 46, 48, 53, 39, 49, 116, 42, 40, 45, - 50, 44, 97, 51, 54, 55, 58, 57, 59, 60, 216, 62, 64, 203, 87, 66, - 63, 68, 2, 71, 73, 70, 69, 74, 75, 80, 170,208, 76, 84, 79, 56, 81, -82, 88, 83, 78, 86, 91, 90, 85, 92, 93, 98, 95, 228, 96,94, 99, 107, - 103, 100, 106, 105, 101, 102, 108, 109, 111, 110, 122, 112, 115, - 118,119, 120, 113, 123, 132, 124, 129, 128, 133, 126, 130, 131, - 143, 139, 137,151,153, 150, 140, 148, 138, 145, 146, 149, 238, - 152, 72, 136, 135, 142, 147, 134,154, 141, 155, 164, 163, 161, -10, 156, 166, 160, 157, 159, 165, 158, 144, 162, 167,173, 180, -178, 168, 171, 181, 169, 172, 176, 174, 179, 177, 182, 183, 184, -185,186, 193, 117, 125, 175, 229, 236, 198, 202, 187, 199, 189, -197, 192, 196,194,188, 200, 240, 89, 67, 127, 190, 201, 195, 205, -191, 43, 204, 220, 211, 221,210,209, 212, 215, 218, 214, 217, -213,206, 219, 223, 222, 4, 77, 225, 224, 226,227,234, 230, 233, - 231,232, 235, 65, 237, 239, 242, 241, 243, 244, 245}; - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 b/Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 deleted file mode 100644 index 91c7b241..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/aclocal.m4 +++ /dev/null @@ -1,8917 +0,0 @@ -# generated automatically by aclocal 1.11.1 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, -[m4_warning([this file was generated for autoconf 2.65. -You have another version of autoconf. It may work, but is not guaranteed to. -If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically `autoreconf'.])]) - -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -]) - -# serial 56 LT_INIT - - -# LT_PREREQ(VERSION) -# ------------------ -# Complain and exit if this libtool version is less that VERSION. -m4_defun([LT_PREREQ], -[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, - [m4_default([$3], - [m4_fatal([Libtool version $1 or higher is required], - 63)])], - [$2])]) - - -# _LT_CHECK_BUILDDIR -# ------------------ -# Complain if the absolute build directory name contains unusual characters -m4_defun([_LT_CHECK_BUILDDIR], -[case `pwd` in - *\ * | *\ *) - AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; -esac -]) - - -# LT_INIT([OPTIONS]) -# ------------------ -AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -])# LT_INIT - -# Old names: -AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) -AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PROG_LIBTOOL], []) -dnl AC_DEFUN([AM_PROG_LIBTOOL], []) - - -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -]) - - -# _LT_FILEUTILS_DEFAULTS -# ---------------------- -# It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. -m4_defun([_LT_FILEUTILS_DEFAULTS], -[: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} -])# _LT_FILEUTILS_DEFAULTS - - -# _LT_SETUP -# --------- -m4_defun([_LT_SETUP], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -_LT_DECL([], [host_alias], [0], [The host system])dnl -_LT_DECL([], [host], [0])dnl -_LT_DECL([], [host_os], [0])dnl -dnl -_LT_DECL([], [build_alias], [0], [The build system])dnl -_LT_DECL([], [build], [0])dnl -_LT_DECL([], [build_os], [0])dnl -dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -test -z "$LN_S" && LN_S="ln -s" -_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl -dnl -AC_REQUIRE([LT_CMD_MAX_LEN])dnl -_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl -_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl -dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -m4_require([_LT_CMD_RELOAD])dnl -m4_require([_LT_CHECK_MAGIC_METHOD])dnl -m4_require([_LT_CMD_OLD_ARCHIVE])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl - -_LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi -]) -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -_LT_CHECK_OBJDIR - -m4_require([_LT_TAG_COMPILER])dnl -_LT_PROG_ECHO_BACKSLASH - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([["`\\]]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -_LT_CC_BASENAME([$compiler]) - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - _LT_PATH_MAGIC - fi - ;; -esac - -# Use C for the default configuration in the libtool script -LT_SUPPORTED_TAG([CC]) -_LT_LANG_C_CONFIG -_LT_LANG_DEFAULT_CONFIG -_LT_CONFIG_COMMANDS -])# _LT_SETUP - - -# _LT_PROG_LTMAIN -# --------------- -# Note that this code is called both from `configure', and `config.status' -# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, -# so we pass a copy along to make sure it has a sensible value anyway. -m4_defun([_LT_PROG_LTMAIN], -[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl -_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain="$ac_aux_dir/ltmain.sh" -])# _LT_PROG_LTMAIN - - - -# So that we can recreate a full libtool script including additional -# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' -# label. - - -# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) -# ---------------------------------------- -# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL_INIT], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_INIT], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_INIT]) - - -# _LT_CONFIG_LIBTOOL([COMMANDS]) -# ------------------------------ -# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) - - -# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) -# ----------------------------------------------------- -m4_defun([_LT_CONFIG_SAVE_COMMANDS], -[_LT_CONFIG_LIBTOOL([$1]) -_LT_CONFIG_LIBTOOL_INIT([$2]) -]) - - -# _LT_FORMAT_COMMENT([COMMENT]) -# ----------------------------- -# Add leading comment marks to the start of each line, and a trailing -# full-stop to the whole comment if one is not present already. -m4_define([_LT_FORMAT_COMMENT], -[m4_ifval([$1], [ -m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], - [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) -)]) - - - - - -# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) -# ------------------------------------------------------------------- -# CONFIGNAME is the name given to the value in the libtool script. -# VARNAME is the (base) name used in the configure script. -# VALUE may be 0, 1 or 2 for a computed quote escaped value based on -# VARNAME. Any other value will be used directly. -m4_define([_LT_DECL], -[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], - [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], - [m4_ifval([$1], [$1], [$2])]) - lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) - m4_ifval([$4], - [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) - lt_dict_add_subkey([lt_decl_dict], [$2], - [tagged?], [m4_ifval([$5], [yes], [no])])]) -]) - - -# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) -# -------------------------------------------------------- -m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) - - -# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_tag_varnames], -[_lt_decl_filter([tagged?], [yes], $@)]) - - -# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) -# --------------------------------------------------------- -m4_define([_lt_decl_filter], -[m4_case([$#], - [0], [m4_fatal([$0: too few arguments: $#])], - [1], [m4_fatal([$0: too few arguments: $#: $1])], - [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], - [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], - [lt_dict_filter([lt_decl_dict], $@)])[]dnl -]) - - -# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) -# -------------------------------------------------- -m4_define([lt_decl_quote_varnames], -[_lt_decl_filter([value], [1], $@)]) - - -# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_dquote_varnames], -[_lt_decl_filter([value], [2], $@)]) - - -# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_varnames_tagged], -[m4_assert([$# <= 2])dnl -_$0(m4_quote(m4_default([$1], [[, ]])), - m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), - m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) -m4_define([_lt_decl_varnames_tagged], -[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) - - -# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_all_varnames], -[_$0(m4_quote(m4_default([$1], [[, ]])), - m4_if([$2], [], - m4_quote(lt_decl_varnames), - m4_quote(m4_shift($@))))[]dnl -]) -m4_define([_lt_decl_all_varnames], -[lt_join($@, lt_decl_varnames_tagged([$1], - lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl -]) - - -# _LT_CONFIG_STATUS_DECLARE([VARNAME]) -# ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME -# must have a single quote delimited value for this to work. -m4_define([_LT_CONFIG_STATUS_DECLARE], -[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) - - -# _LT_CONFIG_STATUS_DECLARATIONS -# ------------------------------ -# We delimit libtool config variables with single quotes, so when -# we write them to config.status, we have to be sure to quote all -# embedded single quotes properly. In configure, this macro expands -# each variable declared with _LT_DECL (and _LT_TAGDECL) into: -# -# <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`' -m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], -[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), - [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAGS -# ---------------- -# Output comment and list of tags supported by the script -m4_defun([_LT_LIBTOOL_TAGS], -[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl -]) - - -# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) -# ----------------------------------- -# Extract the dictionary values for VARNAME (optionally with TAG) and -# expand to a commented shell variable setting: -# -# # Some comment about what VAR is for. -# visible_name=$lt_internal_name -m4_define([_LT_LIBTOOL_DECLARE], -[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], - [description])))[]dnl -m4_pushdef([_libtool_name], - m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl -m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), - [0], [_libtool_name=[$]$1], - [1], [_libtool_name=$lt_[]$1], - [2], [_libtool_name=$lt_[]$1], - [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl -m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl -]) - - -# _LT_LIBTOOL_CONFIG_VARS -# ----------------------- -# Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' -# script. Tagged libtool config variables (even for the LIBTOOL CONFIG -# section) are produced by _LT_LIBTOOL_TAG_VARS. -m4_defun([_LT_LIBTOOL_CONFIG_VARS], -[m4_foreach([_lt_var], - m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAG_VARS(TAG) -# ------------------------- -m4_define([_LT_LIBTOOL_TAG_VARS], -[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) - - -# _LT_TAGVAR(VARNAME, [TAGNAME]) -# ------------------------------ -m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) - - -# _LT_CONFIG_COMMANDS -# ------------------- -# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of -# variables for single and double quote escaping we saved from calls -# to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated -# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. -m4_defun([_LT_CONFIG_COMMANDS], -[AC_PROVIDE_IFELSE([LT_OUTPUT], - dnl If the libtool generation code has been placed in $CONFIG_LT, - dnl instead of duplicating it all over again into config.status, - dnl then we will have config.status run $CONFIG_LT later, so it - dnl needs to know what name is stored there: - [AC_CONFIG_COMMANDS([libtool], - [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], - dnl If the libtool generation code is destined for config.status, - dnl expand the accumulated commands and init code now: - [AC_CONFIG_COMMANDS([libtool], - [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) -])#_LT_CONFIG_COMMANDS - - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], -[ - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -_LT_CONFIG_STATUS_DECLARATIONS -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# Quote evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_quote_varnames); do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_dquote_varnames); do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Fix-up fallback echo if it was mangled by the above quoting rules. -case \$lt_ECHO in -*'\\\[$]0 --fallback-echo"')dnl " - lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` - ;; -esac - -_LT_OUTPUT_LIBTOOL_INIT -]) - - -# LT_OUTPUT -# --------- -# This macro allows early generation of the libtool script (before -# AC_OUTPUT is called), incase it is used in configure for compilation -# tests. -AC_DEFUN([LT_OUTPUT], -[: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -cat >"$CONFIG_LT" <<_LTEOF -#! $SHELL -# Generated by $as_me. -# Run this file to recreate a libtool stub with the current configuration. - -lt_cl_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AS_SHELL_SANITIZE -_AS_PREPARE - -exec AS_MESSAGE_FD>&1 -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to <bug-libtool@gnu.org>." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2008 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -if test "$no_create" != yes; then - lt_cl_success=: - test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" - exec AS_MESSAGE_LOG_FD>/dev/null - $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false - exec AS_MESSAGE_LOG_FD>>config.log - $lt_cl_success || AS_EXIT(1) -fi -])# LT_OUTPUT - - -# _LT_CONFIG(TAG) -# --------------- -# If TAG is the built-in tag, create an initial libtool script with a -# default configuration from the untagged config vars. Otherwise add code -# to config.status for appending the configuration named by TAG from the -# matching tagged config vars. -m4_defun([_LT_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_CONFIG_SAVE_COMMANDS([ - m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl - m4_if(_LT_TAG, [C], [ - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -_LT_COPYING -_LT_LIBTOOL_TAGS - -# ### BEGIN LIBTOOL CONFIG -_LT_LIBTOOL_CONFIG_VARS -_LT_LIBTOOL_TAG_VARS -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - _LT_PROG_LTMAIN - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - _LT_PROG_XSI_SHELLFNS - - sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -], -[cat <<_LT_EOF >> "$ofile" - -dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded -dnl in a comment (ie after a #). -# ### BEGIN LIBTOOL TAG CONFIG: $1 -_LT_LIBTOOL_TAG_VARS(_LT_TAG) -# ### END LIBTOOL TAG CONFIG: $1 -_LT_EOF -])dnl /m4_if -], -[m4_if([$1], [], [ - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile'], []) -])dnl /_LT_CONFIG_SAVE_COMMANDS -])# _LT_CONFIG - - -# LT_SUPPORTED_TAG(TAG) -# --------------------- -# Trace this macro to discover what tags are supported by the libtool -# --tag option, using: -# autoconf --trace 'LT_SUPPORTED_TAG:$1' -AC_DEFUN([LT_SUPPORTED_TAG], []) - - -# C support is built-in for now -m4_define([_LT_LANG_C_enabled], []) -m4_define([_LT_TAGS], []) - - -# LT_LANG(LANG) -# ------------- -# Enable libtool support for the given language if not already enabled. -AC_DEFUN([LT_LANG], -[AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -])# LT_LANG - - -# _LT_LANG(LANGNAME) -# ------------------ -m4_defun([_LT_LANG], -[m4_ifdef([_LT_LANG_]$1[_enabled], [], - [LT_SUPPORTED_TAG([$1])dnl - m4_append([_LT_TAGS], [$1 ])dnl - m4_define([_LT_LANG_]$1[_enabled], [])dnl - _LT_LANG_$1_CONFIG($1)])dnl -])# _LT_LANG - - -# _LT_LANG_DEFAULT_CONFIG -# ----------------------- -m4_defun([_LT_LANG_DEFAULT_CONFIG], -[AC_PROVIDE_IFELSE([AC_PROG_CXX], - [LT_LANG(CXX)], - [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) - -AC_PROVIDE_IFELSE([AC_PROG_F77], - [LT_LANG(F77)], - [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) - -AC_PROVIDE_IFELSE([AC_PROG_FC], - [LT_LANG(FC)], - [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) - -dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal -dnl pulling things in needlessly. -AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([LT_PROG_GCJ], - [LT_LANG(GCJ)], - [m4_ifdef([AC_PROG_GCJ], - [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([A][M_PROG_GCJ], - [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([LT_PROG_GCJ], - [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) - -AC_PROVIDE_IFELSE([LT_PROG_RC], - [LT_LANG(RC)], - [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) -])# _LT_LANG_DEFAULT_CONFIG - -# Obsolete macros: -AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_CXX], []) -dnl AC_DEFUN([AC_LIBTOOL_F77], []) -dnl AC_DEFUN([AC_LIBTOOL_FC], []) -dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) - - -# _LT_TAG_COMPILER -# ---------------- -m4_defun([_LT_TAG_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl -_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl -_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl -_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_TAG_COMPILER - - -# _LT_COMPILER_BOILERPLATE -# ------------------------ -# Check for compiler boilerplate output or warnings with -# the simple compiler test code. -m4_defun([_LT_COMPILER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* -])# _LT_COMPILER_BOILERPLATE - - -# _LT_LINKER_BOILERPLATE -# ---------------------- -# Check for linker boilerplate output or warnings with -# the simple link test code. -m4_defun([_LT_LINKER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* -])# _LT_LINKER_BOILERPLATE - -# _LT_REQUIRED_DARWIN_CHECKS -# ------------------------- -m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ - case $host_os in - rhapsody* | darwin*) - AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) - AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) - AC_CHECK_TOOL([LIPO], [lipo], [:]) - AC_CHECK_TOOL([OTOOL], [otool], [:]) - AC_CHECK_TOOL([OTOOL64], [otool64], [:]) - _LT_DECL([], [DSYMUTIL], [1], - [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) - _LT_DECL([], [NMEDIT], [1], - [Tool to change global to local symbols on Mac OS X]) - _LT_DECL([], [LIPO], [1], - [Tool to manipulate fat objects and archives on Mac OS X]) - _LT_DECL([], [OTOOL], [1], - [ldd/readelf like tool for Mach-O binaries on Mac OS X]) - _LT_DECL([], [OTOOL64], [1], - [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) - - AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], - [lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi]) - AC_CACHE_CHECK([for -exported_symbols_list linker flag], - [lt_cv_ld_exported_symbols_list], - [lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [lt_cv_ld_exported_symbols_list=yes], - [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" - ]) - case $host_os in - rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac -]) - - -# _LT_DARWIN_LINKER_FEATURES -# -------------------------- -# Checks for linker and compiler features on darwin -m4_defun([_LT_DARWIN_LINKER_FEATURES], -[ - m4_require([_LT_REQUIRED_DARWIN_CHECKS]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_automatic, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(whole_archive_flag_spec, $1)='' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=echo - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi -],[]) - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi -]) - -# _LT_SYS_MODULE_PATH_AIX -# ----------------------- -# Links a minimal program and checks the executable -# for the system default hardcoded library path. In most cases, -# this is /usr/lib:/lib, but when the MPI compilers are used -# the location of the communication and MPI libs are included too. -# If we don't find anything, use the default library path according -# to the aix ld manual. -m4_defun([_LT_SYS_MODULE_PATH_AIX], -[m4_require([_LT_DECL_SED])dnl -AC_LINK_IFELSE(AC_LANG_PROGRAM,[ -lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\(.*\)$/\1/ - p - } - }' -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then - aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -fi],[]) -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -])# _LT_SYS_MODULE_PATH_AIX - - -# _LT_SHELL_INIT(ARG) -# ------------------- -m4_define([_LT_SHELL_INIT], -[ifdef([AC_DIVERSION_NOTICE], - [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], - [AC_DIVERT_PUSH(NOTICE)]) -$1 -AC_DIVERT_POP -])# _LT_SHELL_INIT - - -# _LT_PROG_ECHO_BACKSLASH -# ----------------------- -# Add some code to the start of the generated configure script which -# will find an echo command which doesn't interpret backslashes. -m4_defun([_LT_PROG_ECHO_BACKSLASH], -[_LT_SHELL_INIT([ -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$lt_ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` - ;; -esac - -ECHO=${lt_ECHO-echo} -if test "X[$]1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X[$]1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then - # Yippee, $ECHO works! - : -else - # Restart under the correct shell. - exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} -fi - -if test "X[$]1" = X--fallback-echo; then - # used as fallback echo - shift - cat <<_LT_EOF -[$]* -_LT_EOF - exit 0 -fi - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test -z "$lt_ECHO"; then - if test "X${echo_test_string+set}" != Xset; then - # find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if { echo_test_string=`eval $cmd`; } 2>/dev/null && - { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null - then - break - fi - done - fi - - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : - else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for dir in $PATH /usr/ucb; do - IFS="$lt_save_ifs" - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$dir/echo" - break - fi - done - IFS="$lt_save_ifs" - - if test "X$ECHO" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - ECHO='print -r' - elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running configure again with it. - ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} - else - # Try using printf. - ECHO='printf %s\n' - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - ECHO="$CONFIG_SHELL [$]0 --fallback-echo" - elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$CONFIG_SHELL [$]0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do - if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null - then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "[$]0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} - else - # Oops. We lost completely, so just stick with echo. - ECHO=echo - fi - fi - fi - fi - fi -fi - -# Copy echo and quote the copy suitably for passing to libtool from -# the Makefile, instead of quoting the original, which is used later. -lt_ECHO=$ECHO -if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then - lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" -fi - -AC_SUBST(lt_ECHO) -]) -_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) -_LT_DECL([], [ECHO], [1], - [An echo program that does not interpret backslashes]) -])# _LT_PROG_ECHO_BACKSLASH - - -# _LT_ENABLE_LOCK -# --------------- -m4_defun([_LT_ENABLE_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AS_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_PUSH(C) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -sparc*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" -])# _LT_ENABLE_LOCK - - -# _LT_CMD_OLD_ARCHIVE -# ------------------- -m4_defun([_LT_CMD_OLD_ARCHIVE], -[AC_CHECK_TOOL(AR, ar, false) -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru -_LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1]) - -AC_CHECK_TOOL(STRIP, strip, :) -test -z "$STRIP" && STRIP=: -_LT_DECL([], [STRIP], [1], [A symbol stripping program]) - -AC_CHECK_TOOL(RANLIB, ranlib, :) -test -z "$RANLIB" && RANLIB=: -_LT_DECL([], [RANLIB], [1], - [Commands used to install an old-style archive]) - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi -_LT_DECL([], [old_postinstall_cmds], [2]) -_LT_DECL([], [old_postuninstall_cmds], [2]) -_LT_TAGDECL([], [old_archive_cmds], [2], - [Commands used to build an old-style archive]) -])# _LT_CMD_OLD_ARCHIVE - - -# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([_LT_COMPILER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -])# _LT_COMPILER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) - - -# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------- -# Check whether the given linker option works -AC_DEFUN([_LT_LINKER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -])# _LT_LINKER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) - - -# LT_CMD_MAX_LEN -#--------------- -AC_DEFUN([LT_CMD_MAX_LEN], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ - = "XX$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -])# LT_CMD_MAX_LEN - -# Old name: -AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) - - -# _LT_HEADER_DLFCN -# ---------------- -m4_defun([_LT_HEADER_DLFCN], -[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl -])# _LT_HEADER_DLFCN - - -# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ---------------------------------------------------------------- -m4_defun([_LT_TRY_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test "$cross_compiling" = yes; then : - [$4] -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -[#line __oline__ "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -}] -_LT_EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_dlunknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_TRY_DLOPEN_SELF - - -# LT_SYS_DLOPEN_SELF -# ------------------ -AC_DEFUN([LT_SYS_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -])# LT_SYS_DLOPEN_SELF - -# Old name: -AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) - - -# _LT_COMPILER_C_O([TAGNAME]) -# --------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler. -# This macro does not hard code the compiler like AC_PROG_CC_C_O. -m4_defun([_LT_COMPILER_C_O], -[m4_require([_LT_DECL_SED])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* -]) -_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], - [Does compiler simultaneously support -c and -o options?]) -])# _LT_COMPILER_C_O - - -# _LT_COMPILER_FILE_LOCKS([TAGNAME]) -# ---------------------------------- -# Check to see if we can do hard links to lock some files if needed -m4_defun([_LT_COMPILER_FILE_LOCKS], -[m4_require([_LT_ENABLE_LOCK])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_COMPILER_C_O([$1]) - -hard_links="nottested" -if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - AC_MSG_CHECKING([if we can lock with hard links]) - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) - need_locks=warn - fi -else - need_locks=no -fi -_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) -])# _LT_COMPILER_FILE_LOCKS - - -# _LT_CHECK_OBJDIR -# ---------------- -m4_defun([_LT_CHECK_OBJDIR], -[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], -[rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null]) -objdir=$lt_cv_objdir -_LT_DECL([], [objdir], [0], - [The name of the directory that contains temporary libtool files])dnl -m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) -])# _LT_CHECK_OBJDIR - - -# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) -# -------------------------------------- -# Check hardcoding attributes. -m4_defun([_LT_LINKER_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || - test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then - # Linking always hardcodes the temporary library directory. - _LT_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) - -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi -_LT_TAGDECL([], [hardcode_action], [0], - [How to hardcode a shared library path into an executable]) -])# _LT_LINKER_HARDCODE_LIBPATH - - -# _LT_CMD_STRIPLIB -# ---------------- -m4_defun([_LT_CMD_STRIPLIB], -[m4_require([_LT_DECL_EGREP]) -striplib= -old_striplib= -AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) -_LT_DECL([], [striplib], [1]) -])# _LT_CMD_STRIPLIB - - -# _LT_SYS_DYNAMIC_LINKER([TAG]) -# ----------------------------- -# PORTME Fill in your ld.so characteristics -m4_defun([_LT_SYS_DYNAMIC_LINKER], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_OBJDUMP])dnl -m4_require([_LT_DECL_SED])dnl -AC_MSG_CHECKING([dynamic linker characteristics]) -m4_if([$1], - [], [ -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` - else - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[[lt_foo]]++; } - if (lt_freq[[lt_foo]] == 1) { print lt_foo; } -}'` - sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi]) -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[[4-9]]*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib<name>.so - # instead of lib<name>.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[[45]]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[[123]]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[[01]]* | freebsdelf3.[[01]]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ - freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -interix[[3-9]]*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # Some binutils ld are patched to set DT_RUNPATH - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ - LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], - [shlibpath_overrides_runpath=yes])]) - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - -_LT_DECL([], [variables_saved_for_relink], [1], - [Variables whose values should be saved in libtool wrapper scripts and - restored at link time]) -_LT_DECL([], [need_lib_prefix], [0], - [Do we need the "lib" prefix for modules?]) -_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) -_LT_DECL([], [version_type], [0], [Library versioning type]) -_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) -_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) -_LT_DECL([], [shlibpath_overrides_runpath], [0], - [Is shlibpath searched before the hard-coded library search path?]) -_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) -_LT_DECL([], [library_names_spec], [1], - [[List of archive names. First name is the real one, the rest are links. - The last name is the one that the linker finds with -lNAME]]) -_LT_DECL([], [soname_spec], [1], - [[The coded name of the library, if different from the real name]]) -_LT_DECL([], [postinstall_cmds], [2], - [Command to use after installation of a shared archive]) -_LT_DECL([], [postuninstall_cmds], [2], - [Command to use after uninstallation of a shared archive]) -_LT_DECL([], [finish_cmds], [2], - [Commands used to finish a libtool library installation in a directory]) -_LT_DECL([], [finish_eval], [1], - [[As "finish_cmds", except a single script fragment to be evaled but - not shown]]) -_LT_DECL([], [hardcode_into_libs], [0], - [Whether we should hardcode library paths into libraries]) -_LT_DECL([], [sys_lib_search_path_spec], [2], - [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) -])# _LT_SYS_DYNAMIC_LINKER - - -# _LT_PATH_TOOL_PREFIX(TOOL) -# -------------------------- -# find a file program which can recognize shared library -AC_DEFUN([_LT_PATH_TOOL_PREFIX], -[m4_require([_LT_DECL_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -])# _LT_PATH_TOOL_PREFIX - -# Old name: -AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) - - -# _LT_PATH_MAGIC -# -------------- -# find a file program which can recognize a shared library -m4_defun([_LT_PATH_MAGIC], -[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# _LT_PATH_MAGIC - - -# LT_PATH_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([LT_PATH_LD], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in - *GNU* | *'with BFD'*) - test "$with_gnu_ld" != no && break - ;; - *) - test "$with_gnu_ld" != yes && break - ;; - esac - fi - done - IFS="$lt_save_ifs" -else - lt_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$lt_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -_LT_PATH_LD_GNU -AC_SUBST([LD]) - -_LT_TAGDECL([], [LD], [1], [The linker used to build libraries]) -])# LT_PATH_LD - -# Old names: -AU_ALIAS([AM_PROG_LD], [LT_PATH_LD]) -AU_ALIAS([AC_PROG_LD], [LT_PATH_LD]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_LD], []) -dnl AC_DEFUN([AC_PROG_LD], []) - - -# _LT_PATH_LD_GNU -#- -------------- -m4_defun([_LT_PATH_LD_GNU], -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 </dev/null` in -*GNU* | *'with BFD'*) - lt_cv_prog_gnu_ld=yes - ;; -*) - lt_cv_prog_gnu_ld=no - ;; -esac]) -with_gnu_ld=$lt_cv_prog_gnu_ld -])# _LT_PATH_LD_GNU - - -# _LT_CMD_RELOAD -# -------------- -# find reload flag for linker -# -- PORTME Some linkers may need a different reload flag. -m4_defun([_LT_CMD_RELOAD], -[AC_CACHE_CHECK([for $LD option to reload object files], - lt_cv_ld_reload_flag, - [lt_cv_ld_reload_flag='-r']) -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac -_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl -_LT_DECL([], [reload_cmds], [2])dnl -])# _LT_CMD_RELOAD - - -# _LT_CHECK_MAGIC_METHOD -# ---------------------- -# how to check for library dependencies -# -- PORTME fill in with the dynamic library characteristics -m4_defun([_LT_CHECK_MAGIC_METHOD], -[m4_require([_LT_DECL_EGREP]) -m4_require([_LT_DECL_OBJDUMP]) -AC_CACHE_CHECK([how to recognize dependent libraries], -lt_cv_deplibs_check_method, -[lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[[4-9]]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[[45]]*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - if ( file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[[3-9]]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - -_LT_DECL([], [deplibs_check_method], [1], - [Method to check whether dependent libraries are shared objects]) -_LT_DECL([], [file_magic_cmd], [1], - [Command to use when deplibs_check_method == "file_magic"]) -])# _LT_CHECK_MAGIC_METHOD - - -# LT_PATH_NM -# ---------- -# find the pathname to a BSD- or MS-compatible name lister -AC_DEFUN([LT_PATH_NM], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -])# LT_PATH_NM - -# Old names: -AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) -AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_NM], []) -dnl AC_DEFUN([AC_PROG_NM], []) - - -# LT_LIB_M -# -------- -# check for math library -AC_DEFUN([LT_LIB_M], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -AC_SUBST([LIBM]) -])# LT_LIB_M - -# Old name: -AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_CHECK_LIBM], []) - - -# _LT_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------- -m4_defun([_LT_COMPILER_NO_RTTI], -[m4_require([_LT_TAG_COMPILER])dnl - -_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - - _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], - [Compiler flag to turn off builtin functions]) -])# _LT_COMPILER_NO_RTTI - - -# _LT_CMD_GLOBAL_SYMBOLS -# ---------------------- -m4_defun([_LT_CMD_GLOBAL_SYMBOLS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_NM])dnl -AC_REQUIRE([LT_PATH_LD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_TAG_COMPILER])dnl - -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output from $compiler object]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], -[ -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris*) - symcode='[[BDRT]]' - ;; -sco3.2v5*) - symcode='[[DT]]' - ;; -sysv4.2uw2*) - symcode='[[DT]]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[[ABDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[[ABCDGIRSTW]]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK ['"\ -" {last_section=section; section=\$ 3};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx]" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[[]] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" - else - echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi - -_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], - [Take the output of nm and produce a listing of raw symbols and C names]) -_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], - [Transform the output of nm in a proper C declaration]) -_LT_DECL([global_symbol_to_c_name_address], - [lt_cv_sys_global_symbol_to_c_name_address], [1], - [Transform the output of nm in a C name address pair]) -_LT_DECL([global_symbol_to_c_name_address_lib_prefix], - [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], - [Transform the output of nm in a C name address pair when lib prefix is needed]) -]) # _LT_CMD_GLOBAL_SYMBOLS - - -# _LT_COMPILER_PIC([TAGNAME]) -# --------------------------- -m4_defun([_LT_COMPILER_PIC], -[m4_require([_LT_TAG_COMPILER])dnl -_LT_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_TAGVAR(lt_prog_compiler_static, $1)= - -AC_MSG_CHECKING([for $compiler option to produce PIC]) -m4_if([$1], [CXX], [ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix[[4-9]]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - dgux*) - case $cc_basename in - ec++*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xlc* | xlC*) - # IBM XL 8.0 on PPC - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx*) - # Digital/Compaq C++ - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc*) - # Lucid - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - hpux9* | hpux10* | hpux11*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' - _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - ccc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xl*) - # IBM XL C 8.0/Fortran 10.1 on PPC - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - *Sun\ F*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='' - ;; - esac - ;; - esac - ;; - - newsos6) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - rdos*) - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - solaris*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; - *) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; - esac - ;; - - sunos4*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - unicos*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - - uts4*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" - ;; -esac -AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) -_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], - [How to pass a linker flag through the compiler]) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], - [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], - [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], - [Additional compiler flags for building library objects]) - -# -# Check to make sure the static flag actually works. -# -wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" -_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), - $lt_tmp_static_flag, - [], - [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) -_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], - [Compiler flag to prevent dynamic linking]) -])# _LT_COMPILER_PIC - - -# _LT_LINKER_SHLIBS([TAGNAME]) -# ---------------------------- -# See if the linker supports building shared libraries. -m4_defun([_LT_LINKER_SHLIBS], -[AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -m4_if([$1], [CXX], [ - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in - aix[[4-9]]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - ;; - linux* | k*bsd*-gnu) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] -], [ - runpath_var= - _LT_TAGVAR(allow_undefined_flag, $1)= - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(archive_cmds, $1)= - _LT_TAGVAR(archive_expsym_cmds, $1)= - _LT_TAGVAR(compiler_needs_object, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(hardcode_automatic, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= - _LT_TAGVAR(hardcode_libdir_separator, $1)= - _LT_TAGVAR(hardcode_minus_L, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(inherit_rpath, $1)=no - _LT_TAGVAR(link_all_deplibs, $1)=unknown - _LT_TAGVAR(module_cmds, $1)= - _LT_TAGVAR(module_expsym_cmds, $1)= - _LT_TAGVAR(old_archive_from_new_cmds, $1)= - _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_TAGVAR(thread_safe_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_TAGVAR(include_expsyms, $1)= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. -dnl Note also adjust exclude_expsyms for C++ above. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - esac - - _LT_TAGVAR(ld_shlibs, $1)=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[[3-9]]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag= - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - _LT_TAGVAR(whole_archive_flag_spec, $1)= - tmp_sharedflag='--shared' ;; - xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' - _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - sunos4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then - runpath_var= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix[[4-9]]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - _LT_TAGVAR(link_all_deplibs, $1)=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - bsdi[[45]]*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' - _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - freebsd1*) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - AC_LINK_IFELSE(int foo(void) {}, - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - ) - LDFLAGS="$save_LDFLAGS" - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - os2*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - solaris*) - _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - fi - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' - ;; - esac - fi - fi -]) -AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld - -_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl -_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl -_LT_DECL([], [extract_expsyms_cmds], [2], - [The commands to extract the exported symbol list from a shared archive]) - -# -# Do we need to explicitly link libc? -# -case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_TAGVAR(archive_cmds, $1) in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - AC_MSG_CHECKING([whether -lc should be explicitly linked in]) - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) - _LT_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) - then - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - else - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) - ;; - esac - fi - ;; -esac - -_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], - [Whether or not to add -lc for building shared libraries]) -_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], - [enable_shared_with_static_runtimes], [0], - [Whether or not to disallow shared libs when runtime libs are static]) -_LT_TAGDECL([], [export_dynamic_flag_spec], [1], - [Compiler flag to allow reflexive dlopens]) -_LT_TAGDECL([], [whole_archive_flag_spec], [1], - [Compiler flag to generate shared objects directly from archives]) -_LT_TAGDECL([], [compiler_needs_object], [1], - [Whether the compiler copes with passing no objects directly]) -_LT_TAGDECL([], [old_archive_from_new_cmds], [2], - [Create an old-style archive from a shared archive]) -_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], - [Create a temporary old-style archive to link instead of a shared archive]) -_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) -_LT_TAGDECL([], [archive_expsym_cmds], [2]) -_LT_TAGDECL([], [module_cmds], [2], - [Commands used to build a loadable module if different from building - a shared archive.]) -_LT_TAGDECL([], [module_expsym_cmds], [2]) -_LT_TAGDECL([], [with_gnu_ld], [1], - [Whether we are building with GNU ld or not]) -_LT_TAGDECL([], [allow_undefined_flag], [1], - [Flag that allows shared libraries with undefined symbols to be built]) -_LT_TAGDECL([], [no_undefined_flag], [1], - [Flag that enforces no undefined symbols]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], - [Flag to hardcode $libdir into a binary during linking. - This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], - [[If ld is used when linking, flag to hardcode $libdir into a binary - during linking. This must work even if $libdir does not exist]]) -_LT_TAGDECL([], [hardcode_libdir_separator], [1], - [Whether we need a single "-rpath" flag with a separated argument]) -_LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary]) -_LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the - library is relocated]) -_LT_TAGDECL([], [hardcode_minus_L], [0], - [Set to "yes" if using the -LDIR flag during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_shlibpath_var], [0], - [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_automatic], [0], - [Set to "yes" if building a shared library automatically hardcodes DIR - into the library and all subsequent libraries and executables linked - against it]) -_LT_TAGDECL([], [inherit_rpath], [0], - [Set to yes if linker adds runtime paths of dependent libraries - to runtime path list]) -_LT_TAGDECL([], [link_all_deplibs], [0], - [Whether libtool must link a program against all its dependency libraries]) -_LT_TAGDECL([], [fix_srcfile_path], [1], - [Fix the shell variable $srcfile for the compiler]) -_LT_TAGDECL([], [always_export_symbols], [0], - [Set to "yes" if exported symbols are required]) -_LT_TAGDECL([], [export_symbols_cmds], [2], - [The commands to list exported symbols]) -_LT_TAGDECL([], [exclude_expsyms], [1], - [Symbols that should not be listed in the preloaded symbols]) -_LT_TAGDECL([], [include_expsyms], [1], - [Symbols that must always be exported]) -_LT_TAGDECL([], [prelink_cmds], [2], - [Commands necessary for linking programs (against libraries) with templates]) -_LT_TAGDECL([], [file_list_spec], [1], - [Specify filename containing input files]) -dnl FIXME: Not yet implemented -dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], -dnl [Compiler flag to generate thread safe objects]) -])# _LT_LINKER_SHLIBS - - -# _LT_LANG_C_CONFIG([TAG]) -# ------------------------ -# Ensure that the configuration variables for a C compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_C_CONFIG], -[m4_require([_LT_DECL_EGREP])dnl -lt_save_CC="$CC" -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - -_LT_TAG_COMPILER -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - LT_SYS_DLOPEN_SELF - _LT_CMD_STRIPLIB - - # Report which library types will actually be built - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_CONFIG($1) -fi -AC_LANG_POP -CC="$lt_save_CC" -])# _LT_LANG_C_CONFIG - - -# _LT_PROG_CXX -# ------------ -# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ -# compiler, we have our own version here. -m4_defun([_LT_PROG_CXX], -[ -pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) -AC_PROG_CXX -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -else - _lt_caught_CXX_error=yes -fi -popdef([AC_MSG_ERROR]) -])# _LT_PROG_CXX - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([_LT_PROG_CXX], []) - - -# _LT_LANG_CXX_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a C++ compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_CXX_CONFIG], -[AC_REQUIRE([_LT_PROG_CXX])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl - -AC_LANG_PUSH(C++) -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(compiler_needs_object, $1)=no -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - else - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - LT_PATH_LD - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) - _LT_TAGVAR(ld_shlibs, $1)=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aix[[4-9]]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - _LT_SYS_MODULE_PATH_AIX - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - freebsd[[12]]*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - freebsd-elf*) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - gnu*) - ;; - - hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' - ;; - *) - if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' - fi - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) - _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' - _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ - $RANLIB $oldlib' - _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 will use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' - ;; - xl*) - # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='echo' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=echo - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - case $host in - osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - ;; - *) - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(archive_cmds_need_lc,$1)=yes - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - - output_verbose_link_cmd='echo' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' - fi - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - CC=$lt_save_CC - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -AC_LANG_POP -])# _LT_LANG_CXX_CONFIG - - -# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) -# --------------------------------- -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -m4_defun([_LT_SYS_HIDDEN_LIBDEPS], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -# Dependencies to place before and after the object being linked: -_LT_TAGVAR(predep_objects, $1)= -_LT_TAGVAR(postdep_objects, $1)= -_LT_TAGVAR(predeps, $1)= -_LT_TAGVAR(postdeps, $1)= -_LT_TAGVAR(compiler_lib_search_path, $1)= - -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF -int a; -void foo (void) { a = 0; } -_LT_EOF -], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF -], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer*4 a - a=0 - return - end -_LT_EOF -], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer a - a=0 - return - end -_LT_EOF -], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF -public class foo { - private int a; - public void bar (void) { - a = 0; - } -}; -_LT_EOF -]) -dnl Parse the compiler output and extract the necessary -dnl objects, libraries and library flags. -if AC_TRY_EVAL(ac_compile); then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case $p in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - else - prev= - fi - - if test "$pre_test_object_deps_done" = no; then - case $p in - -L* | -R*) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" - else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" - else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" - fi - fi - ;; - - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" - else - _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" - fi - else - if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" - else - _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling $1 test program" -fi - -$RM -f confest.$objext - -# PORTME: override above test on systems where it is broken -m4_if([$1], [CXX], -[case $host_os in -interix[[3-9]]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - _LT_TAGVAR(predep_objects,$1)= - _LT_TAGVAR(postdep_objects,$1)= - _LT_TAGVAR(postdeps,$1)= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac -]) - -case " $_LT_TAGVAR(postdeps, $1) " in -*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; -esac - _LT_TAGVAR(compiler_lib_search_dirs, $1)= -if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi -_LT_TAGDECL([], [compiler_lib_search_dirs], [1], - [The directories searched by this compiler when creating a shared library]) -_LT_TAGDECL([], [predep_objects], [1], - [Dependencies to place before and after the objects being linked to - create a shared library]) -_LT_TAGDECL([], [postdep_objects], [1]) -_LT_TAGDECL([], [predeps], [1]) -_LT_TAGDECL([], [postdeps], [1]) -_LT_TAGDECL([], [compiler_lib_search_path], [1], - [The library search path used internally by the compiler when linking - a shared library]) -])# _LT_SYS_HIDDEN_LIBDEPS - - -# _LT_PROG_F77 -# ------------ -# Since AC_PROG_F77 is broken, in that it returns the empty string -# if there is no fortran compiler, we have our own version here. -m4_defun([_LT_PROG_F77], -[ -pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) -AC_PROG_F77 -if test -z "$F77" || test "X$F77" = "Xno"; then - _lt_disable_F77=yes -fi -popdef([AC_MSG_ERROR]) -])# _LT_PROG_F77 - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([_LT_PROG_F77], []) - - -# _LT_LANG_F77_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a Fortran 77 compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_F77_CONFIG], -[AC_REQUIRE([_LT_PROG_F77])dnl -AC_LANG_PUSH(Fortran 77) - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the F77 compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - CC=${F77-"f77"} - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - GCC=$G77 - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$G77" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC="$lt_save_CC" -fi # test "$_lt_disable_F77" != yes - -AC_LANG_POP -])# _LT_LANG_F77_CONFIG - - -# _LT_PROG_FC -# ----------- -# Since AC_PROG_FC is broken, in that it returns the empty string -# if there is no fortran compiler, we have our own version here. -m4_defun([_LT_PROG_FC], -[ -pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) -AC_PROG_FC -if test -z "$FC" || test "X$FC" = "Xno"; then - _lt_disable_FC=yes -fi -popdef([AC_MSG_ERROR]) -])# _LT_PROG_FC - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([_LT_PROG_FC], []) - - -# _LT_LANG_FC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for a Fortran compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_FC_CONFIG], -[AC_REQUIRE([_LT_PROG_FC])dnl -AC_LANG_PUSH(Fortran) - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for fc test sources. -ac_ext=${ac_fc_srcext-f} - -# Object file extension for compiled fc test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the FC compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - CC=${FC-"f95"} - compiler=$CC - GCC=$ac_cv_fc_compiler_gnu - - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC="$lt_save_CC" -fi # test "$_lt_disable_FC" != yes - -AC_LANG_POP -])# _LT_LANG_FC_CONFIG - - -# _LT_LANG_GCJ_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Java Compiler compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GCJ_CONFIG], -[AC_REQUIRE([LT_PROG_GCJ])dnl -AC_LANG_SAVE - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -lt_save_GCC=$GCC -GCC=yes -CC=${GCJ-"gcj"} -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC="$lt_save_CC" -])# _LT_LANG_GCJ_CONFIG - - -# _LT_LANG_RC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for the Windows resource compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_RC_CONFIG], -[AC_REQUIRE([LT_PROG_RC])dnl -AC_LANG_SAVE - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' - -# Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -lt_save_GCC=$GCC -GCC= -CC=${RC-"windres"} -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) -_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - -if test -n "$compiler"; then - : - _LT_CONFIG($1) -fi - -GCC=$lt_save_GCC -AC_LANG_RESTORE -CC="$lt_save_CC" -])# _LT_LANG_RC_CONFIG - - -# LT_PROG_GCJ -# ----------- -AC_DEFUN([LT_PROG_GCJ], -[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_GCJ], []) - - -# LT_PROG_RC -# ---------- -AC_DEFUN([LT_PROG_RC], -[AC_CHECK_TOOL(RC, windres,) -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_RC], []) - - -# _LT_DECL_EGREP -# -------------- -# If we don't have a new enough Autoconf to choose the best grep -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_EGREP], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_REQUIRE([AC_PROG_FGREP])dnl -test -z "$GREP" && GREP=grep -_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) -_LT_DECL([], [EGREP], [1], [An ERE matcher]) -_LT_DECL([], [FGREP], [1], [A literal string matcher]) -dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too -AC_SUBST([GREP]) -]) - - -# _LT_DECL_OBJDUMP -# -------------- -# If we don't have a new enough Autoconf to choose the best objdump -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_OBJDUMP], -[AC_CHECK_TOOL(OBJDUMP, objdump, false) -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) -AC_SUBST([OBJDUMP]) -]) - - -# _LT_DECL_SED -# ------------ -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -m4_defun([_LT_DECL_SED], -[AC_PROG_SED -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" -_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) -_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], - [Sed that helps us avoid accidentally triggering echo(1) options like -n]) -])# _LT_DECL_SED - -m4_ifndef([AC_PROG_SED], [ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # - -m4_defun([AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -IFS=$as_save_IFS -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -]) -SED=$lt_cv_path_SED -AC_SUBST([SED]) -AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_SED], []) - - -# _LT_CHECK_SHELL_FEATURES -# ------------------------ -# Find out whether the shell is Bourne or XSI compatible, -# or has some other useful features. -m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi -_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac -_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl -_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl -])# _LT_CHECK_SHELL_FEATURES - - -# _LT_PROG_XSI_SHELLFNS -# --------------------- -# Bourne and XSI compatible variants of some useful shell functions. -m4_defun([_LT_PROG_XSI_SHELLFNS], -[case $xsi_shell in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac -} - -# func_basename file -func_basename () -{ - func_basename_result="${1##*/}" -} - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}" -} - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -func_stripname () -{ - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"} -} - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=${1%%=*} - func_opt_split_arg=${1#*=} -} - -# func_lo2o object -func_lo2o () -{ - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=${1%.*}.lo -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=$(( $[*] )) -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=${#1} -} - -_LT_EOF - ;; - *) # Bourne compatible functions. - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` -} - -dnl func_dirname_and_basename -dnl A portable version of this function is already defined in general.m4sh -dnl so there is no need for it here. - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; - esac -} - -# sed scripts: -my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' -my_sed_long_arg='1s/^-[[^=]]*=//' - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` - func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` -} - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "$[@]"` -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` -} - -_LT_EOF -esac - -case $lt_shell_append in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$[1]+=\$[2]" -} -_LT_EOF - ;; - *) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$[1]=\$$[1]\$[2]" -} - -_LT_EOF - ;; - esac -]) - -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [0], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' -# LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [pic_mode="$withval"], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) - -# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltsugar.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) - - -# lt_join(SEP, ARG1, [ARG2...]) -# ----------------------------- -# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their -# associated separator. -# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier -# versions in m4sugar had bugs. -m4_define([lt_join], -[m4_if([$#], [1], [], - [$#], [2], [[$2]], - [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) -m4_define([_lt_join], -[m4_if([$#$2], [2], [], - [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) - - -# lt_car(LIST) -# lt_cdr(LIST) -# ------------ -# Manipulate m4 lists. -# These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. -m4_define([lt_car], [[$1]]) -m4_define([lt_cdr], -[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], - [$#], 1, [], - [m4_dquote(m4_shift($@))])]) -m4_define([lt_unquote], $1) - - -# lt_append(MACRO-NAME, STRING, [SEPARATOR]) -# ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. -# Note that neither SEPARATOR nor STRING are expanded; they are appended -# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). -# No SEPARATOR is output if MACRO-NAME was previously undefined (different -# than defined and empty). -# -# This macro is needed until we can rely on Autoconf 2.62, since earlier -# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. -m4_define([lt_append], -[m4_define([$1], - m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) - - - -# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) -# ---------------------------------------------------------- -# Produce a SEP delimited list of all paired combinations of elements of -# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list -# has the form PREFIXmINFIXSUFFIXn. -# Needed until we can rely on m4_combine added in Autoconf 2.62. -m4_define([lt_combine], -[m4_if(m4_eval([$# > 3]), [1], - [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl -[[m4_foreach([_Lt_prefix], [$2], - [m4_foreach([_Lt_suffix], - ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, - [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) - - -# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) -# ----------------------------------------------------------------------- -# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited -# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. -m4_define([lt_if_append_uniq], -[m4_ifdef([$1], - [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], - [lt_append([$1], [$2], [$3])$4], - [$5])], - [lt_append([$1], [$2], [$3])$4])]) - - -# lt_dict_add(DICT, KEY, VALUE) -# ----------------------------- -m4_define([lt_dict_add], -[m4_define([$1($2)], [$3])]) - - -# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) -# -------------------------------------------- -m4_define([lt_dict_add_subkey], -[m4_define([$1($2:$3)], [$4])]) - - -# lt_dict_fetch(DICT, KEY, [SUBKEY]) -# ---------------------------------- -m4_define([lt_dict_fetch], -[m4_ifval([$3], - m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), - m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) - - -# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) -# ----------------------------------------------------------------- -m4_define([lt_if_dict_fetch], -[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], - [$5], - [$6])]) - - -# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) -# -------------------------------------------------------------- -m4_define([lt_dict_filter], -[m4_if([$5], [], [], - [lt_join(m4_quote(m4_default([$4], [[, ]])), - lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), - [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl -]) - -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# Generated from ltversion.in. - -# serial 3017 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.2.6b]) -m4_define([LT_PACKAGE_REVISION], [1.3017]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.2.6b' -macro_revision='1.3017' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) - -# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004. -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 4 lt~obsolete.m4 - -# These exist entirely to fool aclocal when bootstrapping libtool. -# -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) -# which have later been changed to m4_define as they aren't part of the -# exported API, or moved to Autoconf or Automake where they belong. -# -# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN -# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us -# using a macro with the same name in our local m4/libtool.m4 it'll -# pull the old libtool.m4 in (it doesn't see our shiny new m4_define -# and doesn't know about Autoconf macros at all.) -# -# So we provide this file, which has a silly filename so it's always -# included after everything else. This provides aclocal with the -# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything -# because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. -# -# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. -# Yes, that means every name once taken will need to remain here until -# we give up compatibility with versions before 1.7, at which point -# we need to keep only those names which we still refer to. - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) - -m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) -m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) -m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) -m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) -m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) -m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) -m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) -m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) -m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) -m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) -m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) -m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) -m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) -m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) -m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) -m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) -m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) -m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) -m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) -m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) -m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) -m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) -m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) -m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) -m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) -m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) -m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) -m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) -m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) -m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) -m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) -m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) -m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) -m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) -m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) -m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) -m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) -m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) -m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) -m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) -m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) -m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) -m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) -m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) - -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -# (This private macro should not be called outside this file.) -AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.11' -dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to -dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.1], [], - [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl -]) - -# _AM_AUTOCONF_VERSION(VERSION) -# ----------------------------- -# aclocal traces this macro to find the Autoconf version. -# This is a private macro too. Using m4_define simplifies -# the logic in aclocal, which can simply ignore this definition. -m4_define([_AM_AUTOCONF_VERSION], []) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. -# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11.1])dnl -m4_ifndef([AC_AUTOCONF_VERSION], - [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) - -# AM_AUX_DIR_EXPAND -*- Autoconf -*- - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 9 - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE])dnl -AC_SUBST([$1_FALSE])dnl -_AM_SUBST_NOTMAKE([$1_TRUE])dnl -_AM_SUBST_NOTMAKE([$1_FALSE])dnl -m4_define([_AM_COND_VALUE_$1], [$2])dnl -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 10 - -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - am__universal=false - m4_case([$1], [CC], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac], - [CXX], - [case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac]) - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -#serial 5 - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 16 - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -]) - -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not -dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further -dnl mangled by Autoconf and run in a shell conditional statement. -m4_define([_AC_COMPILER_EXEEXT], -m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST(install_sh)]) - -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 6 - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) - -# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# ------------------------------ -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) - -# _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 5 - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Copyright (C) 2006, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. -# This macro is traced by Automake. -AC_DEFUN([_AM_SUBST_NOTMAKE]) - -# AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Public sister of _AM_SUBST_NOTMAKE. -AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar <conftest.tar]) - grep GrepMe conftest.dir/file >/dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.am deleted file mode 100644 index 46cf501f..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -INCLUDES = \ - -I$(top_srcdir)/libGeoIP \ - -Wall - -AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\" -Wall - -DEPS = $(top_builddir)/libGeoIP/libGeoIP.la -LDADDS = $(top_builddir)/libGeoIP/libGeoIP.la - -bin_PROGRAMS = geoiplookup geoiplookup6 geoipupdate - -geoiplookup_SOURCES = geoiplookup.c -geoiplookup_LDFLAGS = -geoiplookup_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup_LDADD = $(top_builddir)/libGeoIP/libGeoIP.la - -geoiplookup6_SOURCES = geoiplookup6.c -geoiplookup6_LDFLAGS = -geoiplookup6_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup6_LDADD = $(top_builddir)/libGeoIP/libGeoIP.la - -geoipupdate_SOURCES = geoipupdate.c -geoipupdate_LDFLAGS = -geoipupdate_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la $(top_builddir)/libGeoIP/libGeoIPUpdate.la -geoipupdate_LDADD = $(top_builddir)/libGeoIP/libGeoIPUpdate.la $(top_builddir)/libGeoIP/libGeoIP.la -EXTRA_DIST = geoipupdate-pureperl.pl Makefile.vc diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.in deleted file mode 100644 index 934f6b6a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.in +++ /dev/null @@ -1,544 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -bin_PROGRAMS = geoiplookup$(EXEEXT) geoiplookup6$(EXEEXT) \ - geoipupdate$(EXEEXT) -subdir = apps -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" -PROGRAMS = $(bin_PROGRAMS) -am_geoiplookup_OBJECTS = geoiplookup.$(OBJEXT) -geoiplookup_OBJECTS = $(am_geoiplookup_OBJECTS) -geoiplookup_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(geoiplookup_LDFLAGS) $(LDFLAGS) -o $@ -am_geoiplookup6_OBJECTS = geoiplookup6.$(OBJEXT) -geoiplookup6_OBJECTS = $(am_geoiplookup6_OBJECTS) -geoiplookup6_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(geoiplookup6_LDFLAGS) $(LDFLAGS) -o $@ -am_geoipupdate_OBJECTS = geoipupdate.$(OBJEXT) -geoipupdate_OBJECTS = $(am_geoipupdate_OBJECTS) -geoipupdate_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(geoipupdate_LDFLAGS) $(LDFLAGS) -o $@ -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(geoiplookup_SOURCES) $(geoiplookup6_SOURCES) \ - $(geoipupdate_SOURCES) -DIST_SOURCES = $(geoiplookup_SOURCES) $(geoiplookup6_SOURCES) \ - $(geoipupdate_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -INCLUDES = \ - -I$(top_srcdir)/libGeoIP \ - -Wall - -AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\" -Wall -DEPS = $(top_builddir)/libGeoIP/libGeoIP.la -LDADDS = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup_SOURCES = geoiplookup.c -geoiplookup_LDFLAGS = -geoiplookup_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup_LDADD = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup6_SOURCES = geoiplookup6.c -geoiplookup6_LDFLAGS = -geoiplookup6_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -geoiplookup6_LDADD = $(top_builddir)/libGeoIP/libGeoIP.la -geoipupdate_SOURCES = geoipupdate.c -geoipupdate_LDFLAGS = -geoipupdate_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la $(top_builddir)/libGeoIP/libGeoIPUpdate.la -geoipupdate_LDADD = $(top_builddir)/libGeoIP/libGeoIPUpdate.la $(top_builddir)/libGeoIP/libGeoIP.la -EXTRA_DIST = geoipupdate-pureperl.pl Makefile.vc -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu apps/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu apps/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list -geoiplookup$(EXEEXT): $(geoiplookup_OBJECTS) $(geoiplookup_DEPENDENCIES) - @rm -f geoiplookup$(EXEEXT) - $(geoiplookup_LINK) $(geoiplookup_OBJECTS) $(geoiplookup_LDADD) $(LIBS) -geoiplookup6$(EXEEXT): $(geoiplookup6_OBJECTS) $(geoiplookup6_DEPENDENCIES) - @rm -f geoiplookup6$(EXEEXT) - $(geoiplookup6_LINK) $(geoiplookup6_OBJECTS) $(geoiplookup6_LDADD) $(LIBS) -geoipupdate$(EXEEXT): $(geoipupdate_OBJECTS) $(geoipupdate_DEPENDENCIES) - @rm -f geoipupdate$(EXEEXT) - $(geoipupdate_LINK) $(geoipupdate_OBJECTS) $(geoipupdate_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geoiplookup.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geoiplookup6.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geoipupdate.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: - for dir in "$(DESTDIR)$(bindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-binPROGRAMS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libtool ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-binPROGRAMS - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.vc b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.vc deleted file mode 100644 index 266a9319..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/Makefile.vc +++ /dev/null @@ -1,25 +0,0 @@ -#NMAKE makefile for Windows developers. -#Produces a static library (GeoIP.lib). - -COMPILER=cl - -LINK = link -nologo - -CFLAGS=-DWIN32 -MD -nologo - -GEOIPINC = -I..\libGeoIP - -CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) - -GEOIPLIB = ..\libGeoIP\GeoIP.lib - -EXTRA_LIBS= advapi32.lib wsock32.lib - -AR=lib - -APPS: geoiplookup.exe - -geoiplookup.exe: geoiplookup.c - $(CC1) -c geoiplookup.c - $(LINK) geoiplookup.obj $(GEOIPLIB) - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup.c b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup.c deleted file mode 100644 index bd3c6fca..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup.c +++ /dev/null @@ -1,401 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* geoiplookup.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" -#include "GeoIPCity.h" -#include "GeoIP_internal.h" - -#if defined(_WIN32) -# ifndef uint32_t -typedef unsigned int uint32_t; -# endif -#endif - -void geoiplookup(GeoIP* gi,char *hostname,int i); - -void usage() { - fprintf(stderr,"Usage: geoiplookup [-d custom_dir] [-f custom_file] [-v] [-i] <ipaddress|hostname>\n"); -} - -/* extra info used in _say_range_ip */ -int info_flag = 0; - -int main (int argc, char *argv[]) { - char * hostname = NULL; - char * db_info; - GeoIP * gi; - int i; - char *custom_directory = NULL; - char *custom_file = NULL; - int version_flag = 0; - - if (argc < 2) { - usage(); - exit(1); - } - i = 1; - while (i < argc) { - if (strcmp(argv[i],"-v") == 0) { - version_flag = 1; - } else if (strcmp(argv[i],"-i") == 0) { - info_flag = 1; - } else if (strcmp(argv[i],"-f") == 0) { - if ((i+1) < argc){ - i++; - custom_file = argv[i]; - } - } else if (strcmp(argv[i],"-d") == 0) { - if ((i+1) < argc){ - i++; - custom_directory = argv[i]; - } - } else { - hostname = argv[i]; - } - i++; - } - if (hostname == NULL) { - usage(); - exit(1); - } - - if (custom_directory != NULL) { - GeoIP_setup_custom_directory(custom_directory); - } - _GeoIP_setup_dbfilename(); - - if (custom_file != NULL) { - gi = GeoIP_open(custom_file, GEOIP_STANDARD); - - if (NULL == gi) { - printf("%s not available, skipping...\n", custom_file); - } else { - i = GeoIP_database_edition(gi); - if (version_flag == 1) { - db_info = GeoIP_database_info(gi); - printf("%s: %s\n",GeoIPDBDescription[i],db_info == NULL ? "": db_info ); - free(db_info); - } else { - geoiplookup(gi,hostname,i); - } - } - GeoIP_delete(gi); - } else { - /* iterate through different database types */ - for (i = 0; i < NUM_DB_TYPES; ++i) { - if (GeoIP_db_avail(i)) { - gi = GeoIP_open_type(i, GEOIP_STANDARD); - if (NULL == gi) { - printf("%s not available, skipping...\n", GeoIPDBDescription[i]); - } else { - if (version_flag == 1) { - db_info = GeoIP_database_info(gi); - printf("%s: %s\n",GeoIPDBDescription[i], db_info == NULL ? "" : db_info ); - free(db_info); - } else { - geoiplookup(gi,hostname,i); - } - } - GeoIP_delete(gi); - } - } - } - return 0; -} - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -static void _mk_conf_str( unsigned char val , char * to, int size){ - if ( ( val & 0x7f ) == 0x7f ){ - snprintf(to, 5, "N/A"); - return; - } - snprintf(to, 5, "%d", val); - return; -} - -static unsigned long -__addr_to_num(const char *addr) -{ - unsigned int c, octet, t; - unsigned long ipnum; - int i = 3; - - octet = ipnum = 0; - while ((c = *addr++)) { - if (c == '.') { - if (octet > 255) - return 0; - ipnum <<= 8; - ipnum += octet; - i--; - octet = 0; - } else { - t = octet; - octet <<= 3; - octet += t; - octet += t; - c -= '0'; - if (c > 9) - return 0; - octet += c; - } - } - if ((octet > 255) || (i != 0)) - return 0; - ipnum <<= 8; - return ipnum + octet; -} - - - -/* ptr must be a memory area with at least 16 bytes */ -static char *__num_to_addr_r (unsigned long ipnum, char * ptr) { - char *cur_str; - int octet[4]; - int num_chars_written, i; - - cur_str = ptr; - - for (i = 0; i<4; i++) { - octet[3 - i] = ipnum % 256; - ipnum >>= 8; - } - - for (i = 0; i<4; i++) { - num_chars_written = sprintf(cur_str, "%d", octet[i]); - cur_str += num_chars_written; - - if (i < 3) { - cur_str[0] = '.'; - cur_str++; - } - } - - return ptr; -} - -void _say_range_by_ip(GeoIP * gi, uint32_t ipnum ) { - unsigned long last_nm, mask, low, hi; - char ipaddr[16]; - char tmp[16]; - char ** range; - - if ( info_flag == 0 ) - return; /* noop unless extra information is requested */ - - range = GeoIP_range_by_ip( gi, __num_to_addr_r( ipnum, ipaddr ) ); - if ( range == NULL ) - return; - - printf ( " ipaddr: %s\n", ipaddr ); - - printf( " range_by_ip: %s - %s\n", range[0], range[1] ); - last_nm = GeoIP_last_netmask(gi); - mask = 0xffffffff << ( 32 - last_nm ); - low = ipnum & mask; - hi = low + ( 0xffffffff & ~mask ); - printf( " network: %s - %s ::%ld\n", - __num_to_addr_r( low, ipaddr ), - __num_to_addr_r( hi, tmp ), - last_nm - ); - printf( " ipnum: %u\n", ipnum ); - printf( " range_by_num: %lu - %lu\n", __addr_to_num(range[0]), __addr_to_num(range[1]) ); - printf( " network num: %lu - %lu ::%lu\n", low, hi, last_nm ); - - GeoIP_range_by_ip_delete(range); -} - -void -geoiplookup(GeoIP * gi, char *hostname, int i) -{ - const char *country_code; - const char *country_name; - const char *domain_name; - const char *asnum_name; - int netspeed; - int country_id; - GeoIPRegion *region; - GeoIPRecord *gir; - const char *org; - uint32_t ipnum; - - ipnum = _GeoIP_lookupaddress(hostname); - if (ipnum == 0) { - printf("%s: can't resolve hostname ( %s )\n", GeoIPDBDescription[i], hostname); - - } - else { - - if (GEOIP_DOMAIN_EDITION == i) { - domain_name = GeoIP_name_by_ipnum(gi, ipnum); - if (domain_name == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], domain_name); - _say_range_by_ip(gi, ipnum); - } - } - else if (GEOIP_LOCATIONA_EDITION == i || GEOIP_ACCURACYRADIUS_EDITION == i || GEOIP_ASNUM_EDITION == i || GEOIP_USERTYPE_EDITION == i || GEOIP_REGISTRAR_EDITION == i || GEOIP_NETSPEED_EDITION_REV1 == i ) { - asnum_name = GeoIP_name_by_ipnum(gi, ipnum); - if (asnum_name == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], asnum_name); - _say_range_by_ip(gi, ipnum); - } - } - else if (GEOIP_COUNTRY_EDITION == i) { - country_id = GeoIP_id_by_ipnum(gi, ipnum); - country_code = GeoIP_country_code[country_id]; - country_name = GeoIP_country_name[country_id]; - if (country_id == 0) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s\n", GeoIPDBDescription[i], country_code, country_name); - _say_range_by_ip(gi, ipnum); - } - } - else if (GEOIP_REGION_EDITION_REV0 == i || GEOIP_REGION_EDITION_REV1 == i) { - region = GeoIP_region_by_ipnum(gi, ipnum); - if (NULL == region || region->country_code[0] == '\0' ) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s\n", GeoIPDBDescription[i], region->country_code, region->region); - _say_range_by_ip(gi, ipnum); - GeoIPRegion_delete(region); - } - } - else if (GEOIP_CITY_EDITION_REV0 == i) { - gir = GeoIP_record_by_ipnum(gi, ipnum); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), - _mk_NA(gir->city), _mk_NA(gir->postal_code), gir->latitude, gir->longitude); - _say_range_by_ip(gi, ipnum); - GeoIPRecord_delete(gir); - } - } - else if (GEOIP_CITY_EDITION_REV1 == i) { - gir = GeoIP_record_by_ipnum(gi, ipnum); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), _mk_NA(gir->city), _mk_NA(gir->postal_code), - gir->latitude, gir->longitude, gir->metro_code, gir->area_code); - _say_range_by_ip(gi, ipnum); - GeoIPRecord_delete(gir); - } - } - else if (GEOIP_CITYCONFIDENCE_EDITION == i) { - gir = GeoIP_record_by_ipnum(gi, ipnum); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - char country_str[5], region_str[5], city_str[5], postal_str[5]; - _mk_conf_str(gir->country_conf, country_str, 5); - _mk_conf_str(gir->region_conf, region_str, 5); - _mk_conf_str(gir->city_conf, city_str, 5); - _mk_conf_str(gir->postal_conf, postal_str, 5); - - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d, %s, %s, %s, %s\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), _mk_NA(gir->city), _mk_NA(gir->postal_code), - gir->latitude, gir->longitude, gir->metro_code, gir->area_code, - country_str, region_str, city_str, postal_str - ); - _say_range_by_ip(gi, ipnum); - GeoIPRecord_delete(gir); - } - } - else if (GEOIP_CITYCONFIDENCEDIST_EDITION == i) { - gir = GeoIP_record_by_ipnum(gi, ipnum); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - char country_str[5], region_str[5], city_str[5], postal_str[5], accuracy_radius_str[5]; - _mk_conf_str(gir->country_conf, country_str, 5); - _mk_conf_str(gir->region_conf, region_str, 5); - _mk_conf_str(gir->city_conf, city_str, 5); - _mk_conf_str(gir->postal_conf, postal_str, 5); - if (gir->accuracy_radius != 1023){ - sprintf(accuracy_radius_str, "%d", gir->accuracy_radius ); -} else { - strcpy(accuracy_radius_str,"N/A");} - - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d, %s, %s, %s, %s, %s\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), _mk_NA(gir->city), _mk_NA(gir->postal_code), - gir->latitude, gir->longitude, gir->metro_code, gir->area_code, - country_str, region_str, city_str, postal_str, accuracy_radius_str - ); - _say_range_by_ip(gi, ipnum); - GeoIPRecord_delete(gir); - } - } - else if (GEOIP_ORG_EDITION == i || GEOIP_ISP_EDITION == i) { - org = GeoIP_org_by_ipnum(gi, ipnum); - if (org == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], org); - _say_range_by_ip(gi, ipnum); - } - } - else if (GEOIP_NETSPEED_EDITION == i) { - netspeed = GeoIP_id_by_ipnum(gi, ipnum); - if (netspeed == GEOIP_UNKNOWN_SPEED) { - printf("%s: Unknown\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_DIALUP_SPEED) { - printf("%s: Dialup\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_CABLEDSL_SPEED) { - printf("%s: Cable/DSL\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_CORPORATE_SPEED) { - printf("%s: Corporate\n", GeoIPDBDescription[i]); - } - _say_range_by_ip(gi, ipnum); - } - else { - - /* - * Silent ignore IPv6 databases. Otherwise we get annoying - * messages whenever we have a mixed environment IPv4 and - * IPv6 - */ - - /* - * printf("Can not handle database type -- try geoiplookup6\n"); - */ - ; - } - } -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup6.c b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup6.c deleted file mode 100644 index dc0ff9ba..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoiplookup6.c +++ /dev/null @@ -1,255 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* geoiplookup.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <GeoIP.h> -#include <GeoIPCity.h> -#include <GeoIP_internal.h> -void geoiplookup(GeoIP* gi,char *hostname,int i); - -void usage() { - fprintf(stderr,"Usage: geoiplookup [-d custom_dir] [-f custom_file] [-v] <ipaddress|hostname>\n"); -} - -int main (int argc, char *argv[]) { - char * hostname = NULL; - char * db_info; - GeoIP * gi; - int i; - char *custom_directory = NULL; - char *custom_file = NULL; - int version_flag = 0; - - if (argc < 2) { - usage(); - exit(1); - } - i = 1; - while (i < argc) { - if (strcmp(argv[i],"-v") == 0) { - version_flag = 1; - } else if (strcmp(argv[i],"-f") == 0) { - if ((i+1) < argc){ - i++; - custom_file = argv[i]; - } - } else if (strcmp(argv[i],"-d") == 0) { - if ((i+1) < argc){ - i++; - custom_directory = argv[i]; - } - } else { - hostname = argv[i]; - } - i++; - } - if (hostname == NULL) { - usage(); - exit(1); - } - - if (custom_directory != NULL) { - GeoIP_setup_custom_directory(custom_directory); - } - _GeoIP_setup_dbfilename(); - - if (custom_file != NULL) { - gi = GeoIP_open(custom_file, GEOIP_STANDARD); - if (NULL == gi) { - printf("%s not available, skipping...\n", custom_file); - } else { - i = GeoIP_database_edition(gi); - if (version_flag == 1) { - db_info = GeoIP_database_info(gi); - printf("%s: %s\n",GeoIPDBDescription[i],db_info == NULL ? "": db_info ); - free(db_info); - } else { - geoiplookup(gi,hostname,i); - } - } - GeoIP_delete(gi); - } else { - /* iterate through different database types */ - for (i = 0; i < NUM_DB_TYPES; ++i) { - if (GeoIP_db_avail(i)) { - gi = GeoIP_open_type(i, GEOIP_STANDARD); - if (NULL == gi) { - printf("%s not available, skipping...\n", GeoIPDBDescription[i]); - } else { - if (version_flag == 1) { - db_info = GeoIP_database_info(gi); - printf("%s: %s\n",GeoIPDBDescription[i],db_info); - free(db_info); - } else { - geoiplookup(gi,hostname,i); - } - } - GeoIP_delete(gi); - } - } - } - return 0; -} - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -void -geoiplookup(GeoIP * gi, char *hostname, int i) -{ - const char *country_code; - const char *country_name; - const char *domain_name; - const char *asnum_name; - int netspeed; - int country_id; - GeoIPRegion *region; - GeoIPRecord *gir; - const char *org; - - geoipv6_t ipnum; - ipnum = _GeoIP_lookupaddress_v6(hostname); - if (__GEOIP_V6_IS_NULL(ipnum)) { - printf("%s: can't resolve hostname ( %s )\n", GeoIPDBDescription[i], hostname); - - } - else { - - -#if 0 - if (GEOIP_DOMAIN_EDITION_V6 == i) { - domain_name = GeoIP_name_by_name_v6(gi, hostname); - if (domain_name == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], domain_name); - } - } -#endif - - - - if (GEOIP_LOCATIONA_EDITION_V6 == i || GEOIP_ASNUM_EDITION_V6 == i || GEOIP_USERTYPE_EDITION_V6 == i || GEOIP_REGISTRAR_EDITION_V6 == i || GEOIP_DOMAIN_EDITION_V6 == i || GEOIP_ORG_EDITION_V6 == i || GEOIP_ISP_EDITION_V6 == i || GEOIP_NETSPEED_EDITION_REV1_V6 == i ) { - asnum_name = GeoIP_name_by_ipnum_v6(gi, ipnum); - if (asnum_name == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], asnum_name); - // _say_range_by_ip(gi, ipnum); - } - } - - else if (GEOIP_CITY_EDITION_REV0_V6 == i) { - gir = GeoIP_record_by_name_v6(gi, hostname); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), - _mk_NA(gir->city), _mk_NA(gir->postal_code), gir->latitude, gir->longitude); - } - } - else if (GEOIP_CITY_EDITION_REV1_V6 == i) { - gir = GeoIP_record_by_name_v6(gi, hostname); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d\n", GeoIPDBDescription[i], gir->country_code, _mk_NA(gir->region), _mk_NA(gir->city), _mk_NA(gir->postal_code), - gir->latitude, gir->longitude, gir->metro_code, gir->area_code); - } - } - - else if (GEOIP_COUNTRY_EDITION_V6 == i) { - - country_id = GeoIP_id_by_ipnum_v6(gi, ipnum); - country_code = GeoIP_country_code[country_id]; - country_name = GeoIP_country_name[country_id]; - if (country_id == 0) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s\n", GeoIPDBDescription[i], country_code, country_name); - } - } - } - -#if 0 - - else - if (GEOIP_REGION_EDITION_REV0 == i || GEOIP_REGION_EDITION_REV1 == i) { - region = GeoIP_region_by_name_v6(gi, hostname); - if (NULL == region) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s\n", GeoIPDBDescription[i], region->country_code, region->region); - } - } - else if (GEOIP_CITY_EDITION_REV0 == i) { - gir = GeoIP_record_by_name(gi, hostname); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f\n", GeoIPDBDescription[i], gir->country_code, gir->region, - gir->city, gir->postal_code, gir->latitude, gir->longitude); - } - } - else if (GEOIP_CITY_EDITION_REV1 == i) { - gir = GeoIP_record_by_name(gi, hostname); - if (NULL == gir) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s, %s, %s, %s, %f, %f, %d, %d\n", GeoIPDBDescription[i], gir->country_code, gir->region, gir->city, gir->postal_code, - gir->latitude, gir->longitude, gir->metro_code, gir->area_code); - } - } - else if (GEOIP_ORG_EDITION == i || GEOIP_ISP_EDITION == i) { - org = GeoIP_org_by_name_v6(gi, hostname); - if (org == NULL) { - printf("%s: IP Address not found\n", GeoIPDBDescription[i]); - } - else { - printf("%s: %s\n", GeoIPDBDescription[i], org); - } - } - else if (GEOIP_NETSPEED_EDITION == i) { - netspeed = GeoIP_id_by_name_v6(gi, hostname); - if (netspeed == GEOIP_UNKNOWN_SPEED) { - printf("%s: Unknown\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_DIALUP_SPEED) { - printf("%s: Dialup\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_CABLEDSL_SPEED) { - printf("%s: Cable/DSL\n", GeoIPDBDescription[i]); - } - else if (netspeed == GEOIP_CORPORATE_SPEED) { - printf("%s: Corporate\n", GeoIPDBDescription[i]); - } - - } -#endif - -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate-pureperl.pl b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate-pureperl.pl deleted file mode 100644 index a8f04bee..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate-pureperl.pl +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/perl - -=pod - -/* - * - * Copyright (C) 2008 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -=cut - -=pod - -pure perl version of geoipupdate. can handle anything, that - - GeoIP_update_database - GeoIP_update_database_general - -handle. It is a drop in replacement for geoipupdate, as opposide to geoipupdate is the -pp version able to handle proxy requests even with authentication and can be used with -https - -=cut - -use strict; -use warnings; - -our $VERSION = '0.07'; - -use 5.008; -use Data::Dumper; -use Digest::MD5; -use File::Spec; -use File::Basename; -use Getopt::Std; -use HTTP::Request::Common; -use LWP::UserAgent; -use PerlIO::gzip; -use URI; - -my $ua = LWP::UserAgent->new( agent => "pp_geoipupdate/$VERSION" ); -$ua->env_proxy; - -## --- for auth proxies use -## $ua->proxy(['http', 'ftp'] => 'http://username:password@proxy.myorg.com'); - -my $license_file = 'GeoIP.conf'; -my $update_host = 'updates.maxmind.com'; -my $proto = 'http'; -my %opts; - -if ( !getopts( 'hvf:d:', \%opts ) or $opts{h} ) { - print STDERR - "Usage: geoipupdate [-hv] [-f license_file] [-d custom directory]\n"; - exit @ARGV ? 1 : 0; -} - -my $rootdir = File::Spec->rootdir; -$opts{d} ||= File::Spec->catfile( $rootdir, qw/ usr local share GeoIP / ); -$opts{f} ||= - File::Spec->catfile( $rootdir, qw/ usr local etc /, $license_file ); - -die "dir $opts{d} does not exist or is not readable or is not a directory\n" - unless -d $opts{d}; -die "license_file $opts{f} does not exist, is not readable or is not a file\n" - unless -f $opts{f}; - -# -# --- parse license file -# -open my $fh, '<', $opts{f} - or die "Error opening GeoIP Configuration file $opts{f}\n"; -print "Opened License file $opts{f}\n" if $opts{v}; - -my ( $user_id, $license_key, @product_ids ); -{ - local $_; - - while (<$fh>) { - next if /^\s*#/; # skip comments - /^\s*UserId\s+(\d+)/ and $user_id = $1, next; - /^\s*LicenseKey\s+(\S{12})/ and $license_key = $1, next; - /^\s*ProductIds\s+(\d+(?:[a-zA-Z]{2,3})?(?:\s+\d+(?:[a-zA-Z]{2,3})?)*)/ - and @product_ids = split( /\s+/, $1 ), next; - - } -} - -if ( $opts{v} ) { - print "User id $user_id\n" if $user_id; - print "Read in license key $license_key\n"; - print "Product ids @product_ids\n"; -} - -if ($user_id) { - for my $product_id (@product_ids) { - - # update the databases using the user id string, - # the license key string and the product id for each database - eval { - GeoIP_update_database_general( $user_id, $license_key, - $product_id, $opts{v} ); - }; - my $err = $@; - die $err if $err and $err !~ /^No new updates available/i; - print $err; - } -} else { - - # Old format with just license key for MaxMind GeoIP Country database updates - # here for backwards compatibility - eval { GeoIP_update_database( $license_key, $opts{v} ); }; - my $err = $@; - die $err if $err and $err !~ /^No new updates available/i; - print $err; -} - -exit 0; - -sub GeoIP_update_database_general { - my ( $user_id, $license_key, $product_id, $verbose, $client_ipaddr ) = @_; - my $u = URI->new("$proto://$update_host/app/update_getfilename"); - $u->query_form( product_id => $product_id ); - - print 'Send request ' . $u->as_string, "\n" if ($verbose); - my $res = $ua->request( GET $u->as_string, Host => $update_host ); - die $res->status_line unless ( $res->is_success ); - # make sure to use only the filename for security reason - my $geoip_filename = File::Spec->catfile( $opts{d}, basename($res->content) ); - - # /* get MD5 of current GeoIP database file */ - my $old_md5 = _get_hexdigest($geoip_filename); - - print "MD5 sum of database $geoip_filename is $old_md5\n" if $verbose; - - unless ($client_ipaddr) { - print 'Send request ' . $u->as_string, "\n" if ($verbose); - - # /* get client ip address from MaxMind web page */ - $res = $ua->request( GET "$proto://$update_host/app/update_getipaddr", - Host => $update_host ); - die $res->status_line unless ( $res->is_success ); - $client_ipaddr = $res->content; - } - - print "client ip address: $client_ipaddr\n" if $verbose; - my $hex_digest2 = - Digest::MD5->new->add( $license_key, $client_ipaddr )->hexdigest; - print "md5sum of ip address and license key is $hex_digest2\n" if $verbose; - - my $mk_db_req_cref = sub { - - $u->path('/app/update_secure'); - $u->query_form( - db_md5 => shift, - challenge_md5 => $hex_digest2, - user_id => $user_id, - edition_id => $product_id - ); - print 'Send request ' . $u->as_string, "\n" if ($verbose); - return $ua->request( GET $u->as_string, Host => $update_host ); - }; - $res = $mk_db_req_cref->($old_md5); - die $res->status_line unless ( $res->is_success ); - - # print Dumper($res); - print "Downloading gzipped GeoIP Database...\n" if $verbose; - - _gunzip_and_replace( - $res->content, - $geoip_filename, - sub { - - # as sanity check request a update for the new downloaded file - # md5 of the new unpacked file - my $new_md5 = _get_hexdigest(shift); - return $mk_db_req_cref->($new_md5); - } - ); - print "Done\n" if $verbose; -} - -sub GeoIP_update_database { - my ( $license_key, $verbose ) = @_; - my $geoip_filename = File::Spec->catfile( $opts{d}, 'GeoIP.dat' ); - - # /* get MD5 of current GeoIP database file */ - my $hexdigest = _get_hexdigest($geoip_filename); - - print "MD5 sum of database $geoip_filename is $hexdigest\n" if $verbose; - - my $u = URI->new("$proto://$update_host/app/update"); - $u->query_form( license_key => $license_key, md5 => $hexdigest ); - - print 'Send request ' . $u->as_string, "\n" if ($verbose); - my $res = $ua->request( GET $u->as_string, Host => $update_host ); - die $res->status_line unless ( $res->is_success ); - print "Downloading gzipped GeoIP Database...\n" if $verbose; - _gunzip_and_replace( $res->content, $geoip_filename ); - print "Done\n" if $verbose; - -} - -# --- hexdigest of the file or 00000000000000000000000000000000 -sub _get_hexdigest { - my $md5 = '0' x 32; - if ( open my $fh, '<:raw', shift ) { - $md5 = Digest::MD5->new->addfile($fh)->hexdigest; - } - return $md5; -} - -sub _gunzip_and_replace { - my ( $content, $geoip_filename, $sanity_check_c ) = @_; - my $max_retry = 1; - - my $tmp_fname = $geoip_filename . '.test'; - - { - - # --- error if our content does not start with the gzip header - die $content || 'Not a gzip file' if substr( $content, 0, 2 ) ne "\x1f\x8b"; - - # --- uncompress the gzip data - { - local $_; - open my $gin, '<:gzip', \$content or die $!; - open my $gout, '>:raw', $tmp_fname or die $!; - print {$gout} $_ while (<$gin>); - } - - # --- sanity check - if ( defined $sanity_check_c ) { - die "Download failed" if $max_retry-- <= 0; - my $res = $sanity_check_c->($tmp_fname); - die $res->status_line unless ( $res->is_success ); - $content = $res->content; - - redo if ( $content !~ /^No new updates available/ ); - } - } - - # --- install GeoIP.dat.test -> GeoIP.dat - rename( $tmp_fname, $geoip_filename ) or die $!; -} - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate.c b/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate.c deleted file mode 100644 index b3a553b2..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/apps/geoipupdate.c +++ /dev/null @@ -1,283 +0,0 @@ -/* geoipupdate.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" -#include "GeoIPUpdate.h" - -#include <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#ifdef __linux__ -#include <getopt.h> -#endif -#include <ctype.h> - -#define PRODUCT_ID_TOKEN "ProductIds" -#define USER_ID_TOKEN "UserId" -#define LICENSE_KEY_TOKEN "LicenseKey" -#define LICENSE_KEY_LENGTH 12 - -const char *GeoIPConfFile = "GeoIP.conf"; - -void usage() { - fprintf(stderr,"Usage: geoipupdate [-hv] [-f license_file] [-d custom directory]\n"); -} - -void my_printf(char * str) { - printf("%s", str); -} - -void print_status (int err, char * license_file) { - if (err == GEOIP_NO_NEW_UPDATES) { - fprintf(stdout,"GeoIP Database up to date\n"); - } else if (err == GEOIP_LICENSE_KEY_INVALID_ERR) { - fprintf(stderr,"Invalid License Key in %s - Please visit http://www.maxmind.com/app/products for a subscription\n",license_file); - } else if (err == GEOIP_USER_ID_INVALID_ERR){ - fprintf(stderr,"Invalid UserID\n"); - } else if (err == GEOIP_PRODUCT_ID_INVALID_ERR){ - fprintf(stderr,"Invalid product ID or subscription expired\n"); - } else if (err < 0) { - fprintf(stderr,"Received Error %d (%s) when attempting to update GeoIP Database\n",err, GeoIP_get_error_message(err)); - } else { - fprintf(stdout,"Updated database\n"); - } -} - -int main (int argc, char *argv[]) { - int verbose = 0; - char * license_file = NULL; - FILE * license_fh; - int n = 40; - int line_index = 0; - unsigned char *lineptr = malloc(sizeof(char) * n); - char *a_license_key_str, *a_ptr; - char *the_license_key_str = ""; - char * the_reference_empty_license_key_str = the_license_key_str; - char *a_user_id_str = NULL; - /* the string that holds the user id */ - char *the_user_id_str = NULL; - /* the integer that holds the length of the string the_user_id_str */ - int the_user_id_strl = 0; - /* the integer that holds the alloc length of the string the_user_id_str */ - int the_user_id_stral = 0; - char *a_product_id_str = NULL; - char **the_product_id_str = NULL; - int *the_product_id_strl = NULL; - int *the_product_id_stral = NULL; - int num_product_ids = 0; - char * client_ipaddr = NULL; - char * custom_directory = NULL; - int c; - int err = 0; - int i; - - opterr = 0; - - while ((c = getopt (argc, argv, "hvf:d:")) != -1) - switch (c) { - case 'h': - usage(); - exit(0); - case 'v': - verbose = 1; - break; - case 'f': - license_file = optarg; - break; - case 'd': - custom_directory = optarg; - break; - case '?': - if (isprint (optopt)) - fprintf (stderr, "Unknown option `-%c'.\n", optopt); - else - fprintf (stderr, - "Unknown option character `\\x%x'.\n", - optopt); - usage(); - exit(1); - default: - abort(); - } - - if (custom_directory != NULL) { - GeoIP_setup_custom_directory(custom_directory); - } - if (license_file == NULL) { - license_file = malloc(sizeof(char) * (strlen(SYSCONFDIR)+strlen(GeoIPConfFile)+2)); - license_file[0] = '\0'; - strcat(license_file, SYSCONFDIR); - strcat(license_file, "/"); - strcat(license_file, GeoIPConfFile); - } - - license_fh = fopen(license_file,"r"); - if (license_fh == NULL) { - fprintf(stderr,"Error opening GeoIP Configuration file %s\n",license_file); - exit(1); - } - - if (verbose == 1) - printf("Opened License file %s\n", license_file); - - do { - c = fgetc(license_fh); - if (line_index >= n) { - n += 20; - lineptr = realloc(lineptr, n); - } - if (c == 10 || c == EOF) { - lineptr[line_index++] = '\0'; - line_index = 0; - if (lineptr[0] == '#') - continue; - /* get the product ids from the config file */ - a_product_id_str = strstr((char *)lineptr, PRODUCT_ID_TOKEN);//search for a product id token in the line - if (a_product_id_str != NULL) { - a_ptr = a_product_id_str; - /* set pos at the end of product id token */ - a_ptr += strlen(PRODUCT_ID_TOKEN) + 1; - while (a_ptr[0] == ' ') { - /* skip spaces */ - a_ptr++; - } - /* alloc the array of product ids */ - the_product_id_str = (char **) malloc((num_product_ids+1) * sizeof(char*)); /* array of strings */ - the_product_id_strl = (int *) malloc((num_product_ids+1) * sizeof(char*)); /* array of string lengths */ - the_product_id_stral = (int *) malloc((num_product_ids+1) * sizeof(char*)); /* array of string alloc lengths */ - while (a_ptr[0] != '\0') { - /* add new product id to the array of product ids */ - the_product_id_str[num_product_ids] = (char *) malloc(20); /* the string */ - the_product_id_strl[num_product_ids] = 0; /* the length of the string */ - the_product_id_stral[num_product_ids] = 20; /* the alloc length of the string */ - while ((a_ptr[0] != ' ') & (a_ptr[0] != '\0')) { - if (the_product_id_strl[num_product_ids] >= the_product_id_stral[num_product_ids]) { - /* if the length of the string is equal or more than - * alloc length of the string then realloc the string and - * increase the alloc length by 20 */ - the_product_id_stral[num_product_ids] = the_product_id_stral[num_product_ids] + 20; - the_product_id_str[num_product_ids] = (char *) realloc(the_product_id_str[num_product_ids],the_product_id_stral[num_product_ids]+4); - } - /* read the product id from the line in the config file */ - the_product_id_str[num_product_ids][the_product_id_strl[num_product_ids]] = a_ptr[0]; - the_product_id_strl[num_product_ids]++; - a_ptr++; - } - the_product_id_str[num_product_ids][the_product_id_strl[num_product_ids]] = 0; - while ((a_ptr[0] == ' ') & (a_ptr[0] != '\0')) { - a_ptr++;//skip spaces - } - /* new product id add, realloc the arrays */ - num_product_ids = num_product_ids + 1; - /* array of string */ - the_product_id_str = (char **) realloc(the_product_id_str,(num_product_ids+1) * sizeof(char*)); - /* array of string lengths */ - the_product_id_strl = (int *) realloc(the_product_id_strl,(num_product_ids+1) * sizeof(char*)); - /* array of string alloc lengths */ - the_product_id_stral = (int *) realloc(the_product_id_stral,(num_product_ids+1) * sizeof(char*)); - } - } - - /* get the user id from the config file */ - a_user_id_str = strstr((char *)lineptr, USER_ID_TOKEN); /* search for a user id token in the line */ - if (a_user_id_str != NULL) { - a_ptr = a_user_id_str; - /* set the position at the end of user id token */ - a_ptr += strlen(USER_ID_TOKEN) + 1; - while (a_ptr[0] == ' ') { - /* skip spaces */ - a_ptr++; - } - /* get the string that has the user id */ - the_user_id_stral = 20; - the_user_id_str = (char *)malloc(the_user_id_stral); - /* loop while the chars are numbers */ - while ((a_ptr[0] >= '0') & (a_ptr[0] <= '9')) { - the_user_id_str[the_user_id_strl++] = a_ptr[0]; - a_ptr++; - if (the_user_id_strl >= the_user_id_stral) { - /* if the length of user id string is greater or equal to - * the alloc length of user id string then - * add 20 to the alloc length and realloc the user id string */ - the_user_id_stral += 20; - the_user_id_str = realloc(the_user_id_str,the_user_id_stral); - } - } - the_user_id_str[the_user_id_strl] = 0; /* add NUL char */ - } - a_license_key_str = strstr((char *)lineptr, LICENSE_KEY_TOKEN); - if (a_license_key_str != NULL) { - a_ptr = a_license_key_str; - a_ptr += strlen(LICENSE_KEY_TOKEN) + 1; - while (a_ptr[0] == ' ') { - a_ptr++; - } - the_license_key_str = malloc(sizeof(char) * (LICENSE_KEY_LENGTH + 1)); - strncpy(the_license_key_str, a_ptr, LICENSE_KEY_LENGTH); - the_license_key_str[LICENSE_KEY_LENGTH] = '\0'; - } - } else { - lineptr[line_index++] = c; - } - } while (c != EOF); - - free(lineptr); - - fclose(license_fh); - - if (verbose == 1) { - printf("Read in license key %s\n", the_license_key_str); - printf("number of product ids %d \n",num_product_ids); - } - - if (the_user_id_str != NULL) { - /* update the databases using the user id string, the license key string and the product id for each database */ - client_ipaddr = NULL; - for (i = 0; i < num_product_ids; i++) { - err = GeoIP_update_database_general(the_user_id_str, the_license_key_str, the_product_id_str[i], verbose,&client_ipaddr, &my_printf); - print_status(err, license_file); - } - } else { - /* Old format with just license key for MaxMind GeoIP Country database updates - * here for backwards compatibility */ - err = GeoIP_update_database(the_license_key_str, verbose, &my_printf); - print_status(err, license_file); - } - - if (the_product_id_str != NULL) { - /* free the product ids */ - for (i = 0; i < num_product_ids; i++ ) { - free(the_product_id_str[i]); - } - free(the_product_id_str); - free(the_product_id_strl); - free(the_product_id_stral); - } - - if ( the_reference_empty_license_key_str != the_license_key_str ) - free(the_license_key_str); - - if (the_user_id_str) - free(the_user_id_str); - - if (client_ipaddr) { - free(client_ipaddr); - } - exit(err); -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap b/Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap deleted file mode 100644 index d3a651db..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/bootstrap +++ /dev/null @@ -1,8 +0,0 @@ -#! /bin/sh - -# disable dependency trackeing for OS X with multiply arch option's -# automake -i --gnu --add-missing - -aclocal \ -&& automake -i --gnu --add-missing \ -&& autoconf diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/GeoIP.conf.default b/Src/Plugins/DSP/sc_serv3/GeoIP/conf/GeoIP.conf.default deleted file mode 100644 index 33f55265..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/GeoIP.conf.default +++ /dev/null @@ -1,19 +0,0 @@ -# If you purchase a subscription to the GeoIP database, -# then you will obtain a license key which you can -# use to automatically obtain updates. -# for more details, please go to -# http://www.maxmind.com/app/products - -# see https://www.maxmind.com/app/license_key_login to obtain License Key, -# UserId, and available ProductIds - -# Enter your license key here -LicenseKey YOUR_LICENSE_KEY_HERE - -# Enter your User ID here -UserId YOUR_USER_ID_HERE - -# Enter the Product ID(s) of the database(s) you would like to update -# By default 106 (MaxMind GeoIP Country) is listed below -ProductIds 106 - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.am deleted file mode 100644 index c55ec18b..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -dist_sysconf_DATA = GeoIP.conf.default - -DEFAULT_CONFIG_FILE = $(sysconfdir)/GeoIP.conf - -install-exec-hook: - @if test -f "$(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; then \ - echo "$@ will not overwrite existing $(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; \ - else \ - echo "$(INSTALL_DATA) GeoIP.conf.default $(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ - $(INSTALL_DATA) "$(srcdir)/GeoIP.conf.default" "$(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ - fi - -uninstall-hook: - @if test -f "$(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; then \ - rm "$(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ -fi diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.in deleted file mode 100644 index 2a4ad929..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/conf/Makefile.in +++ /dev/null @@ -1,414 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = conf -DIST_COMMON = $(dist_sysconf_DATA) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(sysconfdir)" -DATA = $(dist_sysconf_DATA) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -dist_sysconf_DATA = GeoIP.conf.default -DEFAULT_CONFIG_FILE = $(sysconfdir)/GeoIP.conf -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu conf/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu conf/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-dist_sysconfDATA: $(dist_sysconf_DATA) - @$(NORMAL_INSTALL) - test -z "$(sysconfdir)" || $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" - @list='$(dist_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sysconfdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(sysconfdir)" || exit $$?; \ - done - -uninstall-dist_sysconfDATA: - @$(NORMAL_UNINSTALL) - @list='$(dist_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(sysconfdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(sysconfdir)" && rm -f $$files -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(sysconfdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-dist_sysconfDATA - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-dist_sysconfDATA - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: install-am install-exec-am install-strip uninstall-am - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dist_sysconfDATA \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-exec-hook install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-dist_sysconfDATA uninstall-hook - - -install-exec-hook: - @if test -f "$(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; then \ - echo "$@ will not overwrite existing $(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; \ - else \ - echo "$(INSTALL_DATA) GeoIP.conf.default $(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ - $(INSTALL_DATA) "$(srcdir)/GeoIP.conf.default" "$(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ - fi - -uninstall-hook: - @if test -f "$(DESTDIR)$(DEFAULT_CONFIG_FILE)" ; then \ - rm "$(DESTDIR)$(DEFAULT_CONFIG_FILE)"; \ -fi - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/config.guess b/Src/Plugins/DSP/sc_serv3/GeoIP/config.guess deleted file mode 100644 index e3a2116a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/config.guess +++ /dev/null @@ -1,1533 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. - -timestamp='2009-06-10' - -# This file 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 of the License, 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner <per@bothner.com>. -# Please send patches to <config-patches@gnu.org>. Submit a context -# diff and a properly formatted ChangeLog entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to <config-patches@gnu.org>." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include <stdio.h> /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include <sys/systemcfg.h> - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[456]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include <stdlib.h> - #include <unistd.h> - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include <unistd.h> - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:[3456]*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - EM64T | authenticamd | genuineintel) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-gnu - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-gnu - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - esac - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include <features.h> - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^LIBC/{ - s: ::g - p - }'`" - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } - ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` - echo ${UNAME_MACHINE}-pc-isc$UNAME_REL - elif /bin/uname -X 2>/dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says <Richard.M.Bartel@ccMail.Census.GOV> - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes <hewes@openmarket.com>. - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c <<EOF -#ifdef _SEQUENT_ -# include <sys/types.h> -# include <sys/utsname.h> -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include <sys/param.h> - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include <sys/param.h> -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 <<EOF -$0: unable to guess system type - -This script, last modified $timestamp, has failed to recognize -the operating system you are using. It is advised that you -download the most up to date version of the config scripts from - - http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD -and - http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -If the version you run ($0) is already up to date, please -send the following data and any information you think might be -pertinent to <config-patches@gnu.org> in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/config.sub b/Src/Plugins/DSP/sc_serv3/GeoIP/config.sub deleted file mode 100644 index eb0389a6..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/config.sub +++ /dev/null @@ -1,1693 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. - -timestamp='2009-06-11' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file 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 of the License, 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to <config-patches@gnu.org>. Submit a context -# diff and a properly formatted ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to <config-patches@gnu.org>." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ - uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nios | nios2 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ - | tron-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; - tile*) - basic_machine=tile-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/configure b/Src/Plugins/DSP/sc_serv3/GeoIP/configure deleted file mode 100644 index 246e7563..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/configure +++ /dev/null @@ -1,13633 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.65 for GeoIP 1.4.8. -# -# Report bugs to <support@maxmind.com>. -# -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: support@maxmind.com about your system, including any -$0: error possibly output before this message. Then install -$0: a modern shell, or manually run the script under such a -$0: shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. -as_fn_error () -{ - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 - fi - $as_echo "$as_me: error: $1" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - - -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} - -case X$lt_ECHO in -X*--fallback-echo) - # Remove one level of quotation (which was required for Make). - ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` - ;; -esac - -ECHO=${lt_ECHO-echo} -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then - # Yippee, $ECHO works! - : -else - # Restart under the correct shell. - exec $SHELL "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <<_LT_EOF -$* -_LT_EOF - exit 0 -fi - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test -z "$lt_ECHO"; then - if test "X${echo_test_string+set}" != Xset; then - # find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if { echo_test_string=`eval $cmd`; } 2>/dev/null && - { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null - then - break - fi - done - fi - - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - : - else - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for dir in $PATH /usr/ucb; do - IFS="$lt_save_ifs" - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$dir/echo" - break - fi - done - IFS="$lt_save_ifs" - - if test "X$ECHO" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - ECHO='print -r' - elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running configure again with it. - ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} - else - # Try using printf. - ECHO='printf %s\n' - if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && - echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - # Cool, printf works - : - elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - ECHO="$CONFIG_SHELL $0 --fallback-echo" - elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && - test "X$echo_testing_string" = 'X\t' && - echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && - test "X$echo_testing_string" = "X$echo_test_string"; then - ECHO="$CONFIG_SHELL $0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do - if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null - then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "$0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} - else - # Oops. We lost completely, so just stick with echo. - ECHO=echo - fi - fi - fi - fi - fi -fi - -# Copy echo and quote the copy suitably for passing to libtool from -# the Makefile, instead of quoting the original, which is used later. -lt_ECHO=$ECHO -if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then - lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" -fi - - - - -test -n "$DJDIR" || exec 7<&0 </dev/null -exec 6>&1 - -# Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='GeoIP' -PACKAGE_TARNAME='GeoIP' -PACKAGE_VERSION='1.4.8' -PACKAGE_STRING='GeoIP 1.4.8' -PACKAGE_BUGREPORT='support@maxmind.com' -PACKAGE_URL='' - -# Factoring default headers for most tests. -ac_includes_default="\ -#include <stdio.h> -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -# include <sys/stat.h> -#endif -#ifdef STDC_HEADERS -# include <stdlib.h> -# include <stddef.h> -#else -# ifdef HAVE_STDLIB_H -# include <stdlib.h> -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include <memory.h> -# endif -# include <string.h> -#endif -#ifdef HAVE_STRINGS_H -# include <strings.h> -#endif -#ifdef HAVE_INTTYPES_H -# include <inttypes.h> -#endif -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif" - -ac_unique_file="libGeoIP/GeoIP.c" -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIBOBJS -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -lt_ECHO -RANLIB -AR -OBJDUMP -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -GEOIP_VERSION_INFO -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -EGREP -GREP -CPP -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_dependency_tracking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -enable_libtool_lock -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information." - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures GeoIP 1.4.8 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/GeoIP] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of GeoIP 1.4.8:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-shared[=PKGS] build shared libraries [default=yes] - --enable-static[=PKGS] build static libraries [default=yes] - --enable-fast-install[=PKGS] - optimize for fast installation [default=yes] - --disable-libtool-lock avoid locking (might break parallel builds) - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic try to use only PIC/non-PIC objects [default=use - both] - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a - nonstandard directory <lib dir> - LIBS libraries to pass to the linker, e.g. -l<library> - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if - you have headers in a nonstandard directory <include dir> - CPP C preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to <support@maxmind.com>. -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -GeoIP configure 1.4.8 -generated by GNU Autoconf 2.65 - -Copyright (C) 2009 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to support@maxmind.com ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_header_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case <limits.h> declares $2. - For example, HP-UX 11i <limits.h> declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - <limits.h> exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_func - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - -} # ac_fn_c_check_type -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by GeoIP $as_me 1.4.8, which was -generated by GNU Autoconf 2.65. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - cat <<\_ASBOX -## ---------------- ## -## Cache variables. ## -## ---------------- ## -_ASBOX - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## -## File substitutions. ## -## ------------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "no acceptable C compiler found in \$PATH -See \`config.log' for more details." "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "C compiler cannot create executables -See \`config.log' for more details." "$LINENO" 5; }; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdio.h> -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of object files: cannot compile -See \`config.log' for more details." "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdarg.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <float.h> - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <string.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ctype.h> -#include <stdlib.h> -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" -if test "x$ac_cv_header_minix_config_h" = x""yes; then : - MINIX=yes -else - MINIX= -fi - - - if test "$MINIX" = yes; then - -$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h - - -$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h - - -$as_echo "#define _MINIX 1" >>confdefs.h - - fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 -$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -# define __EXTENSIONS__ 1 - $ac_includes_default -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_safe_to_define___extensions__=yes -else - ac_cv_safe_to_define___extensions__=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 -$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } - test $ac_cv_safe_to_define___extensions__ = yes && - $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h - - $as_echo "#define _ALL_SOURCE 1" >>confdefs.h - - $as_echo "#define _GNU_SOURCE 1" >>confdefs.h - - $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h - - $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h - - - -am__api_version='1.11' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - for ac_t in install-sh install.sh shtool; do - if test -f "$ac_dir/$ac_t"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/$ac_t -c" - break 2 - fi - done -done -if test -z "$ac_aux_dir"; then - as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error "ls -t appears to fail. Make sure there is not a broken -alias in your environment" "$LINENO" 5 - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS - -fi - - test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='GeoIP' - VERSION='1.4.8' - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. - -AMTAR=${AMTAR-"${am_missing_run}tar"} - -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' - - - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - - - -GEOIP_VERSION_INFO=`echo $VERSION | awk -F. '{ printf "%d:%d:%d", $1+$2, $3, $2 }'` - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "no acceptable C compiler found in \$PATH -See \`config.log' for more details." "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdarg.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.2.6b' -macro_revision='1.3017' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if test "${ac_cv_build+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if test "${ac_cv_host+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if test "${ac_cv_path_SED+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if test "${ac_cv_path_FGREP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if test "${lt_cv_path_LD+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in - *GNU* | *'with BFD'*) - test "$with_gnu_ld" != no && break - ;; - *) - test "$with_gnu_ld" != yes && break - ;; - esac - fi - done - IFS="$lt_save_ifs" -else - lt_cv_path_LD="$LD" # Let the user override the test with a path. -fi -fi - -LD="$lt_cv_path_LD" -if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if test "${lt_cv_prog_gnu_ld+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 </dev/null` in -*GNU* | *'with BFD'*) - lt_cv_prog_gnu_ld=yes - ;; -*) - lt_cv_prog_gnu_ld=no - ;; -esac -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if test "${lt_cv_path_NM+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$ac_tool_prefix"; then - for ac_prog in "dumpbin -symbols" "link -dump -symbols" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DUMPBIN+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in "dumpbin -symbols" "link -dump -symbols" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if test "${lt_cv_nm_interface+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:5395: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:5398: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:5401: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if test "${lt_cv_sys_max_cmd_len+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ - = "XX$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if test "${lt_cv_ld_reload_flag+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OBJDUMP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if test "${lt_cv_deplibs_check_method+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - if ( file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -set dummy ${ac_tool_prefix}ar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AR+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_AR"; then - ac_ct_AR=$AR - # Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_AR="ar" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -else - AR="$ac_cv_prog_AR" -fi - -test -z "$AR" && AR=ar -test -z "$AR_FLAGS" && AR_FLAGS=cru - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_save_LIBS="$LIBS" - lt_save_CFLAGS="$CFLAGS" - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS="$lt_save_LIBS" - CFLAGS="$lt_save_CFLAGS" - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - - - - - - - - - - - - - - - - - - - - - - -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line 6606 "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if test "${lt_cv_cc_needs_belf+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -sparc*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_NMEDIT+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_LIPO+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL64+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if test "${lt_cv_apple_cc_single_mod+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -# Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; pic_mode="$withval" -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if test "${lt_cv_objdir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - - - - - - - - - - - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag=' -fno-builtin' - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7864: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:7868: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl*) - # IBM XL C 8.0/Fortran 10.1 on PPC - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Sun\ F*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 -$as_echo "$lt_prog_compiler_pic" >&6; } - - - - - - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8203: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:8207: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if test "${lt_cv_prog_compiler_static_works+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8308: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:8312: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8363: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:8367: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu) - link_all_deplibs=no - ;; - esac - - ld_shlibs=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag= - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld='-rpath $libdir' - archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - link_all_deplibs=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\(.*\)$/\1/ - p - } - }' -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then - aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\(.*\)$/\1/ - p - } - }' -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then - aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes=yes - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - whole_archive_flag_spec='' - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=echo - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - freebsd1*) - ld_shlibs=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld='+b $libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo(void) {} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - archive_cmds_need_lc=no - else - archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 -$as_echo "$archive_cmds_need_lc" >&6; } - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` - else - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib<name>.so - # instead of lib<name>.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -interix[3-9]*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # Some binutils ld are patched to set DT_RUNPATH - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = x""yes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if test "${ac_cv_lib_dld_shl_load+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = x""yes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if test "${ac_cv_lib_svld_dlopen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if test "${ac_cv_lib_dld_dld_link+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if test "${lt_cv_dlopen_self+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line 10747 "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if test "${lt_cv_dlopen_self_static+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line 10843 "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -ac_fn_c_check_type "$LINENO" "byte" "ac_cv_type_byte" "$ac_includes_default" -if test "x$ac_cv_type_byte" = x""yes; then : - $as_echo "#define HAVE_BYTE_TYPEDEF 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "ushort" "ac_cv_type_ushort" "$ac_includes_default" -if test "x$ac_cv_type_ushort" = x""yes; then : - $as_echo "#define HAVE_USHORT_TYPEDEF 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "ulong" "ac_cv_type_ulong" "$ac_includes_default" -if test "x$ac_cv_type_ulong" = x""yes; then : - $as_echo "#define HAVE_ULONG_TYPEDEF 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "u16" "ac_cv_type_u16" "$ac_includes_default" -if test "x$ac_cv_type_u16" = x""yes; then : - $as_echo "#define HAVE_U16_TYPEDEF 1" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "u32" "ac_cv_type_u32" "$ac_includes_default" -if test "x$ac_cv_type_u32" = x""yes; then : - $as_echo "#define HAVE_U32_TYPEDEF 1" >>confdefs.h - -fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if test "${ac_cv_c_bigendian+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_bigendian=unknown - # See if we're dealing with a universal compiler. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __APPLE_CC__ - not a universal capable compiler - #endif - typedef int dummy; - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - # Check for potential -arch flags. It is not universal unless - # there are at least two -arch flags with different values. - ac_arch= - ac_prev= - for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do - if test -n "$ac_prev"; then - case $ac_word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then - ac_arch=$ac_word - else - ac_cv_c_bigendian=universal - break - fi - ;; - esac - ac_prev= - elif test "x$ac_word" = "x-arch"; then - ac_prev=arch - fi - done -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test $ac_cv_c_bigendian = unknown; then - # See if sys/param.h defines the BYTE_ORDER macro. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <sys/types.h> - #include <sys/param.h> - -int -main () -{ -#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ - && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ - && LITTLE_ENDIAN) - bogus endian macros - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <sys/types.h> - #include <sys/param.h> - -int -main () -{ -#if BYTE_ORDER != BIG_ENDIAN - not big endian - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <limits.h> - -int -main () -{ -#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) - bogus endian macros - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to _BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <limits.h> - -int -main () -{ -#ifndef _BIG_ENDIAN - not big endian - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # Compile a test program. - if test "$cross_compiling" = yes; then : - # Try to guess by grepping values from an object file. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -short int ascii_mm[] = - { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - short int ascii_ii[] = - { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; - int use_ascii (int i) { - return ascii_mm[i] + ascii_ii[i]; - } - short int ebcdic_ii[] = - { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = - { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; - int use_ebcdic (int i) { - return ebcdic_mm[i] + ebcdic_ii[i]; - } - extern int foo; - -int -main () -{ -return use_ascii (foo) == use_ebcdic (foo); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then - ac_cv_c_bigendian=yes - fi - if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then - if test "$ac_cv_c_bigendian" = unknown; then - ac_cv_c_bigendian=no - else - # finding both strings is unlikely to happen, but who knows? - ac_cv_c_bigendian=unknown - fi - fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long int l; - char c[sizeof (long int)]; - } u; - u.l = 1; - return u.c[sizeof (long int) - 1] == 1; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } - case $ac_cv_c_bigendian in #( - yes) - $as_echo "#define BIG_ENDIAN_HOST 1" >>confdefs.h -;; #( - no) - $as_echo "#define LITTLE_ENDIAN_HOST 1" >>confdefs.h - ;; #( - universal) - -$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h - - ;; #( - *) - as_fn_error "unknown endianness - presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; - esac - - -for ac_header in stdint.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" -if test "x$ac_cv_header_stdint_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STDINT_H 1 -_ACEOF - -fi - -done - -for ac_header in zlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" -if test "x$ac_cv_header_zlib_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ZLIB_H 1 -_ACEOF - -else - as_fn_error "Zlib header (zlib.h) not found. Tor requires zlib to build. You may need to install a zlib development package." "$LINENO" 5 -fi - -done - - -ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = x""yes; then : - $as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h - -fi - -ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" -if test "x$ac_cv_func_vasprintf" = x""yes; then : - $as_echo "#define HAVE_VASPRINTF 1" >>confdefs.h - -fi - -ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" -if test "x$ac_cv_func_vsnprintf" = x""yes; then : - $as_echo "#define HAVE_VSNPRINTF 1" >>confdefs.h - -fi - -ac_fn_c_check_func "$LINENO" "vsprintf" "ac_cv_func_vsprintf" -if test "x$ac_cv_func_vsprintf" = x""yes; then : - $as_echo "#define HAVE_VSPRINTF 1" >>confdefs.h - -fi - - -ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" -if test "x$ac_cv_func_gethostbyname" = x""yes; then : - $as_echo "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 -$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } -if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lnsl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char gethostbyname (); -int -main () -{ -return gethostbyname (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_nsl_gethostbyname=yes -else - ac_cv_lib_nsl_gethostbyname=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 -$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } -if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : - $as_echo "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h - - LIBS="${LIBS} -lsocket -lnsl" -fi - -fi - - -ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" -if test "x$ac_cv_func_gethostbyname_r" = x""yes; then : - - $as_echo "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h - - # We look for the one that returns `int'. - # Hopefully this check is robust enough. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <netdb.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "int.*gethostbyname_r" >/dev/null 2>&1; then : - - $as_echo "#define GETHOSTBYNAME_R_RETURNS_INT 1" >>confdefs.h - -fi -rm -f conftest* - - -fi - - -ac_config_files="$ac_config_files Makefile GeoIP.spec libGeoIP/Makefile apps/Makefile conf/Makefile data/Makefile man/Makefile test/Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -:mline -/\\$/{ - N - s,\\\n,, - b mline -} -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - - -ac_libobjs= -ac_ltlibobjs= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - - - -: ${CONFIG_STATUS=./config.status} -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. -as_fn_error () -{ - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 - fi - $as_echo "$as_me: error: $1" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by GeoIP $as_me 1.4.8, which was -generated by GNU Autoconf 2.65. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Configuration commands: -$config_commands - -Report bugs to <support@maxmind.com>." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -GeoIP config.status 1.4.8 -configured by $0, generated by GNU Autoconf 2.65, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2009 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' -macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' -enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' -enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' -pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' -host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' -host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' -host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' -build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' -build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' -build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' -SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' -Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' -GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' -EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' -FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' -LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' -NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' -LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' -ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' -exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' -lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' -reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' -AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' -STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' -RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' -CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' -compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' -GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' -objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' -SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' -ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' -need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' -LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' -OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' -libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' -module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' -fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' -need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' -version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' -runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' -libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' -soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' -finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' -old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' -striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# Quote evaled strings. -for var in SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -AR \ -AR_FLAGS \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -SHELL \ -ECHO \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_wl \ -lt_prog_compiler_pic \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_flag_spec_ld \ -hardcode_libdir_separator \ -fix_srcfile_path \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -finish_eval \ -old_striplib \ -striplib; do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do - case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Fix-up fallback echo if it was mangled by the above quoting rules. -case \$lt_ECHO in -*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` - ;; -esac - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "GeoIP.spec") CONFIG_FILES="$CONFIG_FILES GeoIP.spec" ;; - "libGeoIP/Makefile") CONFIG_FILES="$CONFIG_FILES libGeoIP/Makefile" ;; - "apps/Makefile") CONFIG_FILES="$CONFIG_FILES apps/Makefile" ;; - "conf/Makefile") CONFIG_FILES="$CONFIG_FILES conf/Makefile" ;; - "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; - "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; - "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; - - *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' <conf$$subs.awk | sed ' -/^[^""]/{ - N - s/\n// -} -' >>$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || as_fn_error "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ -s/:*$// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - - -eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; - esac \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 - ;; - - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008 Free Software Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="" - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that does not interpret backslashes. -ECHO=$lt_ECHO - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# If ld is used when linking, flag to hardcode \$libdir into a binary -# during linking. This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path=$lt_fix_srcfile_path - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - case $xsi_shell in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac -} - -# func_basename file -func_basename () -{ - func_basename_result="${1##*/}" -} - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}" -} - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -func_stripname () -{ - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"} -} - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=${1%%=*} - func_opt_split_arg=${1#*=} -} - -# func_lo2o object -func_lo2o () -{ - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=${1%.*}.lo -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=$(( $* )) -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=${#1} -} - -_LT_EOF - ;; - *) # Bourne compatible functions. - cat << \_LT_EOF >> "$cfgfile" - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` -} - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "X${3}" \ - | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; - esac -} - -# sed scripts: -my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' -my_sed_long_arg='1s/^-[^=]*=//' - -# func_opt_split -func_opt_split () -{ - func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` - func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` -} - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` -} - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` -} - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "$@"` -} - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` -} - -_LT_EOF -esac - -case $lt_shell_append in - yes) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$1+=\$2" -} -_LT_EOF - ;; - *) - cat << \_LT_EOF >> "$cfgfile" - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "$1=\$$1\$2" -} - -_LT_EOF - ;; - esac - - - sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit $? -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/configure.in b/Src/Plugins/DSP/sc_serv3/GeoIP/configure.in deleted file mode 100644 index 77309b18..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/configure.in +++ /dev/null @@ -1,50 +0,0 @@ -dnl AM_CONFIG_HEADER(config.h) - -AC_INIT([GeoIP], [1.4.8],[support@maxmind.com],[GeoIP]) -AC_GNU_SOURCE -AM_INIT_AUTOMAKE -AC_CONFIG_SRCDIR([libGeoIP/GeoIP.c]) -GEOIP_VERSION_INFO=`echo $VERSION | awk -F. '{ printf "%d:%d:%d", $1+$2, $3, $2 }'` -AC_SUBST(GEOIP_VERSION_INFO) - -AC_PROG_CC -AC_PROG_LIBTOOL - -AC_CHECK_TYPE(byte,[AC_DEFINE(HAVE_BYTE_TYPEDEF)],[]) -AC_CHECK_TYPE(ushort,[AC_DEFINE(HAVE_USHORT_TYPEDEF)],[]) -AC_CHECK_TYPE(ulong,[AC_DEFINE(HAVE_ULONG_TYPEDEF)],[]) -AC_CHECK_TYPE(u16,[AC_DEFINE(HAVE_U16_TYPEDEF)],[]) -AC_CHECK_TYPE(u32,[AC_DEFINE(HAVE_U32_TYPEDEF)],[]) - -AC_C_BIGENDIAN([AC_DEFINE(BIG_ENDIAN_HOST,1)],[AC_DEFINE(LITTLE_ENDIAN_HOST,1)]) - -AC_CHECK_HEADERS(stdint.h) -AC_CHECK_HEADERS(zlib.h, , AC_MSG_ERROR(Zlib header (zlib.h) not found. Tor requires zlib to build. You may need to install a zlib development package.)) - -AC_CHECK_FUNC(gettimeofday, AC_DEFINE(HAVE_GETTIMEOFDAY)) -AC_CHECK_FUNC(vasprintf, AC_DEFINE(HAVE_VASPRINTF)) -AC_CHECK_FUNC(vsnprintf, AC_DEFINE(HAVE_VSNPRINTF)) -AC_CHECK_FUNC(vsprintf, AC_DEFINE(HAVE_VSPRINTF)) - -AC_CHECK_FUNC(gethostbyname, AC_DEFINE(HAVE_GETHOSTBYNAME), - AC_CHECK_LIB(nsl, gethostbyname, AC_DEFINE(HAVE_GETHOSTBYNAME) - LIBS="${LIBS} -lsocket -lnsl")) - -AC_CHECK_FUNC(gethostbyname_r, [ - AC_DEFINE(HAVE_GETHOSTBYNAME_R) - # We look for the one that returns `int'. - # Hopefully this check is robust enough. - AC_EGREP_HEADER(int.*gethostbyname_r, netdb.h, [ - AC_DEFINE(GETHOSTBYNAME_R_RETURNS_INT)]) - ]) - -AC_OUTPUT([ -Makefile -GeoIP.spec -libGeoIP/Makefile -apps/Makefile -conf/Makefile -data/Makefile -man/Makefile -test/Makefile -]) diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/data/GeoIP.dat b/Src/Plugins/DSP/sc_serv3/GeoIP/data/GeoIP.dat deleted file mode 100644 index f92f58115ec131d70d8e06cb00ada1b0c78087e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1348660 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�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	V$uP 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	r1m;XiWtQ(!w?BA?lD^PdJIJ?RAgQPjW6ZHKTW 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 Bb1MJ< diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.am deleted file mode 100644 index 5b7b9096..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -pkgdata_DATA = - -dist_pkgdata_DATA = GeoIP.dat - -DEFAULT_DB_FILE = $(pkgdatadir)/GeoIP.dat - -install-data-hook: - @if test -f "$(DESTDIR)$(DEFAULT_DB_FILE)" ; then \ - echo "$@ will not overwrite existing $(DESTDIR)$(DEFAULT_DB_FILE)" ; \ - else \ - echo "$(INSTALL_DATA) GeoIP.dat $(DESTDIR)$(DEFAULT_DB_FILE)"; \ - $(INSTALL_DATA) "$(srcdir)/GeoIP.dat" "$(DESTDIR)$(DEFAULT_DB_FILE)"; \ - fi - -uninstall-hook: - @if test -f "$(DESTDIR)$(DEFAULT_DB_FILE)" ; then \ - rm "$(DESTDIR)$(DEFAULT_DB_FILE)"; \ -$(INSTALL_DATA) GeoIP.dat $(DESTDIR)$(DEFAULT_DB_FILE); \ - fi diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.in deleted file mode 100644 index 9d814220..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/data/Makefile.in +++ /dev/null @@ -1,437 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = data -DIST_COMMON = $(dist_pkgdata_DATA) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(pkgdatadir)" -DATA = $(dist_pkgdata_DATA) $(pkgdata_DATA) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -pkgdata_DATA = -dist_pkgdata_DATA = GeoIP.dat -DEFAULT_DB_FILE = $(pkgdatadir)/GeoIP.dat -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu data/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-dist_pkgdataDATA: $(dist_pkgdata_DATA) - @$(NORMAL_INSTALL) - test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" - @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ - done - -uninstall-dist_pkgdataDATA: - @$(NORMAL_UNINSTALL) - @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files -install-pkgdataDATA: $(pkgdata_DATA) - @$(NORMAL_INSTALL) - test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" - @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ - done - -uninstall-pkgdataDATA: - @$(NORMAL_UNINSTALL) - @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(pkgdatadir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-dist_pkgdataDATA install-pkgdataDATA - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-dist_pkgdataDATA uninstall-pkgdataDATA - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: install-am install-data-am install-strip uninstall-am - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-data-hook \ - install-dist_pkgdataDATA install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-pkgdataDATA install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-dist_pkgdataDATA \ - uninstall-hook uninstall-pkgdataDATA - - -install-data-hook: - @if test -f "$(DESTDIR)$(DEFAULT_DB_FILE)" ; then \ - echo "$@ will not overwrite existing $(DESTDIR)$(DEFAULT_DB_FILE)" ; \ - else \ - echo "$(INSTALL_DATA) GeoIP.dat $(DESTDIR)$(DEFAULT_DB_FILE)"; \ - $(INSTALL_DATA) "$(srcdir)/GeoIP.dat" "$(DESTDIR)$(DEFAULT_DB_FILE)"; \ - fi - -uninstall-hook: - @if test -f "$(DESTDIR)$(DEFAULT_DB_FILE)" ; then \ - rm "$(DESTDIR)$(DEFAULT_DB_FILE)"; \ -$(INSTALL_DATA) GeoIP.dat $(DESTDIR)$(DEFAULT_DB_FILE); \ - fi - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/depcomp b/Src/Plugins/DSP/sc_serv3/GeoIP/depcomp deleted file mode 100644 index df8eea7e..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/depcomp +++ /dev/null @@ -1,630 +0,0 @@ -#! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2009-04-28.21; # UTC - -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 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, see <http://www.gnu.org/licenses/>. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputing dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to <bug-automake@gnu.org>. -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -cygpath_u="cygpath -u -f -" -if test "$depmode" = msvcmsys; then - # This is just like msvisualcpp but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u="sed s,\\\\\\\\,/,g" - depmode=msvisualcpp -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. -## Unfortunately, FreeBSD c89 acceptance of flags depends upon -## the command line argument order; so add the flags where they -## appear in depend2.am. Note that the slowdown incurred here -## affects only configure: in makefiles, %FASTDEP% shortcuts this. - for arg - do - case $arg in - -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; - *) set fnord "$@" "$arg" ;; - esac - shift # fnord - shift # $arg - done - "$@" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory -## that the space means something, we add a space to the output as -## well. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the - # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> "$depfile" - echo >> "$depfile" - - # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts `$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.u - tmpdepfile2=$base.u - tmpdepfile3=$dir.libs/$base.u - "$@" -Wc,-M - else - tmpdepfile1=$dir$base.u - tmpdepfile2=$dir$base.u - tmpdepfile3=$dir$base.u - "$@" -M - fi - stat=$? - - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - # Each line is of the form `foo.o: dependent.h'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -icc) - # Intel's C compiler understands `-MD -MF file'. However on - # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want: - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using \ : - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | - sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp2) - # The "hp" stanza above does not work with aCC (C++) and HP's ia64 - # compilers, which have integrated preprocessors. The correct option - # to use with these is +Maked; it writes dependencies to a file named - # 'foo.d', which lands next to the object file, wherever that - # happens to be. - # Much of this is similar to the tru64 case; see comments there. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir.libs/$base.d - "$@" -Wc,+Maked - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - "$@" +Maked - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" - # Add `dependent.h:' lines. - sed -ne '2,${ - s/^ *// - s/ \\*$// - s/$/:/ - p - }' "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" "$tmpdepfile2" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mechanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for `:' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. - "$@" $dashmflag | - sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no eat=no - for arg - do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - if test $eat = yes; then - eat=no - continue - fi - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -arch) - eat=yes ;; - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix=`echo "$object" | sed 's/^.*\././'` - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - IFS=" " - for arg - do - case "$arg" in - -o) - shift - ;; - $object) - shift - ;; - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E 2>/dev/null | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvcmsys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/geoip.ico b/Src/Plugins/DSP/sc_serv3/GeoIP/geoip.ico deleted file mode 100644 index ac13353bc0b17ea80bcd4492381bc96315ec3f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3062 zcmcguXH;897S{gG|Lp#W<Fk8GcC&F!ob0-slWg3v<3g_nfeY0(MHGQR5~A7yi6ViJ zKs12?(}V>vgyz`vYEz9&voRgfjilZ0y+^b%cJ}PAJYS7x?%erqnS1X*qx}K@cJHEL z{1ffP2Q=D;G#c%5{C4Aa1V4gLd@Ahi{QmvUrzbug#nx%JCWpJb8<owfoT{ulPb#uH z>q?*ZJXv2|Hk{MzwuKEG!(>albITw+`|?GlJSN%q63_mSzsWAf*^j(W{L%aPhm12H zg;{<n@G>b8g^Ue!Qc#9d2ITinC^604lv2XsSnu~gyDQ+_ZkE~KLe2l~Z}PFo?{Z_Y zgll^+<nrf%=l={&@TJcbv7WEg{XjFg{9a^2K&Qnx*j5+kb~3<ZH`{VgxXr<E+pmHz zehOXiWn*=DVS0jNwU2GNmutPBYkdH7=8u1gaQLRZrf3^MuYWH-1^)DLCC7SSsM!}0 z_J??OUx!(I$uj+G2AlqJ<Qa9UzoiD4*b28j$hA2D;@N)<OG3@RcvLDQRQ!5z##$(5 ze{&5^!Qd#T!x0XL5SBRC<1JNrker!#E@L^YuWE+c8#q?`nHN7{TkQpM#FcL;;yE0` zrL>a5Ix-Fhe1OBH*-7=?8$aMkjLT8B^*&5W#jKU3IT%z|kPMJ$=Ob&H1qdVBP@2JZ zigf%(nB^Y$8$~}1lb`}L(({Dy!YHGVi{KQ*`G(sajCDE2v-?UKVyEtH0#n`7lon)z zAVkxT+`aa_glSWi89UTozcl*_2+Q-+xNd2PJ=<bWdYF?e^a?_k#<bm7)ex9Q7omRI z8smJFf8&REkJAmsQXnG~4`dNw0vS=l7Vu-7k40Yj7MCvcJd+pW)l#WgUs-yyx$&&& zr<%M3ltv8wXq4kWTdEX5FhohG)!t7GigG-hc>BT>nQ5pdq<u8~Xq?-Lc=uBnx5@ov zyvHel$7w_|+UW=cu&j_pjP-W_5Q=21E6|?ByRO~Z1P5`#Z+3D-%rK90KPm7!gS3CM zu{PLVkMiNWo=CWPPT+Zlq_YCAZ4!E!2ydQCxOJY|g;RH~eSeSd{o+{*E~rVBgXL&{ zJAqE-61+nMlD#h`-adcl+IIzfA9#)8&E&eoxt>V!zL0q9yb$0Xr{GJx+er}keAnXw z_fv_t&WZd?Ap;KlLXE5~FOK%LwLL5#%qQ({EJ?#z)Mm2JMX{f$(DQUQ@A~rM%;x$k z;s#8Bl&7#q2Rg<EJBK<N+N%re?j;u|1!aX_OZK_Mzws|<7x`WiGfWXiS&04kKqrxt zzZODeMpV-63#tAVDGYN^YJeq{8DUPyL!?1{p$Oh})t0~-&D`sig;~-t(m0)VdVIL6 zuB24N!a=y1;%_1Hy)5#%3^NGp$t-=C%}?<&lQM0QiXcgljWpO^%rHw2b)?!CI_E2O z-{eq_G}sPRCTBYr#xrW~B@MRKF1#M6)S-MD?n}~Hj$%JEAV>nOhPxgUD)jn?IdQ3h zRyc@EHW0uiOj}8i^-yOch0s=AfTV&LssQq0e{%!}^2LcvY*8}vQ)AUR@u>k;IGD-1 zu34A?zpg-(7HlhL(@~NJLcL^goS_8>-3?`w7+~dG7gB~U=Qzu`&T<Z2#4tsrYqeX3 zntl3<DxK|=5@7K}nTdlPwZ#C*j<|vQdYi7|qLD?o3uIlXC?q3{4vw)5PGR@O(`MkH zpmaLj+|($7f+mbYzMmL~jKy_laj)h^x#vW><wUx^LtwheIWB<OA&?vG0k11FqPN~` zBF<F7J}Q&py0<nr8i>|mH!;|?rdcc#v$7*y^I~r*Vm#j^v;u5lG~UXKC6-{$j1R+j zA~<?I9?kMpHbRFgKub?&IZ%D9^{0H;hRV8k*Zcn^z7JeRr4!(!^_UEIG$6a`i&8Mh z<tk#l)V)OL@G2Dw7=`hE<cP`tBuEMv@TjM;f&kZ{l!!iqmROM%4$O(6ZY-A<W>ABZ z!#&h)cYS&O-P<Ke!Khh+63CI7lVfpW5K^%?iCL1wEE4$lwbT&cMs?csAUik810$74 zQ=@}u7pqJ2gm-#9+FEUXQjsvAEG4WoIRtl9k{kjm6NiF`B~&K_!g7pIfviL0rJ4XH z@TGw73qa~gg6iH!Dl~9Rh>vtoGyl3u9t%umS~#vrDdECjXoNe!#~gu0D@HXD-X#Qf z)f07r3~a7cz$0ZUcY1t?1k-P<ucDmMPY7`GgA4e7aponwKsw=ZQDsE8ROJt}){Z`F zLoZs@%x{arwqGjCQ#sIxURR?K-WU3#$;?cQK!6GkdNSHIu{3(cum{e@+Dhlo#T8PX zGL2iED`>7#pjo{h9bB57f<4rTTdP(GU;u&%YF6d0EdICejr2C5MehX1+DP4$y6<s$ z<^x$|nK-OW6sk<+C?(+!q!ATqJj4ygV@s7D^{7NjbmQ&U9Qm(#-u-y;c`pg}8w24H z5i8u<+^f;P=7+6S`M_x?O8GfYSYIf{yhWuz1ZF1H+O0Pf%I3xzgvSOtRu<<7j&WEh riML0?>p-zlkI3iwsd3Hx^xE>0aa1WuJVubAgx}uP@BDlE_geo4@q!F8 diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk b/Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk deleted file mode 100644 index 5e7abc08..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/get_ver.awk +++ /dev/null @@ -1,14 +0,0 @@ -# fetch version number from input file and write them to STDOUT -BEGIN { - while ((getline < ARGV[1]) > 0) { - if (match ($0, /^VERSION=/)) { - split($1, t, "="); - my_ver_str = t[2]; - split(my_ver_str, v, "."); - gsub("[^0-9].*$", "", v[3]); - my_ver = v[1] "," v[2] "," v[3]; - } - } - print "GEOIP_VERSION = " my_ver ""; - print "GEOIP_VERSION_STR = " my_ver_str ""; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/install-sh b/Src/Plugins/DSP/sc_serv3/GeoIP/install-sh deleted file mode 100644 index 6781b987..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/install-sh +++ /dev/null @@ -1,520 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2009-04-28.21; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call `install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - trap '(exit $?); exit' 1 2 13 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - dst=$dst_arg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst;; - esac - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - -*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test -z "$d" && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c deleted file mode 100644 index d4821c46..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.c +++ /dev/null @@ -1,1965 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIP.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" - -static geoipv6_t IPV6_NULL; - -#if !defined(_WIN32) -#include <unistd.h> -#include <netdb.h> -#include <sys/mman.h> -#endif /* !defined(_WIN32) */ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> -#include <sys/types.h> /* for fstat */ -#include <sys/stat.h> /* for fstat */ - -#ifdef HAVE_GETTIMEOFDAY -#include <sys/time.h> /* for gettimeofday */ -#endif - -#ifdef HAVE_STDINT_H -#include <stdint.h> /* For uint32_t */ -#endif - -#ifndef INADDR_NONE -#define INADDR_NONE -1 -#endif - -#define COUNTRY_BEGIN 16776960 -#define LARGE_COUNTRY_BEGIN 16515072 -#define STATE_BEGIN_REV0 16700000 -#define STATE_BEGIN_REV1 16000000 -#define STRUCTURE_INFO_MAX_SIZE 20 -#define DATABASE_INFO_MAX_SIZE 100 -#define MAX_ORG_RECORD_LENGTH 300 -#define US_OFFSET 1 -#define CANADA_OFFSET 677 -#define WORLD_OFFSET 1353 -#define FIPS_RANGE 360 - -#define CHECK_ERR(err, msg) { \ - if (err != Z_OK) { \ - /*fprintf(stderr, "%s error: %d\n", msg, err);*/ \ - exit(1); \ - } \ -} - -#ifdef _WIN32 -int pread(unsigned int fd, char *buf, size_t count, int offset) -{ - if (_lseek(fd, offset, SEEK_SET) != offset) { - return -1; - } - return read(fd, buf, (unsigned int)count); -} -#endif - -const char GeoIP_country_code[254][3] = { "--","AP","EU","AD","AE","AF","AG","AI","AL","AM","CW", - "AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB", - "BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO", - "BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD", - "CF","CG","CH","CI","CK","CL","CM","CN","CO","CR", - "CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO", - "DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ", - "FK","FM","FO","FR","SX","GA","GB","GD","GE","GF", - "GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT", - "GU","GW","GY","HK","HM","HN","HR","HT","HU","ID", - "IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO", - "JP","KE","KG","KH","KI","KM","KN","KP","KR","KW", - "KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT", - "LU","LV","LY","MA","MC","MD","MG","MH","MK","ML", - "MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV", - "MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI", - "NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF", - "PG","PH","PK","PL","PM","PN","PR","PS","PT","PW", - "PY","QA","RE","RO","RU","RW","SA","SB","SC","SD", - "SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO", - "SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH", - "TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW", - "TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE", - "VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA", - "ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE", - "BL","MF", "BQ"}; - -static const unsigned num_GeoIP_countries = (unsigned)(sizeof(GeoIP_country_code)/sizeof(GeoIP_country_code[0])); - -const char GeoIP_country_code3[254][4] = { "--","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","CUW", - "AGO","ATA","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB", - "BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL", - "BRA","BHS","BTN","BVT","BWA","BLR","BLZ","CAN","CCK","COD", - "CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI", - "CUB","CPV","CXR","CYP","CZE","DEU","DJI","DNK","DMA","DOM", - "DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI", - "FLK","FSM","FRO","FRA","SXM","GAB","GBR","GRD","GEO","GUF", - "GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","SGS","GTM", - "GUM","GNB","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN", - "IRL","ISR","IND","IOT","IRQ","IRN","ISL","ITA","JAM","JOR", - "JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT", - "CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU", - "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI", - "MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV", - "MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC", - "NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF", - "PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW", - "PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN", - "SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM", - "SUR","STP","SLV","SYR","SWZ","TCA","TCD","ATF","TGO","THA", - "TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN", - "TZA","UKR","UGA","UMI","USA","URY","UZB","VAT","VCT","VEN", - "VGB","VIR","VNM","VUT","WLF","WSM","YEM","MYT","SRB","ZAF", - "ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY", - "BLM","MAF", "BES"}; - -const char * GeoIP_utf8_country_name[254] = {"N/A","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Cura" "\xc3\xa7" "ao", - "Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados", - "Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia", - "Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the", - "Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica", - "Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic", - "Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji", - "Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana", - "Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala", - "Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia", - "Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan", - "Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait", - "Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania", - "Luxembourg","Latvia","Libyan Arab Jamahiriya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali", - "Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives", - "Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua", - "Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia", - "Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau", - "Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan", - "Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname", - "Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand", - "Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan", - "Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela", - "Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa", - "Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey", - "Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba"}; - -const char * GeoIP_country_name[254] = {"N/A","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Cura" "\xe7" "ao", - "Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados", - "Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia", - "Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the", - "Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica", - "Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic", - "Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji", - "Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana", - "Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala", - "Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia", - "Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan", - "Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait", - "Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania", - "Luxembourg","Latvia","Libyan Arab Jamahiriya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali", - "Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives", - "Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua", - "Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia", - "Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau", - "Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan", - "Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname", - "Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand", - "Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan", - "Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela", - "Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa", - "Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey", - "Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba"}; - -/* Possible continent codes are AF, AS, EU, NA, OC, SA for Africa, Asia, Europe, North America, Oceania -and South America. */ - -const char GeoIP_country_continent[254][3] = { - "--", "AS","EU","EU","AS","AS","NA","NA","EU","AS","NA", - "AF","AN","SA","OC","EU","OC","NA","AS","EU","NA", - "AS","EU","AF","EU","AS","AF","AF","NA","AS","SA", - "SA","NA","AS","AN","AF","EU","NA","NA","AS","AF", - "AF","AF","EU","AF","OC","SA","AF","AS","SA","NA", - "NA","AF","AS","AS","EU","EU","AF","EU","NA","NA", - "AF","SA","EU","AF","AF","AF","EU","AF","EU","OC", - "SA","OC","EU","EU","NA","AF","EU","NA","AS","SA", - "AF","EU","NA","AF","AF","NA","AF","EU","AN","NA", - "OC","AF","SA","AS","AN","NA","EU","NA","EU","AS", - "EU","AS","AS","AS","AS","AS","EU","EU","NA","AS", - "AS","AF","AS","AS","OC","AF","NA","AS","AS","AS", - "NA","AS","AS","AS","NA","EU","AS","AF","AF","EU", - "EU","EU","AF","AF","EU","EU","AF","OC","EU","AF", - "AS","AS","AS","OC","NA","AF","NA","EU","AF","AS", - "AF","NA","AS","AF","AF","OC","AF","OC","AF","NA", - "EU","EU","AS","OC","OC","OC","AS","NA","SA","OC", - "OC","AS","AS","EU","NA","OC","NA","AS","EU","OC", - "SA","AS","AF","EU","EU","AF","AS","OC","AF","AF", - "EU","AS","AF","EU","EU","EU","AF","EU","AF","AF", - "SA","AF","NA","AS","AF","NA","AF","AN","AF","AS", - "AS","OC","AS","AF","OC","AS","EU","NA","OC","AS", - "AF","EU","AF","OC","NA","SA","AS","EU","NA","SA", - "NA","NA","AS","OC","OC","OC","AS","AF","EU","AF", - "AF","EU","AF","--","--","--","EU","EU","EU","EU", - "NA","NA","NA" -}; - -geoipv6_t _GeoIP_lookupaddress_v6 (const char *host); - -#if defined(_WIN32) -/* http://www.mail-archive.com/users@ipv6.org/msg02107.html */ -static const char * _GeoIP_inet_ntop(int af, const void *src, char *dst, socklen_t cnt) -{ - if (af == AF_INET) - { - struct sockaddr_in in; - memset(&in, 0, sizeof(in)); - in.sin_family = AF_INET; - memcpy(&in.sin_addr, src, sizeof(struct in_addr)); - getnameinfo((struct sockaddr *)&in, sizeof(struct -sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST); - return dst; - } - else if (af == AF_INET6) - { - struct sockaddr_in6 in; - memset(&in, 0, sizeof(in)); - in.sin6_family = AF_INET6; - memcpy(&in.sin6_addr, src, sizeof(struct in_addr6)); - getnameinfo((struct sockaddr *)&in, sizeof(struct -sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST); - return dst; - } - return NULL; -} - -static int _GeoIP_inet_pton(int af, const char *src, void *dst) -{ - struct addrinfo hints, *res, *ressave; - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = af; - - if (getaddrinfo(src, NULL, &hints, &res) != 0) - { - //fprintf(stderr, "Couldn't resolve host %s\n", src); - return -1; - } - - ressave = res; - - while (res) - { - memcpy(dst, res->ai_addr, res->ai_addrlen); - res = res->ai_next; - } - - freeaddrinfo(ressave); - return 0; -} -#else -static int _GeoIP_inet_pton(int af, const char *src, void *dst) { - return inet_pton(af, src, dst); -} -static const char * _GeoIP_inet_ntop(int af, const void *src, char *dst, socklen_t cnt) { - return inet_ntop(af, src, dst, cnt); -} - -#endif /* defined(_WIN32) */ - - -int __GEOIP_V6_IS_NULL(geoipv6_t v6) { - int i; - for (i=0;i<16;i++) { - if (v6.s6_addr[i]) - return 0; - } - return 1; -} - -void __GEOIP_PREPARE_TEREDO(geoipv6_t* v6){ - int i; - if ((v6->s6_addr[0]) != 0x20) return; - if ((v6->s6_addr[1]) != 0x01) return; - if ((v6->s6_addr[2]) != 0x00) return; - if ((v6->s6_addr[3]) != 0x00) return; - - for ( i = 0; i< 12; i++) - v6->s6_addr[i] = 0; - for ( ; i < 16; i++) - v6->s6_addr[i]^=0xff; -} - -const char * GeoIPDBDescription[NUM_DB_TYPES] = { - NULL, - "GeoIP Country Edition", - "GeoIP City Edition, Rev 1", - "GeoIP Region Edition, Rev 1", - "GeoIP ISP Edition", - "GeoIP Organization Edition", - "GeoIP City Edition, Rev 0", - "GeoIP Region Edition, Rev 0", - "GeoIP Proxy Edition", - "GeoIP ASNum Edition", - "GeoIP Netspeed Edition", - "GeoIP Domain Name Edition", - "GeoIP Country V6 Edition", - "GeoIP LocationID ASCII Edition", - "GeoIP Accuracy Radius Edition", - "GeoIP City with Confidence Edition", - "GeoIP City with Confidence and Accuracy Edition", - "GeoIP Large Country Edition", - "GeoIP Large Country V6 Edition", - NULL, - "GeoIP CCM Edition", - "GeoIP ASNum V6 Edition", - "GeoIP ISP V6 Edition", - "GeoIP Organization V6 Edition", - "GeoIP Domain Name V6 Edition", - "GeoIP LocationID ASCII V6 Edition", - "GeoIP Registrar Edition", - "GeoIP Registrar V6 Edition", - "GeoIP UserType Edition", - "GeoIP UserType V6 Edition", - "GeoIP City Edition V6, Rev 1", - "GeoIP City Edition V6, Rev 0", - "GeoIP Netspeed Edition, Rev 1", - "GeoIP Netspeed Edition V6, Rev1" -}; - -char * custom_directory = NULL; - -void GeoIP_setup_custom_directory (char * dir) { - custom_directory = dir; -} - -char *_GeoIP_full_path_to(const char *file_name) { - size_t len; - char *path = malloc(sizeof(char) * 1024); - - /*if (custom_directory == NULL){ -#if !defined(_WIN32) - memset(path, 0, sizeof(char) * 1024); - snprintf(path, sizeof(char) * 1024 - 1, "%s/%s", GEOIPDATADIR, file_name); -#else - char buf[MAX_PATH], *p, *q = NULL; - memset(buf, 0, sizeof(buf)); - len = GetModuleFileNameA(GetModuleHandle(NULL), buf, sizeof(buf) - 1); - for (p = buf + len; p > buf; p--) - if (*p == '\\') - { - if (!q) - q = p; - else - *p = '/'; - } - *q = 0; - memset(path, 0, sizeof(char) * 1024); - snprintf(path, sizeof(char) * 1024 - 1, "%s/%s", buf, file_name); -#endif - } else*/ { - len = strlen(custom_directory); - if (custom_directory[len-1] != '/') { - snprintf(path, sizeof(char) * 1024 - 1, "%s/%s",custom_directory, file_name); - } else { - snprintf(path, sizeof(char) * 1024 - 1, "%s%s", custom_directory, file_name); - } - } - return path; -} - -char ** GeoIPDBFileName = NULL; - -void _GeoIP_setup_dbfilename() { - if (NULL == GeoIPDBFileName) { - GeoIPDBFileName = malloc(sizeof(char *) * NUM_DB_TYPES); - memset(GeoIPDBFileName, 0, sizeof(char *) * NUM_DB_TYPES); - - GeoIPDBFileName[GEOIP_COUNTRY_EDITION] = _GeoIP_full_path_to("GeoIP.dat"); - GeoIPDBFileName[GEOIP_REGION_EDITION_REV0] = _GeoIP_full_path_to("GeoIPRegion.dat"); - GeoIPDBFileName[GEOIP_REGION_EDITION_REV1] = _GeoIP_full_path_to("GeoIPRegion.dat"); - GeoIPDBFileName[GEOIP_CITY_EDITION_REV0] = _GeoIP_full_path_to("GeoIPCity.dat"); - GeoIPDBFileName[GEOIP_CITY_EDITION_REV1] = _GeoIP_full_path_to("GeoIPCity.dat"); - GeoIPDBFileName[GEOIP_ISP_EDITION] = _GeoIP_full_path_to("GeoIPISP.dat"); - GeoIPDBFileName[GEOIP_ORG_EDITION] = _GeoIP_full_path_to("GeoIPOrg.dat"); - GeoIPDBFileName[GEOIP_PROXY_EDITION] = _GeoIP_full_path_to("GeoIPProxy.dat"); - GeoIPDBFileName[GEOIP_ASNUM_EDITION] = _GeoIP_full_path_to("GeoIPASNum.dat"); - GeoIPDBFileName[GEOIP_NETSPEED_EDITION] = _GeoIP_full_path_to("GeoIPNetSpeed.dat"); - GeoIPDBFileName[GEOIP_DOMAIN_EDITION] = _GeoIP_full_path_to("GeoIPDomain.dat"); - GeoIPDBFileName[GEOIP_COUNTRY_EDITION_V6] = _GeoIP_full_path_to("GeoIPv6.dat"); - GeoIPDBFileName[GEOIP_LOCATIONA_EDITION] = _GeoIP_full_path_to("GeoIPLocA.dat"); - GeoIPDBFileName[GEOIP_ACCURACYRADIUS_EDITION] = _GeoIP_full_path_to("GeoIPDistance.dat"); - GeoIPDBFileName[GEOIP_CITYCONFIDENCE_EDITION] = _GeoIP_full_path_to("GeoIPCityConfidence.dat"); - GeoIPDBFileName[GEOIP_CITYCONFIDENCEDIST_EDITION] = _GeoIP_full_path_to("GeoIPCityConfidenceDist.dat"); - GeoIPDBFileName[GEOIP_LARGE_COUNTRY_EDITION] = _GeoIP_full_path_to("GeoIP.dat"); - GeoIPDBFileName[GEOIP_LARGE_COUNTRY_EDITION_V6] = _GeoIP_full_path_to("GeoIPv6.dat"); - GeoIPDBFileName[GEOIP_ASNUM_EDITION_V6] = _GeoIP_full_path_to("GeoIPASNumv6.dat"); - GeoIPDBFileName[GEOIP_ISP_EDITION_V6] = _GeoIP_full_path_to("GeoIPISPv6.dat"); - GeoIPDBFileName[GEOIP_ORG_EDITION_V6] = _GeoIP_full_path_to("GeoIPOrgv6.dat"); - GeoIPDBFileName[GEOIP_DOMAIN_EDITION_V6] = _GeoIP_full_path_to("GeoIPDomainv6.dat"); - GeoIPDBFileName[GEOIP_LOCATIONA_EDITION_V6] = _GeoIP_full_path_to("GeoIPLocAv6.dat"); - GeoIPDBFileName[GEOIP_REGISTRAR_EDITION] = _GeoIP_full_path_to("GeoIPRegistrar.dat"); - GeoIPDBFileName[GEOIP_REGISTRAR_EDITION_V6] = _GeoIP_full_path_to("GeoIPRegistrarv6.dat"); - GeoIPDBFileName[GEOIP_USERTYPE_EDITION] = _GeoIP_full_path_to("GeoIPUserType.dat"); - GeoIPDBFileName[GEOIP_USERTYPE_EDITION_V6] = _GeoIP_full_path_to("GeoIPUserTypev6.dat"); - GeoIPDBFileName[GEOIP_CITY_EDITION_REV0_V6] = _GeoIP_full_path_to("GeoIPCityv6.dat"); - GeoIPDBFileName[GEOIP_CITY_EDITION_REV1_V6] = _GeoIP_full_path_to("GeoIPCityv6.dat"); - GeoIPDBFileName[GEOIP_NETSPEED_EDITION_REV1] = _GeoIP_full_path_to("GeoIPNetspeedCell.dat"); - GeoIPDBFileName[GEOIP_NETSPEED_EDITION_REV1_V6] = _GeoIP_full_path_to("GeoIPNetseedCellv6.dat"); - } -} - -static -int _file_exists(const char *file_name) { - struct stat file_stat; - return( (stat(file_name, &file_stat) == 0) ? 1:0); -} - -char * _GeoIP_iso_8859_1__utf8(const char * iso) { - signed char c; - char k; - char * p; - char * t = (char *)iso; - int len = 0; - while ( ( c = *t++) ){ - if ( c < 0 ) - len++; - } - len += (int)(t - iso); - t = p = malloc( len ); - - if ( p ){ - while ( ( c = *iso++ ) ) { - if (c < 0 ) { - k = 0xc2; - if (c >= -64 ) - k++; - *t++ = k; - c &= ~0x40; - } - *t++ = c; - } - *t++ = 0x00; - } - return p; -} - -int GeoIP_is_private_ipnum_v4( unsigned long ipnum ){ -return ((ipnum >= 167772160U && ipnum <= 184549375U) - || (ipnum >= 2851995648U && ipnum <= 2852061183U) - || (ipnum >= 2886729728U && ipnum <= 2887778303U) - || (ipnum >= 3232235520U && ipnum <= 3232301055U) - || (ipnum >= 2130706432U && ipnum <= 2147483647U))? 1 : 0; -} - -int GeoIP_is_private_v4( const char * addr ){ - unsigned long ipnum = GeoIP_addr_to_num(addr); - return GeoIP_is_private_ipnum_v4(ipnum); -} - -int GeoIP_db_avail(int type) { - const char * filePath; - if (type < 0 || type >= NUM_DB_TYPES) { - return 0; - } - _GeoIP_setup_dbfilename(); - filePath = GeoIPDBFileName[type]; - if (NULL == filePath) { - return 0; - } - return _file_exists(filePath); -} - -static -void _setup_segments(GeoIP * gi) { - int i, j, segment_record_length; - unsigned char delim[3]; - unsigned char buf[LARGE_SEGMENT_RECORD_LENGTH]; - ssize_t silence; - int fno = fileno(gi->GeoIPDatabase); - - gi->databaseSegments = NULL; - - /* default to GeoIP Country Edition */ - gi->databaseType = GEOIP_COUNTRY_EDITION; - gi->record_length = STANDARD_RECORD_LENGTH; - lseek(fno, -3l, SEEK_END); - for (i = 0; i < STRUCTURE_INFO_MAX_SIZE; i++) { - silence = read(fno, delim, 3); - if (delim[0] == 255 && delim[1] == 255 && delim[2] == 255) { - silence = read(fno, &gi->databaseType, 1 ); - if (gi->databaseType >= 106) { - /* backwards compatibility with databases from April 2003 and earlier */ - gi->databaseType -= 105; - } - - if (gi->databaseType == GEOIP_REGION_EDITION_REV0) { - /* Region Edition, pre June 2003 */ - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = STATE_BEGIN_REV0; - } else if (gi->databaseType == GEOIP_REGION_EDITION_REV1) { - /* Region Edition, post June 2003 */ - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = STATE_BEGIN_REV1; - } else if (gi->databaseType == GEOIP_CITY_EDITION_REV0 || - gi->databaseType == GEOIP_CITY_EDITION_REV1 || - gi->databaseType == GEOIP_ORG_EDITION || - gi->databaseType == GEOIP_ORG_EDITION_V6 || - gi->databaseType == GEOIP_DOMAIN_EDITION || - gi->databaseType == GEOIP_DOMAIN_EDITION_V6 || - gi->databaseType == GEOIP_ISP_EDITION || - gi->databaseType == GEOIP_ISP_EDITION_V6 || - gi->databaseType == GEOIP_REGISTRAR_EDITION || - gi->databaseType == GEOIP_REGISTRAR_EDITION_V6 || - gi->databaseType == GEOIP_USERTYPE_EDITION || - gi->databaseType == GEOIP_USERTYPE_EDITION_V6 || - gi->databaseType == GEOIP_ASNUM_EDITION || - gi->databaseType == GEOIP_ASNUM_EDITION_V6 || - gi->databaseType == GEOIP_NETSPEED_EDITION_REV1 || - gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6 || - gi->databaseType == GEOIP_LOCATIONA_EDITION || - gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION || - gi->databaseType == GEOIP_CITYCONFIDENCE_EDITION || - gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION || - gi->databaseType == GEOIP_CITY_EDITION_REV0_V6 || - gi->databaseType == GEOIP_CITY_EDITION_REV1_V6 - - ) { - /* City/Org Editions have two segments, read offset of second segment */ - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = 0; - - segment_record_length = gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION ? LARGE_SEGMENT_RECORD_LENGTH : SEGMENT_RECORD_LENGTH; - - silence = read(fno, buf, segment_record_length ); - for (j = 0; j < segment_record_length; j++) { - gi->databaseSegments[0] += (buf[j] << (j * 8)); - } - - /* the record_length must be correct from here on */ - if (gi->databaseType == GEOIP_ORG_EDITION || - gi->databaseType == GEOIP_ORG_EDITION_V6 || - gi->databaseType == GEOIP_DOMAIN_EDITION || - gi->databaseType == GEOIP_DOMAIN_EDITION_V6 || - gi->databaseType == GEOIP_ISP_EDITION || - gi->databaseType == GEOIP_ISP_EDITION_V6 || - gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION - ) - gi->record_length = ORG_RECORD_LENGTH; - - if ( gi->databaseType == GEOIP_CITYCONFIDENCE_EDITION - || gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION - ) { - silence = pread(fileno(gi->GeoIPDatabase), buf, gi->record_length, gi->databaseSegments[0] * 2 * gi->record_length); - gi->dyn_seg_size = 0; - for (j = 0; j < gi->record_length; j++) { - gi->dyn_seg_size += (buf[j] << (j * 8)); - } - } - - } - break; - } else { - lseek(fno, -4l, SEEK_CUR); - } - } - if (gi->databaseType == GEOIP_COUNTRY_EDITION || - gi->databaseType == GEOIP_PROXY_EDITION || - gi->databaseType == GEOIP_NETSPEED_EDITION || - gi->databaseType == GEOIP_COUNTRY_EDITION_V6 ) { - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = COUNTRY_BEGIN; - } - else if ( gi->databaseType == GEOIP_LARGE_COUNTRY_EDITION || - gi->databaseType == GEOIP_LARGE_COUNTRY_EDITION_V6 ) { - gi->databaseSegments = malloc(sizeof(int)); - gi->databaseSegments[0] = LARGE_COUNTRY_BEGIN; - } - -} - -static -int _check_mtime(GeoIP *gi) { - struct stat buf; - -#if !defined(_WIN32) - struct timeval t; -#else /* !defined(_WIN32) */ - FILETIME ft; - ULONGLONG t; -#endif /* !defined(_WIN32) */ - - if (gi->flags & GEOIP_CHECK_CACHE) { - -#if !defined(_WIN32) - /* stat only has second granularity, so don't - * call it more than once a second */ - gettimeofday(&t, NULL); - if (t.tv_sec == gi->last_mtime_check){ - return 0; - } - gi->last_mtime_check = t.tv_sec; - -#else /* !defined(_WIN32) */ - - /* stat only has second granularity, so don't - call it more than once a second */ - GetSystemTimeAsFileTime(&ft); - t = FILETIME_TO_USEC(ft) / 1000 / 1000; - if (t == gi->last_mtime_check){ - return 0; - } - gi->last_mtime_check = t; - -#endif /* !defined(_WIN32) */ - - if (stat(gi->file_path, &buf) != -1) { - /* make sure that the database file is at least 60 - * seconds untouched. Otherwise we might load the - * database only partly and crash - */ - if (buf.st_mtime != gi->mtime && ( buf.st_mtime + 60 < gi->last_mtime_check ) ) { - /* GeoIP Database file updated */ - if (gi->flags & (GEOIP_MEMORY_CACHE | GEOIP_MMAP_CACHE)) { - if ( gi->flags & GEOIP_MMAP_CACHE) { -#if !defined(_WIN32) - /* MMAP is only avail on UNIX */ - munmap(gi->cache, gi->size); - gi->cache = NULL; -#endif - } else { - /* reload database into memory cache */ - if ((gi->cache = (unsigned char*) realloc(gi->cache, buf.st_size)) == NULL) { - //fprintf(stderr,"Out of memory when reloading %s\n",gi->file_path); - return -1; - } - } - } - /* refresh filehandle */ - fclose(gi->GeoIPDatabase); - gi->GeoIPDatabase = fopen(gi->file_path,"rb"); - if (gi->GeoIPDatabase == NULL) { - //fprintf(stderr,"Error Opening file %s when reloading\n",gi->file_path); - return -1; - } - gi->mtime = buf.st_mtime; - gi->size = buf.st_size; - - if ( gi->flags & GEOIP_MMAP_CACHE) { -#if defined(_WIN32) - //fprintf(stderr, "GEOIP_MMAP_CACHE is not supported on WIN32\n"); - gi->cache = 0; - return -1; -#else - gi->cache = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fileno(gi->GeoIPDatabase), 0); - if ( gi->cache == MAP_FAILED ) { - - //fprintf(stderr,"Error remapping file %s when reloading\n",gi->file_path); - - gi->cache = NULL; - return -1; - } -#endif - } else if ( gi->flags & GEOIP_MEMORY_CACHE ) { - if (pread(fileno(gi->GeoIPDatabase), gi->cache, buf.st_size, 0) != (ssize_t) buf.st_size) { - //fprintf(stderr,"Error reading file %s when reloading\n",gi->file_path); - return -1; - } - } - - if (gi->databaseSegments != NULL) { - free(gi->databaseSegments); - gi->databaseSegments = NULL; - } - _setup_segments(gi); - if (gi->databaseSegments == NULL) { - //fprintf(stderr, "Error reading file %s -- corrupt\n", gi->file_path); - return -1; - } - if (gi->flags & GEOIP_INDEX_CACHE) { - gi->index_cache = (unsigned char *) realloc(gi->index_cache, sizeof(unsigned char) * ((gi->databaseSegments[0] * (long)gi->record_length * 2))); - if (gi->index_cache != NULL) { - if (pread(fileno(gi->GeoIPDatabase), gi->index_cache, - gi->databaseSegments[0] * (long)gi->record_length * 2, 0 ) != (ssize_t) (gi->databaseSegments[0]*(long)gi->record_length * 2)) { - //fprintf(stderr,"Error reading file %s where reloading\n",gi->file_path); - return -1; - } - } - } - } - } - } - return 0; -} - -#define ADDR_STR_LEN (8 * 4 + 7 + 1) -unsigned int _GeoIP_seek_record_v6 (GeoIP *gi, geoipv6_t ipnum) { - int depth; - char paddr[ADDR_STR_LEN]; - unsigned int x; - unsigned char stack_buffer[2 * MAX_RECORD_LENGTH]; - const unsigned char *buf = (gi->cache == NULL) ? stack_buffer : NULL; - unsigned int offset = 0; - - const unsigned char * p; - int j; - ssize_t silence; - int fno = fileno(gi->GeoIPDatabase); - _check_mtime(gi); - if ( GeoIP_teredo(gi) ) - __GEOIP_PREPARE_TEREDO(&ipnum); - for (depth = 127; depth >= 0; depth--) { - if (gi->cache == NULL && gi->index_cache == NULL) { - /* read from disk */ - silence = pread(fno, stack_buffer,gi->record_length * 2, (long)gi->record_length * 2 * offset ); - } else if (gi->index_cache == NULL) { - /* simply point to record in memory */ - buf = gi->cache + (long)gi->record_length * 2 *offset; - } else { - buf = gi->index_cache + (long)gi->record_length * 2 * offset; - } - - if (GEOIP_CHKBIT_V6(depth, ipnum.s6_addr )) { - /* Take the right-hand branch */ - if ( gi->record_length == 3 ) { - /* Most common case is completely unrolled and uses constants. */ - x = (buf[3*1 + 0] << (0*8)) - + (buf[3*1 + 1] << (1*8)) - + (buf[3*1 + 2] << (2*8)); - - } else { - /* General case */ - j = gi->record_length; - p = &buf[2*j]; - x = 0; - do { - x <<= 8; - x += *(--p); - } while ( --j ); - } - - } else { - /* Take the left-hand branch */ - if ( gi->record_length == 3 ) { - /* Most common case is completely unrolled and uses constants. */ - x = (buf[3*0 + 0] << (0*8)) - + (buf[3*0 + 1] << (1*8)) - + (buf[3*0 + 2] << (2*8)); - } else { - /* General case */ - j = gi->record_length; - p = &buf[1*j]; - x = 0; - do { - x <<= 8; - x += *(--p); - } while ( --j ); - } - } - - if (x >= gi->databaseSegments[0]) { - gi->netmask = 128 - depth; - return x; - } - offset = x; - } - - /* shouldn't reach here */ - _GeoIP_inet_ntop(AF_INET6, &ipnum.s6_addr[0], paddr, ADDR_STR_LEN); - //fprintf(stderr,"Error Traversing Database for ipnum = %s - Perhaps database is corrupt?\n", paddr); - return 0; -} - -geoipv6_t -_GeoIP_addr_to_num_v6(const char *addr) -{ - geoipv6_t ipnum; - if ( 1 == _GeoIP_inet_pton(AF_INET6, addr, &ipnum.s6_addr[0] ) ) - return ipnum; - return IPV6_NULL; -} - -unsigned int _GeoIP_seek_record (GeoIP *gi, unsigned long ipnum) { - int depth; - unsigned int x; - unsigned char stack_buffer[2 * MAX_RECORD_LENGTH]; - const unsigned char *buf = (gi->cache == NULL) ? stack_buffer : NULL; - unsigned int offset = 0; - ssize_t silence; - - const unsigned char * p; - int j; - int fno = fileno(gi->GeoIPDatabase); - _check_mtime(gi); - for (depth = 31; depth >= 0; depth--) { - if (gi->cache == NULL && gi->index_cache == NULL) { - /* read from disk */ - silence = pread(fno, stack_buffer, gi->record_length * 2, gi->record_length * 2 * offset); - } else if (gi->index_cache == NULL) { - /* simply point to record in memory */ - buf = gi->cache + (long)gi->record_length * 2 *offset; - } else { - buf = gi->index_cache + (long)gi->record_length * 2 * offset; - } - - if (ipnum & (1 << depth)) { - /* Take the right-hand branch */ - if ( gi->record_length == 3 ) { - /* Most common case is completely unrolled and uses constants. */ - x = (buf[3*1 + 0] << (0*8)) - + (buf[3*1 + 1] << (1*8)) - + (buf[3*1 + 2] << (2*8)); - - } else { - /* General case */ - j = gi->record_length; - p = &buf[2*j]; - x = 0; - do { - x <<= 8; - x += *(--p); - } while ( --j ); - } - - } else { - /* Take the left-hand branch */ - if ( gi->record_length == 3 ) { - /* Most common case is completely unrolled and uses constants. */ - x = (buf[3*0 + 0] << (0*8)) - + (buf[3*0 + 1] << (1*8)) - + (buf[3*0 + 2] << (2*8)); - } else { - /* General case */ - j = gi->record_length; - p = &buf[1*j]; - x = 0; - do { - x <<= 8; - x += *(--p); - } while ( --j ); - } - } - - if (x >= gi->databaseSegments[0]) { - gi->netmask = 32 - depth; - return x; - } - offset = x; - } - /* shouldn't reach here */ - //fprintf(stderr,"Error Traversing Database for ipnum = %lu - Perhaps database is corrupt?\n",ipnum); - return 0; -} - -unsigned long -GeoIP_addr_to_num(const char *addr) -{ - unsigned int c, octet, t; - unsigned long ipnum; - int i = 3; - - octet = ipnum = 0; - while ((c = *addr++)) { - if (c == '.') { - if (octet > 255) - return 0; - ipnum <<= 8; - ipnum += octet; - i--; - octet = 0; - } else { - t = octet; - octet <<= 3; - octet += t; - octet += t; - c -= '0'; - if (c > 9) - return 0; - octet += c; - } - } - if ((octet > 255) || (i != 0)) - return 0; - ipnum <<= 8; - return ipnum + octet; -} - -GeoIP* GeoIP_open_type (int type, int flags) { - GeoIP * gi; - const char * filePath; - if (type < 0 || type >= NUM_DB_TYPES) { - printf("Invalid database type %d\n", type); - return NULL; - } - _GeoIP_setup_dbfilename(); - filePath = GeoIPDBFileName[type]; - if (filePath == NULL) { - printf("Invalid database type %d\n", type); - return NULL; - } - gi = GeoIP_open (filePath, flags); - return gi; -} - -GeoIP* GeoIP_new (int flags) { - GeoIP * gi; - _GeoIP_setup_dbfilename(); - gi = GeoIP_open (GeoIPDBFileName[GEOIP_COUNTRY_EDITION], flags); - return gi; -} - -GeoIP* GeoIP_open (const char * filename, int flags) { - struct stat buf; - GeoIP * gi; - size_t len; - - gi = (GeoIP *)malloc(sizeof(GeoIP)); - if (gi == NULL) - return NULL; - len = sizeof(char) * (strlen(filename)+1); - gi->file_path = malloc(len); - if (gi->file_path == NULL) { - free(gi); - return NULL; - } - strncpy(gi->file_path, filename, len); - gi->GeoIPDatabase = fopen(filename,"rb"); - if (gi->GeoIPDatabase == NULL) { - //fprintf(stderr,"Error Opening file %s\n",filename); - free(gi->file_path); - free(gi); - return NULL; - } else { - if (flags & (GEOIP_MEMORY_CACHE | GEOIP_MMAP_CACHE) ) { - if (fstat(fileno(gi->GeoIPDatabase), &buf) == -1) { - //fprintf(stderr,"Error stating file %s\n",filename); - free(gi->file_path); - free(gi); - return NULL; - } - gi->mtime = buf.st_mtime; - gi->size = buf.st_size; - - /* MMAP added my Peter Shipley */ - if ( flags & GEOIP_MMAP_CACHE ) { -#if !defined(_WIN32) - gi->cache = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fileno(gi->GeoIPDatabase), 0); - if ( gi->cache == MAP_FAILED ) { - fprintf(stderr,"Error mmaping file %s\n",filename); - free(gi->file_path); - free(gi); - return NULL; - } -#endif - } else { - gi->cache = (unsigned char *) malloc(sizeof(unsigned char) * buf.st_size); - - if (gi->cache != NULL) { - if (pread(fileno(gi->GeoIPDatabase),gi->cache, buf.st_size, 0) != (ssize_t) buf.st_size) { - //fprintf(stderr,"Error reading file %s\n",filename); - free(gi->cache); - free(gi->file_path); - free(gi); - return NULL; - } - } - } - } else { - if (flags & GEOIP_CHECK_CACHE) { - if (fstat(fileno(gi->GeoIPDatabase), &buf) == -1) { - //fprintf(stderr,"Error stating file %s\n",filename); - free(gi->file_path); - free(gi); - return NULL; - } - gi->mtime = buf.st_mtime; - } - gi->cache = NULL; - } - gi->flags = flags; - gi->charset = GEOIP_CHARSET_ISO_8859_1; - gi->ext_flags = 1U << GEOIP_TEREDO_BIT; - _setup_segments(gi); - if (flags & GEOIP_INDEX_CACHE) { - gi->index_cache = (unsigned char *) malloc(sizeof(unsigned char) * ((gi->databaseSegments[0] * (long)gi->record_length * 2))); - if (gi->index_cache != NULL) { - if (pread(fileno(gi->GeoIPDatabase),gi->index_cache, gi->databaseSegments[0] * (long)gi->record_length * 2, 0) != (size_t) (gi->databaseSegments[0]*(long)gi->record_length * 2)) { - //fprintf(stderr,"Error reading file %s\n",filename); - free(gi->databaseSegments); - free(gi->index_cache); - free(gi); - return NULL; - } - } - } else { - gi->index_cache = NULL; - } - return gi; - } -} - -void GeoIP_delete (GeoIP *gi) { - if (gi == NULL ) - return; - if (gi->GeoIPDatabase != NULL) - fclose(gi->GeoIPDatabase); - if (gi->cache != NULL) { - if ( gi->flags & GEOIP_MMAP_CACHE ) { -#if !defined(_WIN32) - munmap(gi->cache, gi->size); -#endif - } else { - free(gi->cache); - } - gi->cache = NULL; - } - if (gi->index_cache != NULL) - free(gi->index_cache); - if (gi->file_path != NULL) - free(gi->file_path); - if (gi->databaseSegments != NULL) - free(gi->databaseSegments); - free(gi); -} - -const char *GeoIP_country_code_by_name_v6 (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name_v6(gi, name); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code_by_name (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name(gi, name); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_name_v6 (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name_v6(gi, name); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name(gi, name); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_name_by_name_v6 (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name_v6(gi, name); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_name_by_name (GeoIP* gi, const char *name) { - int country_id; - country_id = GeoIP_id_by_name(gi, name); - return GeoIP_country_name_by_id(gi, country_id ); -} - -unsigned long _GeoIP_lookupaddress (const char *host) { - unsigned long addr = inet_addr(host); - struct hostent phe2; - struct hostent * phe = &phe2; - char *buf = NULL; -#ifdef HAVE_GETHOSTBYNAME_R - int buflength = 16384; - int herr = 0; -#endif - int result = 0; -#ifdef HAVE_GETHOSTBYNAME_R - buf = malloc(buflength); -#endif - if (addr == INADDR_NONE) { -#ifdef HAVE_GETHOSTBYNAME_R - while (1) { - /* we use gethostbyname_r here because it is thread-safe and gethostbyname is not */ -#ifdef GETHOSTBYNAME_R_RETURNS_INT - result = gethostbyname_r(host,&phe2,buf,buflength,&phe,&herr); -#else - phe = gethostbyname_r(host,&phe2,buf,buflength,&herr); -#endif - if (herr != ERANGE) - break; - if (result == 0) - break; - /* double the buffer if the buffer is too small */ - buflength = buflength * 2; - buf = realloc(buf,buflength); - } -#else - /* Some systems do not support gethostbyname_r, such as Mac OS X */ - phe = gethostbyname(host); -#endif - if (!phe || result != 0) { - free(buf); - return 0; - } -#if !defined(_WIN32) - addr = *((in_addr_t *) phe->h_addr_list[0]); -#else - addr = ((IN_ADDR *) phe->h_addr_list[0])->S_un.S_addr; -#endif - } -#ifdef HAVE_GETHOSTBYNAME_R - free(buf); -#endif - return ntohl(addr); -} - -geoipv6_t -_GeoIP_lookupaddress_v6(const char *host) -{ - geoipv6_t ipnum; - int gaierr; - struct addrinfo hints, *aifirst; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_INET6; - /* hints.ai_flags = AI_V4MAPPED; */ - hints.ai_socktype = SOCK_STREAM; - - if ((gaierr = getaddrinfo(host, NULL, &hints, &aifirst)) != 0) { - /* fprintf(stderr, "Err: %s (%d %s)\n", host, gaierr, gai_strerror(gaierr)); */ - return IPV6_NULL; - } - memcpy(ipnum.s6_addr, ((struct sockaddr_in6 *) aifirst->ai_addr)->sin6_addr.s6_addr, sizeof(geoipv6_t)); - freeaddrinfo(aifirst); - /* inet_pton(AF_INET6, host, ipnum.s6_addr); */ - - return ipnum; -} - -int GeoIP_id_by_name (GeoIP* gi, const char *name) { - unsigned long ipnum; - int ret; - if (name == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION && gi->databaseType != GEOIP_COUNTRY_EDITION && gi->databaseType != GEOIP_PROXY_EDITION && gi->databaseType != GEOIP_NETSPEED_EDITION) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_COUNTRY_EDITION]); - return 0; - } - if (!(ipnum = _GeoIP_lookupaddress(name))) - return 0; - ret = _GeoIP_seek_record(gi, ipnum) - gi->databaseSegments[0]; - return ret; - -} - -int GeoIP_id_by_name_v6 (GeoIP* gi, const char *name) { - geoipv6_t ipnum; - int ret; - if (name == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION_V6 && gi->databaseType != GEOIP_COUNTRY_EDITION_V6) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_COUNTRY_EDITION_V6]); - return 0; - } - ipnum = _GeoIP_lookupaddress_v6(name); - if (__GEOIP_V6_IS_NULL(ipnum)) - return 0; - - ret = _GeoIP_seek_record_v6(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - -const char *GeoIP_country_code_by_addr_v6 (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr_v6(gi, addr); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr(gi, addr); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_addr_v6 (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr_v6(gi, addr); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr(gi, addr); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_name_by_addr_v6 (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr_v6(gi, addr); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr) { - int country_id; - country_id = GeoIP_id_by_addr(gi, addr); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_name_by_ipnum (GeoIP* gi, unsigned long ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum(gi, ipnum); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum_v6(gi, ipnum); - return GeoIP_country_name_by_id(gi, country_id ); -} - -const char *GeoIP_country_code_by_ipnum (GeoIP* gi, unsigned long ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum(gi, ipnum); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum_v6(gi, ipnum); - return (country_id > 0) ? GeoIP_country_code[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_ipnum (GeoIP* gi, unsigned long ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum(gi, ipnum); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -const char *GeoIP_country_code3_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - int country_id; - country_id = GeoIP_id_by_ipnum_v6(gi, ipnum); - return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL; -} - -int GeoIP_country_id_by_addr_v6 (GeoIP* gi, const char *addr) { - return GeoIP_id_by_addr_v6(gi, addr); -} - -int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr) { - return GeoIP_id_by_addr(gi, addr); -} - -int GeoIP_country_id_by_name_v6 (GeoIP* gi, const char *host) { - return GeoIP_id_by_name_v6(gi, host); -} - -int GeoIP_country_id_by_name (GeoIP* gi, const char *host) { - return GeoIP_id_by_name(gi, host); -} - -int GeoIP_id_by_addr_v6 (GeoIP* gi, const char *addr) { - geoipv6_t ipnum; - int ret; - if (addr == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_COUNTRY_EDITION_V6 - && gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION_V6) { - printf("Invalid database type %s, expected %s\n", - GeoIPDBDescription[(int)gi->databaseType], - GeoIPDBDescription[GEOIP_COUNTRY_EDITION_V6]); - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - ret = _GeoIP_seek_record_v6(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - -int GeoIP_id_by_addr (GeoIP* gi, const char *addr) { - unsigned long ipnum; - int ret; - if (addr == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_COUNTRY_EDITION && - gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION && - gi->databaseType != GEOIP_PROXY_EDITION && - gi->databaseType != GEOIP_NETSPEED_EDITION) { - printf("Invalid database type %s, expected %s\n", - GeoIPDBDescription[(int)gi->databaseType], - GeoIPDBDescription[GEOIP_COUNTRY_EDITION]); - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - ret = _GeoIP_seek_record(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - -int GeoIP_id_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - int ret; -/* if (ipnum == 0) { - return 0; - } -*/ - if (gi->databaseType != GEOIP_COUNTRY_EDITION_V6 - && gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION_V6) { - printf("Invalid database type %s, expected %s\n", - GeoIPDBDescription[(int)gi->databaseType], - GeoIPDBDescription[GEOIP_COUNTRY_EDITION_V6]); - return 0; - } - ret = _GeoIP_seek_record_v6(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - - - -int GeoIP_id_by_ipnum (GeoIP* gi, unsigned long ipnum) { - int ret; - if (ipnum == 0) { - return 0; - } - if (gi->databaseType != GEOIP_COUNTRY_EDITION && - gi->databaseType != GEOIP_LARGE_COUNTRY_EDITION && - gi->databaseType != GEOIP_PROXY_EDITION && - gi->databaseType != GEOIP_NETSPEED_EDITION) { - printf("Invalid database type %s, expected %s\n", - GeoIPDBDescription[(int)gi->databaseType], - GeoIPDBDescription[GEOIP_COUNTRY_EDITION]); - return 0; - } - ret = _GeoIP_seek_record(gi, ipnum) - gi->databaseSegments[0]; - return ret; -} - -char *GeoIP_database_info (GeoIP* gi) { - int i; - unsigned char buf[3]; - char *retval; - int hasStructureInfo = 0; - ssize_t silence; - int fno = fileno(gi->GeoIPDatabase); - - if(gi == NULL) - return NULL; - - _check_mtime(gi); - lseek(fno, -3l, SEEK_END); - - /* first get past the database structure information */ - for (i = 0; i < STRUCTURE_INFO_MAX_SIZE; i++) { - silence = read(fno, buf, 3 ); - if (buf[0] == 255 && buf[1] == 255 && buf[2] == 255) { - hasStructureInfo = 1; - break; - } - lseek(fno, -4l, SEEK_CUR); - } - if (hasStructureInfo == 1) { - lseek(fno, -6l, SEEK_CUR); - } else { - /* no structure info, must be pre Sep 2002 database, go back to end */ - lseek(fno, -3l, SEEK_END); - } - - for (i = 0; i < DATABASE_INFO_MAX_SIZE; i++) { - silence = read(fno, buf, 3 ); - if (buf[0] == 0 && buf[1] == 0 && buf[2] == 0) { - retval = malloc(sizeof(char) * (i+1)); - if (retval == NULL) { - return NULL; - } - silence = read(fno, retval, i); - retval[i] = '\0'; - return retval; - } - lseek(fno, -4l, SEEK_CUR); - } - return NULL; -} - -/* GeoIP Region Edition functions */ - -void GeoIP_assign_region_by_inetaddr(GeoIP* gi, unsigned long inetaddr, GeoIPRegion *region) { - unsigned int seek_region; - - /* This also writes in the terminating NULs (if you decide to - * keep them) and clear any fields that are not set. */ - memset(region, 0, sizeof(GeoIPRegion)); - - seek_region = _GeoIP_seek_record(gi, ntohl(inetaddr)); - - if (gi->databaseType == GEOIP_REGION_EDITION_REV0) { - /* Region Edition, pre June 2003 */ - seek_region -= STATE_BEGIN_REV0; - if (seek_region >= 1000) { - region->country_code[0] = 'U'; - region->country_code[1] = 'S'; - region->region[0] = (char) ((seek_region - 1000)/26 + 65); - region->region[1] = (char) ((seek_region - 1000)%26 + 65); - } else { - memcpy(region->country_code, GeoIP_country_code[seek_region], 2); - } - } else if (gi->databaseType == GEOIP_REGION_EDITION_REV1) { - /* Region Edition, post June 2003 */ - seek_region -= STATE_BEGIN_REV1; - if (seek_region < US_OFFSET) { - /* Unknown */ - /* we don't need to do anything here b/c we memset region to 0 */ - } else if (seek_region < CANADA_OFFSET) { - /* USA State */ - region->country_code[0] = 'U'; - region->country_code[1] = 'S'; - region->region[0] = (char) ((seek_region - US_OFFSET)/26 + 65); - region->region[1] = (char) ((seek_region - US_OFFSET)%26 + 65); - } else if (seek_region < WORLD_OFFSET) { - /* Canada Province */ - region->country_code[0] = 'C'; - region->country_code[1] = 'A'; - region->region[0] = (char) ((seek_region - CANADA_OFFSET)/26 + 65); - region->region[1] = (char) ((seek_region - CANADA_OFFSET)%26 + 65); - } else { - /* Not US or Canada */ - memcpy(region->country_code, GeoIP_country_code[(seek_region - WORLD_OFFSET) / FIPS_RANGE], 2); - } - } -} - -void GeoIP_assign_region_by_inetaddr_v6(GeoIP* gi, geoipv6_t inetaddr, GeoIPRegion *region) { - unsigned int seek_region; - - /* This also writes in the terminating NULs (if you decide to - * keep them) and clear any fields that are not set. */ - memset(region, 0, sizeof(GeoIPRegion)); - - seek_region = _GeoIP_seek_record_v6(gi, inetaddr); - - if (gi->databaseType == GEOIP_REGION_EDITION_REV0) { - /* Region Edition, pre June 2003 */ - seek_region -= STATE_BEGIN_REV0; - if (seek_region >= 1000) { - region->country_code[0] = 'U'; - region->country_code[1] = 'S'; - region->region[0] = (char) ((seek_region - 1000)/26 + 65); - region->region[1] = (char) ((seek_region - 1000)%26 + 65); - } else { - memcpy(region->country_code, GeoIP_country_code[seek_region], 2); - } - } else if (gi->databaseType == GEOIP_REGION_EDITION_REV1) { - /* Region Edition, post June 2003 */ - seek_region -= STATE_BEGIN_REV1; - if (seek_region < US_OFFSET) { - /* Unknown */ - /* we don't need to do anything here b/c we memset region to 0 */ - } else if (seek_region < CANADA_OFFSET) { - /* USA State */ - region->country_code[0] = 'U'; - region->country_code[1] = 'S'; - region->region[0] = (char) ((seek_region - US_OFFSET)/26 + 65); - region->region[1] = (char) ((seek_region - US_OFFSET)%26 + 65); - } else if (seek_region < WORLD_OFFSET) { - /* Canada Province */ - region->country_code[0] = 'C'; - region->country_code[1] = 'A'; - region->region[0] = (char) ((seek_region - CANADA_OFFSET)/26 + 65); - region->region[1] = (char) ((seek_region - CANADA_OFFSET)%26 + 65); - } else { - /* Not US or Canada */ - memcpy(region->country_code, GeoIP_country_code[(seek_region - WORLD_OFFSET) / FIPS_RANGE], 2); - } - } -} - -static -GeoIPRegion * _get_region(GeoIP* gi, unsigned long ipnum) { - GeoIPRegion * region; - - region = malloc(sizeof(GeoIPRegion)); - if (region) { - GeoIP_assign_region_by_inetaddr(gi, htonl(ipnum), region); - } - return region; -} - -static -GeoIPRegion * _get_region_v6(GeoIP* gi, geoipv6_t ipnum) { - GeoIPRegion * region; - - region = malloc(sizeof(GeoIPRegion)); - if (region) { - GeoIP_assign_region_by_inetaddr_v6(gi, ipnum, region); - } - return region; -} - -GeoIPRegion * GeoIP_region_by_addr (GeoIP* gi, const char *addr) { - unsigned long ipnum; - if (addr == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - return _get_region(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_addr_v6 (GeoIP* gi, const char *addr) { - geoipv6_t ipnum; - if (addr == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - return _get_region_v6(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_name (GeoIP* gi, const char *name) { - unsigned long ipnum; - if (name == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - if (!(ipnum = _GeoIP_lookupaddress(name))) - return 0; - return _get_region(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_name_v6 (GeoIP* gi, const char *name) { - geoipv6_t ipnum; - if (name == NULL) { - return 0; - } - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - - ipnum = _GeoIP_lookupaddress_v6(name); - if (__GEOIP_V6_IS_NULL(ipnum)) - return 0; - return _get_region_v6(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_ipnum (GeoIP* gi, unsigned long ipnum) { - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - return _get_region(gi, ipnum); -} - -GeoIPRegion * GeoIP_region_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - if (gi->databaseType != GEOIP_REGION_EDITION_REV0 && - gi->databaseType != GEOIP_REGION_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]); - return 0; - } - return _get_region_v6(gi, ipnum); -} - -void GeoIPRegion_delete (GeoIPRegion *gir) { - free(gir); -} - -/* GeoIP Organization, ISP and AS Number Edition private method */ -static -char *_get_name (GeoIP* gi, unsigned long ipnum) { - int seek_org; - char buf[MAX_ORG_RECORD_LENGTH]; - char * org_buf, * buf_pointer; - int record_pointer; - size_t len; - ssize_t silence; - - if (gi->databaseType != GEOIP_ORG_EDITION && - gi->databaseType != GEOIP_ISP_EDITION && - gi->databaseType != GEOIP_DOMAIN_EDITION && - gi->databaseType != GEOIP_ASNUM_EDITION && - gi->databaseType != GEOIP_NETSPEED_EDITION_REV1 && - gi->databaseType != GEOIP_USERTYPE_EDITION && - gi->databaseType != GEOIP_REGISTRAR_EDITION && - gi->databaseType != GEOIP_LOCATIONA_EDITION - ) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_ORG_EDITION]); - return NULL; - } - - seek_org = _GeoIP_seek_record(gi, ipnum); - if (seek_org == gi->databaseSegments[0]) - return NULL; - - record_pointer = seek_org + (2 * gi->record_length - 1) * gi->databaseSegments[0]; - - if (gi->cache == NULL) { - silence = pread(fileno(gi->GeoIPDatabase), buf, MAX_ORG_RECORD_LENGTH, record_pointer); - if ( gi->charset == GEOIP_CHARSET_UTF8 ) { - org_buf = _GeoIP_iso_8859_1__utf8( (const char * ) buf ); - } else { - len = sizeof(char) * (strlen(buf)+1); - org_buf = malloc(len); - strncpy(org_buf, buf, len); - } - } else { - buf_pointer = (char *)(gi->cache + (long)record_pointer); - if ( gi->charset == GEOIP_CHARSET_UTF8 ) { - org_buf = _GeoIP_iso_8859_1__utf8( (const char * ) buf_pointer ); - } else { - len = sizeof(char) * (strlen(buf_pointer)+1); - org_buf = malloc(len); - strncpy(org_buf, buf_pointer, len); - } - } - return org_buf; -} - -char *_get_name_v6 (GeoIP* gi, geoipv6_t ipnum) { - int seek_org; - char buf[MAX_ORG_RECORD_LENGTH]; - char * org_buf, * buf_pointer; - int record_pointer; - size_t len; - ssize_t silence; - - if ( - gi->databaseType != GEOIP_ORG_EDITION_V6 && - gi->databaseType != GEOIP_ISP_EDITION_V6 && - gi->databaseType != GEOIP_DOMAIN_EDITION_V6 && - gi->databaseType != GEOIP_ASNUM_EDITION_V6 && - gi->databaseType != GEOIP_NETSPEED_EDITION_REV1_V6 && - gi->databaseType != GEOIP_USERTYPE_EDITION_V6 && - gi->databaseType != GEOIP_REGISTRAR_EDITION_V6 && - gi->databaseType != GEOIP_LOCATIONA_EDITION - ) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_ORG_EDITION]); - return NULL; - } - - seek_org = _GeoIP_seek_record_v6(gi, ipnum); - if (seek_org == gi->databaseSegments[0]) - return NULL; - - record_pointer = seek_org + (2 * gi->record_length - 1) * gi->databaseSegments[0]; - - if (gi->cache == NULL) { - silence = pread(fileno(gi->GeoIPDatabase), buf, MAX_ORG_RECORD_LENGTH, record_pointer); - if ( gi->charset == GEOIP_CHARSET_UTF8 ) { - org_buf = _GeoIP_iso_8859_1__utf8( (const char * ) buf ); - } else { - len = sizeof(char) * (strlen(buf)+1); - org_buf = malloc(len); - strncpy(org_buf, buf, len); - } - } else { - buf_pointer = (char *)(gi->cache + (long)record_pointer); - if ( gi->charset == GEOIP_CHARSET_UTF8 ) { - org_buf = _GeoIP_iso_8859_1__utf8( (const char * ) buf_pointer ); - } else { - len = sizeof(char) * (strlen(buf_pointer)+1); - org_buf = malloc(len); - strncpy(org_buf, buf_pointer, len); - } - } - return org_buf; -} - -char * GeoIP_num_to_addr (unsigned long ipnum) { - char *ret_str; - char *cur_str; - int octet[4]; - int num_chars_written, i; - - ret_str = malloc(sizeof(char) * 16); - cur_str = ret_str; - - for (i = 0; i<4; i++) { - octet[3 - i] = ipnum % 256; - ipnum >>= 8; - } - - for (i = 0; i<4; i++) { - num_chars_written = sprintf(cur_str, "%d", octet[i]); - cur_str += num_chars_written; - - if (i < 3) { - cur_str[0] = '.'; - cur_str++; - } - } - - return ret_str; -} - -char **GeoIP_range_by_ip (GeoIP* gi, const char *addr) { - unsigned long ipnum; - unsigned long left_seek; - unsigned long right_seek; - unsigned long mask; - int orig_netmask; - int target_value; - char **ret; - - if (addr == NULL) { - return 0; - } - - ret = malloc(sizeof(char *) * 2); - - ipnum = GeoIP_addr_to_num(addr); - target_value = _GeoIP_seek_record(gi, ipnum); - orig_netmask = GeoIP_last_netmask(gi); - mask = 0xffffffff << ( 32 - orig_netmask ); - left_seek = ipnum & mask; - right_seek = left_seek + ( 0xffffffff & ~mask ); - - while (left_seek != 0 - && target_value == _GeoIP_seek_record(gi, left_seek - 1) ) { - - /* Go to beginning of netblock defined by netmask */ - mask = 0xffffffff << ( 32 - GeoIP_last_netmask(gi) ); - left_seek = ( left_seek - 1 ) & mask; - } - ret[0] = GeoIP_num_to_addr(left_seek); - - while (right_seek != 0xffffffff - && target_value == _GeoIP_seek_record(gi, right_seek + 1) ) { - - /* Go to end of netblock defined by netmask */ - mask = 0xffffffff << ( 32 - GeoIP_last_netmask(gi) ); - right_seek = ( right_seek + 1 ) & mask; - right_seek += 0xffffffff & ~mask; - } - ret[1] = GeoIP_num_to_addr(right_seek); - - gi->netmask = orig_netmask; - - return ret; -} - -void GeoIP_range_by_ip_delete( char ** ptr ){ - if ( ptr ){ - if ( ptr[0] ) - free(ptr[0]); - if ( ptr[1] ) - free(ptr[1]); - free(ptr); - } -} - -char *GeoIP_name_by_ipnum (GeoIP* gi, unsigned long ipnum) { - return _get_name(gi,ipnum); -} - -char *GeoIP_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - return _get_name_v6(gi,ipnum); -} - -char *GeoIP_name_by_addr (GeoIP* gi, const char *addr) { - unsigned long ipnum; - if (addr == NULL) { - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - return _get_name(gi, ipnum); -} - -char *GeoIP_name_by_addr_v6 (GeoIP* gi, const char *addr) { - geoipv6_t ipnum; - if (addr == NULL) { - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - return _get_name_v6(gi, ipnum); -} - -char *GeoIP_name_by_name (GeoIP* gi, const char *name) { - unsigned long ipnum; - if (name == NULL) { - return 0; - } - if (!(ipnum = _GeoIP_lookupaddress(name))) - return 0; - return _get_name(gi, ipnum); -} - -char *GeoIP_name_by_name_v6 (GeoIP* gi, const char *name) { - geoipv6_t ipnum; - if (name == NULL) { - return 0; - } - ipnum = _GeoIP_lookupaddress_v6(name); - if (__GEOIP_V6_IS_NULL(ipnum)) - return 0; - return _get_name_v6(gi, ipnum); -} - -char *GeoIP_org_by_ipnum (GeoIP* gi, unsigned long ipnum) { - return GeoIP_name_by_ipnum(gi, ipnum); -} - -char *GeoIP_org_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum) { - return GeoIP_name_by_ipnum_v6(gi, ipnum); -} - -char *GeoIP_org_by_addr (GeoIP* gi, const char *addr) { - return GeoIP_name_by_addr(gi, addr); -} - -char *GeoIP_org_by_addr_v6 (GeoIP* gi, const char *addr) { - return GeoIP_name_by_addr_v6(gi, addr); -} - -char *GeoIP_org_by_name (GeoIP* gi, const char *name) { - return GeoIP_name_by_name(gi, name); -} - -char *GeoIP_org_by_name_v6 (GeoIP* gi, const char *name) { - return GeoIP_name_by_name_v6(gi, name); -} - -unsigned char GeoIP_database_edition (GeoIP* gi) { - return gi->databaseType; -} - -int GeoIP_enable_teredo(GeoIP* gi, int true_false){ - unsigned int mask = ( 1U << GEOIP_TEREDO_BIT ); - int b = ( gi->ext_flags & mask ) ? 1 : 0; - gi->ext_flags &= ~mask ; - if ( true_false ) - gi->ext_flags |= true_false; - return b; -} - -int GeoIP_teredo ( GeoIP* gi ){ - unsigned int mask = ( 1U << GEOIP_TEREDO_BIT ); - return ( gi->ext_flags & mask ) ? 1 : 0; -} - -int GeoIP_charset( GeoIP* gi){ - return gi->charset; -} - -int GeoIP_set_charset( GeoIP* gi, int charset ){ - int old_charset = gi->charset; - gi->charset = charset; - return old_charset; -} - -int GeoIP_last_netmask (GeoIP* gi) { - return gi->netmask; -} - - -/** return two letter country code */ -const char* GeoIP_code_by_id(int id) -{ - if (id < 0 || id >= (int) num_GeoIP_countries) - return NULL; - - return GeoIP_country_code[id]; -} - -/** return three letter country code */ -const char* GeoIP_code3_by_id(int id) -{ - if (id < 0 || id >= (int) num_GeoIP_countries) - return NULL; - - return GeoIP_country_code3[id]; -} - - -/** return full name of country in utf8 or iso-8859-1 */ -const char* GeoIP_country_name_by_id(GeoIP * gi, int id) -{ - /* return NULL also even for index 0 for backward compatibility */ - if (id <= 0 || id >= (int) num_GeoIP_countries) - return NULL; - return ((gi->charset == GEOIP_CHARSET_UTF8) - ? GeoIP_utf8_country_name[id] - : GeoIP_country_name[id]); -} - -/** return full name of country in iso-8859-1 */ -const char* GeoIP_name_by_id(int id) -{ - if (id < 0 || id >= (int) num_GeoIP_countries) - return NULL; - - return GeoIP_country_name[id]; -} - -/** return continent of country */ -const char* GeoIP_continent_by_id(int id) -{ - if (id < 0 || id >= (int) num_GeoIP_countries) - return NULL; - - return GeoIP_country_continent[id]; -} - -/** return id by country code **/ -int GeoIP_id_by_code(const char *country) -{ - unsigned i; - - for ( i = 0; i < num_GeoIP_countries; ++i) - { - if (strcmp(country, GeoIP_country_code[i]) == 0) - return i; - } - - return 0; -} - -unsigned GeoIP_num_countries(void) -{ - return num_GeoIP_countries; -} - -/*const char * GeoIP_lib_version(void) -{ - return PACKAGE_VERSION; -}*/ - -int GeoIP_cleanup(void) -{ - int i, result = 0; - if (GeoIPDBFileName) { - - for (i = 0; i < NUM_DB_TYPES; i++) { - if (GeoIPDBFileName[i]) free(GeoIPDBFileName[i]); - } - - free(GeoIPDBFileName); - GeoIPDBFileName = NULL; - result = 1; - } - - return result; -} - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h deleted file mode 100644 index c1a2a470..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP.h +++ /dev/null @@ -1,315 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIP.h - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef GEOIP_H -#define GEOIP_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/types.h> -#if !defined(_WIN32) -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#else /* !defined(_WIN32) */ -#include <winsock2.h> -#include <ws2tcpip.h> -#include <wspiapi.h> -#include <windows.h> -#define snprintf _snprintf -#define FILETIME_TO_USEC(ft) (((unsigned __int64) ft.dwHighDateTime << 32 | ft.dwLowDateTime) / 10) -#endif /* !defined(_WIN32) */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> /* for fstat */ -#include <sys/stat.h> /* for fstat */ - -#define SEGMENT_RECORD_LENGTH 3 -#define LARGE_SEGMENT_RECORD_LENGTH 4 -#define STANDARD_RECORD_LENGTH 3 -#define ORG_RECORD_LENGTH 4 -#define MAX_RECORD_LENGTH 4 -#define NUM_DB_TYPES (33+1) - -// TODO -#ifdef _WIN32 -#include <io.h> -#include <stdio.h> -#define ssize_t int -static int pread(unsigned int fd, char *buf, size_t count, int offset); -#endif - -/* 128 bit address in network order */ -typedef struct in6_addr geoipv6_t; - -#define GEOIP_CHKBIT_V6(bit,ptr) (ptr[((127UL - bit) >> 3)] & (1UL << (~(127 - bit) & 7))) - -typedef struct GeoIPTag { - FILE *GeoIPDatabase; - char *file_path; - unsigned char *cache; - unsigned char *index_cache; - unsigned int *databaseSegments; - char databaseType; - time_t mtime; - int flags; - off_t size; - char record_length; - int charset; /* 0 iso-8859-1 1 utf8 */ - int record_iter; /* used in GeoIP_next_record */ - int netmask; /* netmask of last lookup - set using depth in _GeoIP_seek_record */ - time_t last_mtime_check; - off_t dyn_seg_size; /* currently only used by the cityconfidence database */ - unsigned int ext_flags; /* bit 0 teredo support enabled */ -} GeoIP; - - -typedef enum { - GEOIP_TEREDO_BIT = 0 -} GeoIPExtFlags; - -typedef enum { - GEOIP_CHARSET_ISO_8859_1 = 0, - GEOIP_CHARSET_UTF8 = 1 -} GeoIPCharset; - -typedef struct GeoIPRegionTag { - char country_code[3]; - char region[3]; -} GeoIPRegion; - -typedef enum { - GEOIP_STANDARD = 0, - GEOIP_MEMORY_CACHE = 1, - GEOIP_CHECK_CACHE = 2, - GEOIP_INDEX_CACHE = 4, - GEOIP_MMAP_CACHE = 8, -} GeoIPOptions; - -typedef enum { - GEOIP_COUNTRY_EDITION = 1, - GEOIP_REGION_EDITION_REV0 = 7, - GEOIP_CITY_EDITION_REV0 = 6, - GEOIP_ORG_EDITION = 5, - GEOIP_ISP_EDITION = 4, - GEOIP_CITY_EDITION_REV1 = 2, - GEOIP_REGION_EDITION_REV1 = 3, - GEOIP_PROXY_EDITION = 8, - GEOIP_ASNUM_EDITION = 9, - GEOIP_NETSPEED_EDITION = 10, - GEOIP_DOMAIN_EDITION = 11, - GEOIP_COUNTRY_EDITION_V6 = 12, - GEOIP_LOCATIONA_EDITION = 13, - GEOIP_ACCURACYRADIUS_EDITION = 14, - GEOIP_CITYCONFIDENCE_EDITION = 15, - GEOIP_CITYCONFIDENCEDIST_EDITION = 16, - GEOIP_LARGE_COUNTRY_EDITION = 17, - GEOIP_LARGE_COUNTRY_EDITION_V6 = 18, - GEOIP_CITYCONFIDENCEDIST_ISP_ORG_EDITION = 19, /* unsued, but gaps are not allowed */ - GEOIP_CCM_COUNTRY_EDITION =20, /* unsued, but gaps are not allowed */ - GEOIP_ASNUM_EDITION_V6 = 21, - GEOIP_ISP_EDITION_V6 = 22, - GEOIP_ORG_EDITION_V6 = 23, - GEOIP_DOMAIN_EDITION_V6 = 24, - GEOIP_LOCATIONA_EDITION_V6 = 25, - GEOIP_REGISTRAR_EDITION = 26, - GEOIP_REGISTRAR_EDITION_V6 = 27, - GEOIP_USERTYPE_EDITION = 28, - GEOIP_USERTYPE_EDITION_V6 = 29, - GEOIP_CITY_EDITION_REV1_V6 = 30, - GEOIP_CITY_EDITION_REV0_V6 = 31, - GEOIP_NETSPEED_EDITION_REV1 = 32, - GEOIP_NETSPEED_EDITION_REV1_V6 = 33 -} GeoIPDBTypes; - -typedef enum { - GEOIP_ANON_PROXY = 1, - GEOIP_HTTP_X_FORWARDED_FOR_PROXY = 2, - GEOIP_HTTP_CLIENT_IP_PROXY = 3, -} GeoIPProxyTypes; - -typedef enum { - GEOIP_UNKNOWN_SPEED = 0, - GEOIP_DIALUP_SPEED = 1, - GEOIP_CABLEDSL_SPEED = 2, - GEOIP_CORPORATE_SPEED = 3, -} GeoIPNetspeedValues; - -extern char **GeoIPDBFileName; -extern const char * GeoIPDBDescription[NUM_DB_TYPES]; -extern const char *GeoIPCountryDBFileName; -extern const char *GeoIPRegionDBFileName; -extern const char *GeoIPCityDBFileName; -extern const char *GeoIPOrgDBFileName; -extern const char *GeoIPISPDBFileName; -extern const char *GeoIPLocationADBFileName; -extern const char *GeoIPAccuracyRadiusFileName; -extern const char *GeoIPCityConfidenceFileName; - -/* Warning: do not use those arrays as doing so may break your - * program with newer GeoIP versions */ -extern const char GeoIP_country_code[254][3]; -extern const char GeoIP_country_code3[254][4]; -extern const char * GeoIP_country_name[254]; -extern const char * GeoIP_utf8_country_name[254]; -extern const char GeoIP_country_continent[254][3]; - -#ifdef DLL -#define GEOIP_API __declspec(dllexport) -#else -#define GEOIP_API -#endif /* DLL */ - -GEOIP_API void GeoIP_setup_custom_directory(char *dir); -GEOIP_API GeoIP* GeoIP_open_type (int type, int flags); -GEOIP_API GeoIP* GeoIP_new(int flags); -GEOIP_API GeoIP* GeoIP_open(const char * filename, int flags); -GEOIP_API int GeoIP_db_avail(int type); -GEOIP_API void GeoIP_delete(GeoIP* gi); -GEOIP_API const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_code_by_name (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_name_by_name (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_name_by_ipnum (GeoIP* gi, unsigned long ipnum); -GEOIP_API const char *GeoIP_country_code_by_ipnum (GeoIP* gi, unsigned long ipnum); -GEOIP_API const char *GeoIP_country_code3_by_ipnum (GeoIP* gi, unsigned long ipnum); - -/* */ -GEOIP_API const char *GeoIP_country_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GEOIP_API const char *GeoIP_country_code_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GEOIP_API const char *GeoIP_country_code3_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - -GEOIP_API const char *GeoIP_country_code_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_code_by_name_v6 (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_code3_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_code3_by_name_v6 (GeoIP* gi, const char *host); -GEOIP_API const char *GeoIP_country_name_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API const char *GeoIP_country_name_by_name_v6 (GeoIP* gi, const char *host); - -/* Deprecated - for backwards compatibility only */ -GEOIP_API int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr); -GEOIP_API int GeoIP_country_id_by_name (GeoIP* gi, const char *host); -GEOIP_API char *GeoIP_org_by_addr (GeoIP* gi, const char *addr); -GEOIP_API char *GeoIP_org_by_name (GeoIP* gi, const char *host); -GEOIP_API char *GeoIP_org_by_ipnum (GeoIP* gi, unsigned long ipnum); - -GEOIP_API char *GeoIP_org_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GEOIP_API char *GeoIP_org_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API char *GeoIP_org_by_name_v6 (GeoIP* gi, const char *name); - -/* End deprecated */ - -GEOIP_API int GeoIP_id_by_addr (GeoIP* gi, const char *addr); -GEOIP_API int GeoIP_id_by_name (GeoIP* gi, const char *host); -GEOIP_API int GeoIP_id_by_ipnum (GeoIP* gi, unsigned long ipnum); - -GEOIP_API int GeoIP_id_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API int GeoIP_id_by_name_v6 (GeoIP* gi, const char *host); -GEOIP_API int GeoIP_id_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); - -GEOIP_API GeoIPRegion * GeoIP_region_by_addr (GeoIP* gi, const char *addr); -GEOIP_API GeoIPRegion * GeoIP_region_by_name (GeoIP* gi, const char *host); -GEOIP_API GeoIPRegion * GeoIP_region_by_ipnum (GeoIP *gi, unsigned long ipnum); - -GEOIP_API GeoIPRegion * GeoIP_region_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API GeoIPRegion * GeoIP_region_by_name_v6 (GeoIP* gi, const char *host); -GEOIP_API GeoIPRegion * GeoIP_region_by_ipnum_v6 (GeoIP *gi, geoipv6_t ipnum); - -/* Warning - don't call this after GeoIP_assign_region_by_inetaddr calls */ -GEOIP_API void GeoIPRegion_delete (GeoIPRegion *gir); - -GEOIP_API void GeoIP_assign_region_by_inetaddr(GeoIP* gi, unsigned long inetaddr, GeoIPRegion *gir); - -GEOIP_API void GeoIP_assign_region_by_inetaddr_v6(GeoIP* gi, geoipv6_t inetaddr, GeoIPRegion *gir); - -/* Used to query GeoIP Organization, ISP and AS Number databases */ -GEOIP_API char *GeoIP_name_by_ipnum (GeoIP* gi, unsigned long ipnum); -GEOIP_API char *GeoIP_name_by_addr (GeoIP* gi, const char *addr); -GEOIP_API char *GeoIP_name_by_name (GeoIP* gi, const char *host); - -GEOIP_API char *GeoIP_name_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GEOIP_API char *GeoIP_name_by_addr_v6 (GeoIP* gi, const char *addr); -GEOIP_API char *GeoIP_name_by_name_v6 (GeoIP* gi, const char *name); - -/** return two letter country code */ -GEOIP_API const char* GeoIP_code_by_id(int id); - -/** return three letter country code */ -GEOIP_API const char* GeoIP_code3_by_id(int id); - -/** return full name of country in utf8 or iso-8859-1 */ -GEOIP_API const char* GeoIP_country_name_by_id(GeoIP* gi, int id); - -/** return full name of country */ -GEOIP_API const char* GeoIP_name_by_id(int id); - -/** return continent of country */ -GEOIP_API const char* GeoIP_continent_by_id(int id); - -/** return id by country code **/ -GEOIP_API int GeoIP_id_by_code(const char *country); - -/** return return number of known countries */ -GEOIP_API unsigned GeoIP_num_countries(void); - -GEOIP_API char *GeoIP_database_info (GeoIP* gi); -GEOIP_API unsigned char GeoIP_database_edition (GeoIP* gi); - -GEOIP_API int GeoIP_charset (GeoIP* gi); -GEOIP_API int GeoIP_set_charset (GeoIP* gi, int charset); -GEOIP_API int GeoIP_enable_teredo (GeoIP* gi, int true_false ); -GEOIP_API int GeoIP_teredo (GeoIP* gi ); - -GEOIP_API int GeoIP_last_netmask (GeoIP* gi); -GEOIP_API char **GeoIP_range_by_ip (GeoIP* gi, const char *addr); -GEOIP_API void GeoIP_range_by_ip_delete(char **ptr); - -/* Convert region code to region name */ -GEOIP_API const char * GeoIP_region_name_by_code(const char *country_code, const char *region_code); - -/* Get timezone from country and region code */ -GEOIP_API const char * GeoIP_time_zone_by_country_and_region(const char *country_code, const char *region_code); - -/* some v4 helper functions as of 1.4.7 exported to the public API */ -GEOIP_API unsigned long GeoIP_addr_to_num(const char *addr); -GEOIP_API char * GeoIP_num_to_addr(unsigned long ipnum); - -/* Internal function -- convert iso to utf8; return a malloced utf8 string. */ -char * _GeoIP_iso_8859_1__utf8(const char * iso); - -/* Cleans up memory used to hold file name paths. Returns 1 if successful; otherwise 0. - * */ -GEOIP_API int GeoIP_cleanup(void); - -/* Returns the library version in use. Helpful if your loading dynamically. */ -GEOIP_API const char * GeoIP_lib_version(void); - -# -#ifdef __cplusplus -} -#endif - -#endif /* GEOIP_H */ diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c deleted file mode 100644 index 8503fcb2..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.c +++ /dev/null @@ -1,393 +0,0 @@ - -/* - * GeoIPCity.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation; either version 2.1 of the License, or (at your - * option) any later version. - * - * This library 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 Lesser General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <GeoIP.h> -#include <GeoIP_internal.h> -#include <GeoIPCity.h> -#if !defined(_WIN32) -#include <unistd.h> -#include <netdb.h> -#include <netinet/in.h> /* For ntohl */ -#else -#include <windows.h> -#include <winsock.h> -#endif -#include <sys/types.h> /* For uint32_t */ -#ifdef HAVE_STDINT_H -#include <stdint.h> /* For uint32_t */ -#endif - -static -const int FULL_RECORD_LENGTH = 50; - -static const int CITYCONFIDENCE_FIXED_RECORD = 4; -static const int CITYCONFIDENCEDIST_FIXED_RECORD = 6; - - -static -GeoIPRecord * -_extract_record(GeoIP * gi, unsigned int seek_record, int *next_record_ptr) -{ - int record_pointer; - unsigned char *record_buf = NULL; - unsigned char *begin_record_buf = NULL; - GeoIPRecord *record; - int str_length = 0; - int j; - double latitude = 0, longitude = 0; - int metroarea_combo = 0; - int bytes_read = 0; - if (seek_record == gi->databaseSegments[0]) - return NULL; - - record = malloc(sizeof(GeoIPRecord)); - memset(record, 0, sizeof(GeoIPRecord)); - record->charset = gi->charset; - - if (gi->databaseType == GEOIP_CITYCONFIDENCE_EDITION - || gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION) { - - int fixed_rec_size = gi->record_length + - ((gi->databaseType == GEOIP_CITYCONFIDENCE_EDITION) - ? CITYCONFIDENCE_FIXED_RECORD - : CITYCONFIDENCEDIST_FIXED_RECORD); - - //allocate max rec size, even for CITYCONFIDENCE_FIXED_RECORD - //+4 is the max_record_length - // TODO - unsigned char tmp_fixed_record[6/*CITYCONFIDENCEDIST_FIXED_RECORD*/ + 4]; - int dseg = gi->databaseSegments[0] * gi->record_length * 2 + gi->record_length; -// int aligned_dseg = dseg ; - - int offset = seek_record - gi->databaseSegments[0] - 1; /* -1 b/c zero is not - * found. but the array - * start with 0 */ - record_pointer = offset * fixed_rec_size + dseg + gi->dyn_seg_size; - if (gi->cache == NULL) { - - /* read from disk */ - bytes_read = pread(fileno(gi->GeoIPDatabase), tmp_fixed_record, fixed_rec_size, record_pointer); - - if (bytes_read != fixed_rec_size) - return NULL; - - record->country_conf = tmp_fixed_record[0]; - record->region_conf = tmp_fixed_record[1]; - record->city_conf = tmp_fixed_record[2]; - record->postal_conf = tmp_fixed_record[3]; - - record->accuracy_radius = - gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION - ? ((tmp_fixed_record[4] + (tmp_fixed_record[5] << 8)) & 0x3ff) : 0x3ff; - - int t = fixed_rec_size - gi->record_length; - - record_pointer = dseg + tmp_fixed_record[t] + - (tmp_fixed_record[t + 1] << 8) + (tmp_fixed_record[t + 2] << 16) ; - - if (gi->record_length == 4) - record_pointer += (tmp_fixed_record[t + 3] << 24); - - begin_record_buf = record_buf = malloc(sizeof(char) * FULL_RECORD_LENGTH); - - bytes_read = pread(fileno(gi->GeoIPDatabase), record_buf, FULL_RECORD_LENGTH, record_pointer); - - if (bytes_read == 0) { - /* eof or other error */ - free(begin_record_buf); - free(record); - return NULL; - } - - } - else { - record_buf = gi->cache + (long) record_pointer; - - record->country_conf = record_buf[0]; - record->region_conf = record_buf[1]; - record->city_conf = record_buf[2]; - record->postal_conf = record_buf[3]; - - record->accuracy_radius = - gi->databaseType == GEOIP_CITYCONFIDENCEDIST_EDITION - ? ((record_buf[4] + (record_buf[5] << 8)) & 0x3ff) : 0x3ff; - - int t = fixed_rec_size - gi->record_length; - - record_pointer = dseg + record_buf[t] + - (record_buf[t + 1] << 8) + (record_buf[t + 2] << 16) ; - - if (gi->record_length == 4) - record_pointer += (record_buf[t + 3] << 24); - - record_buf = gi->cache + (long) record_pointer; - } - - } /* other city records */ - else { - - record->country_conf = GEOIP_UNKNOWN_CONF; - record->region_conf = GEOIP_UNKNOWN_CONF; - record->city_conf = GEOIP_UNKNOWN_CONF; - record->postal_conf = GEOIP_UNKNOWN_CONF; - record->accuracy_radius = GEOIP_UNKNOWN_ACCURACY_RADIUS; - - record_pointer = seek_record + (2 * gi->record_length - 1) * gi->databaseSegments[0]; - - if (gi->cache == NULL) { - begin_record_buf = record_buf = malloc(sizeof(char) * FULL_RECORD_LENGTH); - bytes_read = pread(fileno(gi->GeoIPDatabase), record_buf, FULL_RECORD_LENGTH, record_pointer); - if (bytes_read == 0) { - /* eof or other error */ - free(begin_record_buf); - free(record); - return NULL; - } - } - else { - record_buf = gi->cache + (long) record_pointer; - } - } - - /* get country */ - record->continent_code = (char *) GeoIP_country_continent[record_buf[0]]; - record->country_code = (char *) GeoIP_country_code[record_buf[0]]; - record->country_code3 = (char *) GeoIP_country_code3[record_buf[0]]; - record->country_name = (char *) GeoIP_country_name_by_id(gi, record_buf[0]); - record_buf++; - - /* get region */ - while (record_buf[str_length] != '\0') - str_length++; - if (str_length > 0) { - record->region = malloc(str_length + 1); - strncpy(record->region, (char *) record_buf, str_length + 1); - } - record_buf += str_length + 1; - str_length = 0; - - /* get city */ - while (record_buf[str_length] != '\0') - str_length++; - if (str_length > 0) { - if (gi->charset == GEOIP_CHARSET_UTF8) { - record->city = _GeoIP_iso_8859_1__utf8((const char *) record_buf); - } - else { - record->city = malloc(str_length + 1); - strncpy(record->city, (const char *) record_buf, str_length + 1); - } - } - record_buf += (str_length + 1); - str_length = 0; - - /* get postal code */ - while (record_buf[str_length] != '\0') - str_length++; - if (str_length > 0) { - record->postal_code = malloc(str_length + 1); - strncpy(record->postal_code, (char *) record_buf, str_length + 1); - } - record_buf += (str_length + 1); - - /* get latitude */ - for (j = 0; j < 3; ++j) - latitude += (record_buf[j] << (j * 8)); - record->latitude = latitude / 10000 - 180; - record_buf += 3; - - /* get longitude */ - for (j = 0; j < 3; ++j) - longitude += (record_buf[j] << (j * 8)); - record->longitude = longitude / 10000 - 180; - - /* - * get area code and metro code for post April 2002 databases and for US - * locations - */ - if (GEOIP_CITY_EDITION_REV1 == gi->databaseType - || GEOIP_CITYCONFIDENCE_EDITION == gi->databaseType) { - if (!strcmp(record->country_code, "US")) { - record_buf += 3; - for (j = 0; j < 3; ++j) - metroarea_combo += (record_buf[j] << (j * 8)); - record->metro_code = metroarea_combo / 1000; - record->area_code = metroarea_combo % 1000; - } - } - - if (gi->cache == NULL) - free(begin_record_buf); - - /* Used for GeoIP_next_record */ - if (next_record_ptr != NULL) - *next_record_ptr = seek_record + record_buf - begin_record_buf + 3; - - return record; -} - -static -GeoIPRecord * -_get_record(GeoIP * gi, unsigned long ipnum) -{ - unsigned int seek_record; - if (gi->databaseType != GEOIP_CITY_EDITION_REV0 - && gi->databaseType != GEOIP_CITY_EDITION_REV1 - && gi->databaseType != GEOIP_CITYCONFIDENCE_EDITION - && gi->databaseType != GEOIP_CITYCONFIDENCEDIST_EDITION) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int) gi->databaseType], GeoIPDBDescription[GEOIP_CITY_EDITION_REV1]); - return 0; - } - - seek_record = _GeoIP_seek_record(gi, ipnum); - return _extract_record(gi, seek_record, NULL); -} - -static -GeoIPRecord * -_get_record_v6(GeoIP * gi, geoipv6_t ipnum) -{ - unsigned int seek_record; - if (gi->databaseType != GEOIP_CITY_EDITION_REV0_V6 && - gi->databaseType != GEOIP_CITY_EDITION_REV1_V6) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int) gi->databaseType], GeoIPDBDescription[GEOIP_CITY_EDITION_REV1_V6]); - return 0; - } - - seek_record = _GeoIP_seek_record_v6(gi, ipnum); - return _extract_record(gi, seek_record, NULL); -} - - - -GeoIPRecord * -GeoIP_record_by_ipnum(GeoIP * gi, unsigned long ipnum) -{ - return _get_record(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_ipnum_v6(GeoIP * gi, geoipv6_t ipnum) -{ - return _get_record_v6(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_addr(GeoIP * gi, const char *addr) -{ - unsigned long ipnum; - if (addr == NULL) { - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - return _get_record(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_addr_v6(GeoIP * gi, const char *addr) -{ - geoipv6_t ipnum; - if (addr == NULL) { - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - return _get_record_v6(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_name(GeoIP * gi, const char *name) -{ - unsigned long ipnum; - if (name == NULL) { - return 0; - } - ipnum = _GeoIP_lookupaddress(name); - return _get_record(gi, ipnum); -} - -GeoIPRecord * -GeoIP_record_by_name_v6(GeoIP * gi, const char *name) -{ - geoipv6_t ipnum; - if (name == NULL) { - return 0; - } - ipnum = _GeoIP_lookupaddress_v6(name); - return _get_record_v6(gi, ipnum); -} - -int -GeoIP_record_id_by_addr(GeoIP * gi, const char *addr) -{ - unsigned long ipnum; - if (gi->databaseType != GEOIP_CITY_EDITION_REV0 && - gi->databaseType != GEOIP_CITY_EDITION_REV1) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int) gi->databaseType], GeoIPDBDescription[GEOIP_CITY_EDITION_REV1]); - return 0; - } - if (addr == NULL) { - return 0; - } - ipnum = GeoIP_addr_to_num(addr); - return _GeoIP_seek_record(gi, ipnum); -} - -int -GeoIP_record_id_by_addr_v6(GeoIP * gi, const char *addr) -{ - geoipv6_t ipnum; - if (gi->databaseType != GEOIP_CITY_EDITION_REV0_V6 && - gi->databaseType != GEOIP_CITY_EDITION_REV1_V6) { - printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int) gi->databaseType], GeoIPDBDescription[GEOIP_CITY_EDITION_REV1]); - return 0; - } - if (addr == NULL) { - return 0; - } - ipnum = _GeoIP_addr_to_num_v6(addr); - return _GeoIP_seek_record_v6(gi, ipnum); -} - -int -GeoIP_init_record_iter(GeoIP * gi) -{ - return gi->databaseSegments[0] + 1; -} - -int -GeoIP_next_record(GeoIP * gi, GeoIPRecord ** gir, int *record_iter) -{ - if (gi->cache != NULL) { - printf("GeoIP_next_record not supported in memory cache mode\n"); - return 1; - } - *gir = _extract_record(gi, *record_iter, record_iter); - return 0; -} - -void -GeoIPRecord_delete(GeoIPRecord * gir) -{ - free(gir->region); - free(gir->city); - free(gir->postal_code); - free(gir); -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h deleted file mode 100644 index f6f8fc80..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPCity.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIPCity.h - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef GEOIPCITY_H -#define GEOIPCITY_H - -#include <GeoIP.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define GEOIP_UNKNOWN_CONF ( 0x7f ) -#define GEOIP_UNKNOWN_ACCURACY_RADIUS ( 0x3ff ) - -typedef struct GeoIPRecordTag { - char *country_code; - char *country_code3; - char *country_name; - char *region; - char *city; - char *postal_code; - float latitude; - float longitude; - union { - int metro_code; /* metro_code is a alias for dma_code */ - int dma_code; - }; - int area_code; - int charset; - char *continent_code; - /* confidence factor for Country/Region/City/Postal */ - unsigned char country_conf, region_conf, city_conf, postal_conf; - int accuracy_radius; -} GeoIPRecord; - -GeoIPRecord * GeoIP_record_by_ipnum (GeoIP* gi, unsigned long ipnum); -GeoIPRecord * GeoIP_record_by_addr (GeoIP* gi, const char *addr); -GeoIPRecord * GeoIP_record_by_name (GeoIP* gi, const char *host); - -GeoIPRecord * GeoIP_record_by_ipnum_v6 (GeoIP* gi, geoipv6_t ipnum); -GeoIPRecord * GeoIP_record_by_addr_v6 (GeoIP* gi, const char *addr); -GeoIPRecord * GeoIP_record_by_name_v6 (GeoIP* gi, const char *host); - -int GeoIP_record_id_by_addr (GeoIP* gi, const char *addr); -int GeoIP_record_id_by_addr_v6 (GeoIP* gi, const char *addr); - -int GeoIP_init_record_iter (GeoIP* gi); -/* returns 0 on success, 1 on failure */ -int GeoIP_next_record (GeoIP* gi, GeoIPRecord **gir, int *record_iter); - -void GeoIPRecord_delete (GeoIPRecord *gir); - -/* NULL on failure otherwise a malloced string in utf8 */ -/* char * GeoIP_iso_8859_1__utf8(const char *); */ - -#ifdef __cplusplus -} -#endif - -#endif /* GEOIPCITY_H */ diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c deleted file mode 100644 index 008c9d93..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.c +++ /dev/null @@ -1,975 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIPUpdate.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIPCity.h" -#include "GeoIP.h" -#include "GeoIPUpdate.h" -#include "GeoIP_internal.h" - -#include "global.h" -#include "md5.h" -#include <sys/types.h> -#if !defined(_WIN32) -#include <netinet/in.h> -#include <arpa/inet.h> -#include <sys/socket.h> -#include <netdb.h> -#else -#include <windows.h> -//#include <winsock.h> -#include <winsock2.h> -#endif -#include <zlib.h> -#include <time.h> -#include <stdio.h> -//#include <unistd.h> - - -#define BLOCK_SIZE 1024 - -/* Update DB Host & HTTP GET Request formats: - * ------------------------------------------ - * GET must support an optional HTTP Proxy. - */ -const char *GeoIPUpdateHost = "updates.maxmind.com"; -/* This is the direct, or proxy port number. */ -static int GeoIPHTTPPort = 80; -/* License-only format (OLD) */ -const char *GeoIPHTTPRequest = "GET %s%s/app/update?license_key=%s&md5=%s HTTP/1.0\nHost: updates.maxmind.com\n\n"; -/* General DB Types formats */ -const char *GeoIPHTTPRequestFilename = "GET %s%s/app/update_getfilename?product_id=%s HTTP/1.0\nHost: %s\n\n"; -const char *GeoIPHTTPRequestClientIP = "GET %s%s/app/update_getipaddr HTTP/1.0\nHost: %s\n\n"; -const char *GeoIPHTTPRequestMD5 = "GET %s%s/app/update_secure?db_md5=%s&challenge_md5=%s&user_id=%s&edition_id=%s HTTP/1.0\nHost: updates.maxmind.com\n\n"; - -/* messages */ -const char *NoCurrentDB = "%s can't be opened, proceeding to download database\n"; -const char *MD5Info = "MD5 Digest of installed database is %s\n"; -const char *SavingGzip = "Saving gzip file to %s ... "; -const char *WritingFile = "Writing uncompressed data to %s ..."; - -const char * GeoIP_get_error_message(int i) { - switch (i) { - case GEOIP_NO_NEW_UPDATES: - return "no new updates"; - case GEOIP_SUCCESS: - return "Success"; - case GEOIP_LICENSE_KEY_INVALID_ERR: - return "License Key Invalid"; - case GEOIP_DNS_ERR: - return "Unable to resolve hostname"; - case GEOIP_NON_IPV4_ERR: - return "Non - IPv4 address"; - case GEOIP_SOCKET_OPEN_ERR: - return "Error opening socket"; - case GEOIP_CONNECTION_ERR: - return "Unable to connect"; - case GEOIP_GZIP_IO_ERR: - return "Unable to write GeoIP.dat.gz file"; - case GEOIP_TEST_IO_ERR: - return "Unable to write GeoIP.dat.test file"; - case GEOIP_GZIP_READ_ERR: - return "Unable to read gzip data"; - case GEOIP_OUT_OF_MEMORY_ERR: - return "Out of memory error"; - case GEOIP_SOCKET_READ_ERR: - return "Error reading from socket, see errno"; - case GEOIP_SANITY_OPEN_ERR: - return "Sanity check GeoIP_open error"; - case GEOIP_SANITY_INFO_FAIL: - return "Sanity check database_info string failed"; - case GEOIP_SANITY_LOOKUP_FAIL: - return "Sanity check ip address lookup failed"; - case GEOIP_RENAME_ERR: - return "Rename error while installing db, check errno"; - case GEOIP_USER_ID_INVALID_ERR: - return "Invalid userID"; - case GEOIP_PRODUCT_ID_INVALID_ERR: - return "Invalid product ID or subscription expired"; - case GEOIP_INVALID_SERVER_RESPONSE: - return "Server returned something unexpected"; - default: - return "no error"; - } -} -int GeoIP_fprintf(int (*f)(FILE *, char *),FILE *fp, const char *str, ...) { - va_list ap; - int rc; - char * f_str; - int silence; - - if ( f == NULL ) - return 0; - va_start(ap, str); -#if defined(HAVE_VASPRINTF) - silence = vasprintf(&f_str, str, ap); -#elif defined (HAVE_VSNPRINTF) - f_str = malloc(4096); - if ( f_str ) - silence = vsnprintf(f_str, 4096, str, ap); -#else - f_str = malloc(4096); - if ( f_str ) - silence = vsprintf(f_str, str, ap); -#endif - va_end(ap); - if ( f_str == NULL ) - return -1; - rc = (*f)(fp, f_str); - free(f_str); - return(rc); -} - -void GeoIP_printf(void (*f)(char *), const char *str,...) { - va_list params; - char * f_str; - int silence; - if (f == NULL) - return; - va_start(params, str); -#if defined(HAVE_VASPRINTF) - silence = vasprintf(&f_str, str, params); -#elif defined (HAVE_VSNPRINTF) - f_str = malloc(4096); - if ( f_str ) - silence = vsnprintf(f_str, 4096, str, params); -#else - f_str = malloc(4096); - if ( f_str ) - silence = vsprintf(f_str, str, params); -#endif - va_end(params); - if ( f_str == NULL ) - return; - (*f)(f_str); - free(f_str); -} - -/* Support HTTP Proxy Host - * -------------------------------------------------- - * Use typical OS support for the optional HTTP Proxy. - * - * Proxy adds http://{real-hostname} to URI format strings: - * sprintf("GET %s%s/ HTTP/1.0\r\n",GeoIPProxyHTTP,GeoIPProxiedHost, ...); - */ - -/* The Protocol is usually "" OR "http://" with a proxy. */ -static char *GeoIPProxyHTTP = ""; -/* GeoIP Hostname where proxy forwards requests. */ -static char *GeoIPProxiedHost = ""; - -/* Read http_proxy env. variable & parse it. - * ----------------------------------------- - * Allow only these formats: - * "http://server.com", "http://server.com:8080" - * OR - * "server.com", "server.com:8080" - * - * A "user:password@" part will break this. - */ -short int parse_http_proxy(char **proxy_host, int *port) { - char * http_proxy; - char * port_value; - - if ((http_proxy = getenv("http_proxy"))) { - - if (! strncmp("http://", http_proxy, 7)) http_proxy += 7; - - *proxy_host = strdup(http_proxy); - if ( *proxy_host == NULL ) - return 0; /* let the other functions deal with the memory error */ - - if ((port_value = strchr(*proxy_host, ':'))) { - *port_value++ = '\0'; - *port = atoi(port_value); - } - else { - *port = 80; - } - return(1); - } - else { - return(0); - } -} - -/* Get the GeoIP host or the current HTTP Proxy host. */ -struct hostent *GeoIP_get_host_or_proxy (void) { - char * hostname = (char *) GeoIPUpdateHost; - char * proxy_host; - int proxy_port; - - /* Set Proxy from OS: Unix/Linux */ - if (parse_http_proxy(&proxy_host,&proxy_port)) { - hostname = proxy_host; - GeoIPProxyHTTP = "http://"; - GeoIPProxiedHost = (char *) GeoIPUpdateHost; - GeoIPHTTPPort = proxy_port; - } - - /* Resolve DNS host entry. */ - return(gethostbyname(hostname)); -} - -short int GeoIP_update_database (char * license_key, int verbose, void (*f)( char * )) { - struct hostent *hostlist; - int sock; - char * buf; - struct sockaddr_in sa; - int offset = 0, err; - char * request_uri; - char * compr; - unsigned long comprLen; - FILE *comp_fh, *cur_db_fh, *gi_fh; - gzFile gz_fh; - char * file_path_gz, * file_path_test; - MD5_CONTEXT context; - unsigned char buffer[1024], digest[16]; - char hex_digest[33] = "00000000000000000000000000000000\0"; - unsigned int i; - GeoIP * gi; - char * db_info; - char block[BLOCK_SIZE]; - int block_size = BLOCK_SIZE; - size_t len; - size_t written; - _GeoIP_setup_dbfilename(); - - /* get MD5 of current GeoIP database file */ - if ((cur_db_fh = fopen (GeoIPDBFileName[GEOIP_COUNTRY_EDITION], "rb")) == NULL) { - GeoIP_printf(f,"%s%s", NoCurrentDB, GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } else { - md5_init(&context); - while ((len = fread (buffer, 1, 1024, cur_db_fh)) > 0) - md5_write (&context, buffer, len); - md5_final (&context); - memcpy(digest,context.buf,16); - fclose (cur_db_fh); - for (i = 0; i < 16; i++) { - // "%02x" will write 3 chars - snprintf (&hex_digest[2*i], 3, "%02x", digest[i]); - } - GeoIP_printf(f, MD5Info, hex_digest); - } - - hostlist = GeoIP_get_host_or_proxy(); - - if (hostlist == NULL) - return GEOIP_DNS_ERR; - - if (hostlist->h_addrtype != AF_INET) - return GEOIP_NON_IPV4_ERR; - - if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return GEOIP_SOCKET_OPEN_ERR; - } - - memset(&sa, 0, sizeof(struct sockaddr_in)); - sa.sin_port = htons(GeoIPHTTPPort); - memcpy(&sa.sin_addr, hostlist->h_addr_list[0], hostlist->h_length); - sa.sin_family = AF_INET; - - if (verbose == 1){ - GeoIP_printf(f,"Connecting to MaxMind GeoIP Update server\n"); - GeoIP_printf(f, "via Host or Proxy Server: %s:%d\n", hostlist->h_name, GeoIPHTTPPort); - } - - /* Download gzip file */ - if (connect(sock, (struct sockaddr *)&sa, sizeof(struct sockaddr))< 0) - return GEOIP_CONNECTION_ERR; - - request_uri = malloc(sizeof(char) * (strlen(license_key) + strlen(GeoIPHTTPRequest) - + strlen(GeoIPProxyHTTP) + strlen(GeoIPProxiedHost) + 36 + 1)); - if (request_uri == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - sprintf(request_uri,GeoIPHTTPRequest,GeoIPProxyHTTP,GeoIPProxiedHost,license_key, hex_digest); - send(sock, request_uri, strlen(request_uri),0); - free(request_uri); - - buf = malloc(sizeof(char) * block_size + 1); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - - if (verbose == 1) - GeoIP_printf(f,"Downloading gzipped GeoIP Database...\n"); - - for (;;) { - int amt; - amt = recv(sock, &buf[offset], block_size,0); - if (amt == 0) { - break; - } else if (amt == -1) { - free(buf); - return GEOIP_SOCKET_READ_ERR; - } - offset += amt; - buf = realloc(buf, offset+block_size + 1); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - } - - buf[offset]=0; - compr = strstr(buf, "\r\n\r\n"); - if ( compr == NULL ) { - free(buf); - return GEOIP_INVALID_SERVER_RESPONSE; - } - /* skip searchstr "\r\n\r\n" */ - compr += 4; - comprLen = offset + buf - compr; - - if (strstr(compr, "License Key Invalid") != NULL) { - if (verbose == 1) - GeoIP_printf(f,"Failed\n"); - free(buf); - return GEOIP_LICENSE_KEY_INVALID_ERR; - } else if (strstr(compr, "Invalid product ID or subscription expired") != NULL){ - free(buf); - return GEOIP_PRODUCT_ID_INVALID_ERR; - } else if (strstr(compr, "No new updates available") != NULL) { - free(buf); - return GEOIP_NO_NEW_UPDATES; - } - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - /* save gzip file */ - file_path_gz = malloc(sizeof(char) * (strlen(GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) + 4)); - if (file_path_gz == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - strcpy(file_path_gz,GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - strcat(file_path_gz,".gz"); - if (verbose == 1) { - GeoIP_printf(f, SavingGzip, file_path_gz); - } - comp_fh = fopen(file_path_gz, "wb"); - - if(comp_fh == NULL) { - free(file_path_gz); - free(buf); - return GEOIP_GZIP_IO_ERR; - } - - written = fwrite(compr, 1, comprLen, comp_fh); - fclose(comp_fh); - free(buf); - - if ( written != comprLen ) - return GEOIP_GZIP_IO_ERR; - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - if (verbose == 1) - GeoIP_printf(f,"Uncompressing gzip file ... "); - - /* uncompress gzip file */ - gz_fh = gzopen(file_path_gz, "rb"); - file_path_test = malloc(sizeof(char) * (strlen(GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) + 6)); - if (file_path_test == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - strcpy(file_path_test,GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - strcat(file_path_test,".test"); - gi_fh = fopen(file_path_test, "wb"); - - if(gi_fh == NULL) { - free(file_path_test); - return GEOIP_TEST_IO_ERR; - } - for (;;) { - int amt; - amt = gzread(gz_fh, block, block_size); - if (amt == -1) { - free(file_path_test); - fclose(gi_fh); - gzclose(gz_fh); - return GEOIP_GZIP_READ_ERR; - } - if (amt == 0) { - break; - } - if ( fwrite(block,1,amt,gi_fh) != amt ){ - free(file_path_test); - fclose(gi_fh); - gzclose(gz_fh); - return GEOIP_GZIP_READ_ERR; - } - } - gzclose(gz_fh); - unlink(file_path_gz); - free(file_path_gz); - fclose(gi_fh); - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - if (verbose == 1) { - GeoIP_printf(f, WritingFile, GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - } - - /* sanity check */ - gi = GeoIP_open(file_path_test, GEOIP_STANDARD); - - if (verbose == 1) - GeoIP_printf(f,"Performing santity checks ... "); - - if (gi == NULL) { - GeoIP_printf(f,"Error opening sanity check database\n"); - return GEOIP_SANITY_OPEN_ERR; - } - - /* this checks to make sure the files is complete, since info is at the end */ - /* dependent on future databases having MaxMind in info */ - if (verbose == 1) - GeoIP_printf(f,"database_info "); - db_info = GeoIP_database_info(gi); - if (db_info == NULL) { - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL\n"); - return GEOIP_SANITY_INFO_FAIL; - } - if (strstr(db_info, "MaxMind") == NULL) { - free(db_info); - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL\n"); - return GEOIP_SANITY_INFO_FAIL; - } - free(db_info); - if (verbose == 1) - GeoIP_printf(f,"PASS "); - - /* this performs an IP lookup test of a US IP address */ - if (verbose == 1) - GeoIP_printf(f,"lookup "); - if (strcmp(GeoIP_country_code_by_addr(gi,"24.24.24.24"), "US") != 0) { - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL\n"); - return GEOIP_SANITY_LOOKUP_FAIL; - } - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"PASS\n"); - - /* install GeoIP.dat.test -> GeoIP.dat */ - err = rename(file_path_test, GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - if (err != 0) { - GeoIP_printf(f,"GeoIP Install error while renaming file\n"); - return GEOIP_RENAME_ERR; - } - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - return 0; -} - -short int GeoIP_update_database_general (char * user_id,char * license_key,char *data_base_type, int verbose,char ** client_ipaddr, void (*f)( char *)) { - struct hostent *hostlist; - int sock; - char * buf; - struct sockaddr_in sa; - int offset = 0, err; - char * request_uri; - char * compr; - unsigned long comprLen; - FILE *comp_fh, *cur_db_fh, *gi_fh; - gzFile gz_fh; - char * file_path_gz, * file_path_test; - MD5_CONTEXT context; - MD5_CONTEXT context2; - unsigned char buffer[1024], digest[16] ,digest2[16]; - char hex_digest[33] = "0000000000000000000000000000000\0"; - char hex_digest2[33] = "0000000000000000000000000000000\0"; - unsigned int i; - char *f_str; - GeoIP * gi; - char * db_info; - char *ipaddress; - char *geoipfilename; - char *tmpstr; - int dbtype; - int lookupresult = 1; - char block[BLOCK_SIZE]; - int block_size = BLOCK_SIZE; - size_t len; - size_t request_uri_len; - size_t size; - - hostlist = GeoIP_get_host_or_proxy(); - - if (hostlist == NULL) - return GEOIP_DNS_ERR; - - if (hostlist->h_addrtype != AF_INET) - return GEOIP_NON_IPV4_ERR; - if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return GEOIP_SOCKET_OPEN_ERR; - } - - memset(&sa, 0, sizeof(struct sockaddr_in)); - sa.sin_port = htons(GeoIPHTTPPort); - memcpy(&sa.sin_addr, hostlist->h_addr_list[0], hostlist->h_length); - sa.sin_family = AF_INET; - - if (verbose == 1) { - GeoIP_printf(f,"Connecting to MaxMind GeoIP server\n"); - GeoIP_printf(f, "via Host or Proxy Server: %s:%d\n", hostlist->h_name, GeoIPHTTPPort); - } - - if (connect(sock, (struct sockaddr *)&sa, sizeof(struct sockaddr))< 0) - return GEOIP_CONNECTION_ERR; - request_uri = malloc(sizeof(char) * (strlen(GeoIPHTTPRequestFilename) - + strlen(GeoIPProxyHTTP) + strlen(GeoIPProxiedHost) - + strlen(data_base_type) + strlen(GeoIPUpdateHost) + 1)); - if (request_uri == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - - /* get the file name from a web page using the product id */ - sprintf(request_uri,GeoIPHTTPRequestFilename,GeoIPProxyHTTP,GeoIPProxiedHost,data_base_type,GeoIPUpdateHost); - if (verbose == 1) { - GeoIP_printf(f, "sending request %s \n",request_uri); - } - send(sock, request_uri, strlen(request_uri),0); /* send the request */ - free(request_uri); - buf = malloc(sizeof(char) * (block_size+4)); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - offset = 0; - for (;;){ - int amt; - amt = recv(sock, &buf[offset], block_size,0); - if (amt == 0){ - break; - } else if (amt == -1) { - free(buf); - return GEOIP_SOCKET_READ_ERR; - } - offset += amt; - buf = realloc(buf, offset + block_size + 4); - } - buf[offset] = 0; - offset = 0; - tmpstr = strstr(buf, "\r\n\r\n"); - if ( tmpstr == NULL ) { - free(buf); - return GEOIP_INVALID_SERVER_RESPONSE; - } - /* skip searchstr "\r\n\r\n" */ - tmpstr += 4; - if (tmpstr[0] == '.' || strchr(tmpstr, '/') != NULL || strchr(tmpstr, '\\') != NULL) { - free(buf); - return GEOIP_INVALID_SERVER_RESPONSE; - } - geoipfilename = _GeoIP_full_path_to(tmpstr); - free(buf); - - /* print the database product id and the database filename */ - if (verbose == 1){ - GeoIP_printf(f, "database product id %s database file name %s \n",data_base_type,geoipfilename); - } - _GeoIP_setup_dbfilename(); - - /* get MD5 of current GeoIP database file */ - if ((cur_db_fh = fopen (geoipfilename, "rb")) == NULL) { - GeoIP_printf(f, NoCurrentDB, geoipfilename); - } else { - md5_init(&context); - while ((len = fread (buffer, 1, 1024, cur_db_fh)) > 0) - md5_write (&context, buffer, len); - md5_final (&context); - memcpy(digest,context.buf,16); - fclose (cur_db_fh); - for (i = 0; i < 16; i++) - sprintf (&hex_digest[2*i], "%02x", digest[i]); - GeoIP_printf(f, MD5Info, hex_digest ); - } - if (verbose == 1) { - GeoIP_printf(f,"MD5 sum of database %s is %s \n",geoipfilename,hex_digest); - } - if (client_ipaddr[0] == NULL) { - /* We haven't gotten our IP address yet, so let's request it */ - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - free(geoipfilename); - return GEOIP_SOCKET_OPEN_ERR; - } - - memset(&sa, 0, sizeof(struct sockaddr_in)); - sa.sin_port = htons(GeoIPHTTPPort); - memcpy(&sa.sin_addr, hostlist->h_addr_list[0], hostlist->h_length); - sa.sin_family = AF_INET; - - if (verbose == 1) - GeoIP_printf(f,"Connecting to MaxMind GeoIP Update server\n"); - - /* Download gzip file */ - if (connect(sock, (struct sockaddr *)&sa, sizeof(struct sockaddr))< 0) { - free(geoipfilename); - return GEOIP_CONNECTION_ERR; - } - request_uri = malloc(sizeof(char) * (strlen(GeoIPHTTPRequestClientIP) - + strlen(GeoIPProxyHTTP) - + strlen(GeoIPProxiedHost) - + strlen(GeoIPUpdateHost) + 1 )); - if (request_uri == NULL) { - free(geoipfilename); - return GEOIP_OUT_OF_MEMORY_ERR; - } - - /* get client ip address from MaxMind web page */ - sprintf(request_uri,GeoIPHTTPRequestClientIP,GeoIPProxyHTTP,GeoIPProxiedHost,GeoIPUpdateHost); - send(sock, request_uri, strlen(request_uri),0); /* send the request */ - if (verbose == 1) { - GeoIP_printf(f, "sending request %s", request_uri); - } - free(request_uri); - buf = malloc(sizeof(char) * (block_size+1)); - if (buf == NULL) { - free(geoipfilename); - return GEOIP_OUT_OF_MEMORY_ERR; - } - offset = 0; - - for (;;){ - int amt; - amt = recv(sock, &buf[offset], block_size,0); - if (amt == 0) { - break; - } else if (amt == -1) { - free(buf); - return GEOIP_SOCKET_READ_ERR; - } - offset += amt; - buf = realloc(buf, offset+block_size+1); - } - - buf[offset] = 0; - offset = 0; - ipaddress = strstr(buf, "\r\n\r\n") + 4; /* get the ip address */ - ipaddress = malloc(strlen(strstr(buf, "\r\n\r\n") + 4)+5); - strcpy(ipaddress,strstr(buf, "\r\n\r\n") + 4); - client_ipaddr[0] = ipaddress; - if (verbose == 1) { - GeoIP_printf(f, "client ip address: %s\n",ipaddress); - } - free(buf); - close(sock); - } - - ipaddress = client_ipaddr[0]; - - /* make a md5 sum of ip address and license_key and store it in hex_digest2 */ - md5_init(&context2); - md5_write (&context2, (byte *)license_key, 12);//add license key to the md5 sum - md5_write (&context2, (byte *)ipaddress, strlen(ipaddress));//add ip address to the md5 sum - md5_final (&context2); - memcpy(digest2,context2.buf,16); - for (i = 0; i < 16; i++) - snprintf (&hex_digest2[2*i], 3, "%02x", digest2[i]);// change the digest to a hex digest - if (verbose == 1) { - GeoIP_printf(f, "md5sum of ip address and license key is %s \n",hex_digest2); - } - - /* send the request using the user id,product id, - * md5 sum of the prev database and - * the md5 sum of the license_key and ip address */ - if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return GEOIP_SOCKET_OPEN_ERR; - } - memset(&sa, 0, sizeof(struct sockaddr_in)); - sa.sin_port = htons(GeoIPHTTPPort); - memcpy(&sa.sin_addr, hostlist->h_addr_list[0], hostlist->h_length); - sa.sin_family = AF_INET; - if (connect(sock, (struct sockaddr *)&sa, sizeof(struct sockaddr))< 0) - return GEOIP_CONNECTION_ERR; - request_uri_len = sizeof(char) * 2036; - request_uri = malloc(request_uri_len); - if (request_uri == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - snprintf(request_uri, request_uri_len, GeoIPHTTPRequestMD5,GeoIPProxyHTTP,GeoIPProxiedHost,hex_digest,hex_digest2,user_id,data_base_type); - send(sock, request_uri, strlen(request_uri),0); - if (verbose == 1) { - GeoIP_printf(f, "sending request %s\n",request_uri); - } - - free(request_uri); - - offset = 0; - buf = malloc(sizeof(char) * block_size); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - - if (verbose == 1) - GeoIP_printf(f,"Downloading gzipped GeoIP Database...\n"); - - for (;;) { - int amt; - amt = recv(sock, &buf[offset], block_size,0); - - if (amt == 0) { - break; - } else if (amt == -1) { - free(buf); - return GEOIP_SOCKET_READ_ERR; - } - offset += amt; - buf = realloc(buf, offset+block_size); - if (buf == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - } - - compr = strstr(buf, "\r\n\r\n") + 4; - comprLen = offset + buf - compr; - - if (strstr(compr, "License Key Invalid") != NULL) { - if (verbose == 1) - GeoIP_printf(f,"Failed\n"); - free(buf); - return GEOIP_LICENSE_KEY_INVALID_ERR; - } else if (strstr(compr, "No new updates available") != NULL) { - free(buf); - GeoIP_printf(f, "%s is up to date, no updates required\n", geoipfilename); - return GEOIP_NO_NEW_UPDATES; - } else if (strstr(compr, "Invalid UserId") != NULL){ - free(buf); - return GEOIP_USER_ID_INVALID_ERR; - } else if (strstr(compr, "Invalid product ID or subscription expired") != NULL){ - free(buf); - return GEOIP_PRODUCT_ID_INVALID_ERR; - } - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - GeoIP_printf(f, "Updating %s\n", geoipfilename); - - /* save gzip file */ - file_path_gz = malloc(sizeof(char) * (strlen(geoipfilename) + 4)); - - if (file_path_gz == NULL) - return GEOIP_OUT_OF_MEMORY_ERR; - strcpy(file_path_gz,geoipfilename); - strcat(file_path_gz,".gz"); - if (verbose == 1) { - GeoIP_printf(f, SavingGzip, file_path_gz ); - } - comp_fh = fopen(file_path_gz, "wb"); - - if(comp_fh == NULL) { - free(file_path_gz); - free(buf); - return GEOIP_GZIP_IO_ERR; - } - - size = fwrite(compr, 1, comprLen, comp_fh); - fclose(comp_fh); - free(buf); - if ( size != comprLen ) { - return GEOIP_GZIP_IO_ERR; - } - - if (verbose == 1) { - GeoIP_printf(f, "download data to a gz file named %s \n",file_path_gz); - GeoIP_printf(f,"Done\n"); - GeoIP_printf(f,"Uncompressing gzip file ... "); - } - - file_path_test = malloc(sizeof(char) * (strlen(GeoIPDBFileName[GEOIP_COUNTRY_EDITION]) + 6)); - if (file_path_test == NULL) { - free(file_path_gz); - return GEOIP_OUT_OF_MEMORY_ERR; - } - strcpy(file_path_test,GeoIPDBFileName[GEOIP_COUNTRY_EDITION]); - strcat(file_path_test,".test"); - gi_fh = fopen(file_path_test, "wb"); - if(gi_fh == NULL) { - free(file_path_test); - free(file_path_gz); - return GEOIP_TEST_IO_ERR; - } - /* uncompress gzip file */ - offset = 0; - gz_fh = gzopen(file_path_gz, "rb"); - for (;;) { - int amt; - amt = gzread(gz_fh, block, block_size); - if (amt == -1) { - free(file_path_gz); - free(file_path_test); - gzclose(gz_fh); - fclose(gi_fh); - return GEOIP_GZIP_READ_ERR; - } - if (amt == 0) { - break; - } - if ( amt != fwrite(block,1,amt,gi_fh) ){ - return GEOIP_GZIP_IO_ERR; - } - } - gzclose(gz_fh); - unlink(file_path_gz); - free(file_path_gz); - fclose(gi_fh); - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - - if (verbose == 1) { - len = strlen(WritingFile) + strlen(geoipfilename) - 1; - f_str = malloc(len); - snprintf(f_str,len,WritingFile,geoipfilename); - free(f_str); - } - - /* sanity check */ - gi = GeoIP_open(file_path_test, GEOIP_STANDARD); - - if (verbose == 1) - GeoIP_printf(f,"Performing santity checks ... "); - - if (gi == NULL) { - GeoIP_printf(f,"Error opening sanity check database\n"); - return GEOIP_SANITY_OPEN_ERR; - } - - - /* get the database type */ - dbtype = GeoIP_database_edition(gi); - if (verbose == 1) { - GeoIP_printf(f, "Database type is %d\n",dbtype); - } - - /* this checks to make sure the files is complete, since info is at the end - dependent on future databases having MaxMind in info (ISP and Organization databases currently don't have info string */ - - if ((dbtype != GEOIP_ISP_EDITION)&& - (dbtype != GEOIP_ORG_EDITION)) { - if (verbose == 1) - GeoIP_printf(f,"database_info "); - db_info = GeoIP_database_info(gi); - if (db_info == NULL) { - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL null\n"); - return GEOIP_SANITY_INFO_FAIL; - } - if (strstr(db_info, "MaxMind") == NULL) { - free(db_info); - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL maxmind\n"); - return GEOIP_SANITY_INFO_FAIL; - } - free(db_info); - if (verbose == 1) - GeoIP_printf(f,"PASS "); - } - - /* this performs an IP lookup test of a US IP address */ - if (verbose == 1) - GeoIP_printf(f,"lookup "); - if (dbtype == GEOIP_NETSPEED_EDITION) { - int netspeed = GeoIP_id_by_name(gi,"24.24.24.24"); - lookupresult = 0; - if (netspeed == GEOIP_CABLEDSL_SPEED){ - lookupresult = 1; - } - } - if (dbtype == GEOIP_COUNTRY_EDITION) { - /* if data base type is country then call the function - * named GeoIP_country_code_by_addr */ - lookupresult = 1; - if (strcmp(GeoIP_country_code_by_addr(gi,"24.24.24.24"), "US") != 0) { - lookupresult = 0; - } - if (verbose == 1) { - GeoIP_printf(f,"testing GEOIP_COUNTRY_EDITION\n"); - } - } - if (dbtype == GEOIP_REGION_EDITION_REV1) { - /* if data base type is region then call the function - * named GeoIP_region_by_addr */ - GeoIPRegion *r = GeoIP_region_by_addr(gi,"24.24.24.24"); - lookupresult = 0; - if (r != NULL) { - lookupresult = 1; - free(r); - } - if (verbose == 1) { - GeoIP_printf(f,"testing GEOIP_REGION_EDITION\n"); - } - } - if (dbtype == GEOIP_CITY_EDITION_REV1) { - /* if data base type is city then call the function - * named GeoIP_record_by_addr */ - GeoIPRecord *r = GeoIP_record_by_addr(gi,"24.24.24.24"); - lookupresult = 0; - if (r != NULL) { - lookupresult = 1; - free(r); - } - if (verbose == 1) { - GeoIP_printf(f,"testing GEOIP_CITY_EDITION\n"); - } - } - if ((dbtype == GEOIP_ISP_EDITION)|| - (dbtype == GEOIP_ORG_EDITION)) { - /* if data base type is isp or org then call the function - * named GeoIP_org_by_addr */ - GeoIPRecord *r = (GeoIPRecord*)GeoIP_org_by_addr(gi,"24.24.24.24"); - lookupresult = 0; - if (r != NULL) { - lookupresult = 1; - free(r); - } - if (verbose == 1) { - if (dbtype == GEOIP_ISP_EDITION) { - GeoIP_printf(f,"testing GEOIP_ISP_EDITION\n"); - } - if (dbtype == GEOIP_ORG_EDITION) { - GeoIP_printf(f,"testing GEOIP_ORG_EDITION\n"); - } - } - } - if (lookupresult == 0) { - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"FAIL\n"); - return GEOIP_SANITY_LOOKUP_FAIL; - } - GeoIP_delete(gi); - if (verbose == 1) - GeoIP_printf(f,"PASS\n"); - - /* install GeoIP.dat.test -> GeoIP.dat */ - err = rename(file_path_test, geoipfilename); - if (err != 0) { - GeoIP_printf(f,"GeoIP Install error while renaming file\n"); - return GEOIP_RENAME_ERR; - } - - if (verbose == 1) - GeoIP_printf(f,"Done\n"); - free(geoipfilename); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h deleted file mode 100644 index 7e6bbe18..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIPUpdate.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* GeoIP.h - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef GEOIPUPDATE_H -#define GEOIPUPDATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stdarg.h> -#include <stdio.h> - -typedef enum { - GEOIP_NO_NEW_UPDATES = 1, /* Database up-to-date, no action taken */ - GEOIP_SUCCESS = 0, /* Success */ - GEOIP_LICENSE_KEY_INVALID_ERR = -1, /* License Key Invalid */ - GEOIP_DNS_ERR = -11, /* Unable to resolve hostname */ - GEOIP_NON_IPV4_ERR = -12, /* Non - IPv4 address */ - GEOIP_SOCKET_OPEN_ERR = -13, /* Error opening socket */ - GEOIP_CONNECTION_ERR = -14, /* Unable to connect */ - GEOIP_GZIP_IO_ERR = -15, /* Unable to write GeoIP.dat.gz file */ - GEOIP_TEST_IO_ERR = -16, /* Unable to write GeoIP.dat.test file */ - GEOIP_GZIP_READ_ERR = -17, /* Unable to read gzip data */ - GEOIP_OUT_OF_MEMORY_ERR = -18, /* Out of memory error */ - GEOIP_SOCKET_READ_ERR = -19, /* Error reading from socket, see errno */ - GEOIP_SANITY_OPEN_ERR = -20, /* Sanity check GeoIP_open error */ - GEOIP_SANITY_INFO_FAIL = -21, /* Sanity check database_info string failed */ - GEOIP_SANITY_LOOKUP_FAIL = -22, /* Sanity check ip address lookup failed */ - GEOIP_RENAME_ERR = -23, /* Rename error while installing db, check errno */ - GEOIP_USER_ID_INVALID_ERR = -24, /* Invalid userID */ - GEOIP_PRODUCT_ID_INVALID_ERR = -25, /* Invalid product ID or subscription expired */ - GEOIP_INVALID_SERVER_RESPONSE = -26 /* Server returned invalid response */ -} GeoIPUpdateCode; - -const char * GeoIP_get_error_message(int i); - -/* Original Update Function, just for MaxMind GeoIP Country database */ - short int GeoIP_update_database (char * license_key, int verbose, void (*f)( char *)); - -/* More generalized update function that works more databases */ - short int GeoIP_update_database_general (char * user_id, char * license_key,char * data_base_type, int verbose,char ** client_ipaddr, void (*f)( char *)); - - /* experimental export */ - int GeoIP_fprintf(int (*f)(FILE *, char *),FILE *fp, const char *fmt, ...); - void GeoIP_printf(void (*f)(char *), const char *fmt, ...); - -#ifdef __cplusplus -} -#endif - -#endif /* GEOIPUPDATE_H */ diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h deleted file mode 100644 index c19870fa..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/GeoIP_internal.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef GEOIP_INTERNAL_H -#define GEOIP_INTERNAL_H - -#include "GeoIP.h" - -GEOIP_API unsigned int _GeoIP_seek_record (GeoIP *gi, unsigned long ipnum); - -GEOIP_API unsigned int _GeoIP_seek_record_v6 (GeoIP *gi, geoipv6_t ipnum); -GEOIP_API geoipv6_t _GeoIP_addr_to_num_v6 (const char *addr); - -GEOIP_API unsigned long _GeoIP_lookupaddress (const char *host); -GEOIP_API geoipv6_t _GeoIP_lookupaddress_v6 (const char *host); -GEOIP_API int __GEOIP_V6_IS_NULL(geoipv6_t v6); - -GEOIP_API void _GeoIP_setup_dbfilename(); -GEOIP_API char *_GeoIP_full_path_to(const char *file_name); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am deleted file mode 100644 index 5fa0a903..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -lib_LTLIBRARIES = libGeoIP.la libGeoIPUpdate.la - -EXTRA_DIST = Makefile.vc md5.h global.h types.h GeoIP_internal.h - -AM_CPPFLAGS = -DGEOIPDATADIR=\"$(pkgdatadir)\" -Wall - -libGeoIP_la_SOURCES = GeoIP.c GeoIPCity.c regionName.c timeZone.c -include_HEADERS = GeoIP.h GeoIPCity.h GeoIPUpdate.h - -libGeoIPUpdate_la_SOURCES = GeoIPUpdate.c md5.c - -libGeoIP_la_LDFLAGS = -version-info @GEOIP_VERSION_INFO@ - -libGeoIPUpdate_la_LIBADD = -lz libGeoIP.la - -GeoIP.lo GeoIP.o: GeoIP.c GeoIP.h - -GeoIPCity.lo GeoIPCity.o: GeoIPCity.c GeoIP.h - -GeoIPUpdate.lo GeoIPUpdate.o: GeoIPUpdate.c GeoIPCity.h GeoIP.h - -regionName.lo regionName.o: regionName.c - -md5.lo md5.o: md5.c - -timeZone.lo timeZone.o: timeZone.c - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in deleted file mode 100644 index 5cb5c9f1..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.in +++ /dev/null @@ -1,567 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = libGeoIP -DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" -LTLIBRARIES = $(lib_LTLIBRARIES) -libGeoIP_la_LIBADD = -am_libGeoIP_la_OBJECTS = GeoIP.lo GeoIPCity.lo regionName.lo \ - timeZone.lo -libGeoIP_la_OBJECTS = $(am_libGeoIP_la_OBJECTS) -libGeoIP_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libGeoIP_la_LDFLAGS) $(LDFLAGS) -o $@ -libGeoIPUpdate_la_DEPENDENCIES = libGeoIP.la -am_libGeoIPUpdate_la_OBJECTS = GeoIPUpdate.lo md5.lo -libGeoIPUpdate_la_OBJECTS = $(am_libGeoIPUpdate_la_OBJECTS) -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(libGeoIP_la_SOURCES) $(libGeoIPUpdate_la_SOURCES) -DIST_SOURCES = $(libGeoIP_la_SOURCES) $(libGeoIPUpdate_la_SOURCES) -HEADERS = $(include_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -lib_LTLIBRARIES = libGeoIP.la libGeoIPUpdate.la -EXTRA_DIST = Makefile.vc md5.h global.h types.h GeoIP_internal.h -AM_CPPFLAGS = -DGEOIPDATADIR=\"$(pkgdatadir)\" -Wall -libGeoIP_la_SOURCES = GeoIP.c GeoIPCity.c regionName.c timeZone.c -include_HEADERS = GeoIP.h GeoIPCity.h GeoIPUpdate.h -libGeoIPUpdate_la_SOURCES = GeoIPUpdate.c md5.c -libGeoIP_la_LDFLAGS = -version-info @GEOIP_VERSION_INFO@ -libGeoIPUpdate_la_LIBADD = -lz libGeoIP.la -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libGeoIP/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu libGeoIP/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libGeoIP.la: $(libGeoIP_la_OBJECTS) $(libGeoIP_la_DEPENDENCIES) - $(libGeoIP_la_LINK) -rpath $(libdir) $(libGeoIP_la_OBJECTS) $(libGeoIP_la_LIBADD) $(LIBS) -libGeoIPUpdate.la: $(libGeoIPUpdate_la_OBJECTS) $(libGeoIPUpdate_la_DEPENDENCIES) - $(LINK) -rpath $(libdir) $(libGeoIPUpdate_la_OBJECTS) $(libGeoIPUpdate_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GeoIP.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GeoIPCity.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GeoIPUpdate.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regionName.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeZone.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-includeHEADERS: $(include_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ - done - -uninstall-includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LTLIBRARIES) $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-includeHEADERS - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-libLTLIBRARIES - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-includeHEADERS install-info \ - install-info-am install-libLTLIBRARIES install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-includeHEADERS \ - uninstall-libLTLIBRARIES - - -GeoIP.lo GeoIP.o: GeoIP.c GeoIP.h - -GeoIPCity.lo GeoIPCity.o: GeoIPCity.c GeoIP.h - -GeoIPUpdate.lo GeoIPUpdate.o: GeoIPUpdate.c GeoIPCity.h GeoIP.h - -regionName.lo regionName.o: regionName.c - -md5.lo md5.o: md5.c - -timeZone.lo timeZone.o: timeZone.c - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc deleted file mode 100644 index 2a167319..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/Makefile.vc +++ /dev/null @@ -1,34 +0,0 @@ -#NMAKE makefile for Windows developers. -#Produces a static library (GeoIP.lib). - -COMPILER=cl - -CFLAGS=-DWIN32 -MD -nologo - -GEOIPINC = -I..\libGeoIP - -CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) -DGEOIPDATADIR=\"$(GEOIPDATADIR)\" - -OBJS=GeoIP.obj GeoIPCity.obj regionName.obj md5.obj timeZone.obj - -EXTRA_LIBS= advapi32.lib wsock32.lib - -AR=lib - -GeoIP.lib: GeoIP.obj GeoIPCity.obj regionName.obj md5.obj timeZone.obj - $(AR) -nologo $(OBJS) $(EXTRA_LIBS) /OUT:GeoIP.lib - -GeoIP.obj: GeoIP.c - $(CC1) -c GeoIP.c $(GEOIPINC) - -GeoIPCity.obj: GeoIPCity.c - $(CC1) -c GeoIPCity.c $(GEOIPINC) - -regionName.obj: regionName.c - $(CC1) -c regionName.c $(GEOIPINC) - -md5.obj: md5.c - $(CC1) -c md5.c $(GEOIPINC) - -timeZone.obj: timeZone.c - $(CC1) -c timeZone.c $(GEOIPINC) diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/global.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/global.h deleted file mode 100644 index 22c5684b..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/global.h +++ /dev/null @@ -1,32 +0,0 @@ -/* GLOBAL.H - RSAREF types and constants - */ - -/* PROTOTYPES should be set to one if and only if the compiler supports - function argument prototyping. -The following makes PROTOTYPES default to 0 if it has not already - - been defined with C compiler flags. - */ -#ifndef PROTOTYPES -#define PROTOTYPES 0 -#endif - -/* POINTER defines a generic pointer type */ -typedef unsigned char *POINTER; - -/* UINT2 defines a two byte word */ -typedef unsigned short int UINT2; - -/* UINT4 defines a four byte word */ -typedef unsigned long int UINT4; - -/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. -If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it - returns an empty list. - */ -#if PROTOTYPES -#define PROTO_LIST(list) list -#else -#define PROTO_LIST(list) () -#endif - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c deleted file mode 100644 index 4b0c237f..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.c +++ /dev/null @@ -1,326 +0,0 @@ -/* md5.c - MD5 Message-Digest Algorithm - * Copyright (C) 1995, 1996, 1998, 1999, - * 2000, 2001 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. - * - * According to the definition of MD5 in RFC 1321 from April 1992. - * NOTE: This is *not* the same file as the one from glibc. - */ -/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */ -/* Heavily modified for GnuPG by <wk@gnupg.org> */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#include "types.h" - -#ifdef WORDS_BIGENDIAN -#define BIG_ENDIAN_HOST -#endif - -//#define DIM(v) (sizeof(v)/sizeof((v)[0])) -#define wipememory2(_ptr,_set,_len) do { volatile char *_vptr=(volatile char *)(_ptr); size_t _vlen=(_len); while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } } while(0) -#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len) -#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) - -typedef struct { - u32 A,B,C,D; /* chaining variables */ - u32 nblocks; - byte buf[64]; - int count; -} MD5_CONTEXT; - - -void -md5_init( MD5_CONTEXT *ctx ) -{ - ctx->A = 0x67452301; - ctx->B = 0xefcdab89; - ctx->C = 0x98badcfe; - ctx->D = 0x10325476; - - ctx->nblocks = 0; - ctx->count = 0; -} - - - - -/* These are the four functions used in the four steps of the MD5 algorithm - and defined in the RFC 1321. The first function is a little bit optimized - (as found in Colin Plumbs public domain implementation). */ -/* #define FF(b, c, d) ((b & c) | (~b & d)) */ -#define FF(b, c, d) (d ^ (b & (c ^ d))) -#define FG(b, c, d) FF (d, b, c) -#define FH(b, c, d) (b ^ c ^ d) -#define FI(b, c, d) (c ^ (b | ~d)) - -static void -burn_stack (int bytes) -{ - char buf[128]; - - wipememory(buf,sizeof buf); - bytes -= sizeof buf; - if (bytes > 0) - burn_stack (bytes); -} - - - -/**************** - * transform n*64 bytes - */ -static void -/*transform( MD5_CONTEXT *ctx, const void *buffer, size_t len )*/ -transform( MD5_CONTEXT *ctx, byte *data ) -{ - u32 correct_words[16]; - u32 A = ctx->A; - u32 B = ctx->B; - u32 C = ctx->C; - u32 D = ctx->D; - u32 *cwp = correct_words; - -#ifdef BIG_ENDIAN_HOST - { int i; - byte *p2, *p1; - for(i=0, p1=data, p2=(byte*)correct_words; i < 16; i++, p2 += 4 ) { - p2[3] = *p1++; - p2[2] = *p1++; - p2[1] = *p1++; - p2[0] = *p1++; - } - } -#else - memcpy( correct_words, data, 64 ); -#endif - - -#define OP(a, b, c, d, s, T) \ - do \ - { \ - a += FF (b, c, d) + (*cwp++) + T; \ - a = rol(a, s); \ - a += b; \ - } \ - while (0) - - /* Before we start, one word about the strange constants. - They are defined in RFC 1321 as - - T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 - */ - - /* Round 1. */ - OP (A, B, C, D, 7, 0xd76aa478); - OP (D, A, B, C, 12, 0xe8c7b756); - OP (C, D, A, B, 17, 0x242070db); - OP (B, C, D, A, 22, 0xc1bdceee); - OP (A, B, C, D, 7, 0xf57c0faf); - OP (D, A, B, C, 12, 0x4787c62a); - OP (C, D, A, B, 17, 0xa8304613); - OP (B, C, D, A, 22, 0xfd469501); - OP (A, B, C, D, 7, 0x698098d8); - OP (D, A, B, C, 12, 0x8b44f7af); - OP (C, D, A, B, 17, 0xffff5bb1); - OP (B, C, D, A, 22, 0x895cd7be); - OP (A, B, C, D, 7, 0x6b901122); - OP (D, A, B, C, 12, 0xfd987193); - OP (C, D, A, B, 17, 0xa679438e); - OP (B, C, D, A, 22, 0x49b40821); - -#undef OP -#define OP(f, a, b, c, d, k, s, T) \ - do \ - { \ -a += f (b, c, d) + correct_words[k] + T; \ -a = rol(a, s); \ -a += b; \ - } \ - while (0) - - /* Round 2. */ - OP (FG, A, B, C, D, 1, 5, 0xf61e2562); - OP (FG, D, A, B, C, 6, 9, 0xc040b340); - OP (FG, C, D, A, B, 11, 14, 0x265e5a51); - OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); - OP (FG, A, B, C, D, 5, 5, 0xd62f105d); - OP (FG, D, A, B, C, 10, 9, 0x02441453); - OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); - OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); - OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); - OP (FG, D, A, B, C, 14, 9, 0xc33707d6); - OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); - OP (FG, B, C, D, A, 8, 20, 0x455a14ed); - OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); - OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); - OP (FG, C, D, A, B, 7, 14, 0x676f02d9); - OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); - - /* Round 3. */ - OP (FH, A, B, C, D, 5, 4, 0xfffa3942); - OP (FH, D, A, B, C, 8, 11, 0x8771f681); - OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); - OP (FH, B, C, D, A, 14, 23, 0xfde5380c); - OP (FH, A, B, C, D, 1, 4, 0xa4beea44); - OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); - OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); - OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); - OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); - OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); - OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); - OP (FH, B, C, D, A, 6, 23, 0x04881d05); - OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); - OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); - OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); - OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); - - /* Round 4. */ - OP (FI, A, B, C, D, 0, 6, 0xf4292244); - OP (FI, D, A, B, C, 7, 10, 0x432aff97); - OP (FI, C, D, A, B, 14, 15, 0xab9423a7); - OP (FI, B, C, D, A, 5, 21, 0xfc93a039); - OP (FI, A, B, C, D, 12, 6, 0x655b59c3); - OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); - OP (FI, C, D, A, B, 10, 15, 0xffeff47d); - OP (FI, B, C, D, A, 1, 21, 0x85845dd1); - OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); - OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); - OP (FI, C, D, A, B, 6, 15, 0xa3014314); - OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); - OP (FI, A, B, C, D, 4, 6, 0xf7537e82); - OP (FI, D, A, B, C, 11, 10, 0xbd3af235); - OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); - OP (FI, B, C, D, A, 9, 21, 0xeb86d391); - - /* Put checksum in context given as argument. */ - ctx->A += A; - ctx->B += B; - ctx->C += C; - ctx->D += D; -} - - - -/* The routine updates the message-digest context to - * account for the presence of each of the characters inBuf[0..inLen-1] - * in the message whose digest is being computed. - */ -void -md5_write( MD5_CONTEXT *hd, byte *inbuf, size_t inlen) -{ - if( hd->count == 64 ) { /* flush the buffer */ - transform( hd, hd->buf ); - burn_stack (80+6*sizeof(void*)); - hd->count = 0; - hd->nblocks++; - } - if( !inbuf ) - return; - if( hd->count ) { - for( ; inlen && hd->count < 64; inlen-- ) - hd->buf[hd->count++] = *inbuf++; - md5_write( hd, NULL, 0 ); - if( !inlen ) - return; - } - - while( inlen >= 64 ) { - transform( hd, inbuf ); - hd->count = 0; - hd->nblocks++; - inlen -= 64; - inbuf += 64; - } - burn_stack (80+6*sizeof(void*)); - for( ; inlen && hd->count < 64; inlen-- ) - hd->buf[hd->count++] = *inbuf++; -} -/* The routine final terminates the message-digest computation and - * ends with the desired message digest in mdContext->digest[0...15]. - * The handle is prepared for a new MD5 cycle. - * Returns 16 bytes representing the digest. - */ - -void -md5_final( MD5_CONTEXT *hd ) -{ - u32 t, msb, lsb; - byte *p; - - md5_write(hd, NULL, 0); /* flush */; - - t = hd->nblocks; - /* multiply by 64 to make a byte count */ - lsb = t << 6; - msb = t >> 26; - /* add the count */ - t = lsb; - if( (lsb += hd->count) < t ) - msb++; - /* multiply by 8 to make a bit count */ - t = lsb; - lsb <<= 3; - msb <<= 3; - msb |= t >> 29; - - if( hd->count < 56 ) { /* enough room */ - hd->buf[hd->count++] = 0x80; /* pad */ - while( hd->count < 56 ) - hd->buf[hd->count++] = 0; /* pad */ - } - else { /* need one extra block */ - hd->buf[hd->count++] = 0x80; /* pad character */ - while( hd->count < 64 ) - hd->buf[hd->count++] = 0; - md5_write(hd, NULL, 0); /* flush */; - memset(hd->buf, 0, 56 ); /* fill next block with zeroes */ - } - /* append the 64 bit count */ - hd->buf[56] = lsb ; - hd->buf[57] = lsb >> 8; - hd->buf[58] = lsb >> 16; - hd->buf[59] = lsb >> 24; - hd->buf[60] = msb ; - hd->buf[61] = msb >> 8; - hd->buf[62] = msb >> 16; - hd->buf[63] = msb >> 24; - transform( hd, hd->buf ); - burn_stack (80+6*sizeof(void*)); - - p = hd->buf; -#ifdef BIG_ENDIAN_HOST -#define X(a) do { *p++ = hd-> a ; *p++ = hd-> a >> 8; \ - *p++ = hd-> a >> 16; *p++ = hd-> a >> 24; } while(0) -#else /* little endian */ -#define X(a) do { *(u32*)p = hd-> a ; p += 4; } while(0) -#endif - X(A); - X(B); - X(C); - X(D); -#undef X - -} - -static byte * -md5_read( MD5_CONTEXT *hd ) -{ - return hd->buf; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h deleted file mode 100644 index e1607be9..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/md5.h +++ /dev/null @@ -1,40 +0,0 @@ -/* MD5.H - header file for MD5C.C - */ - -/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -rights reserved. - -License to copy and use this software is granted provided that it -is identified as the "RSA Data Security, Inc. MD5 Message-Digest -Algorithm" in all material mentioning or referencing this software -or this function. - -License is also granted to make and use derivative works provided -that such works are identified as "derived from the RSA Data -Security, Inc. MD5 Message-Digest Algorithm" in all material -mentioning or referencing the derived work. - -RSA Data Security, Inc. makes no representations concerning either -the merchantability of this software or the suitability of this -software for any particular purpose. It is provided "as is" -without express or implied warranty of any kind. - -These notices must be retained in any copies of any part of this -documentation and/or software. - */ - -/* MD5 context. */ - -#include "types.h" - -typedef struct { - u32 A,B,C,D; /* chaining variables */ - u32 nblocks; - byte buf[64]; - int count; -} MD5_CONTEXT; - -void md5_init( MD5_CONTEXT *ctx ); -void md5_write( MD5_CONTEXT *hd, byte *inbuf, size_t inlen); -void md5_final( MD5_CONTEXT *hd ); - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/regionName.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/regionName.c deleted file mode 100644 index 4f90f386..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/regionName.c +++ /dev/null @@ -1,12780 +0,0 @@ -#include <string.h> -#include <stdio.h> - -const char * GeoIP_region_name_by_code(const char * country_code,const char * region_code) { - const char * name = NULL; - int region_code2 = -1; - if (region_code == NULL) { return NULL; } - - if ( ((region_code[0] >= 48) && (region_code[0] < (48 + 10))) - && ((region_code[1] >= 48) && (region_code[1] < (48 + 10))) - ) { - - /* only numbers, that shorten the large switch statements */ - region_code2 = (region_code[0] - 48) * 10 + region_code[1] - 48; - } - - else if ( ( ((region_code[0] >= 65) && (region_code[0] < (65 + 26))) - || ((region_code[0] >= 48) && (region_code[0] < (48 + 10)))) - && ( ((region_code[1] >= 65) && (region_code[1] < (65 + 26))) - || ((region_code[1] >= 48) && (region_code[1] < (48 + 10)))) - ) { - - region_code2 = (region_code[0] - 48) * (65 + 26 - 48) + region_code[1] - 48 + 100; - } - - if (region_code2 == -1) {return NULL;} - - if (strcmp(country_code,"CA") == 0) { - switch (region_code2) { - case 849: - name = "Alberta"; - break; - case 893: - name = "British Columbia"; - break; - case 1365: - name = "Manitoba"; - break; - case 1408: - name = "New Brunswick"; - break; - case 1418: - name = "Newfoundland"; - break; - case 1425: - name = "Nova Scotia"; - break; - case 1427: - name = "Nunavut"; - break; - case 1463: - name = "Ontario"; - break; - case 1497: - name = "Prince Edward Island"; - break; - case 1538: - name = "Quebec"; - break; - case 1632: - name = "Saskatchewan"; - break; - case 1426: - name = "Northwest Territories"; - break; - case 1899: - name = "Yukon Territory"; - break; - } - } - if (strcmp(country_code,"US") == 0) { - switch (region_code2) { - case 848: - name = "Armed Forces Americas"; - break; - case 852: - name = "Armed Forces Europe, Middle East, & Canada"; - break; - case 858: - name = "Alaska"; - break; - case 859: - name = "Alabama"; - break; - case 863: - name = "Armed Forces Pacific"; - break; - case 865: - name = "Arkansas"; - break; - case 866: - name = "American Samoa"; - break; - case 873: - name = "Arizona"; - break; - case 934: - name = "California"; - break; - case 948: - name = "Colorado"; - break; - case 953: - name = "Connecticut"; - break; - case 979: - name = "District of Columbia"; - break; - case 981: - name = "Delaware"; - break; - case 1074: - name = "Florida"; - break; - case 1075: - name = "Federated States of Micronesia"; - break; - case 1106: - name = "Georgia"; - break; - case 1126: - name = "Guam"; - break; - case 1157: - name = "Hawaii"; - break; - case 1192: - name = "Iowa"; - break; - case 1195: - name = "Idaho"; - break; - case 1203: - name = "Illinois"; - break; - case 1205: - name = "Indiana"; - break; - case 1296: - name = "Kansas"; - break; - case 1302: - name = "Kentucky"; - break; - case 1321: - name = "Louisiana"; - break; - case 1364: - name = "Massachusetts"; - break; - case 1367: - name = "Maryland"; - break; - case 1368: - name = "Maine"; - break; - case 1371: - name = "Marshall Islands"; - break; - case 1372: - name = "Michigan"; - break; - case 1377: - name = "Minnesota"; - break; - case 1378: - name = "Missouri"; - break; - case 1379: - name = "Northern Mariana Islands"; - break; - case 1382: - name = "Mississippi"; - break; - case 1383: - name = "Montana"; - break; - case 1409: - name = "North Carolina"; - break; - case 1410: - name = "North Dakota"; - break; - case 1411: - name = "Nebraska"; - break; - case 1414: - name = "New Hampshire"; - break; - case 1416: - name = "New Jersey"; - break; - case 1419: - name = "New Mexico"; - break; - case 1428: - name = "Nevada"; - break; - case 1431: - name = "New York"; - break; - case 1457: - name = "Ohio"; - break; - case 1460: - name = "Oklahoma"; - break; - case 1467: - name = "Oregon"; - break; - case 1493: - name = "Pennsylvania"; - break; - case 1510: - name = "Puerto Rico"; - break; - case 1515: - name = "Palau"; - break; - case 1587: - name = "Rhode Island"; - break; - case 1624: - name = "South Carolina"; - break; - case 1625: - name = "South Dakota"; - break; - case 1678: - name = "Tennessee"; - break; - case 1688: - name = "Texas"; - break; - case 1727: - name = "Utah"; - break; - case 1751: - name = "Virginia"; - break; - case 1759: - name = "Virgin Islands"; - break; - case 1770: - name = "Vermont"; - break; - case 1794: - name = "Washington"; - break; - case 1815: - name = "West Virginia"; - break; - case 1802: - name = "Wisconsin"; - break; - case 1818: - name = "Wyoming"; - break; - } - } - if (strcmp(country_code,"AD") == 0) { - switch (region_code2) { - case 2: - name = "Canillo"; - break; - case 3: - name = "Encamp"; - break; - case 4: - name = "La Massana"; - break; - case 5: - name = "Ordino"; - break; - case 6: - name = "Sant Julia de Loria"; - break; - case 7: - name = "Andorra la Vella"; - break; - case 8: - name = "Escaldes-Engordany"; - break; - } - } - if (strcmp(country_code,"AE") == 0) { - switch (region_code2) { - case 1: - name = "Abu Dhabi"; - break; - case 2: - name = "Ajman"; - break; - case 3: - name = "Dubai"; - break; - case 4: - name = "Fujairah"; - break; - case 5: - name = "Ras Al Khaimah"; - break; - case 6: - name = "Sharjah"; - break; - case 7: - name = "Umm Al Quwain"; - break; - } - } - if (strcmp(country_code,"AF") == 0) { - switch (region_code2) { - case 1: - name = "Badakhshan"; - break; - case 2: - name = "Badghis"; - break; - case 3: - name = "Baghlan"; - break; - case 5: - name = "Bamian"; - break; - case 6: - name = "Farah"; - break; - case 7: - name = "Faryab"; - break; - case 8: - name = "Ghazni"; - break; - case 9: - name = "Ghowr"; - break; - case 10: - name = "Helmand"; - break; - case 11: - name = "Herat"; - break; - case 13: - name = "Kabol"; - break; - case 14: - name = "Kapisa"; - break; - case 17: - name = "Lowgar"; - break; - case 18: - name = "Nangarhar"; - break; - case 19: - name = "Nimruz"; - break; - case 23: - name = "Kandahar"; - break; - case 24: - name = "Kondoz"; - break; - case 26: - name = "Takhar"; - break; - case 27: - name = "Vardak"; - break; - case 28: - name = "Zabol"; - break; - case 29: - name = "Paktika"; - break; - case 30: - name = "Balkh"; - break; - case 31: - name = "Jowzjan"; - break; - case 32: - name = "Samangan"; - break; - case 33: - name = "Sar-e Pol"; - break; - case 34: - name = "Konar"; - break; - case 35: - name = "Laghman"; - break; - case 36: - name = "Paktia"; - break; - case 37: - name = "Khowst"; - break; - case 38: - name = "Nurestan"; - break; - case 39: - name = "Oruzgan"; - break; - case 40: - name = "Parvan"; - break; - case 41: - name = "Daykondi"; - break; - case 42: - name = "Panjshir"; - break; - } - } - if (strcmp(country_code,"AG") == 0) { - switch (region_code2) { - case 1: - name = "Barbuda"; - break; - case 3: - name = "Saint George"; - break; - case 4: - name = "Saint John"; - break; - case 5: - name = "Saint Mary"; - break; - case 6: - name = "Saint Paul"; - break; - case 7: - name = "Saint Peter"; - break; - case 8: - name = "Saint Philip"; - break; - case 9: - name = "Redonda"; - break; - } - } - if (strcmp(country_code,"AL") == 0) { - switch (region_code2) { - case 40: - name = "Berat"; - break; - case 41: - name = "Diber"; - break; - case 42: - name = "Durres"; - break; - case 43: - name = "Elbasan"; - break; - case 44: - name = "Fier"; - break; - case 45: - name = "Gjirokaster"; - break; - case 46: - name = "Korce"; - break; - case 47: - name = "Kukes"; - break; - case 48: - name = "Lezhe"; - break; - case 49: - name = "Shkoder"; - break; - case 50: - name = "Tirane"; - break; - case 51: - name = "Vlore"; - break; - } - } - if (strcmp(country_code,"AM") == 0) { - switch (region_code2) { - case 1: - name = "Aragatsotn"; - break; - case 2: - name = "Ararat"; - break; - case 3: - name = "Armavir"; - break; - case 4: - name = "Geghark'unik'"; - break; - case 5: - name = "Kotayk'"; - break; - case 6: - name = "Lorri"; - break; - case 7: - name = "Shirak"; - break; - case 8: - name = "Syunik'"; - break; - case 9: - name = "Tavush"; - break; - case 10: - name = "Vayots' Dzor"; - break; - case 11: - name = "Yerevan"; - break; - } - } - if (strcmp(country_code,"AO") == 0) { - switch (region_code2) { - case 1: - name = "Benguela"; - break; - case 2: - name = "Bie"; - break; - case 3: - name = "Cabinda"; - break; - case 4: - name = "Cuando Cubango"; - break; - case 5: - name = "Cuanza Norte"; - break; - case 6: - name = "Cuanza Sul"; - break; - case 7: - name = "Cunene"; - break; - case 8: - name = "Huambo"; - break; - case 9: - name = "Huila"; - break; - case 12: - name = "Malanje"; - break; - case 13: - name = "Namibe"; - break; - case 14: - name = "Moxico"; - break; - case 15: - name = "Uige"; - break; - case 16: - name = "Zaire"; - break; - case 17: - name = "Lunda Norte"; - break; - case 18: - name = "Lunda Sul"; - break; - case 19: - name = "Bengo"; - break; - case 20: - name = "Luanda"; - break; - } - } - if (strcmp(country_code,"AR") == 0) { - switch (region_code2) { - case 1: - name = "Buenos Aires"; - break; - case 2: - name = "Catamarca"; - break; - case 3: - name = "Chaco"; - break; - case 4: - name = "Chubut"; - break; - case 5: - name = "Cordoba"; - break; - case 6: - name = "Corrientes"; - break; - case 7: - name = "Distrito Federal"; - break; - case 8: - name = "Entre Rios"; - break; - case 9: - name = "Formosa"; - break; - case 10: - name = "Jujuy"; - break; - case 11: - name = "La Pampa"; - break; - case 12: - name = "La Rioja"; - break; - case 13: - name = "Mendoza"; - break; - case 14: - name = "Misiones"; - break; - case 15: - name = "Neuquen"; - break; - case 16: - name = "Rio Negro"; - break; - case 17: - name = "Salta"; - break; - case 18: - name = "San Juan"; - break; - case 19: - name = "San Luis"; - break; - case 20: - name = "Santa Cruz"; - break; - case 21: - name = "Santa Fe"; - break; - case 22: - name = "Santiago del Estero"; - break; - case 23: - name = "Tierra del Fuego"; - break; - case 24: - name = "Tucuman"; - break; - } - } - if (strcmp(country_code,"AT") == 0) { - switch (region_code2) { - case 1: - name = "Burgenland"; - break; - case 2: - name = "Karnten"; - break; - case 3: - name = "Niederosterreich"; - break; - case 4: - name = "Oberosterreich"; - break; - case 5: - name = "Salzburg"; - break; - case 6: - name = "Steiermark"; - break; - case 7: - name = "Tirol"; - break; - case 8: - name = "Vorarlberg"; - break; - case 9: - name = "Wien"; - break; - } - } - if (strcmp(country_code,"AU") == 0) { - switch (region_code2) { - case 1: - name = "Australian Capital Territory"; - break; - case 2: - name = "New South Wales"; - break; - case 3: - name = "Northern Territory"; - break; - case 4: - name = "Queensland"; - break; - case 5: - name = "South Australia"; - break; - case 6: - name = "Tasmania"; - break; - case 7: - name = "Victoria"; - break; - case 8: - name = "Western Australia"; - break; - } - } - if (strcmp(country_code,"AZ") == 0) { - switch (region_code2) { - case 1: - name = "Abseron"; - break; - case 2: - name = "Agcabadi"; - break; - case 3: - name = "Agdam"; - break; - case 4: - name = "Agdas"; - break; - case 5: - name = "Agstafa"; - break; - case 6: - name = "Agsu"; - break; - case 7: - name = "Ali Bayramli"; - break; - case 8: - name = "Astara"; - break; - case 9: - name = "Baki"; - break; - case 10: - name = "Balakan"; - break; - case 11: - name = "Barda"; - break; - case 12: - name = "Beylaqan"; - break; - case 13: - name = "Bilasuvar"; - break; - case 14: - name = "Cabrayil"; - break; - case 15: - name = "Calilabad"; - break; - case 16: - name = "Daskasan"; - break; - case 17: - name = "Davaci"; - break; - case 18: - name = "Fuzuli"; - break; - case 19: - name = "Gadabay"; - break; - case 20: - name = "Ganca"; - break; - case 21: - name = "Goranboy"; - break; - case 22: - name = "Goycay"; - break; - case 23: - name = "Haciqabul"; - break; - case 24: - name = "Imisli"; - break; - case 25: - name = "Ismayilli"; - break; - case 26: - name = "Kalbacar"; - break; - case 27: - name = "Kurdamir"; - break; - case 28: - name = "Lacin"; - break; - case 29: - name = "Lankaran"; - break; - case 30: - name = "Lankaran"; - break; - case 31: - name = "Lerik"; - break; - case 32: - name = "Masalli"; - break; - case 33: - name = "Mingacevir"; - break; - case 34: - name = "Naftalan"; - break; - case 35: - name = "Naxcivan"; - break; - case 36: - name = "Neftcala"; - break; - case 37: - name = "Oguz"; - break; - case 38: - name = "Qabala"; - break; - case 39: - name = "Qax"; - break; - case 40: - name = "Qazax"; - break; - case 41: - name = "Qobustan"; - break; - case 42: - name = "Quba"; - break; - case 43: - name = "Qubadli"; - break; - case 44: - name = "Qusar"; - break; - case 45: - name = "Saatli"; - break; - case 46: - name = "Sabirabad"; - break; - case 47: - name = "Saki"; - break; - case 48: - name = "Saki"; - break; - case 49: - name = "Salyan"; - break; - case 50: - name = "Samaxi"; - break; - case 51: - name = "Samkir"; - break; - case 52: - name = "Samux"; - break; - case 53: - name = "Siyazan"; - break; - case 54: - name = "Sumqayit"; - break; - case 55: - name = "Susa"; - break; - case 56: - name = "Susa"; - break; - case 57: - name = "Tartar"; - break; - case 58: - name = "Tovuz"; - break; - case 59: - name = "Ucar"; - break; - case 60: - name = "Xacmaz"; - break; - case 61: - name = "Xankandi"; - break; - case 62: - name = "Xanlar"; - break; - case 63: - name = "Xizi"; - break; - case 64: - name = "Xocali"; - break; - case 65: - name = "Xocavand"; - break; - case 66: - name = "Yardimli"; - break; - case 67: - name = "Yevlax"; - break; - case 68: - name = "Yevlax"; - break; - case 69: - name = "Zangilan"; - break; - case 70: - name = "Zaqatala"; - break; - case 71: - name = "Zardab"; - break; - } - } - if (strcmp(country_code,"BA") == 0) { - switch (region_code2) { - case 1: - name = "Federation of Bosnia and Herzegovina"; - break; - case 2: - name = "Republika Srpska"; - break; - } - } - if (strcmp(country_code,"BB") == 0) { - switch (region_code2) { - case 1: - name = "Christ Church"; - break; - case 2: - name = "Saint Andrew"; - break; - case 3: - name = "Saint George"; - break; - case 4: - name = "Saint James"; - break; - case 5: - name = "Saint John"; - break; - case 6: - name = "Saint Joseph"; - break; - case 7: - name = "Saint Lucy"; - break; - case 8: - name = "Saint Michael"; - break; - case 9: - name = "Saint Peter"; - break; - case 10: - name = "Saint Philip"; - break; - case 11: - name = "Saint Thomas"; - break; - } - } - if (strcmp(country_code,"BD") == 0) { - switch (region_code2) { - case 81: - name = "Dhaka"; - break; - case 82: - name = "Khulna"; - break; - case 83: - name = "Rajshahi"; - break; - case 84: - name = "Chittagong"; - break; - case 85: - name = "Barisal"; - break; - case 86: - name = "Sylhet"; - break; - } - } - if (strcmp(country_code,"BE") == 0) { - switch (region_code2) { - case 1: - name = "Antwerpen"; - break; - case 3: - name = "Hainaut"; - break; - case 4: - name = "Liege"; - break; - case 5: - name = "Limburg"; - break; - case 6: - name = "Luxembourg"; - break; - case 7: - name = "Namur"; - break; - case 8: - name = "Oost-Vlaanderen"; - break; - case 9: - name = "West-Vlaanderen"; - break; - case 10: - name = "Brabant Wallon"; - break; - case 11: - name = "Brussels Hoofdstedelijk Gewest"; - break; - case 12: - name = "Vlaams-Brabant"; - break; - } - } - if (strcmp(country_code,"BF") == 0) { - switch (region_code2) { - case 15: - name = "Bam"; - break; - case 19: - name = "Boulkiemde"; - break; - case 20: - name = "Ganzourgou"; - break; - case 21: - name = "Gnagna"; - break; - case 28: - name = "Kouritenga"; - break; - case 33: - name = "Oudalan"; - break; - case 34: - name = "Passore"; - break; - case 36: - name = "Sanguie"; - break; - case 40: - name = "Soum"; - break; - case 42: - name = "Tapoa"; - break; - case 44: - name = "Zoundweogo"; - break; - case 45: - name = "Bale"; - break; - case 46: - name = "Banwa"; - break; - case 47: - name = "Bazega"; - break; - case 48: - name = "Bougouriba"; - break; - case 49: - name = "Boulgou"; - break; - case 50: - name = "Gourma"; - break; - case 51: - name = "Houet"; - break; - case 52: - name = "Ioba"; - break; - case 53: - name = "Kadiogo"; - break; - case 54: - name = "Kenedougou"; - break; - case 55: - name = "Komoe"; - break; - case 56: - name = "Komondjari"; - break; - case 57: - name = "Kompienga"; - break; - case 58: - name = "Kossi"; - break; - case 59: - name = "Koulpelogo"; - break; - case 60: - name = "Kourweogo"; - break; - case 61: - name = "Leraba"; - break; - case 62: - name = "Loroum"; - break; - case 63: - name = "Mouhoun"; - break; - case 64: - name = "Namentenga"; - break; - case 65: - name = "Naouri"; - break; - case 66: - name = "Nayala"; - break; - case 67: - name = "Noumbiel"; - break; - case 68: - name = "Oubritenga"; - break; - case 69: - name = "Poni"; - break; - case 70: - name = "Sanmatenga"; - break; - case 71: - name = "Seno"; - break; - case 72: - name = "Sissili"; - break; - case 73: - name = "Sourou"; - break; - case 74: - name = "Tuy"; - break; - case 75: - name = "Yagha"; - break; - case 76: - name = "Yatenga"; - break; - case 77: - name = "Ziro"; - break; - case 78: - name = "Zondoma"; - break; - } - } - if (strcmp(country_code,"BG") == 0) { - switch (region_code2) { - case 33: - name = "Mikhaylovgrad"; - break; - case 38: - name = "Blagoevgrad"; - break; - case 39: - name = "Burgas"; - break; - case 40: - name = "Dobrich"; - break; - case 41: - name = "Gabrovo"; - break; - case 42: - name = "Grad Sofiya"; - break; - case 43: - name = "Khaskovo"; - break; - case 44: - name = "Kurdzhali"; - break; - case 45: - name = "Kyustendil"; - break; - case 46: - name = "Lovech"; - break; - case 47: - name = "Montana"; - break; - case 48: - name = "Pazardzhik"; - break; - case 49: - name = "Pernik"; - break; - case 50: - name = "Pleven"; - break; - case 51: - name = "Plovdiv"; - break; - case 52: - name = "Razgrad"; - break; - case 53: - name = "Ruse"; - break; - case 54: - name = "Shumen"; - break; - case 55: - name = "Silistra"; - break; - case 56: - name = "Sliven"; - break; - case 57: - name = "Smolyan"; - break; - case 58: - name = "Sofiya"; - break; - case 59: - name = "Stara Zagora"; - break; - case 60: - name = "Turgovishte"; - break; - case 61: - name = "Varna"; - break; - case 62: - name = "Veliko Turnovo"; - break; - case 63: - name = "Vidin"; - break; - case 64: - name = "Vratsa"; - break; - case 65: - name = "Yambol"; - break; - } - } - if (strcmp(country_code,"BH") == 0) { - switch (region_code2) { - case 1: - name = "Al Hadd"; - break; - case 2: - name = "Al Manamah"; - break; - case 5: - name = "Jidd Hafs"; - break; - case 6: - name = "Sitrah"; - break; - case 8: - name = "Al Mintaqah al Gharbiyah"; - break; - case 9: - name = "Mintaqat Juzur Hawar"; - break; - case 10: - name = "Al Mintaqah ash Shamaliyah"; - break; - case 11: - name = "Al Mintaqah al Wusta"; - break; - case 12: - name = "Madinat"; - break; - case 13: - name = "Ar Rifa"; - break; - case 14: - name = "Madinat Hamad"; - break; - case 15: - name = "Al Muharraq"; - break; - case 16: - name = "Al Asimah"; - break; - case 17: - name = "Al Janubiyah"; - break; - case 18: - name = "Ash Shamaliyah"; - break; - case 19: - name = "Al Wusta"; - break; - } - } - if (strcmp(country_code,"BI") == 0) { - switch (region_code2) { - case 2: - name = "Bujumbura"; - break; - case 9: - name = "Bubanza"; - break; - case 10: - name = "Bururi"; - break; - case 11: - name = "Cankuzo"; - break; - case 12: - name = "Cibitoke"; - break; - case 13: - name = "Gitega"; - break; - case 14: - name = "Karuzi"; - break; - case 15: - name = "Kayanza"; - break; - case 16: - name = "Kirundo"; - break; - case 17: - name = "Makamba"; - break; - case 18: - name = "Muyinga"; - break; - case 19: - name = "Ngozi"; - break; - case 20: - name = "Rutana"; - break; - case 21: - name = "Ruyigi"; - break; - case 22: - name = "Muramvya"; - break; - case 23: - name = "Mwaro"; - break; - } - } - if (strcmp(country_code,"BJ") == 0) { - switch (region_code2) { - case 7: - name = "Alibori"; - break; - case 8: - name = "Atakora"; - break; - case 9: - name = "Atlanyique"; - break; - case 10: - name = "Borgou"; - break; - case 11: - name = "Collines"; - break; - case 12: - name = "Kouffo"; - break; - case 13: - name = "Donga"; - break; - case 14: - name = "Littoral"; - break; - case 15: - name = "Mono"; - break; - case 16: - name = "Oueme"; - break; - case 17: - name = "Plateau"; - break; - case 18: - name = "Zou"; - break; - } - } - if (strcmp(country_code,"BM") == 0) { - switch (region_code2) { - case 1: - name = "Devonshire"; - break; - case 2: - name = "Hamilton"; - break; - case 3: - name = "Hamilton"; - break; - case 4: - name = "Paget"; - break; - case 5: - name = "Pembroke"; - break; - case 6: - name = "Saint George"; - break; - case 7: - name = "Saint George's"; - break; - case 8: - name = "Sandys"; - break; - case 9: - name = "Smiths"; - break; - case 10: - name = "Southampton"; - break; - case 11: - name = "Warwick"; - break; - } - } - if (strcmp(country_code,"BN") == 0) { - switch (region_code2) { - case 7: - name = "Alibori"; - break; - case 8: - name = "Belait"; - break; - case 9: - name = "Brunei and Muara"; - break; - case 10: - name = "Temburong"; - break; - case 11: - name = "Collines"; - break; - case 12: - name = "Kouffo"; - break; - case 13: - name = "Donga"; - break; - case 14: - name = "Littoral"; - break; - case 15: - name = "Tutong"; - break; - case 16: - name = "Oueme"; - break; - case 17: - name = "Plateau"; - break; - case 18: - name = "Zou"; - break; - } - } - if (strcmp(country_code,"BO") == 0) { - switch (region_code2) { - case 1: - name = "Chuquisaca"; - break; - case 2: - name = "Cochabamba"; - break; - case 3: - name = "El Beni"; - break; - case 4: - name = "La Paz"; - break; - case 5: - name = "Oruro"; - break; - case 6: - name = "Pando"; - break; - case 7: - name = "Potosi"; - break; - case 8: - name = "Santa Cruz"; - break; - case 9: - name = "Tarija"; - break; - } - } - if (strcmp(country_code,"BR") == 0) { - switch (region_code2) { - case 1: - name = "Acre"; - break; - case 2: - name = "Alagoas"; - break; - case 3: - name = "Amapa"; - break; - case 4: - name = "Amazonas"; - break; - case 5: - name = "Bahia"; - break; - case 6: - name = "Ceara"; - break; - case 7: - name = "Distrito Federal"; - break; - case 8: - name = "Espirito Santo"; - break; - case 11: - name = "Mato Grosso do Sul"; - break; - case 13: - name = "Maranhao"; - break; - case 14: - name = "Mato Grosso"; - break; - case 15: - name = "Minas Gerais"; - break; - case 16: - name = "Para"; - break; - case 17: - name = "Paraiba"; - break; - case 18: - name = "Parana"; - break; - case 20: - name = "Piaui"; - break; - case 21: - name = "Rio de Janeiro"; - break; - case 22: - name = "Rio Grande do Norte"; - break; - case 23: - name = "Rio Grande do Sul"; - break; - case 24: - name = "Rondonia"; - break; - case 25: - name = "Roraima"; - break; - case 26: - name = "Santa Catarina"; - break; - case 27: - name = "Sao Paulo"; - break; - case 28: - name = "Sergipe"; - break; - case 29: - name = "Goias"; - break; - case 30: - name = "Pernambuco"; - break; - case 31: - name = "Tocantins"; - break; - } - } - if (strcmp(country_code,"BS") == 0) { - switch (region_code2) { - case 5: - name = "Bimini"; - break; - case 6: - name = "Cat Island"; - break; - case 10: - name = "Exuma"; - break; - case 13: - name = "Inagua"; - break; - case 15: - name = "Long Island"; - break; - case 16: - name = "Mayaguana"; - break; - case 18: - name = "Ragged Island"; - break; - case 22: - name = "Harbour Island"; - break; - case 23: - name = "New Providence"; - break; - case 24: - name = "Acklins and Crooked Islands"; - break; - case 25: - name = "Freeport"; - break; - case 26: - name = "Fresh Creek"; - break; - case 27: - name = "Governor's Harbour"; - break; - case 28: - name = "Green Turtle Cay"; - break; - case 29: - name = "High Rock"; - break; - case 30: - name = "Kemps Bay"; - break; - case 31: - name = "Marsh Harbour"; - break; - case 32: - name = "Nichollstown and Berry Islands"; - break; - case 33: - name = "Rock Sound"; - break; - case 34: - name = "Sandy Point"; - break; - case 35: - name = "San Salvador and Rum Cay"; - break; - } - } - if (strcmp(country_code,"BT") == 0) { - switch (region_code2) { - case 5: - name = "Bumthang"; - break; - case 6: - name = "Chhukha"; - break; - case 7: - name = "Chirang"; - break; - case 8: - name = "Daga"; - break; - case 9: - name = "Geylegphug"; - break; - case 10: - name = "Ha"; - break; - case 11: - name = "Lhuntshi"; - break; - case 12: - name = "Mongar"; - break; - case 13: - name = "Paro"; - break; - case 14: - name = "Pemagatsel"; - break; - case 15: - name = "Punakha"; - break; - case 16: - name = "Samchi"; - break; - case 17: - name = "Samdrup"; - break; - case 18: - name = "Shemgang"; - break; - case 19: - name = "Tashigang"; - break; - case 20: - name = "Thimphu"; - break; - case 21: - name = "Tongsa"; - break; - case 22: - name = "Wangdi Phodrang"; - break; - } - } - if (strcmp(country_code,"BW") == 0) { - switch (region_code2) { - case 1: - name = "Central"; - break; - case 3: - name = "Ghanzi"; - break; - case 4: - name = "Kgalagadi"; - break; - case 5: - name = "Kgatleng"; - break; - case 6: - name = "Kweneng"; - break; - case 8: - name = "North-East"; - break; - case 9: - name = "South-East"; - break; - case 10: - name = "Southern"; - break; - case 11: - name = "North-West"; - break; - } - } - if (strcmp(country_code,"BY") == 0) { - switch (region_code2) { - case 1: - name = "Brestskaya Voblasts'"; - break; - case 2: - name = "Homyel'skaya Voblasts'"; - break; - case 3: - name = "Hrodzyenskaya Voblasts'"; - break; - case 4: - name = "Minsk"; - break; - case 5: - name = "Minskaya Voblasts'"; - break; - case 6: - name = "Mahilyowskaya Voblasts'"; - break; - case 7: - name = "Vitsyebskaya Voblasts'"; - break; - } - } - if (strcmp(country_code,"BZ") == 0) { - switch (region_code2) { - case 1: - name = "Belize"; - break; - case 2: - name = "Cayo"; - break; - case 3: - name = "Corozal"; - break; - case 4: - name = "Orange Walk"; - break; - case 5: - name = "Stann Creek"; - break; - case 6: - name = "Toledo"; - break; - } - } - if (strcmp(country_code,"CD") == 0) { - switch (region_code2) { - case 1: - name = "Bandundu"; - break; - case 2: - name = "Equateur"; - break; - case 4: - name = "Kasai-Oriental"; - break; - case 5: - name = "Katanga"; - break; - case 6: - name = "Kinshasa"; - break; - case 8: - name = "Bas-Congo"; - break; - case 9: - name = "Orientale"; - break; - case 10: - name = "Maniema"; - break; - case 11: - name = "Nord-Kivu"; - break; - case 12: - name = "Sud-Kivu"; - break; - } - } - if (strcmp(country_code,"CF") == 0) { - switch (region_code2) { - case 1: - name = "Bamingui-Bangoran"; - break; - case 2: - name = "Basse-Kotto"; - break; - case 3: - name = "Haute-Kotto"; - break; - case 4: - name = "Mambere-Kadei"; - break; - case 5: - name = "Haut-Mbomou"; - break; - case 6: - name = "Kemo"; - break; - case 7: - name = "Lobaye"; - break; - case 8: - name = "Mbomou"; - break; - case 9: - name = "Nana-Mambere"; - break; - case 11: - name = "Ouaka"; - break; - case 12: - name = "Ouham"; - break; - case 13: - name = "Ouham-Pende"; - break; - case 14: - name = "Cuvette-Ouest"; - break; - case 15: - name = "Nana-Grebizi"; - break; - case 16: - name = "Sangha-Mbaere"; - break; - case 17: - name = "Ombella-Mpoko"; - break; - case 18: - name = "Bangui"; - break; - } - } - if (strcmp(country_code,"CG") == 0) { - switch (region_code2) { - case 1: - name = "Bouenza"; - break; - case 4: - name = "Kouilou"; - break; - case 5: - name = "Lekoumou"; - break; - case 6: - name = "Likouala"; - break; - case 7: - name = "Niari"; - break; - case 8: - name = "Plateaux"; - break; - case 10: - name = "Sangha"; - break; - case 11: - name = "Pool"; - break; - case 12: - name = "Brazzaville"; - break; - case 13: - name = "Cuvette"; - break; - case 14: - name = "Cuvette-Ouest"; - break; - } - } - if (strcmp(country_code,"CH") == 0) { - switch (region_code2) { - case 1: - name = "Aargau"; - break; - case 2: - name = "Ausser-Rhoden"; - break; - case 3: - name = "Basel-Landschaft"; - break; - case 4: - name = "Basel-Stadt"; - break; - case 5: - name = "Bern"; - break; - case 6: - name = "Fribourg"; - break; - case 7: - name = "Geneve"; - break; - case 8: - name = "Glarus"; - break; - case 9: - name = "Graubunden"; - break; - case 10: - name = "Inner-Rhoden"; - break; - case 11: - name = "Luzern"; - break; - case 12: - name = "Neuchatel"; - break; - case 13: - name = "Nidwalden"; - break; - case 14: - name = "Obwalden"; - break; - case 15: - name = "Sankt Gallen"; - break; - case 16: - name = "Schaffhausen"; - break; - case 17: - name = "Schwyz"; - break; - case 18: - name = "Solothurn"; - break; - case 19: - name = "Thurgau"; - break; - case 20: - name = "Ticino"; - break; - case 21: - name = "Uri"; - break; - case 22: - name = "Valais"; - break; - case 23: - name = "Vaud"; - break; - case 24: - name = "Zug"; - break; - case 25: - name = "Zurich"; - break; - case 26: - name = "Jura"; - break; - } - } - if (strcmp(country_code,"CI") == 0) { - switch (region_code2) { - case 74: - name = "Agneby"; - break; - case 75: - name = "Bafing"; - break; - case 76: - name = "Bas-Sassandra"; - break; - case 77: - name = "Denguele"; - break; - case 78: - name = "Dix-Huit Montagnes"; - break; - case 79: - name = "Fromager"; - break; - case 80: - name = "Haut-Sassandra"; - break; - case 81: - name = "Lacs"; - break; - case 82: - name = "Lagunes"; - break; - case 83: - name = "Marahoue"; - break; - case 84: - name = "Moyen-Cavally"; - break; - case 85: - name = "Moyen-Comoe"; - break; - case 86: - name = "N'zi-Comoe"; - break; - case 87: - name = "Savanes"; - break; - case 88: - name = "Sud-Bandama"; - break; - case 89: - name = "Sud-Comoe"; - break; - case 90: - name = "Vallee du Bandama"; - break; - case 91: - name = "Worodougou"; - break; - case 92: - name = "Zanzan"; - break; - } - } - if (strcmp(country_code,"CL") == 0) { - switch (region_code2) { - case 1: - name = "Valparaiso"; - break; - case 2: - name = "Aisen del General Carlos Ibanez del Campo"; - break; - case 3: - name = "Antofagasta"; - break; - case 4: - name = "Araucania"; - break; - case 5: - name = "Atacama"; - break; - case 6: - name = "Bio-Bio"; - break; - case 7: - name = "Coquimbo"; - break; - case 8: - name = "Libertador General Bernardo O'Higgins"; - break; - case 9: - name = "Los Lagos"; - break; - case 10: - name = "Magallanes y de la Antartica Chilena"; - break; - case 11: - name = "Maule"; - break; - case 12: - name = "Region Metropolitana"; - break; - case 13: - name = "Tarapaca"; - break; - case 14: - name = "Los Lagos"; - break; - case 15: - name = "Tarapaca"; - break; - case 16: - name = "Arica y Parinacota"; - break; - case 17: - name = "Los Rios"; - break; - } - } - if (strcmp(country_code,"CM") == 0) { - switch (region_code2) { - case 4: - name = "Est"; - break; - case 5: - name = "Littoral"; - break; - case 7: - name = "Nord-Ouest"; - break; - case 8: - name = "Ouest"; - break; - case 9: - name = "Sud-Ouest"; - break; - case 10: - name = "Adamaoua"; - break; - case 11: - name = "Centre"; - break; - case 12: - name = "Extreme-Nord"; - break; - case 13: - name = "Nord"; - break; - case 14: - name = "Sud"; - break; - } - } - if (strcmp(country_code,"CN") == 0) { - switch (region_code2) { - case 1: - name = "Anhui"; - break; - case 2: - name = "Zhejiang"; - break; - case 3: - name = "Jiangxi"; - break; - case 4: - name = "Jiangsu"; - break; - case 5: - name = "Jilin"; - break; - case 6: - name = "Qinghai"; - break; - case 7: - name = "Fujian"; - break; - case 8: - name = "Heilongjiang"; - break; - case 9: - name = "Henan"; - break; - case 10: - name = "Hebei"; - break; - case 11: - name = "Hunan"; - break; - case 12: - name = "Hubei"; - break; - case 13: - name = "Xinjiang"; - break; - case 14: - name = "Xizang"; - break; - case 15: - name = "Gansu"; - break; - case 16: - name = "Guangxi"; - break; - case 18: - name = "Guizhou"; - break; - case 19: - name = "Liaoning"; - break; - case 20: - name = "Nei Mongol"; - break; - case 21: - name = "Ningxia"; - break; - case 22: - name = "Beijing"; - break; - case 23: - name = "Shanghai"; - break; - case 24: - name = "Shanxi"; - break; - case 25: - name = "Shandong"; - break; - case 26: - name = "Shaanxi"; - break; - case 28: - name = "Tianjin"; - break; - case 29: - name = "Yunnan"; - break; - case 30: - name = "Guangdong"; - break; - case 31: - name = "Hainan"; - break; - case 32: - name = "Sichuan"; - break; - case 33: - name = "Chongqing"; - break; - } - } - if (strcmp(country_code,"CO") == 0) { - switch (region_code2) { - case 1: - name = "Amazonas"; - break; - case 2: - name = "Antioquia"; - break; - case 3: - name = "Arauca"; - break; - case 4: - name = "Atlantico"; - break; - case 5: - name = "Bolivar Department"; - break; - case 6: - name = "Boyaca Department"; - break; - case 7: - name = "Caldas Department"; - break; - case 8: - name = "Caqueta"; - break; - case 9: - name = "Cauca"; - break; - case 10: - name = "Cesar"; - break; - case 11: - name = "Choco"; - break; - case 12: - name = "Cordoba"; - break; - case 14: - name = "Guaviare"; - break; - case 15: - name = "Guainia"; - break; - case 16: - name = "Huila"; - break; - case 17: - name = "La Guajira"; - break; - case 18: - name = "Magdalena Department"; - break; - case 19: - name = "Meta"; - break; - case 20: - name = "Narino"; - break; - case 21: - name = "Norte de Santander"; - break; - case 22: - name = "Putumayo"; - break; - case 23: - name = "Quindio"; - break; - case 24: - name = "Risaralda"; - break; - case 25: - name = "San Andres y Providencia"; - break; - case 26: - name = "Santander"; - break; - case 27: - name = "Sucre"; - break; - case 28: - name = "Tolima"; - break; - case 29: - name = "Valle del Cauca"; - break; - case 30: - name = "Vaupes"; - break; - case 31: - name = "Vichada"; - break; - case 32: - name = "Casanare"; - break; - case 33: - name = "Cundinamarca"; - break; - case 34: - name = "Distrito Especial"; - break; - case 35: - name = "Bolivar"; - break; - case 36: - name = "Boyaca"; - break; - case 37: - name = "Caldas"; - break; - case 38: - name = "Magdalena"; - break; - } - } - if (strcmp(country_code,"CR") == 0) { - switch (region_code2) { - case 1: - name = "Alajuela"; - break; - case 2: - name = "Cartago"; - break; - case 3: - name = "Guanacaste"; - break; - case 4: - name = "Heredia"; - break; - case 6: - name = "Limon"; - break; - case 7: - name = "Puntarenas"; - break; - case 8: - name = "San Jose"; - break; - } - } - if (strcmp(country_code,"CU") == 0) { - switch (region_code2) { - case 1: - name = "Pinar del Rio"; - break; - case 2: - name = "Ciudad de la Habana"; - break; - case 3: - name = "Matanzas"; - break; - case 4: - name = "Isla de la Juventud"; - break; - case 5: - name = "Camaguey"; - break; - case 7: - name = "Ciego de Avila"; - break; - case 8: - name = "Cienfuegos"; - break; - case 9: - name = "Granma"; - break; - case 10: - name = "Guantanamo"; - break; - case 11: - name = "La Habana"; - break; - case 12: - name = "Holguin"; - break; - case 13: - name = "Las Tunas"; - break; - case 14: - name = "Sancti Spiritus"; - break; - case 15: - name = "Santiago de Cuba"; - break; - case 16: - name = "Villa Clara"; - break; - } - } - if (strcmp(country_code,"CV") == 0) { - switch (region_code2) { - case 1: - name = "Boa Vista"; - break; - case 2: - name = "Brava"; - break; - case 4: - name = "Maio"; - break; - case 5: - name = "Paul"; - break; - case 7: - name = "Ribeira Grande"; - break; - case 8: - name = "Sal"; - break; - case 10: - name = "Sao Nicolau"; - break; - case 11: - name = "Sao Vicente"; - break; - case 13: - name = "Mosteiros"; - break; - case 14: - name = "Praia"; - break; - case 15: - name = "Santa Catarina"; - break; - case 16: - name = "Santa Cruz"; - break; - case 17: - name = "Sao Domingos"; - break; - case 18: - name = "Sao Filipe"; - break; - case 19: - name = "Sao Miguel"; - break; - case 20: - name = "Tarrafal"; - break; - } - } - if (strcmp(country_code,"CY") == 0) { - switch (region_code2) { - case 1: - name = "Famagusta"; - break; - case 2: - name = "Kyrenia"; - break; - case 3: - name = "Larnaca"; - break; - case 4: - name = "Nicosia"; - break; - case 5: - name = "Limassol"; - break; - case 6: - name = "Paphos"; - break; - } - } - if (strcmp(country_code,"CZ") == 0) { - switch (region_code2) { - case 52: - name = "Hlavni mesto Praha"; - break; - case 78: - name = "Jihomoravsky kraj"; - break; - case 79: - name = "Jihocesky kraj"; - break; - case 80: - name = "Vysocina"; - break; - case 81: - name = "Karlovarsky kraj"; - break; - case 82: - name = "Kralovehradecky kraj"; - break; - case 83: - name = "Liberecky kraj"; - break; - case 84: - name = "Olomoucky kraj"; - break; - case 85: - name = "Moravskoslezsky kraj"; - break; - case 86: - name = "Pardubicky kraj"; - break; - case 87: - name = "Plzensky kraj"; - break; - case 88: - name = "Stredocesky kraj"; - break; - case 89: - name = "Ustecky kraj"; - break; - case 90: - name = "Zlinsky kraj"; - break; - } - } - if (strcmp(country_code,"DE") == 0) { - switch (region_code2) { - case 1: - name = "Baden-Wurttemberg"; - break; - case 2: - name = "Bayern"; - break; - case 3: - name = "Bremen"; - break; - case 4: - name = "Hamburg"; - break; - case 5: - name = "Hessen"; - break; - case 6: - name = "Niedersachsen"; - break; - case 7: - name = "Nordrhein-Westfalen"; - break; - case 8: - name = "Rheinland-Pfalz"; - break; - case 9: - name = "Saarland"; - break; - case 10: - name = "Schleswig-Holstein"; - break; - case 11: - name = "Brandenburg"; - break; - case 12: - name = "Mecklenburg-Vorpommern"; - break; - case 13: - name = "Sachsen"; - break; - case 14: - name = "Sachsen-Anhalt"; - break; - case 15: - name = "Thuringen"; - break; - case 16: - name = "Berlin"; - break; - } - } - if (strcmp(country_code,"DJ") == 0) { - switch (region_code2) { - case 1: - name = "Ali Sabieh"; - break; - case 4: - name = "Obock"; - break; - case 5: - name = "Tadjoura"; - break; - case 6: - name = "Dikhil"; - break; - case 7: - name = "Djibouti"; - break; - case 8: - name = "Arta"; - break; - } - } - if (strcmp(country_code,"DK") == 0) { - switch (region_code2) { - case 17: - name = "Hovedstaden"; - break; - case 18: - name = "Midtjylland"; - break; - case 19: - name = "Nordjylland"; - break; - case 20: - name = "Sjelland"; - break; - case 21: - name = "Syddanmark"; - break; - } - } - if (strcmp(country_code,"DM") == 0) { - switch (region_code2) { - case 2: - name = "Saint Andrew"; - break; - case 3: - name = "Saint David"; - break; - case 4: - name = "Saint George"; - break; - case 5: - name = "Saint John"; - break; - case 6: - name = "Saint Joseph"; - break; - case 7: - name = "Saint Luke"; - break; - case 8: - name = "Saint Mark"; - break; - case 9: - name = "Saint Patrick"; - break; - case 10: - name = "Saint Paul"; - break; - case 11: - name = "Saint Peter"; - break; - } - } - if (strcmp(country_code,"DO") == 0) { - switch (region_code2) { - case 1: - name = "Azua"; - break; - case 2: - name = "Baoruco"; - break; - case 3: - name = "Barahona"; - break; - case 4: - name = "Dajabon"; - break; - case 5: - name = "Distrito Nacional"; - break; - case 6: - name = "Duarte"; - break; - case 8: - name = "Espaillat"; - break; - case 9: - name = "Independencia"; - break; - case 10: - name = "La Altagracia"; - break; - case 11: - name = "Elias Pina"; - break; - case 12: - name = "La Romana"; - break; - case 14: - name = "Maria Trinidad Sanchez"; - break; - case 15: - name = "Monte Cristi"; - break; - case 16: - name = "Pedernales"; - break; - case 17: - name = "Peravia"; - break; - case 18: - name = "Puerto Plata"; - break; - case 19: - name = "Salcedo"; - break; - case 20: - name = "Samana"; - break; - case 21: - name = "Sanchez Ramirez"; - break; - case 23: - name = "San Juan"; - break; - case 24: - name = "San Pedro De Macoris"; - break; - case 25: - name = "Santiago"; - break; - case 26: - name = "Santiago Rodriguez"; - break; - case 27: - name = "Valverde"; - break; - case 28: - name = "El Seibo"; - break; - case 29: - name = "Hato Mayor"; - break; - case 30: - name = "La Vega"; - break; - case 31: - name = "Monsenor Nouel"; - break; - case 32: - name = "Monte Plata"; - break; - case 33: - name = "San Cristobal"; - break; - case 34: - name = "Distrito Nacional"; - break; - case 35: - name = "Peravia"; - break; - case 36: - name = "San Jose de Ocoa"; - break; - case 37: - name = "Santo Domingo"; - break; - } - } - if (strcmp(country_code,"DZ") == 0) { - switch (region_code2) { - case 1: - name = "Alger"; - break; - case 3: - name = "Batna"; - break; - case 4: - name = "Constantine"; - break; - case 6: - name = "Medea"; - break; - case 7: - name = "Mostaganem"; - break; - case 9: - name = "Oran"; - break; - case 10: - name = "Saida"; - break; - case 12: - name = "Setif"; - break; - case 13: - name = "Tiaret"; - break; - case 14: - name = "Tizi Ouzou"; - break; - case 15: - name = "Tlemcen"; - break; - case 18: - name = "Bejaia"; - break; - case 19: - name = "Biskra"; - break; - case 20: - name = "Blida"; - break; - case 21: - name = "Bouira"; - break; - case 22: - name = "Djelfa"; - break; - case 23: - name = "Guelma"; - break; - case 24: - name = "Jijel"; - break; - case 25: - name = "Laghouat"; - break; - case 26: - name = "Mascara"; - break; - case 27: - name = "M'sila"; - break; - case 29: - name = "Oum el Bouaghi"; - break; - case 30: - name = "Sidi Bel Abbes"; - break; - case 31: - name = "Skikda"; - break; - case 33: - name = "Tebessa"; - break; - case 34: - name = "Adrar"; - break; - case 35: - name = "Ain Defla"; - break; - case 36: - name = "Ain Temouchent"; - break; - case 37: - name = "Annaba"; - break; - case 38: - name = "Bechar"; - break; - case 39: - name = "Bordj Bou Arreridj"; - break; - case 40: - name = "Boumerdes"; - break; - case 41: - name = "Chlef"; - break; - case 42: - name = "El Bayadh"; - break; - case 43: - name = "El Oued"; - break; - case 44: - name = "El Tarf"; - break; - case 45: - name = "Ghardaia"; - break; - case 46: - name = "Illizi"; - break; - case 47: - name = "Khenchela"; - break; - case 48: - name = "Mila"; - break; - case 49: - name = "Naama"; - break; - case 50: - name = "Ouargla"; - break; - case 51: - name = "Relizane"; - break; - case 52: - name = "Souk Ahras"; - break; - case 53: - name = "Tamanghasset"; - break; - case 54: - name = "Tindouf"; - break; - case 55: - name = "Tipaza"; - break; - case 56: - name = "Tissemsilt"; - break; - } - } - if (strcmp(country_code,"EC") == 0) { - switch (region_code2) { - case 1: - name = "Galapagos"; - break; - case 2: - name = "Azuay"; - break; - case 3: - name = "Bolivar"; - break; - case 4: - name = "Canar"; - break; - case 5: - name = "Carchi"; - break; - case 6: - name = "Chimborazo"; - break; - case 7: - name = "Cotopaxi"; - break; - case 8: - name = "El Oro"; - break; - case 9: - name = "Esmeraldas"; - break; - case 10: - name = "Guayas"; - break; - case 11: - name = "Imbabura"; - break; - case 12: - name = "Loja"; - break; - case 13: - name = "Los Rios"; - break; - case 14: - name = "Manabi"; - break; - case 15: - name = "Morona-Santiago"; - break; - case 17: - name = "Pastaza"; - break; - case 18: - name = "Pichincha"; - break; - case 19: - name = "Tungurahua"; - break; - case 20: - name = "Zamora-Chinchipe"; - break; - case 22: - name = "Sucumbios"; - break; - case 23: - name = "Napo"; - break; - case 24: - name = "Orellana"; - break; - } - } - if (strcmp(country_code,"EE") == 0) { - switch (region_code2) { - case 1: - name = "Harjumaa"; - break; - case 2: - name = "Hiiumaa"; - break; - case 3: - name = "Ida-Virumaa"; - break; - case 4: - name = "Jarvamaa"; - break; - case 5: - name = "Jogevamaa"; - break; - case 6: - name = "Kohtla-Jarve"; - break; - case 7: - name = "Laanemaa"; - break; - case 8: - name = "Laane-Virumaa"; - break; - case 9: - name = "Narva"; - break; - case 10: - name = "Parnu"; - break; - case 11: - name = "Parnumaa"; - break; - case 12: - name = "Polvamaa"; - break; - case 13: - name = "Raplamaa"; - break; - case 14: - name = "Saaremaa"; - break; - case 15: - name = "Sillamae"; - break; - case 16: - name = "Tallinn"; - break; - case 17: - name = "Tartu"; - break; - case 18: - name = "Tartumaa"; - break; - case 19: - name = "Valgamaa"; - break; - case 20: - name = "Viljandimaa"; - break; - case 21: - name = "Vorumaa"; - break; - } - } - if (strcmp(country_code,"EG") == 0) { - switch (region_code2) { - case 1: - name = "Ad Daqahliyah"; - break; - case 2: - name = "Al Bahr al Ahmar"; - break; - case 3: - name = "Al Buhayrah"; - break; - case 4: - name = "Al Fayyum"; - break; - case 5: - name = "Al Gharbiyah"; - break; - case 6: - name = "Al Iskandariyah"; - break; - case 7: - name = "Al Isma'iliyah"; - break; - case 8: - name = "Al Jizah"; - break; - case 9: - name = "Al Minufiyah"; - break; - case 10: - name = "Al Minya"; - break; - case 11: - name = "Al Qahirah"; - break; - case 12: - name = "Al Qalyubiyah"; - break; - case 13: - name = "Al Wadi al Jadid"; - break; - case 14: - name = "Ash Sharqiyah"; - break; - case 15: - name = "As Suways"; - break; - case 16: - name = "Aswan"; - break; - case 17: - name = "Asyut"; - break; - case 18: - name = "Bani Suwayf"; - break; - case 19: - name = "Bur Sa'id"; - break; - case 20: - name = "Dumyat"; - break; - case 21: - name = "Kafr ash Shaykh"; - break; - case 22: - name = "Matruh"; - break; - case 23: - name = "Qina"; - break; - case 24: - name = "Suhaj"; - break; - case 26: - name = "Janub Sina'"; - break; - case 27: - name = "Shamal Sina'"; - break; - } - } - if (strcmp(country_code,"ER") == 0) { - switch (region_code2) { - case 1: - name = "Anseba"; - break; - case 2: - name = "Debub"; - break; - case 3: - name = "Debubawi K'eyih Bahri"; - break; - case 4: - name = "Gash Barka"; - break; - case 5: - name = "Ma'akel"; - break; - case 6: - name = "Semenawi K'eyih Bahri"; - break; - } - } - if (strcmp(country_code,"ES") == 0) { - switch (region_code2) { - case 7: - name = "Islas Baleares"; - break; - case 27: - name = "La Rioja"; - break; - case 29: - name = "Madrid"; - break; - case 31: - name = "Murcia"; - break; - case 32: - name = "Navarra"; - break; - case 34: - name = "Asturias"; - break; - case 39: - name = "Cantabria"; - break; - case 51: - name = "Andalucia"; - break; - case 52: - name = "Aragon"; - break; - case 53: - name = "Canarias"; - break; - case 54: - name = "Castilla-La Mancha"; - break; - case 55: - name = "Castilla y Leon"; - break; - case 56: - name = "Catalonia"; - break; - case 57: - name = "Extremadura"; - break; - case 58: - name = "Galicia"; - break; - case 59: - name = "Pais Vasco"; - break; - case 60: - name = "Comunidad Valenciana"; - break; - } - } - if (strcmp(country_code,"ET") == 0) { - switch (region_code2) { - case 44: - name = "Adis Abeba"; - break; - case 45: - name = "Afar"; - break; - case 46: - name = "Amara"; - break; - case 47: - name = "Binshangul Gumuz"; - break; - case 48: - name = "Dire Dawa"; - break; - case 49: - name = "Gambela Hizboch"; - break; - case 50: - name = "Hareri Hizb"; - break; - case 51: - name = "Oromiya"; - break; - case 52: - name = "Sumale"; - break; - case 53: - name = "Tigray"; - break; - case 54: - name = "YeDebub Biheroch Bihereseboch na Hizboch"; - break; - } - } - if (strcmp(country_code,"FI") == 0) { - switch (region_code2) { - case 1: - name = "Aland"; - break; - case 6: - name = "Lapland"; - break; - case 8: - name = "Oulu"; - break; - case 13: - name = "Southern Finland"; - break; - case 14: - name = "Eastern Finland"; - break; - case 15: - name = "Western Finland"; - break; - } - } - if (strcmp(country_code,"FJ") == 0) { - switch (region_code2) { - case 1: - name = "Central"; - break; - case 2: - name = "Eastern"; - break; - case 3: - name = "Northern"; - break; - case 4: - name = "Rotuma"; - break; - case 5: - name = "Western"; - break; - } - } - if (strcmp(country_code,"FM") == 0) { - switch (region_code2) { - case 1: - name = "Kosrae"; - break; - case 2: - name = "Pohnpei"; - break; - case 3: - name = "Chuuk"; - break; - case 4: - name = "Yap"; - break; - } - } - if (strcmp(country_code,"FR") == 0) { - switch (region_code2) { - case 97: - name = "Aquitaine"; - break; - case 98: - name = "Auvergne"; - break; - case 99: - name = "Basse-Normandie"; - break; - case 832: - name = "Bourgogne"; - break; - case 833: - name = "Bretagne"; - break; - case 834: - name = "Centre"; - break; - case 835: - name = "Champagne-Ardenne"; - break; - case 836: - name = "Corse"; - break; - case 837: - name = "Franche-Comte"; - break; - case 838: - name = "Haute-Normandie"; - break; - case 839: - name = "Ile-de-France"; - break; - case 840: - name = "Languedoc-Roussillon"; - break; - case 875: - name = "Limousin"; - break; - case 876: - name = "Lorraine"; - break; - case 877: - name = "Midi-Pyrenees"; - break; - case 878: - name = "Nord-Pas-de-Calais"; - break; - case 879: - name = "Pays de la Loire"; - break; - case 880: - name = "Picardie"; - break; - case 881: - name = "Poitou-Charentes"; - break; - case 882: - name = "Provence-Alpes-Cote d'Azur"; - break; - case 883: - name = "Rhone-Alpes"; - break; - case 918: - name = "Alsace"; - break; - } - } - if (strcmp(country_code,"GA") == 0) { - switch (region_code2) { - case 1: - name = "Estuaire"; - break; - case 2: - name = "Haut-Ogooue"; - break; - case 3: - name = "Moyen-Ogooue"; - break; - case 4: - name = "Ngounie"; - break; - case 5: - name = "Nyanga"; - break; - case 6: - name = "Ogooue-Ivindo"; - break; - case 7: - name = "Ogooue-Lolo"; - break; - case 8: - name = "Ogooue-Maritime"; - break; - case 9: - name = "Woleu-Ntem"; - break; - } - } - if (strcmp(country_code,"GB") == 0) { - switch (region_code2) { - case 832: - name = "Barking and Dagenham"; - break; - case 833: - name = "Barnet"; - break; - case 834: - name = "Barnsley"; - break; - case 835: - name = "Bath and North East Somerset"; - break; - case 836: - name = "Bedfordshire"; - break; - case 837: - name = "Bexley"; - break; - case 838: - name = "Birmingham"; - break; - case 839: - name = "Blackburn with Darwen"; - break; - case 840: - name = "Blackpool"; - break; - case 875: - name = "Bolton"; - break; - case 876: - name = "Bournemouth"; - break; - case 877: - name = "Bracknell Forest"; - break; - case 878: - name = "Bradford"; - break; - case 879: - name = "Brent"; - break; - case 880: - name = "Brighton and Hove"; - break; - case 881: - name = "Bristol, City of"; - break; - case 882: - name = "Bromley"; - break; - case 883: - name = "Buckinghamshire"; - break; - case 918: - name = "Bury"; - break; - case 919: - name = "Calderdale"; - break; - case 920: - name = "Cambridgeshire"; - break; - case 921: - name = "Camden"; - break; - case 922: - name = "Cheshire"; - break; - case 923: - name = "Cornwall"; - break; - case 924: - name = "Coventry"; - break; - case 925: - name = "Croydon"; - break; - case 926: - name = "Cumbria"; - break; - case 961: - name = "Darlington"; - break; - case 962: - name = "Derby"; - break; - case 963: - name = "Derbyshire"; - break; - case 964: - name = "Devon"; - break; - case 965: - name = "Doncaster"; - break; - case 966: - name = "Dorset"; - break; - case 967: - name = "Dudley"; - break; - case 968: - name = "Durham"; - break; - case 969: - name = "Ealing"; - break; - case 1004: - name = "East Riding of Yorkshire"; - break; - case 1005: - name = "East Sussex"; - break; - case 1006: - name = "Enfield"; - break; - case 1007: - name = "Essex"; - break; - case 1008: - name = "Gateshead"; - break; - case 1009: - name = "Gloucestershire"; - break; - case 1010: - name = "Greenwich"; - break; - case 1011: - name = "Hackney"; - break; - case 1012: - name = "Halton"; - break; - case 1047: - name = "Hammersmith and Fulham"; - break; - case 1048: - name = "Hampshire"; - break; - case 1049: - name = "Haringey"; - break; - case 1050: - name = "Harrow"; - break; - case 1051: - name = "Hartlepool"; - break; - case 1052: - name = "Havering"; - break; - case 1053: - name = "Herefordshire"; - break; - case 1054: - name = "Hertford"; - break; - case 1055: - name = "Hillingdon"; - break; - case 1090: - name = "Hounslow"; - break; - case 1091: - name = "Isle of Wight"; - break; - case 1092: - name = "Islington"; - break; - case 1093: - name = "Kensington and Chelsea"; - break; - case 1094: - name = "Kent"; - break; - case 1095: - name = "Kingston upon Hull, City of"; - break; - case 1096: - name = "Kingston upon Thames"; - break; - case 1097: - name = "Kirklees"; - break; - case 1098: - name = "Knowsley"; - break; - case 1133: - name = "Lambeth"; - break; - case 1134: - name = "Lancashire"; - break; - case 1135: - name = "Leeds"; - break; - case 1136: - name = "Leicester"; - break; - case 1137: - name = "Leicestershire"; - break; - case 1138: - name = "Lewisham"; - break; - case 1139: - name = "Lincolnshire"; - break; - case 1140: - name = "Liverpool"; - break; - case 1141: - name = "London, City of"; - break; - case 1176: - name = "Luton"; - break; - case 1177: - name = "Manchester"; - break; - case 1178: - name = "Medway"; - break; - case 1179: - name = "Merton"; - break; - case 1180: - name = "Middlesbrough"; - break; - case 1181: - name = "Milton Keynes"; - break; - case 1182: - name = "Newcastle upon Tyne"; - break; - case 1183: - name = "Newham"; - break; - case 1184: - name = "Norfolk"; - break; - case 1219: - name = "Northamptonshire"; - break; - case 1220: - name = "North East Lincolnshire"; - break; - case 1221: - name = "North Lincolnshire"; - break; - case 1222: - name = "North Somerset"; - break; - case 1223: - name = "North Tyneside"; - break; - case 1224: - name = "Northumberland"; - break; - case 1225: - name = "North Yorkshire"; - break; - case 1226: - name = "Nottingham"; - break; - case 1227: - name = "Nottinghamshire"; - break; - case 1262: - name = "Oldham"; - break; - case 1263: - name = "Oxfordshire"; - break; - case 1264: - name = "Peterborough"; - break; - case 1265: - name = "Plymouth"; - break; - case 1266: - name = "Poole"; - break; - case 1267: - name = "Portsmouth"; - break; - case 1268: - name = "Reading"; - break; - case 1269: - name = "Redbridge"; - break; - case 1270: - name = "Redcar and Cleveland"; - break; - case 1305: - name = "Richmond upon Thames"; - break; - case 1306: - name = "Rochdale"; - break; - case 1307: - name = "Rotherham"; - break; - case 1308: - name = "Rutland"; - break; - case 1309: - name = "Salford"; - break; - case 1310: - name = "Shropshire"; - break; - case 1311: - name = "Sandwell"; - break; - case 1312: - name = "Sefton"; - break; - case 1313: - name = "Sheffield"; - break; - case 1348: - name = "Slough"; - break; - case 1349: - name = "Solihull"; - break; - case 1350: - name = "Somerset"; - break; - case 1351: - name = "Southampton"; - break; - case 1352: - name = "Southend-on-Sea"; - break; - case 1353: - name = "South Gloucestershire"; - break; - case 1354: - name = "South Tyneside"; - break; - case 1355: - name = "Southwark"; - break; - case 1356: - name = "Staffordshire"; - break; - case 1391: - name = "St. Helens"; - break; - case 1392: - name = "Stockport"; - break; - case 1393: - name = "Stockton-on-Tees"; - break; - case 1394: - name = "Stoke-on-Trent"; - break; - case 1395: - name = "Suffolk"; - break; - case 1396: - name = "Sunderland"; - break; - case 1397: - name = "Surrey"; - break; - case 1398: - name = "Sutton"; - break; - case 1399: - name = "Swindon"; - break; - case 1434: - name = "Tameside"; - break; - case 1435: - name = "Telford and Wrekin"; - break; - case 1436: - name = "Thurrock"; - break; - case 1437: - name = "Torbay"; - break; - case 1438: - name = "Tower Hamlets"; - break; - case 1439: - name = "Trafford"; - break; - case 1440: - name = "Wakefield"; - break; - case 1441: - name = "Walsall"; - break; - case 1442: - name = "Waltham Forest"; - break; - case 1477: - name = "Wandsworth"; - break; - case 1478: - name = "Warrington"; - break; - case 1479: - name = "Warwickshire"; - break; - case 1480: - name = "West Berkshire"; - break; - case 1481: - name = "Westminster"; - break; - case 1482: - name = "West Sussex"; - break; - case 1483: - name = "Wigan"; - break; - case 1484: - name = "Wiltshire"; - break; - case 1485: - name = "Windsor and Maidenhead"; - break; - case 1520: - name = "Wirral"; - break; - case 1521: - name = "Wokingham"; - break; - case 1522: - name = "Wolverhampton"; - break; - case 1523: - name = "Worcestershire"; - break; - case 1524: - name = "York"; - break; - case 1525: - name = "Antrim"; - break; - case 1526: - name = "Ards"; - break; - case 1527: - name = "Armagh"; - break; - case 1528: - name = "Ballymena"; - break; - case 1563: - name = "Ballymoney"; - break; - case 1564: - name = "Banbridge"; - break; - case 1565: - name = "Belfast"; - break; - case 1566: - name = "Carrickfergus"; - break; - case 1567: - name = "Castlereagh"; - break; - case 1568: - name = "Coleraine"; - break; - case 1569: - name = "Cookstown"; - break; - case 1570: - name = "Craigavon"; - break; - case 1571: - name = "Down"; - break; - case 1606: - name = "Dungannon"; - break; - case 1607: - name = "Fermanagh"; - break; - case 1608: - name = "Larne"; - break; - case 1609: - name = "Limavady"; - break; - case 1610: - name = "Lisburn"; - break; - case 1611: - name = "Derry"; - break; - case 1612: - name = "Magherafelt"; - break; - case 1613: - name = "Moyle"; - break; - case 1614: - name = "Newry and Mourne"; - break; - case 1649: - name = "Newtownabbey"; - break; - case 1650: - name = "North Down"; - break; - case 1651: - name = "Omagh"; - break; - case 1652: - name = "Strabane"; - break; - case 1653: - name = "Aberdeen City"; - break; - case 1654: - name = "Aberdeenshire"; - break; - case 1655: - name = "Angus"; - break; - case 1656: - name = "Argyll and Bute"; - break; - case 1657: - name = "Scottish Borders, The"; - break; - case 1692: - name = "Clackmannanshire"; - break; - case 1693: - name = "Dumfries and Galloway"; - break; - case 1694: - name = "Dundee City"; - break; - case 1695: - name = "East Ayrshire"; - break; - case 1696: - name = "East Dunbartonshire"; - break; - case 1697: - name = "East Lothian"; - break; - case 1698: - name = "East Renfrewshire"; - break; - case 1699: - name = "Edinburgh, City of"; - break; - case 1700: - name = "Falkirk"; - break; - case 1735: - name = "Fife"; - break; - case 1736: - name = "Glasgow City"; - break; - case 1737: - name = "Highland"; - break; - case 1738: - name = "Inverclyde"; - break; - case 1739: - name = "Midlothian"; - break; - case 1740: - name = "Moray"; - break; - case 1741: - name = "North Ayrshire"; - break; - case 1742: - name = "North Lanarkshire"; - break; - case 1743: - name = "Orkney"; - break; - case 1778: - name = "Perth and Kinross"; - break; - case 1779: - name = "Renfrewshire"; - break; - case 1780: - name = "Shetland Islands"; - break; - case 1781: - name = "South Ayrshire"; - break; - case 1782: - name = "South Lanarkshire"; - break; - case 1783: - name = "Stirling"; - break; - case 1784: - name = "West Dunbartonshire"; - break; - case 1785: - name = "Eilean Siar"; - break; - case 1786: - name = "West Lothian"; - break; - case 1821: - name = "Isle of Anglesey"; - break; - case 1822: - name = "Blaenau Gwent"; - break; - case 1823: - name = "Bridgend"; - break; - case 1824: - name = "Caerphilly"; - break; - case 1825: - name = "Cardiff"; - break; - case 1826: - name = "Ceredigion"; - break; - case 1827: - name = "Carmarthenshire"; - break; - case 1828: - name = "Conwy"; - break; - case 1829: - name = "Denbighshire"; - break; - case 1864: - name = "Flintshire"; - break; - case 1865: - name = "Gwynedd"; - break; - case 1866: - name = "Merthyr Tydfil"; - break; - case 1867: - name = "Monmouthshire"; - break; - case 1868: - name = "Neath Port Talbot"; - break; - case 1869: - name = "Newport"; - break; - case 1870: - name = "Pembrokeshire"; - break; - case 1871: - name = "Powys"; - break; - case 1872: - name = "Rhondda Cynon Taff"; - break; - case 1907: - name = "Swansea"; - break; - case 1908: - name = "Torfaen"; - break; - case 1909: - name = "Vale of Glamorgan, The"; - break; - case 1910: - name = "Wrexham"; - break; - } - } - if (strcmp(country_code,"GD") == 0) { - switch (region_code2) { - case 1: - name = "Saint Andrew"; - break; - case 2: - name = "Saint David"; - break; - case 3: - name = "Saint George"; - break; - case 4: - name = "Saint John"; - break; - case 5: - name = "Saint Mark"; - break; - case 6: - name = "Saint Patrick"; - break; - } - } - if (strcmp(country_code,"GE") == 0) { - switch (region_code2) { - case 1: - name = "Abashis Raioni"; - break; - case 2: - name = "Abkhazia"; - break; - case 3: - name = "Adigenis Raioni"; - break; - case 4: - name = "Ajaria"; - break; - case 5: - name = "Akhalgoris Raioni"; - break; - case 6: - name = "Akhalk'alak'is Raioni"; - break; - case 7: - name = "Akhalts'ikhis Raioni"; - break; - case 8: - name = "Akhmetis Raioni"; - break; - case 9: - name = "Ambrolauris Raioni"; - break; - case 10: - name = "Aspindzis Raioni"; - break; - case 11: - name = "Baghdat'is Raioni"; - break; - case 12: - name = "Bolnisis Raioni"; - break; - case 13: - name = "Borjomis Raioni"; - break; - case 14: - name = "Chiat'ura"; - break; - case 15: - name = "Ch'khorotsqus Raioni"; - break; - case 16: - name = "Ch'okhatauris Raioni"; - break; - case 17: - name = "Dedop'listsqaros Raioni"; - break; - case 18: - name = "Dmanisis Raioni"; - break; - case 19: - name = "Dushet'is Raioni"; - break; - case 20: - name = "Gardabanis Raioni"; - break; - case 21: - name = "Gori"; - break; - case 22: - name = "Goris Raioni"; - break; - case 23: - name = "Gurjaanis Raioni"; - break; - case 24: - name = "Javis Raioni"; - break; - case 25: - name = "K'arelis Raioni"; - break; - case 26: - name = "Kaspis Raioni"; - break; - case 27: - name = "Kharagaulis Raioni"; - break; - case 28: - name = "Khashuris Raioni"; - break; - case 29: - name = "Khobis Raioni"; - break; - case 30: - name = "Khonis Raioni"; - break; - case 31: - name = "K'ut'aisi"; - break; - case 32: - name = "Lagodekhis Raioni"; - break; - case 33: - name = "Lanch'khut'is Raioni"; - break; - case 34: - name = "Lentekhis Raioni"; - break; - case 35: - name = "Marneulis Raioni"; - break; - case 36: - name = "Martvilis Raioni"; - break; - case 37: - name = "Mestiis Raioni"; - break; - case 38: - name = "Mts'khet'is Raioni"; - break; - case 39: - name = "Ninotsmindis Raioni"; - break; - case 40: - name = "Onis Raioni"; - break; - case 41: - name = "Ozurget'is Raioni"; - break; - case 42: - name = "P'ot'i"; - break; - case 43: - name = "Qazbegis Raioni"; - break; - case 44: - name = "Qvarlis Raioni"; - break; - case 45: - name = "Rust'avi"; - break; - case 46: - name = "Sach'kheris Raioni"; - break; - case 47: - name = "Sagarejos Raioni"; - break; - case 48: - name = "Samtrediis Raioni"; - break; - case 49: - name = "Senakis Raioni"; - break; - case 50: - name = "Sighnaghis Raioni"; - break; - case 51: - name = "T'bilisi"; - break; - case 52: - name = "T'elavis Raioni"; - break; - case 53: - name = "T'erjolis Raioni"; - break; - case 54: - name = "T'et'ritsqaros Raioni"; - break; - case 55: - name = "T'ianet'is Raioni"; - break; - case 56: - name = "Tqibuli"; - break; - case 57: - name = "Ts'ageris Raioni"; - break; - case 58: - name = "Tsalenjikhis Raioni"; - break; - case 59: - name = "Tsalkis Raioni"; - break; - case 60: - name = "Tsqaltubo"; - break; - case 61: - name = "Vanis Raioni"; - break; - case 62: - name = "Zestap'onis Raioni"; - break; - case 63: - name = "Zugdidi"; - break; - case 64: - name = "Zugdidis Raioni"; - break; - } - } - if (strcmp(country_code,"GH") == 0) { - switch (region_code2) { - case 1: - name = "Greater Accra"; - break; - case 2: - name = "Ashanti"; - break; - case 3: - name = "Brong-Ahafo"; - break; - case 4: - name = "Central"; - break; - case 5: - name = "Eastern"; - break; - case 6: - name = "Northern"; - break; - case 8: - name = "Volta"; - break; - case 9: - name = "Western"; - break; - case 10: - name = "Upper East"; - break; - case 11: - name = "Upper West"; - break; - } - } - if (strcmp(country_code,"GL") == 0) { - switch (region_code2) { - case 1: - name = "Nordgronland"; - break; - case 2: - name = "Ostgronland"; - break; - case 3: - name = "Vestgronland"; - break; - } - } - if (strcmp(country_code,"GM") == 0) { - switch (region_code2) { - case 1: - name = "Banjul"; - break; - case 2: - name = "Lower River"; - break; - case 3: - name = "Central River"; - break; - case 4: - name = "Upper River"; - break; - case 5: - name = "Western"; - break; - case 7: - name = "North Bank"; - break; - } - } - if (strcmp(country_code,"GN") == 0) { - switch (region_code2) { - case 1: - name = "Beyla"; - break; - case 2: - name = "Boffa"; - break; - case 3: - name = "Boke"; - break; - case 4: - name = "Conakry"; - break; - case 5: - name = "Dabola"; - break; - case 6: - name = "Dalaba"; - break; - case 7: - name = "Dinguiraye"; - break; - case 9: - name = "Faranah"; - break; - case 10: - name = "Forecariah"; - break; - case 11: - name = "Fria"; - break; - case 12: - name = "Gaoual"; - break; - case 13: - name = "Gueckedou"; - break; - case 15: - name = "Kerouane"; - break; - case 16: - name = "Kindia"; - break; - case 17: - name = "Kissidougou"; - break; - case 18: - name = "Koundara"; - break; - case 19: - name = "Kouroussa"; - break; - case 21: - name = "Macenta"; - break; - case 22: - name = "Mali"; - break; - case 23: - name = "Mamou"; - break; - case 25: - name = "Pita"; - break; - case 27: - name = "Telimele"; - break; - case 28: - name = "Tougue"; - break; - case 29: - name = "Yomou"; - break; - case 30: - name = "Coyah"; - break; - case 31: - name = "Dubreka"; - break; - case 32: - name = "Kankan"; - break; - case 33: - name = "Koubia"; - break; - case 34: - name = "Labe"; - break; - case 35: - name = "Lelouma"; - break; - case 36: - name = "Lola"; - break; - case 37: - name = "Mandiana"; - break; - case 38: - name = "Nzerekore"; - break; - case 39: - name = "Siguiri"; - break; - } - } - if (strcmp(country_code,"GQ") == 0) { - switch (region_code2) { - case 3: - name = "Annobon"; - break; - case 4: - name = "Bioko Norte"; - break; - case 5: - name = "Bioko Sur"; - break; - case 6: - name = "Centro Sur"; - break; - case 7: - name = "Kie-Ntem"; - break; - case 8: - name = "Litoral"; - break; - case 9: - name = "Wele-Nzas"; - break; - } - } - if (strcmp(country_code,"GR") == 0) { - switch (region_code2) { - case 1: - name = "Evros"; - break; - case 2: - name = "Rodhopi"; - break; - case 3: - name = "Xanthi"; - break; - case 4: - name = "Drama"; - break; - case 5: - name = "Serrai"; - break; - case 6: - name = "Kilkis"; - break; - case 7: - name = "Pella"; - break; - case 8: - name = "Florina"; - break; - case 9: - name = "Kastoria"; - break; - case 10: - name = "Grevena"; - break; - case 11: - name = "Kozani"; - break; - case 12: - name = "Imathia"; - break; - case 13: - name = "Thessaloniki"; - break; - case 14: - name = "Kavala"; - break; - case 15: - name = "Khalkidhiki"; - break; - case 16: - name = "Pieria"; - break; - case 17: - name = "Ioannina"; - break; - case 18: - name = "Thesprotia"; - break; - case 19: - name = "Preveza"; - break; - case 20: - name = "Arta"; - break; - case 21: - name = "Larisa"; - break; - case 22: - name = "Trikala"; - break; - case 23: - name = "Kardhitsa"; - break; - case 24: - name = "Magnisia"; - break; - case 25: - name = "Kerkira"; - break; - case 26: - name = "Levkas"; - break; - case 27: - name = "Kefallinia"; - break; - case 28: - name = "Zakinthos"; - break; - case 29: - name = "Fthiotis"; - break; - case 30: - name = "Evritania"; - break; - case 31: - name = "Aitolia kai Akarnania"; - break; - case 32: - name = "Fokis"; - break; - case 33: - name = "Voiotia"; - break; - case 34: - name = "Evvoia"; - break; - case 35: - name = "Attiki"; - break; - case 36: - name = "Argolis"; - break; - case 37: - name = "Korinthia"; - break; - case 38: - name = "Akhaia"; - break; - case 39: - name = "Ilia"; - break; - case 40: - name = "Messinia"; - break; - case 41: - name = "Arkadhia"; - break; - case 42: - name = "Lakonia"; - break; - case 43: - name = "Khania"; - break; - case 44: - name = "Rethimni"; - break; - case 45: - name = "Iraklion"; - break; - case 46: - name = "Lasithi"; - break; - case 47: - name = "Dhodhekanisos"; - break; - case 48: - name = "Samos"; - break; - case 49: - name = "Kikladhes"; - break; - case 50: - name = "Khios"; - break; - case 51: - name = "Lesvos"; - break; - } - } - if (strcmp(country_code,"GT") == 0) { - switch (region_code2) { - case 1: - name = "Alta Verapaz"; - break; - case 2: - name = "Baja Verapaz"; - break; - case 3: - name = "Chimaltenango"; - break; - case 4: - name = "Chiquimula"; - break; - case 5: - name = "El Progreso"; - break; - case 6: - name = "Escuintla"; - break; - case 7: - name = "Guatemala"; - break; - case 8: - name = "Huehuetenango"; - break; - case 9: - name = "Izabal"; - break; - case 10: - name = "Jalapa"; - break; - case 11: - name = "Jutiapa"; - break; - case 12: - name = "Peten"; - break; - case 13: - name = "Quetzaltenango"; - break; - case 14: - name = "Quiche"; - break; - case 15: - name = "Retalhuleu"; - break; - case 16: - name = "Sacatepequez"; - break; - case 17: - name = "San Marcos"; - break; - case 18: - name = "Santa Rosa"; - break; - case 19: - name = "Solola"; - break; - case 20: - name = "Suchitepequez"; - break; - case 21: - name = "Totonicapan"; - break; - case 22: - name = "Zacapa"; - break; - } - } - if (strcmp(country_code,"GW") == 0) { - switch (region_code2) { - case 1: - name = "Bafata"; - break; - case 2: - name = "Quinara"; - break; - case 4: - name = "Oio"; - break; - case 5: - name = "Bolama"; - break; - case 6: - name = "Cacheu"; - break; - case 7: - name = "Tombali"; - break; - case 10: - name = "Gabu"; - break; - case 11: - name = "Bissau"; - break; - case 12: - name = "Biombo"; - break; - } - } - if (strcmp(country_code,"GY") == 0) { - switch (region_code2) { - case 10: - name = "Barima-Waini"; - break; - case 11: - name = "Cuyuni-Mazaruni"; - break; - case 12: - name = "Demerara-Mahaica"; - break; - case 13: - name = "East Berbice-Corentyne"; - break; - case 14: - name = "Essequibo Islands-West Demerara"; - break; - case 15: - name = "Mahaica-Berbice"; - break; - case 16: - name = "Pomeroon-Supenaam"; - break; - case 17: - name = "Potaro-Siparuni"; - break; - case 18: - name = "Upper Demerara-Berbice"; - break; - case 19: - name = "Upper Takutu-Upper Essequibo"; - break; - } - } - if (strcmp(country_code,"HN") == 0) { - switch (region_code2) { - case 1: - name = "Atlantida"; - break; - case 2: - name = "Choluteca"; - break; - case 3: - name = "Colon"; - break; - case 4: - name = "Comayagua"; - break; - case 5: - name = "Copan"; - break; - case 6: - name = "Cortes"; - break; - case 7: - name = "El Paraiso"; - break; - case 8: - name = "Francisco Morazan"; - break; - case 9: - name = "Gracias a Dios"; - break; - case 10: - name = "Intibuca"; - break; - case 11: - name = "Islas de la Bahia"; - break; - case 12: - name = "La Paz"; - break; - case 13: - name = "Lempira"; - break; - case 14: - name = "Ocotepeque"; - break; - case 15: - name = "Olancho"; - break; - case 16: - name = "Santa Barbara"; - break; - case 17: - name = "Valle"; - break; - case 18: - name = "Yoro"; - break; - } - } - if (strcmp(country_code,"HR") == 0) { - switch (region_code2) { - case 1: - name = "Bjelovarsko-Bilogorska"; - break; - case 2: - name = "Brodsko-Posavska"; - break; - case 3: - name = "Dubrovacko-Neretvanska"; - break; - case 4: - name = "Istarska"; - break; - case 5: - name = "Karlovacka"; - break; - case 6: - name = "Koprivnicko-Krizevacka"; - break; - case 7: - name = "Krapinsko-Zagorska"; - break; - case 8: - name = "Licko-Senjska"; - break; - case 9: - name = "Medimurska"; - break; - case 10: - name = "Osjecko-Baranjska"; - break; - case 11: - name = "Pozesko-Slavonska"; - break; - case 12: - name = "Primorsko-Goranska"; - break; - case 13: - name = "Sibensko-Kninska"; - break; - case 14: - name = "Sisacko-Moslavacka"; - break; - case 15: - name = "Splitsko-Dalmatinska"; - break; - case 16: - name = "Varazdinska"; - break; - case 17: - name = "Viroviticko-Podravska"; - break; - case 18: - name = "Vukovarsko-Srijemska"; - break; - case 19: - name = "Zadarska"; - break; - case 20: - name = "Zagrebacka"; - break; - case 21: - name = "Grad Zagreb"; - break; - } - } - if (strcmp(country_code,"HT") == 0) { - switch (region_code2) { - case 3: - name = "Nord-Ouest"; - break; - case 6: - name = "Artibonite"; - break; - case 7: - name = "Centre"; - break; - case 9: - name = "Nord"; - break; - case 10: - name = "Nord-Est"; - break; - case 11: - name = "Ouest"; - break; - case 12: - name = "Sud"; - break; - case 13: - name = "Sud-Est"; - break; - case 14: - name = "Grand' Anse"; - break; - case 15: - name = "Nippes"; - break; - } - } - if (strcmp(country_code,"HU") == 0) { - switch (region_code2) { - case 1: - name = "Bacs-Kiskun"; - break; - case 2: - name = "Baranya"; - break; - case 3: - name = "Bekes"; - break; - case 4: - name = "Borsod-Abauj-Zemplen"; - break; - case 5: - name = "Budapest"; - break; - case 6: - name = "Csongrad"; - break; - case 7: - name = "Debrecen"; - break; - case 8: - name = "Fejer"; - break; - case 9: - name = "Gyor-Moson-Sopron"; - break; - case 10: - name = "Hajdu-Bihar"; - break; - case 11: - name = "Heves"; - break; - case 12: - name = "Komarom-Esztergom"; - break; - case 13: - name = "Miskolc"; - break; - case 14: - name = "Nograd"; - break; - case 15: - name = "Pecs"; - break; - case 16: - name = "Pest"; - break; - case 17: - name = "Somogy"; - break; - case 18: - name = "Szabolcs-Szatmar-Bereg"; - break; - case 19: - name = "Szeged"; - break; - case 20: - name = "Jasz-Nagykun-Szolnok"; - break; - case 21: - name = "Tolna"; - break; - case 22: - name = "Vas"; - break; - case 23: - name = "Veszprem"; - break; - case 24: - name = "Zala"; - break; - case 25: - name = "Gyor"; - break; - case 26: - name = "Bekescsaba"; - break; - case 27: - name = "Dunaujvaros"; - break; - case 28: - name = "Eger"; - break; - case 29: - name = "Hodmezovasarhely"; - break; - case 30: - name = "Kaposvar"; - break; - case 31: - name = "Kecskemet"; - break; - case 32: - name = "Nagykanizsa"; - break; - case 33: - name = "Nyiregyhaza"; - break; - case 34: - name = "Sopron"; - break; - case 35: - name = "Szekesfehervar"; - break; - case 36: - name = "Szolnok"; - break; - case 37: - name = "Szombathely"; - break; - case 38: - name = "Tatabanya"; - break; - case 39: - name = "Veszprem"; - break; - case 40: - name = "Zalaegerszeg"; - break; - case 41: - name = "Salgotarjan"; - break; - case 42: - name = "Szekszard"; - break; - case 43: - name = "Erd"; - break; - } - } - if (strcmp(country_code,"ID") == 0) { - switch (region_code2) { - case 1: - name = "Aceh"; - break; - case 2: - name = "Bali"; - break; - case 3: - name = "Bengkulu"; - break; - case 4: - name = "Jakarta Raya"; - break; - case 5: - name = "Jambi"; - break; - case 6: - name = "Jawa Barat"; - break; - case 7: - name = "Jawa Tengah"; - break; - case 8: - name = "Jawa Timur"; - break; - case 9: - name = "Papua"; - break; - case 10: - name = "Yogyakarta"; - break; - case 11: - name = "Kalimantan Barat"; - break; - case 12: - name = "Kalimantan Selatan"; - break; - case 13: - name = "Kalimantan Tengah"; - break; - case 14: - name = "Kalimantan Timur"; - break; - case 15: - name = "Lampung"; - break; - case 16: - name = "Maluku"; - break; - case 17: - name = "Nusa Tenggara Barat"; - break; - case 18: - name = "Nusa Tenggara Timur"; - break; - case 19: - name = "Riau"; - break; - case 20: - name = "Sulawesi Selatan"; - break; - case 21: - name = "Sulawesi Tengah"; - break; - case 22: - name = "Sulawesi Tenggara"; - break; - case 23: - name = "Sulawesi Utara"; - break; - case 24: - name = "Sumatera Barat"; - break; - case 25: - name = "Sumatera Selatan"; - break; - case 26: - name = "Sumatera Utara"; - break; - case 28: - name = "Maluku"; - break; - case 29: - name = "Maluku Utara"; - break; - case 30: - name = "Jawa Barat"; - break; - case 31: - name = "Sulawesi Utara"; - break; - case 32: - name = "Sumatera Selatan"; - break; - case 33: - name = "Banten"; - break; - case 34: - name = "Gorontalo"; - break; - case 35: - name = "Kepulauan Bangka Belitung"; - break; - case 36: - name = "Papua"; - break; - case 37: - name = "Riau"; - break; - case 38: - name = "Sulawesi Selatan"; - break; - case 39: - name = "Irian Jaya Barat"; - break; - case 40: - name = "Kepulauan Riau"; - break; - case 41: - name = "Sulawesi Barat"; - break; - } - } - if (strcmp(country_code,"IE") == 0) { - switch (region_code2) { - case 1: - name = "Carlow"; - break; - case 2: - name = "Cavan"; - break; - case 3: - name = "Clare"; - break; - case 4: - name = "Cork"; - break; - case 6: - name = "Donegal"; - break; - case 7: - name = "Dublin"; - break; - case 10: - name = "Galway"; - break; - case 11: - name = "Kerry"; - break; - case 12: - name = "Kildare"; - break; - case 13: - name = "Kilkenny"; - break; - case 14: - name = "Leitrim"; - break; - case 15: - name = "Laois"; - break; - case 16: - name = "Limerick"; - break; - case 18: - name = "Longford"; - break; - case 19: - name = "Louth"; - break; - case 20: - name = "Mayo"; - break; - case 21: - name = "Meath"; - break; - case 22: - name = "Monaghan"; - break; - case 23: - name = "Offaly"; - break; - case 24: - name = "Roscommon"; - break; - case 25: - name = "Sligo"; - break; - case 26: - name = "Tipperary"; - break; - case 27: - name = "Waterford"; - break; - case 29: - name = "Westmeath"; - break; - case 30: - name = "Wexford"; - break; - case 31: - name = "Wicklow"; - break; - } - } - if (strcmp(country_code,"IL") == 0) { - switch (region_code2) { - case 1: - name = "HaDarom"; - break; - case 2: - name = "HaMerkaz"; - break; - case 3: - name = "HaZafon"; - break; - case 4: - name = "Hefa"; - break; - case 5: - name = "Tel Aviv"; - break; - case 6: - name = "Yerushalayim"; - break; - } - } - if (strcmp(country_code,"IN") == 0) { - switch (region_code2) { - case 1: - name = "Andaman and Nicobar Islands"; - break; - case 2: - name = "Andhra Pradesh"; - break; - case 3: - name = "Assam"; - break; - case 5: - name = "Chandigarh"; - break; - case 6: - name = "Dadra and Nagar Haveli"; - break; - case 7: - name = "Delhi"; - break; - case 9: - name = "Gujarat"; - break; - case 10: - name = "Haryana"; - break; - case 11: - name = "Himachal Pradesh"; - break; - case 12: - name = "Jammu and Kashmir"; - break; - case 13: - name = "Kerala"; - break; - case 14: - name = "Lakshadweep"; - break; - case 16: - name = "Maharashtra"; - break; - case 17: - name = "Manipur"; - break; - case 18: - name = "Meghalaya"; - break; - case 19: - name = "Karnataka"; - break; - case 20: - name = "Nagaland"; - break; - case 21: - name = "Orissa"; - break; - case 22: - name = "Puducherry"; - break; - case 23: - name = "Punjab"; - break; - case 24: - name = "Rajasthan"; - break; - case 25: - name = "Tamil Nadu"; - break; - case 26: - name = "Tripura"; - break; - case 28: - name = "West Bengal"; - break; - case 29: - name = "Sikkim"; - break; - case 30: - name = "Arunachal Pradesh"; - break; - case 31: - name = "Mizoram"; - break; - case 32: - name = "Daman and Diu"; - break; - case 33: - name = "Goa"; - break; - case 34: - name = "Bihar"; - break; - case 35: - name = "Madhya Pradesh"; - break; - case 36: - name = "Uttar Pradesh"; - break; - case 37: - name = "Chhattisgarh"; - break; - case 38: - name = "Jharkhand"; - break; - case 39: - name = "Uttarakhand"; - break; - } - } - if (strcmp(country_code,"IQ") == 0) { - switch (region_code2) { - case 1: - name = "Al Anbar"; - break; - case 2: - name = "Al Basrah"; - break; - case 3: - name = "Al Muthanna"; - break; - case 4: - name = "Al Qadisiyah"; - break; - case 5: - name = "As Sulaymaniyah"; - break; - case 6: - name = "Babil"; - break; - case 7: - name = "Baghdad"; - break; - case 8: - name = "Dahuk"; - break; - case 9: - name = "Dhi Qar"; - break; - case 10: - name = "Diyala"; - break; - case 11: - name = "Arbil"; - break; - case 12: - name = "Karbala'"; - break; - case 13: - name = "At Ta'mim"; - break; - case 14: - name = "Maysan"; - break; - case 15: - name = "Ninawa"; - break; - case 16: - name = "Wasit"; - break; - case 17: - name = "An Najaf"; - break; - case 18: - name = "Salah ad Din"; - break; - } - } - if (strcmp(country_code,"IR") == 0) { - switch (region_code2) { - case 1: - name = "Azarbayjan-e Bakhtari"; - break; - case 3: - name = "Chahar Mahall va Bakhtiari"; - break; - case 4: - name = "Sistan va Baluchestan"; - break; - case 5: - name = "Kohkiluyeh va Buyer Ahmadi"; - break; - case 7: - name = "Fars"; - break; - case 8: - name = "Gilan"; - break; - case 9: - name = "Hamadan"; - break; - case 10: - name = "Ilam"; - break; - case 11: - name = "Hormozgan"; - break; - case 12: - name = "Kerman"; - break; - case 13: - name = "Bakhtaran"; - break; - case 15: - name = "Khuzestan"; - break; - case 16: - name = "Kordestan"; - break; - case 17: - name = "Mazandaran"; - break; - case 18: - name = "Semnan Province"; - break; - case 19: - name = "Markazi"; - break; - case 21: - name = "Zanjan"; - break; - case 22: - name = "Bushehr"; - break; - case 23: - name = "Lorestan"; - break; - case 24: - name = "Markazi"; - break; - case 25: - name = "Semnan"; - break; - case 26: - name = "Tehran"; - break; - case 27: - name = "Zanjan"; - break; - case 28: - name = "Esfahan"; - break; - case 29: - name = "Kerman"; - break; - case 30: - name = "Khorasan"; - break; - case 31: - name = "Yazd"; - break; - case 32: - name = "Ardabil"; - break; - case 33: - name = "East Azarbaijan"; - break; - case 34: - name = "Markazi"; - break; - case 35: - name = "Mazandaran"; - break; - case 36: - name = "Zanjan"; - break; - case 37: - name = "Golestan"; - break; - case 38: - name = "Qazvin"; - break; - case 39: - name = "Qom"; - break; - case 40: - name = "Yazd"; - break; - case 41: - name = "Khorasan-e Janubi"; - break; - case 42: - name = "Khorasan-e Razavi"; - break; - case 43: - name = "Khorasan-e Shemali"; - break; - } - } - if (strcmp(country_code,"IS") == 0) { - switch (region_code2) { - case 3: - name = "Arnessysla"; - break; - case 5: - name = "Austur-Hunavatnssysla"; - break; - case 6: - name = "Austur-Skaftafellssysla"; - break; - case 7: - name = "Borgarfjardarsysla"; - break; - case 9: - name = "Eyjafjardarsysla"; - break; - case 10: - name = "Gullbringusysla"; - break; - case 15: - name = "Kjosarsysla"; - break; - case 17: - name = "Myrasysla"; - break; - case 20: - name = "Nordur-Mulasysla"; - break; - case 21: - name = "Nordur-Tingeyjarsysla"; - break; - case 23: - name = "Rangarvallasysla"; - break; - case 28: - name = "Skagafjardarsysla"; - break; - case 29: - name = "Snafellsnes- og Hnappadalssysla"; - break; - case 30: - name = "Strandasysla"; - break; - case 31: - name = "Sudur-Mulasysla"; - break; - case 32: - name = "Sudur-Tingeyjarsysla"; - break; - case 34: - name = "Vestur-Bardastrandarsysla"; - break; - case 35: - name = "Vestur-Hunavatnssysla"; - break; - case 36: - name = "Vestur-Isafjardarsysla"; - break; - case 37: - name = "Vestur-Skaftafellssysla"; - break; - case 40: - name = "Norourland Eystra"; - break; - case 41: - name = "Norourland Vestra"; - break; - case 42: - name = "Suourland"; - break; - case 43: - name = "Suournes"; - break; - case 44: - name = "Vestfiroir"; - break; - case 45: - name = "Vesturland"; - break; - } - } - if (strcmp(country_code,"IT") == 0) { - switch (region_code2) { - case 1: - name = "Abruzzi"; - break; - case 2: - name = "Basilicata"; - break; - case 3: - name = "Calabria"; - break; - case 4: - name = "Campania"; - break; - case 5: - name = "Emilia-Romagna"; - break; - case 6: - name = "Friuli-Venezia Giulia"; - break; - case 7: - name = "Lazio"; - break; - case 8: - name = "Liguria"; - break; - case 9: - name = "Lombardia"; - break; - case 10: - name = "Marche"; - break; - case 11: - name = "Molise"; - break; - case 12: - name = "Piemonte"; - break; - case 13: - name = "Puglia"; - break; - case 14: - name = "Sardegna"; - break; - case 15: - name = "Sicilia"; - break; - case 16: - name = "Toscana"; - break; - case 17: - name = "Trentino-Alto Adige"; - break; - case 18: - name = "Umbria"; - break; - case 19: - name = "Valle d'Aosta"; - break; - case 20: - name = "Veneto"; - break; - } - } - if (strcmp(country_code,"JM") == 0) { - switch (region_code2) { - case 1: - name = "Clarendon"; - break; - case 2: - name = "Hanover"; - break; - case 4: - name = "Manchester"; - break; - case 7: - name = "Portland"; - break; - case 8: - name = "Saint Andrew"; - break; - case 9: - name = "Saint Ann"; - break; - case 10: - name = "Saint Catherine"; - break; - case 11: - name = "Saint Elizabeth"; - break; - case 12: - name = "Saint James"; - break; - case 13: - name = "Saint Mary"; - break; - case 14: - name = "Saint Thomas"; - break; - case 15: - name = "Trelawny"; - break; - case 16: - name = "Westmoreland"; - break; - case 17: - name = "Kingston"; - break; - } - } - if (strcmp(country_code,"JO") == 0) { - switch (region_code2) { - case 2: - name = "Al Balqa'"; - break; - case 7: - name = "Ma"; - break; - case 9: - name = "Al Karak"; - break; - case 10: - name = "Al Mafraq"; - break; - case 11: - name = "Amman Governorate"; - break; - case 12: - name = "At Tafilah"; - break; - case 13: - name = "Az Zarqa"; - break; - case 14: - name = "Irbid"; - break; - case 16: - name = "Amman"; - break; - } - } - if (strcmp(country_code,"JP") == 0) { - switch (region_code2) { - case 1: - name = "Aichi"; - break; - case 2: - name = "Akita"; - break; - case 3: - name = "Aomori"; - break; - case 4: - name = "Chiba"; - break; - case 5: - name = "Ehime"; - break; - case 6: - name = "Fukui"; - break; - case 7: - name = "Fukuoka"; - break; - case 8: - name = "Fukushima"; - break; - case 9: - name = "Gifu"; - break; - case 10: - name = "Gumma"; - break; - case 11: - name = "Hiroshima"; - break; - case 12: - name = "Hokkaido"; - break; - case 13: - name = "Hyogo"; - break; - case 14: - name = "Ibaraki"; - break; - case 15: - name = "Ishikawa"; - break; - case 16: - name = "Iwate"; - break; - case 17: - name = "Kagawa"; - break; - case 18: - name = "Kagoshima"; - break; - case 19: - name = "Kanagawa"; - break; - case 20: - name = "Kochi"; - break; - case 21: - name = "Kumamoto"; - break; - case 22: - name = "Kyoto"; - break; - case 23: - name = "Mie"; - break; - case 24: - name = "Miyagi"; - break; - case 25: - name = "Miyazaki"; - break; - case 26: - name = "Nagano"; - break; - case 27: - name = "Nagasaki"; - break; - case 28: - name = "Nara"; - break; - case 29: - name = "Niigata"; - break; - case 30: - name = "Oita"; - break; - case 31: - name = "Okayama"; - break; - case 32: - name = "Osaka"; - break; - case 33: - name = "Saga"; - break; - case 34: - name = "Saitama"; - break; - case 35: - name = "Shiga"; - break; - case 36: - name = "Shimane"; - break; - case 37: - name = "Shizuoka"; - break; - case 38: - name = "Tochigi"; - break; - case 39: - name = "Tokushima"; - break; - case 40: - name = "Tokyo"; - break; - case 41: - name = "Tottori"; - break; - case 42: - name = "Toyama"; - break; - case 43: - name = "Wakayama"; - break; - case 44: - name = "Yamagata"; - break; - case 45: - name = "Yamaguchi"; - break; - case 46: - name = "Yamanashi"; - break; - case 47: - name = "Okinawa"; - break; - } - } - if (strcmp(country_code,"KE") == 0) { - switch (region_code2) { - case 1: - name = "Central"; - break; - case 2: - name = "Coast"; - break; - case 3: - name = "Eastern"; - break; - case 5: - name = "Nairobi Area"; - break; - case 6: - name = "North-Eastern"; - break; - case 7: - name = "Nyanza"; - break; - case 8: - name = "Rift Valley"; - break; - case 9: - name = "Western"; - break; - } - } - if (strcmp(country_code,"KG") == 0) { - switch (region_code2) { - case 1: - name = "Bishkek"; - break; - case 2: - name = "Chuy"; - break; - case 3: - name = "Jalal-Abad"; - break; - case 4: - name = "Naryn"; - break; - case 5: - name = "Osh"; - break; - case 6: - name = "Talas"; - break; - case 7: - name = "Ysyk-Kol"; - break; - case 8: - name = "Osh"; - break; - case 9: - name = "Batken"; - break; - } - } - if (strcmp(country_code,"KH") == 0) { - switch (region_code2) { - case 1: - name = "Batdambang"; - break; - case 2: - name = "Kampong Cham"; - break; - case 3: - name = "Kampong Chhnang"; - break; - case 4: - name = "Kampong Speu"; - break; - case 5: - name = "Kampong Thum"; - break; - case 6: - name = "Kampot"; - break; - case 7: - name = "Kandal"; - break; - case 8: - name = "Koh Kong"; - break; - case 9: - name = "Kracheh"; - break; - case 10: - name = "Mondulkiri"; - break; - case 11: - name = "Phnum Penh"; - break; - case 12: - name = "Pursat"; - break; - case 13: - name = "Preah Vihear"; - break; - case 14: - name = "Prey Veng"; - break; - case 15: - name = "Ratanakiri Kiri"; - break; - case 16: - name = "Siem Reap"; - break; - case 17: - name = "Stung Treng"; - break; - case 18: - name = "Svay Rieng"; - break; - case 19: - name = "Takeo"; - break; - case 25: - name = "Banteay Meanchey"; - break; - case 29: - name = "Batdambang"; - break; - case 30: - name = "Pailin"; - break; - } - } - if (strcmp(country_code,"KI") == 0) { - switch (region_code2) { - case 1: - name = "Gilbert Islands"; - break; - case 2: - name = "Line Islands"; - break; - case 3: - name = "Phoenix Islands"; - break; - } - } - if (strcmp(country_code,"KM") == 0) { - switch (region_code2) { - case 1: - name = "Anjouan"; - break; - case 2: - name = "Grande Comore"; - break; - case 3: - name = "Moheli"; - break; - } - } - if (strcmp(country_code,"KN") == 0) { - switch (region_code2) { - case 1: - name = "Christ Church Nichola Town"; - break; - case 2: - name = "Saint Anne Sandy Point"; - break; - case 3: - name = "Saint George Basseterre"; - break; - case 4: - name = "Saint George Gingerland"; - break; - case 5: - name = "Saint James Windward"; - break; - case 6: - name = "Saint John Capisterre"; - break; - case 7: - name = "Saint John Figtree"; - break; - case 8: - name = "Saint Mary Cayon"; - break; - case 9: - name = "Saint Paul Capisterre"; - break; - case 10: - name = "Saint Paul Charlestown"; - break; - case 11: - name = "Saint Peter Basseterre"; - break; - case 12: - name = "Saint Thomas Lowland"; - break; - case 13: - name = "Saint Thomas Middle Island"; - break; - case 15: - name = "Trinity Palmetto Point"; - break; - } - } - if (strcmp(country_code,"KP") == 0) { - switch (region_code2) { - case 1: - name = "Chagang-do"; - break; - case 3: - name = "Hamgyong-namdo"; - break; - case 6: - name = "Hwanghae-namdo"; - break; - case 7: - name = "Hwanghae-bukto"; - break; - case 8: - name = "Kaesong-si"; - break; - case 9: - name = "Kangwon-do"; - break; - case 11: - name = "P'yongan-bukto"; - break; - case 12: - name = "P'yongyang-si"; - break; - case 13: - name = "Yanggang-do"; - break; - case 14: - name = "Namp'o-si"; - break; - case 15: - name = "P'yongan-namdo"; - break; - case 17: - name = "Hamgyong-bukto"; - break; - case 18: - name = "Najin Sonbong-si"; - break; - } - } - if (strcmp(country_code,"KR") == 0) { - switch (region_code2) { - case 1: - name = "Cheju-do"; - break; - case 3: - name = "Cholla-bukto"; - break; - case 5: - name = "Ch'ungch'ong-bukto"; - break; - case 6: - name = "Kangwon-do"; - break; - case 10: - name = "Pusan-jikhalsi"; - break; - case 11: - name = "Seoul-t'ukpyolsi"; - break; - case 12: - name = "Inch'on-jikhalsi"; - break; - case 13: - name = "Kyonggi-do"; - break; - case 14: - name = "Kyongsang-bukto"; - break; - case 15: - name = "Taegu-jikhalsi"; - break; - case 16: - name = "Cholla-namdo"; - break; - case 17: - name = "Ch'ungch'ong-namdo"; - break; - case 18: - name = "Kwangju-jikhalsi"; - break; - case 19: - name = "Taejon-jikhalsi"; - break; - case 20: - name = "Kyongsang-namdo"; - break; - case 21: - name = "Ulsan-gwangyoksi"; - break; - } - } - if (strcmp(country_code,"KW") == 0) { - switch (region_code2) { - case 1: - name = "Al Ahmadi"; - break; - case 2: - name = "Al Kuwayt"; - break; - case 5: - name = "Al Jahra"; - break; - case 7: - name = "Al Farwaniyah"; - break; - case 8: - name = "Hawalli"; - break; - case 9: - name = "Mubarak al Kabir"; - break; - } - } - if (strcmp(country_code,"KY") == 0) { - switch (region_code2) { - case 1: - name = "Creek"; - break; - case 2: - name = "Eastern"; - break; - case 3: - name = "Midland"; - break; - case 4: - name = "South Town"; - break; - case 5: - name = "Spot Bay"; - break; - case 6: - name = "Stake Bay"; - break; - case 7: - name = "West End"; - break; - case 8: - name = "Western"; - break; - } - } - if (strcmp(country_code,"KZ") == 0) { - switch (region_code2) { - case 1: - name = "Almaty"; - break; - case 2: - name = "Almaty City"; - break; - case 3: - name = "Aqmola"; - break; - case 4: - name = "Aqtobe"; - break; - case 5: - name = "Astana"; - break; - case 6: - name = "Atyrau"; - break; - case 7: - name = "West Kazakhstan"; - break; - case 8: - name = "Bayqonyr"; - break; - case 9: - name = "Mangghystau"; - break; - case 10: - name = "South Kazakhstan"; - break; - case 11: - name = "Pavlodar"; - break; - case 12: - name = "Qaraghandy"; - break; - case 13: - name = "Qostanay"; - break; - case 14: - name = "Qyzylorda"; - break; - case 15: - name = "East Kazakhstan"; - break; - case 16: - name = "North Kazakhstan"; - break; - case 17: - name = "Zhambyl"; - break; - } - } - if (strcmp(country_code,"LA") == 0) { - switch (region_code2) { - case 1: - name = "Attapu"; - break; - case 2: - name = "Champasak"; - break; - case 3: - name = "Houaphan"; - break; - case 4: - name = "Khammouan"; - break; - case 5: - name = "Louang Namtha"; - break; - case 7: - name = "Oudomxai"; - break; - case 8: - name = "Phongsali"; - break; - case 9: - name = "Saravan"; - break; - case 10: - name = "Savannakhet"; - break; - case 11: - name = "Vientiane"; - break; - case 13: - name = "Xaignabouri"; - break; - case 14: - name = "Xiangkhoang"; - break; - case 17: - name = "Louangphrabang"; - break; - } - } - if (strcmp(country_code,"LB") == 0) { - switch (region_code2) { - case 1: - name = "Beqaa"; - break; - case 2: - name = "Al Janub"; - break; - case 3: - name = "Liban-Nord"; - break; - case 4: - name = "Beyrouth"; - break; - case 5: - name = "Mont-Liban"; - break; - case 6: - name = "Liban-Sud"; - break; - case 7: - name = "Nabatiye"; - break; - case 8: - name = "Beqaa"; - break; - case 9: - name = "Liban-Nord"; - break; - case 10: - name = "Aakk,r"; - break; - case 11: - name = "Baalbek-Hermel"; - break; - } - } - if (strcmp(country_code,"LC") == 0) { - switch (region_code2) { - case 1: - name = "Anse-la-Raye"; - break; - case 2: - name = "Dauphin"; - break; - case 3: - name = "Castries"; - break; - case 4: - name = "Choiseul"; - break; - case 5: - name = "Dennery"; - break; - case 6: - name = "Gros-Islet"; - break; - case 7: - name = "Laborie"; - break; - case 8: - name = "Micoud"; - break; - case 9: - name = "Soufriere"; - break; - case 10: - name = "Vieux-Fort"; - break; - case 11: - name = "Praslin"; - break; - } - } - if (strcmp(country_code,"LI") == 0) { - switch (region_code2) { - case 1: - name = "Balzers"; - break; - case 2: - name = "Eschen"; - break; - case 3: - name = "Gamprin"; - break; - case 4: - name = "Mauren"; - break; - case 5: - name = "Planken"; - break; - case 6: - name = "Ruggell"; - break; - case 7: - name = "Schaan"; - break; - case 8: - name = "Schellenberg"; - break; - case 9: - name = "Triesen"; - break; - case 10: - name = "Triesenberg"; - break; - case 11: - name = "Vaduz"; - break; - case 21: - name = "Gbarpolu"; - break; - case 22: - name = "River Gee"; - break; - } - } - if (strcmp(country_code,"LK") == 0) { - switch (region_code2) { - case 1: - name = "Amparai"; - break; - case 2: - name = "Anuradhapura"; - break; - case 3: - name = "Badulla"; - break; - case 4: - name = "Batticaloa"; - break; - case 6: - name = "Galle"; - break; - case 7: - name = "Hambantota"; - break; - case 9: - name = "Kalutara"; - break; - case 10: - name = "Kandy"; - break; - case 11: - name = "Kegalla"; - break; - case 12: - name = "Kurunegala"; - break; - case 14: - name = "Matale"; - break; - case 15: - name = "Matara"; - break; - case 16: - name = "Moneragala"; - break; - case 17: - name = "Nuwara Eliya"; - break; - case 18: - name = "Polonnaruwa"; - break; - case 19: - name = "Puttalam"; - break; - case 20: - name = "Ratnapura"; - break; - case 21: - name = "Trincomalee"; - break; - case 23: - name = "Colombo"; - break; - case 24: - name = "Gampaha"; - break; - case 25: - name = "Jaffna"; - break; - case 26: - name = "Mannar"; - break; - case 27: - name = "Mullaittivu"; - break; - case 28: - name = "Vavuniya"; - break; - case 29: - name = "Central"; - break; - case 30: - name = "North Central"; - break; - case 31: - name = "Northern"; - break; - case 32: - name = "North Western"; - break; - case 33: - name = "Sabaragamuwa"; - break; - case 34: - name = "Southern"; - break; - case 35: - name = "Uva"; - break; - case 36: - name = "Western"; - break; - } - } - if (strcmp(country_code,"LR") == 0) { - switch (region_code2) { - case 1: - name = "Bong"; - break; - case 4: - name = "Grand Cape Mount"; - break; - case 5: - name = "Lofa"; - break; - case 6: - name = "Maryland"; - break; - case 7: - name = "Monrovia"; - break; - case 9: - name = "Nimba"; - break; - case 10: - name = "Sino"; - break; - case 11: - name = "Grand Bassa"; - break; - case 12: - name = "Grand Cape Mount"; - break; - case 13: - name = "Maryland"; - break; - case 14: - name = "Montserrado"; - break; - case 17: - name = "Margibi"; - break; - case 18: - name = "River Cess"; - break; - case 19: - name = "Grand Gedeh"; - break; - case 20: - name = "Lofa"; - break; - case 21: - name = "Gbarpolu"; - break; - case 22: - name = "River Gee"; - break; - } - } - if (strcmp(country_code,"LS") == 0) { - switch (region_code2) { - case 10: - name = "Berea"; - break; - case 11: - name = "Butha-Buthe"; - break; - case 12: - name = "Leribe"; - break; - case 13: - name = "Mafeteng"; - break; - case 14: - name = "Maseru"; - break; - case 15: - name = "Mohales Hoek"; - break; - case 16: - name = "Mokhotlong"; - break; - case 17: - name = "Qachas Nek"; - break; - case 18: - name = "Quthing"; - break; - case 19: - name = "Thaba-Tseka"; - break; - } - } - if (strcmp(country_code,"LT") == 0) { - switch (region_code2) { - case 56: - name = "Alytaus Apskritis"; - break; - case 57: - name = "Kauno Apskritis"; - break; - case 58: - name = "Klaipedos Apskritis"; - break; - case 59: - name = "Marijampoles Apskritis"; - break; - case 60: - name = "Panevezio Apskritis"; - break; - case 61: - name = "Siauliu Apskritis"; - break; - case 62: - name = "Taurages Apskritis"; - break; - case 63: - name = "Telsiu Apskritis"; - break; - case 64: - name = "Utenos Apskritis"; - break; - case 65: - name = "Vilniaus Apskritis"; - break; - } - } - if (strcmp(country_code,"LU") == 0) { - switch (region_code2) { - case 1: - name = "Diekirch"; - break; - case 2: - name = "Grevenmacher"; - break; - case 3: - name = "Luxembourg"; - break; - } - } - if (strcmp(country_code,"LV") == 0) { - switch (region_code2) { - case 1: - name = "Aizkraukles"; - break; - case 2: - name = "Aluksnes"; - break; - case 3: - name = "Balvu"; - break; - case 4: - name = "Bauskas"; - break; - case 5: - name = "Cesu"; - break; - case 6: - name = "Daugavpils"; - break; - case 7: - name = "Daugavpils"; - break; - case 8: - name = "Dobeles"; - break; - case 9: - name = "Gulbenes"; - break; - case 10: - name = "Jekabpils"; - break; - case 11: - name = "Jelgava"; - break; - case 12: - name = "Jelgavas"; - break; - case 13: - name = "Jurmala"; - break; - case 14: - name = "Kraslavas"; - break; - case 15: - name = "Kuldigas"; - break; - case 16: - name = "Liepaja"; - break; - case 17: - name = "Liepajas"; - break; - case 18: - name = "Limbazu"; - break; - case 19: - name = "Ludzas"; - break; - case 20: - name = "Madonas"; - break; - case 21: - name = "Ogres"; - break; - case 22: - name = "Preilu"; - break; - case 23: - name = "Rezekne"; - break; - case 24: - name = "Rezeknes"; - break; - case 25: - name = "Riga"; - break; - case 26: - name = "Rigas"; - break; - case 27: - name = "Saldus"; - break; - case 28: - name = "Talsu"; - break; - case 29: - name = "Tukuma"; - break; - case 30: - name = "Valkas"; - break; - case 31: - name = "Valmieras"; - break; - case 32: - name = "Ventspils"; - break; - case 33: - name = "Ventspils"; - break; - } - } - if (strcmp(country_code,"LY") == 0) { - switch (region_code2) { - case 3: - name = "Al Aziziyah"; - break; - case 5: - name = "Al Jufrah"; - break; - case 8: - name = "Al Kufrah"; - break; - case 13: - name = "Ash Shati'"; - break; - case 30: - name = "Murzuq"; - break; - case 34: - name = "Sabha"; - break; - case 41: - name = "Tarhunah"; - break; - case 42: - name = "Tubruq"; - break; - case 45: - name = "Zlitan"; - break; - case 47: - name = "Ajdabiya"; - break; - case 48: - name = "Al Fatih"; - break; - case 49: - name = "Al Jabal al Akhdar"; - break; - case 50: - name = "Al Khums"; - break; - case 51: - name = "An Nuqat al Khams"; - break; - case 52: - name = "Awbari"; - break; - case 53: - name = "Az Zawiyah"; - break; - case 54: - name = "Banghazi"; - break; - case 55: - name = "Darnah"; - break; - case 56: - name = "Ghadamis"; - break; - case 57: - name = "Gharyan"; - break; - case 58: - name = "Misratah"; - break; - case 59: - name = "Sawfajjin"; - break; - case 60: - name = "Surt"; - break; - case 61: - name = "Tarabulus"; - break; - case 62: - name = "Yafran"; - break; - } - } - if (strcmp(country_code,"MA") == 0) { - switch (region_code2) { - case 45: - name = "Grand Casablanca"; - break; - case 46: - name = "Fes-Boulemane"; - break; - case 47: - name = "Marrakech-Tensift-Al Haouz"; - break; - case 48: - name = "Meknes-Tafilalet"; - break; - case 49: - name = "Rabat-Sale-Zemmour-Zaer"; - break; - case 50: - name = "Chaouia-Ouardigha"; - break; - case 51: - name = "Doukkala-Abda"; - break; - case 52: - name = "Gharb-Chrarda-Beni Hssen"; - break; - case 53: - name = "Guelmim-Es Smara"; - break; - case 54: - name = "Oriental"; - break; - case 55: - name = "Souss-Massa-Dr,a"; - break; - case 56: - name = "Tadla-Azilal"; - break; - case 57: - name = "Tanger-Tetouan"; - break; - case 58: - name = "Taza-Al Hoceima-Taounate"; - break; - case 59: - name = "La,youne-Boujdour-Sakia El Hamra"; - break; - } - } - if (strcmp(country_code,"MC") == 0) { - switch (region_code2) { - case 1: - name = "La Condamine"; - break; - case 2: - name = "Monaco"; - break; - case 3: - name = "Monte-Carlo"; - break; - } - } - if (strcmp(country_code,"MD") == 0) { - switch (region_code2) { - case 51: - name = "Gagauzia"; - break; - case 57: - name = "Chisinau"; - break; - case 58: - name = "Stinga Nistrului"; - break; - case 59: - name = "Anenii Noi"; - break; - case 60: - name = "Balti"; - break; - case 61: - name = "Basarabeasca"; - break; - case 62: - name = "Bender"; - break; - case 63: - name = "Briceni"; - break; - case 64: - name = "Cahul"; - break; - case 65: - name = "Cantemir"; - break; - case 66: - name = "Calarasi"; - break; - case 67: - name = "Causeni"; - break; - case 68: - name = "Cimislia"; - break; - case 69: - name = "Criuleni"; - break; - case 70: - name = "Donduseni"; - break; - case 71: - name = "Drochia"; - break; - case 72: - name = "Dubasari"; - break; - case 73: - name = "Edinet"; - break; - case 74: - name = "Falesti"; - break; - case 75: - name = "Floresti"; - break; - case 76: - name = "Glodeni"; - break; - case 77: - name = "Hincesti"; - break; - case 78: - name = "Ialoveni"; - break; - case 79: - name = "Leova"; - break; - case 80: - name = "Nisporeni"; - break; - case 81: - name = "Ocnita"; - break; - case 83: - name = "Rezina"; - break; - case 84: - name = "Riscani"; - break; - case 85: - name = "Singerei"; - break; - case 86: - name = "Soldanesti"; - break; - case 87: - name = "Soroca"; - break; - case 88: - name = "Stefan-Voda"; - break; - case 89: - name = "Straseni"; - break; - case 90: - name = "Taraclia"; - break; - case 91: - name = "Telenesti"; - break; - case 92: - name = "Ungheni"; - break; - } - } - if (strcmp(country_code,"MG") == 0) { - switch (region_code2) { - case 1: - name = "Antsiranana"; - break; - case 2: - name = "Fianarantsoa"; - break; - case 3: - name = "Mahajanga"; - break; - case 4: - name = "Toamasina"; - break; - case 5: - name = "Antananarivo"; - break; - case 6: - name = "Toliara"; - break; - } - } - if (strcmp(country_code,"MK") == 0) { - switch (region_code2) { - case 1: - name = "Aracinovo"; - break; - case 2: - name = "Bac"; - break; - case 3: - name = "Belcista"; - break; - case 4: - name = "Berovo"; - break; - case 5: - name = "Bistrica"; - break; - case 6: - name = "Bitola"; - break; - case 7: - name = "Blatec"; - break; - case 8: - name = "Bogdanci"; - break; - case 9: - name = "Bogomila"; - break; - case 10: - name = "Bogovinje"; - break; - case 11: - name = "Bosilovo"; - break; - case 12: - name = "Brvenica"; - break; - case 13: - name = "Cair"; - break; - case 14: - name = "Capari"; - break; - case 15: - name = "Caska"; - break; - case 16: - name = "Cegrane"; - break; - case 17: - name = "Centar"; - break; - case 18: - name = "Centar Zupa"; - break; - case 19: - name = "Cesinovo"; - break; - case 20: - name = "Cucer-Sandevo"; - break; - case 21: - name = "Debar"; - break; - case 22: - name = "Delcevo"; - break; - case 23: - name = "Delogozdi"; - break; - case 24: - name = "Demir Hisar"; - break; - case 25: - name = "Demir Kapija"; - break; - case 26: - name = "Dobrusevo"; - break; - case 27: - name = "Dolna Banjica"; - break; - case 28: - name = "Dolneni"; - break; - case 29: - name = "Dorce Petrov"; - break; - case 30: - name = "Drugovo"; - break; - case 31: - name = "Dzepciste"; - break; - case 32: - name = "Gazi Baba"; - break; - case 33: - name = "Gevgelija"; - break; - case 34: - name = "Gostivar"; - break; - case 35: - name = "Gradsko"; - break; - case 36: - name = "Ilinden"; - break; - case 37: - name = "Izvor"; - break; - case 38: - name = "Jegunovce"; - break; - case 39: - name = "Kamenjane"; - break; - case 40: - name = "Karbinci"; - break; - case 41: - name = "Karpos"; - break; - case 42: - name = "Kavadarci"; - break; - case 43: - name = "Kicevo"; - break; - case 44: - name = "Kisela Voda"; - break; - case 45: - name = "Klecevce"; - break; - case 46: - name = "Kocani"; - break; - case 47: - name = "Konce"; - break; - case 48: - name = "Kondovo"; - break; - case 49: - name = "Konopiste"; - break; - case 50: - name = "Kosel"; - break; - case 51: - name = "Kratovo"; - break; - case 52: - name = "Kriva Palanka"; - break; - case 53: - name = "Krivogastani"; - break; - case 54: - name = "Krusevo"; - break; - case 55: - name = "Kuklis"; - break; - case 56: - name = "Kukurecani"; - break; - case 57: - name = "Kumanovo"; - break; - case 58: - name = "Labunista"; - break; - case 59: - name = "Lipkovo"; - break; - case 60: - name = "Lozovo"; - break; - case 61: - name = "Lukovo"; - break; - case 62: - name = "Makedonska Kamenica"; - break; - case 63: - name = "Makedonski Brod"; - break; - case 64: - name = "Mavrovi Anovi"; - break; - case 65: - name = "Meseista"; - break; - case 66: - name = "Miravci"; - break; - case 67: - name = "Mogila"; - break; - case 68: - name = "Murtino"; - break; - case 69: - name = "Negotino"; - break; - case 70: - name = "Negotino-Polosko"; - break; - case 71: - name = "Novaci"; - break; - case 72: - name = "Novo Selo"; - break; - case 73: - name = "Oblesevo"; - break; - case 74: - name = "Ohrid"; - break; - case 75: - name = "Orasac"; - break; - case 76: - name = "Orizari"; - break; - case 77: - name = "Oslomej"; - break; - case 78: - name = "Pehcevo"; - break; - case 79: - name = "Petrovec"; - break; - case 80: - name = "Plasnica"; - break; - case 81: - name = "Podares"; - break; - case 82: - name = "Prilep"; - break; - case 83: - name = "Probistip"; - break; - case 84: - name = "Radovis"; - break; - case 85: - name = "Rankovce"; - break; - case 86: - name = "Resen"; - break; - case 87: - name = "Rosoman"; - break; - case 88: - name = "Rostusa"; - break; - case 89: - name = "Samokov"; - break; - case 90: - name = "Saraj"; - break; - case 91: - name = "Sipkovica"; - break; - case 92: - name = "Sopiste"; - break; - case 93: - name = "Sopotnica"; - break; - case 94: - name = "Srbinovo"; - break; - case 95: - name = "Staravina"; - break; - case 96: - name = "Star Dojran"; - break; - case 97: - name = "Staro Nagoricane"; - break; - case 98: - name = "Stip"; - break; - case 99: - name = "Struga"; - break; - case 832: - name = "Strumica"; - break; - case 833: - name = "Studenicani"; - break; - case 834: - name = "Suto Orizari"; - break; - case 835: - name = "Sveti Nikole"; - break; - case 836: - name = "Tearce"; - break; - case 837: - name = "Tetovo"; - break; - case 838: - name = "Topolcani"; - break; - case 839: - name = "Valandovo"; - break; - case 840: - name = "Vasilevo"; - break; - case 875: - name = "Veles"; - break; - case 876: - name = "Velesta"; - break; - case 877: - name = "Vevcani"; - break; - case 878: - name = "Vinica"; - break; - case 879: - name = "Vitoliste"; - break; - case 880: - name = "Vranestica"; - break; - case 881: - name = "Vrapciste"; - break; - case 882: - name = "Vratnica"; - break; - case 883: - name = "Vrutok"; - break; - case 918: - name = "Zajas"; - break; - case 919: - name = "Zelenikovo"; - break; - case 920: - name = "Zelino"; - break; - case 921: - name = "Zitose"; - break; - case 922: - name = "Zletovo"; - break; - case 923: - name = "Zrnovci"; - break; - } - } - if (strcmp(country_code,"ML") == 0) { - switch (region_code2) { - case 1: - name = "Bamako"; - break; - case 3: - name = "Kayes"; - break; - case 4: - name = "Mopti"; - break; - case 5: - name = "Segou"; - break; - case 6: - name = "Sikasso"; - break; - case 7: - name = "Koulikoro"; - break; - case 8: - name = "Tombouctou"; - break; - case 9: - name = "Gao"; - break; - case 10: - name = "Kidal"; - break; - } - } - if (strcmp(country_code,"MM") == 0) { - switch (region_code2) { - case 1: - name = "Rakhine State"; - break; - case 2: - name = "Chin State"; - break; - case 3: - name = "Irrawaddy"; - break; - case 4: - name = "Kachin State"; - break; - case 5: - name = "Karan State"; - break; - case 6: - name = "Kayah State"; - break; - case 7: - name = "Magwe"; - break; - case 8: - name = "Mandalay"; - break; - case 9: - name = "Pegu"; - break; - case 10: - name = "Sagaing"; - break; - case 11: - name = "Shan State"; - break; - case 12: - name = "Tenasserim"; - break; - case 13: - name = "Mon State"; - break; - case 14: - name = "Rangoon"; - break; - case 17: - name = "Yangon"; - break; - } - } - if (strcmp(country_code,"MN") == 0) { - switch (region_code2) { - case 1: - name = "Arhangay"; - break; - case 2: - name = "Bayanhongor"; - break; - case 3: - name = "Bayan-Olgiy"; - break; - case 5: - name = "Darhan"; - break; - case 6: - name = "Dornod"; - break; - case 7: - name = "Dornogovi"; - break; - case 8: - name = "Dundgovi"; - break; - case 9: - name = "Dzavhan"; - break; - case 10: - name = "Govi-Altay"; - break; - case 11: - name = "Hentiy"; - break; - case 12: - name = "Hovd"; - break; - case 13: - name = "Hovsgol"; - break; - case 14: - name = "Omnogovi"; - break; - case 15: - name = "Ovorhangay"; - break; - case 16: - name = "Selenge"; - break; - case 17: - name = "Suhbaatar"; - break; - case 18: - name = "Tov"; - break; - case 19: - name = "Uvs"; - break; - case 20: - name = "Ulaanbaatar"; - break; - case 21: - name = "Bulgan"; - break; - case 22: - name = "Erdenet"; - break; - case 23: - name = "Darhan-Uul"; - break; - case 24: - name = "Govisumber"; - break; - case 25: - name = "Orhon"; - break; - } - } - if (strcmp(country_code,"MO") == 0) { - switch (region_code2) { - case 1: - name = "Ilhas"; - break; - case 2: - name = "Macau"; - break; - } - } - if (strcmp(country_code,"MR") == 0) { - switch (region_code2) { - case 1: - name = "Hodh Ech Chargui"; - break; - case 2: - name = "Hodh El Gharbi"; - break; - case 3: - name = "Assaba"; - break; - case 4: - name = "Gorgol"; - break; - case 5: - name = "Brakna"; - break; - case 6: - name = "Trarza"; - break; - case 7: - name = "Adrar"; - break; - case 8: - name = "Dakhlet Nouadhibou"; - break; - case 9: - name = "Tagant"; - break; - case 10: - name = "Guidimaka"; - break; - case 11: - name = "Tiris Zemmour"; - break; - case 12: - name = "Inchiri"; - break; - } - } - if (strcmp(country_code,"MS") == 0) { - switch (region_code2) { - case 1: - name = "Saint Anthony"; - break; - case 2: - name = "Saint Georges"; - break; - case 3: - name = "Saint Peter"; - break; - } - } - if (strcmp(country_code,"MU") == 0) { - switch (region_code2) { - case 12: - name = "Black River"; - break; - case 13: - name = "Flacq"; - break; - case 14: - name = "Grand Port"; - break; - case 15: - name = "Moka"; - break; - case 16: - name = "Pamplemousses"; - break; - case 17: - name = "Plaines Wilhems"; - break; - case 18: - name = "Port Louis"; - break; - case 19: - name = "Riviere du Rempart"; - break; - case 20: - name = "Savanne"; - break; - case 21: - name = "Agalega Islands"; - break; - case 22: - name = "Cargados Carajos"; - break; - case 23: - name = "Rodrigues"; - break; - } - } - if (strcmp(country_code,"MV") == 0) { - switch (region_code2) { - case 1: - name = "Seenu"; - break; - case 5: - name = "Laamu"; - break; - case 30: - name = "Alifu"; - break; - case 31: - name = "Baa"; - break; - case 32: - name = "Dhaalu"; - break; - case 33: - name = "Faafu "; - break; - case 34: - name = "Gaafu Alifu"; - break; - case 35: - name = "Gaafu Dhaalu"; - break; - case 36: - name = "Haa Alifu"; - break; - case 37: - name = "Haa Dhaalu"; - break; - case 38: - name = "Kaafu"; - break; - case 39: - name = "Lhaviyani"; - break; - case 40: - name = "Maale"; - break; - case 41: - name = "Meemu"; - break; - case 42: - name = "Gnaviyani"; - break; - case 43: - name = "Noonu"; - break; - case 44: - name = "Raa"; - break; - case 45: - name = "Shaviyani"; - break; - case 46: - name = "Thaa"; - break; - case 47: - name = "Vaavu"; - break; - } - } - if (strcmp(country_code,"MW") == 0) { - switch (region_code2) { - case 2: - name = "Chikwawa"; - break; - case 3: - name = "Chiradzulu"; - break; - case 4: - name = "Chitipa"; - break; - case 5: - name = "Thyolo"; - break; - case 6: - name = "Dedza"; - break; - case 7: - name = "Dowa"; - break; - case 8: - name = "Karonga"; - break; - case 9: - name = "Kasungu"; - break; - case 11: - name = "Lilongwe"; - break; - case 12: - name = "Mangochi"; - break; - case 13: - name = "Mchinji"; - break; - case 15: - name = "Mzimba"; - break; - case 16: - name = "Ntcheu"; - break; - case 17: - name = "Nkhata Bay"; - break; - case 18: - name = "Nkhotakota"; - break; - case 19: - name = "Nsanje"; - break; - case 20: - name = "Ntchisi"; - break; - case 21: - name = "Rumphi"; - break; - case 22: - name = "Salima"; - break; - case 23: - name = "Zomba"; - break; - case 24: - name = "Blantyre"; - break; - case 25: - name = "Mwanza"; - break; - case 26: - name = "Balaka"; - break; - case 27: - name = "Likoma"; - break; - case 28: - name = "Machinga"; - break; - case 29: - name = "Mulanje"; - break; - case 30: - name = "Phalombe"; - break; - } - } - if (strcmp(country_code,"MX") == 0) { - switch (region_code2) { - case 1: - name = "Aguascalientes"; - break; - case 2: - name = "Baja California"; - break; - case 3: - name = "Baja California Sur"; - break; - case 4: - name = "Campeche"; - break; - case 5: - name = "Chiapas"; - break; - case 6: - name = "Chihuahua"; - break; - case 7: - name = "Coahuila de Zaragoza"; - break; - case 8: - name = "Colima"; - break; - case 9: - name = "Distrito Federal"; - break; - case 10: - name = "Durango"; - break; - case 11: - name = "Guanajuato"; - break; - case 12: - name = "Guerrero"; - break; - case 13: - name = "Hidalgo"; - break; - case 14: - name = "Jalisco"; - break; - case 15: - name = "Mexico"; - break; - case 16: - name = "Michoacan de Ocampo"; - break; - case 17: - name = "Morelos"; - break; - case 18: - name = "Nayarit"; - break; - case 19: - name = "Nuevo Leon"; - break; - case 20: - name = "Oaxaca"; - break; - case 21: - name = "Puebla"; - break; - case 22: - name = "Queretaro de Arteaga"; - break; - case 23: - name = "Quintana Roo"; - break; - case 24: - name = "San Luis Potosi"; - break; - case 25: - name = "Sinaloa"; - break; - case 26: - name = "Sonora"; - break; - case 27: - name = "Tabasco"; - break; - case 28: - name = "Tamaulipas"; - break; - case 29: - name = "Tlaxcala"; - break; - case 30: - name = "Veracruz-Llave"; - break; - case 31: - name = "Yucatan"; - break; - case 32: - name = "Zacatecas"; - break; - } - } - if (strcmp(country_code,"MY") == 0) { - switch (region_code2) { - case 1: - name = "Johor"; - break; - case 2: - name = "Kedah"; - break; - case 3: - name = "Kelantan"; - break; - case 4: - name = "Melaka"; - break; - case 5: - name = "Negeri Sembilan"; - break; - case 6: - name = "Pahang"; - break; - case 7: - name = "Perak"; - break; - case 8: - name = "Perlis"; - break; - case 9: - name = "Pulau Pinang"; - break; - case 11: - name = "Sarawak"; - break; - case 12: - name = "Selangor"; - break; - case 13: - name = "Terengganu"; - break; - case 14: - name = "Kuala Lumpur"; - break; - case 15: - name = "Labuan"; - break; - case 16: - name = "Sabah"; - break; - case 17: - name = "Putrajaya"; - break; - } - } - if (strcmp(country_code,"MZ") == 0) { - switch (region_code2) { - case 1: - name = "Cabo Delgado"; - break; - case 2: - name = "Gaza"; - break; - case 3: - name = "Inhambane"; - break; - case 4: - name = "Maputo"; - break; - case 5: - name = "Sofala"; - break; - case 6: - name = "Nampula"; - break; - case 7: - name = "Niassa"; - break; - case 8: - name = "Tete"; - break; - case 9: - name = "Zambezia"; - break; - case 10: - name = "Manica"; - break; - case 11: - name = "Maputo"; - break; - } - } - if (strcmp(country_code,"NA") == 0) { - switch (region_code2) { - case 1: - name = "Bethanien"; - break; - case 2: - name = "Caprivi Oos"; - break; - case 3: - name = "Boesmanland"; - break; - case 4: - name = "Gobabis"; - break; - case 5: - name = "Grootfontein"; - break; - case 6: - name = "Kaokoland"; - break; - case 7: - name = "Karibib"; - break; - case 8: - name = "Keetmanshoop"; - break; - case 9: - name = "Luderitz"; - break; - case 10: - name = "Maltahohe"; - break; - case 11: - name = "Okahandja"; - break; - case 12: - name = "Omaruru"; - break; - case 13: - name = "Otjiwarongo"; - break; - case 14: - name = "Outjo"; - break; - case 15: - name = "Owambo"; - break; - case 16: - name = "Rehoboth"; - break; - case 17: - name = "Swakopmund"; - break; - case 18: - name = "Tsumeb"; - break; - case 20: - name = "Karasburg"; - break; - case 21: - name = "Windhoek"; - break; - case 22: - name = "Damaraland"; - break; - case 23: - name = "Hereroland Oos"; - break; - case 24: - name = "Hereroland Wes"; - break; - case 25: - name = "Kavango"; - break; - case 26: - name = "Mariental"; - break; - case 27: - name = "Namaland"; - break; - case 28: - name = "Caprivi"; - break; - case 29: - name = "Erongo"; - break; - case 30: - name = "Hardap"; - break; - case 31: - name = "Karas"; - break; - case 32: - name = "Kunene"; - break; - case 33: - name = "Ohangwena"; - break; - case 34: - name = "Okavango"; - break; - case 35: - name = "Omaheke"; - break; - case 36: - name = "Omusati"; - break; - case 37: - name = "Oshana"; - break; - case 38: - name = "Oshikoto"; - break; - case 39: - name = "Otjozondjupa"; - break; - } - } - if (strcmp(country_code,"NE") == 0) { - switch (region_code2) { - case 1: - name = "Agadez"; - break; - case 2: - name = "Diffa"; - break; - case 3: - name = "Dosso"; - break; - case 4: - name = "Maradi"; - break; - case 5: - name = "Niamey"; - break; - case 6: - name = "Tahoua"; - break; - case 7: - name = "Zinder"; - break; - case 8: - name = "Niamey"; - break; - } - } - if (strcmp(country_code,"NG") == 0) { - switch (region_code2) { - case 5: - name = "Lagos"; - break; - case 11: - name = "Federal Capital Territory"; - break; - case 16: - name = "Ogun"; - break; - case 21: - name = "Akwa Ibom"; - break; - case 22: - name = "Cross River"; - break; - case 23: - name = "Kaduna"; - break; - case 24: - name = "Katsina"; - break; - case 25: - name = "Anambra"; - break; - case 26: - name = "Benue"; - break; - case 27: - name = "Borno"; - break; - case 28: - name = "Imo"; - break; - case 29: - name = "Kano"; - break; - case 30: - name = "Kwara"; - break; - case 31: - name = "Niger"; - break; - case 32: - name = "Oyo"; - break; - case 35: - name = "Adamawa"; - break; - case 36: - name = "Delta"; - break; - case 37: - name = "Edo"; - break; - case 39: - name = "Jigawa"; - break; - case 40: - name = "Kebbi"; - break; - case 41: - name = "Kogi"; - break; - case 42: - name = "Osun"; - break; - case 43: - name = "Taraba"; - break; - case 44: - name = "Yobe"; - break; - case 45: - name = "Abia"; - break; - case 46: - name = "Bauchi"; - break; - case 47: - name = "Enugu"; - break; - case 48: - name = "Ondo"; - break; - case 49: - name = "Plateau"; - break; - case 50: - name = "Rivers"; - break; - case 51: - name = "Sokoto"; - break; - case 52: - name = "Bayelsa"; - break; - case 53: - name = "Ebonyi"; - break; - case 54: - name = "Ekiti"; - break; - case 55: - name = "Gombe"; - break; - case 56: - name = "Nassarawa"; - break; - case 57: - name = "Zamfara"; - break; - } - } - if (strcmp(country_code,"NI") == 0) { - switch (region_code2) { - case 1: - name = "Boaco"; - break; - case 2: - name = "Carazo"; - break; - case 3: - name = "Chinandega"; - break; - case 4: - name = "Chontales"; - break; - case 5: - name = "Esteli"; - break; - case 6: - name = "Granada"; - break; - case 7: - name = "Jinotega"; - break; - case 8: - name = "Leon"; - break; - case 9: - name = "Madriz"; - break; - case 10: - name = "Managua"; - break; - case 11: - name = "Masaya"; - break; - case 12: - name = "Matagalpa"; - break; - case 13: - name = "Nueva Segovia"; - break; - case 14: - name = "Rio San Juan"; - break; - case 15: - name = "Rivas"; - break; - case 16: - name = "Zelaya"; - break; - case 17: - name = "Autonoma Atlantico Norte"; - break; - case 18: - name = "Region Autonoma Atlantico Sur"; - break; - } - } - if (strcmp(country_code,"NL") == 0) { - switch (region_code2) { - case 1: - name = "Drenthe"; - break; - case 2: - name = "Friesland"; - break; - case 3: - name = "Gelderland"; - break; - case 4: - name = "Groningen"; - break; - case 5: - name = "Limburg"; - break; - case 6: - name = "Noord-Brabant"; - break; - case 7: - name = "Noord-Holland"; - break; - case 8: - name = "Overijssel"; - break; - case 9: - name = "Utrecht"; - break; - case 10: - name = "Zeeland"; - break; - case 11: - name = "Zuid-Holland"; - break; - case 15: - name = "Overijssel"; - break; - case 16: - name = "Flevoland"; - break; - } - } - if (strcmp(country_code,"NO") == 0) { - switch (region_code2) { - case 1: - name = "Akershus"; - break; - case 2: - name = "Aust-Agder"; - break; - case 4: - name = "Buskerud"; - break; - case 5: - name = "Finnmark"; - break; - case 6: - name = "Hedmark"; - break; - case 7: - name = "Hordaland"; - break; - case 8: - name = "More og Romsdal"; - break; - case 9: - name = "Nordland"; - break; - case 10: - name = "Nord-Trondelag"; - break; - case 11: - name = "Oppland"; - break; - case 12: - name = "Oslo"; - break; - case 13: - name = "Ostfold"; - break; - case 14: - name = "Rogaland"; - break; - case 15: - name = "Sogn og Fjordane"; - break; - case 16: - name = "Sor-Trondelag"; - break; - case 17: - name = "Telemark"; - break; - case 18: - name = "Troms"; - break; - case 19: - name = "Vest-Agder"; - break; - case 20: - name = "Vestfold"; - break; - } - } - if (strcmp(country_code,"NP") == 0) { - switch (region_code2) { - case 1: - name = "Bagmati"; - break; - case 2: - name = "Bheri"; - break; - case 3: - name = "Dhawalagiri"; - break; - case 4: - name = "Gandaki"; - break; - case 5: - name = "Janakpur"; - break; - case 6: - name = "Karnali"; - break; - case 7: - name = "Kosi"; - break; - case 8: - name = "Lumbini"; - break; - case 9: - name = "Mahakali"; - break; - case 10: - name = "Mechi"; - break; - case 11: - name = "Narayani"; - break; - case 12: - name = "Rapti"; - break; - case 13: - name = "Sagarmatha"; - break; - case 14: - name = "Seti"; - break; - } - } - if (strcmp(country_code,"NR") == 0) { - switch (region_code2) { - case 1: - name = "Aiwo"; - break; - case 2: - name = "Anabar"; - break; - case 3: - name = "Anetan"; - break; - case 4: - name = "Anibare"; - break; - case 5: - name = "Baiti"; - break; - case 6: - name = "Boe"; - break; - case 7: - name = "Buada"; - break; - case 8: - name = "Denigomodu"; - break; - case 9: - name = "Ewa"; - break; - case 10: - name = "Ijuw"; - break; - case 11: - name = "Meneng"; - break; - case 12: - name = "Nibok"; - break; - case 13: - name = "Uaboe"; - break; - case 14: - name = "Yaren"; - break; - } - } - if (strcmp(country_code,"NZ") == 0) { - switch (region_code2) { - case 10: - name = "Chatham Islands"; - break; - case 1010: - name = "Auckland"; - break; - case 1011: - name = "Bay of Plenty"; - break; - case 1012: - name = "Canterbury"; - break; - case 1047: - name = "Gisborne"; - break; - case 1048: - name = "Hawke's Bay"; - break; - case 1049: - name = "Manawatu-Wanganui"; - break; - case 1050: - name = "Marlborough"; - break; - case 1051: - name = "Nelson"; - break; - case 1052: - name = "Northland"; - break; - case 1053: - name = "Otago"; - break; - case 1054: - name = "Southland"; - break; - case 1055: - name = "Taranaki"; - break; - case 1090: - name = "Waikato"; - break; - case 1091: - name = "Wellington"; - break; - case 1092: - name = "West Coast"; - break; - } - } - if (strcmp(country_code,"OM") == 0) { - switch (region_code2) { - case 1: - name = "Ad Dakhiliyah"; - break; - case 2: - name = "Al Batinah"; - break; - case 3: - name = "Al Wusta"; - break; - case 4: - name = "Ash Sharqiyah"; - break; - case 5: - name = "Az Zahirah"; - break; - case 6: - name = "Masqat"; - break; - case 7: - name = "Musandam"; - break; - case 8: - name = "Zufar"; - break; - } - } - if (strcmp(country_code,"PA") == 0) { - switch (region_code2) { - case 1: - name = "Bocas del Toro"; - break; - case 2: - name = "Chiriqui"; - break; - case 3: - name = "Cocle"; - break; - case 4: - name = "Colon"; - break; - case 5: - name = "Darien"; - break; - case 6: - name = "Herrera"; - break; - case 7: - name = "Los Santos"; - break; - case 8: - name = "Panama"; - break; - case 9: - name = "San Blas"; - break; - case 10: - name = "Veraguas"; - break; - } - } - if (strcmp(country_code,"PE") == 0) { - switch (region_code2) { - case 1: - name = "Amazonas"; - break; - case 2: - name = "Ancash"; - break; - case 3: - name = "Apurimac"; - break; - case 4: - name = "Arequipa"; - break; - case 5: - name = "Ayacucho"; - break; - case 6: - name = "Cajamarca"; - break; - case 7: - name = "Callao"; - break; - case 8: - name = "Cusco"; - break; - case 9: - name = "Huancavelica"; - break; - case 10: - name = "Huanuco"; - break; - case 11: - name = "Ica"; - break; - case 12: - name = "Junin"; - break; - case 13: - name = "La Libertad"; - break; - case 14: - name = "Lambayeque"; - break; - case 15: - name = "Lima"; - break; - case 16: - name = "Loreto"; - break; - case 17: - name = "Madre de Dios"; - break; - case 18: - name = "Moquegua"; - break; - case 19: - name = "Pasco"; - break; - case 20: - name = "Piura"; - break; - case 21: - name = "Puno"; - break; - case 22: - name = "San Martin"; - break; - case 23: - name = "Tacna"; - break; - case 24: - name = "Tumbes"; - break; - case 25: - name = "Ucayali"; - break; - } - } - if (strcmp(country_code,"PG") == 0) { - switch (region_code2) { - case 1: - name = "Central"; - break; - case 2: - name = "Gulf"; - break; - case 3: - name = "Milne Bay"; - break; - case 4: - name = "Northern"; - break; - case 5: - name = "Southern Highlands"; - break; - case 6: - name = "Western"; - break; - case 7: - name = "North Solomons"; - break; - case 8: - name = "Chimbu"; - break; - case 9: - name = "Eastern Highlands"; - break; - case 10: - name = "East New Britain"; - break; - case 11: - name = "East Sepik"; - break; - case 12: - name = "Madang"; - break; - case 13: - name = "Manus"; - break; - case 14: - name = "Morobe"; - break; - case 15: - name = "New Ireland"; - break; - case 16: - name = "Western Highlands"; - break; - case 17: - name = "West New Britain"; - break; - case 18: - name = "Sandaun"; - break; - case 19: - name = "Enga"; - break; - case 20: - name = "National Capital"; - break; - } - } - if (strcmp(country_code,"PH") == 0) { - switch (region_code2) { - case 1: - name = "Abra"; - break; - case 2: - name = "Agusan del Norte"; - break; - case 3: - name = "Agusan del Sur"; - break; - case 4: - name = "Aklan"; - break; - case 5: - name = "Albay"; - break; - case 6: - name = "Antique"; - break; - case 7: - name = "Bataan"; - break; - case 8: - name = "Batanes"; - break; - case 9: - name = "Batangas"; - break; - case 10: - name = "Benguet"; - break; - case 11: - name = "Bohol"; - break; - case 12: - name = "Bukidnon"; - break; - case 13: - name = "Bulacan"; - break; - case 14: - name = "Cagayan"; - break; - case 15: - name = "Camarines Norte"; - break; - case 16: - name = "Camarines Sur"; - break; - case 17: - name = "Camiguin"; - break; - case 18: - name = "Capiz"; - break; - case 19: - name = "Catanduanes"; - break; - case 20: - name = "Cavite"; - break; - case 21: - name = "Cebu"; - break; - case 22: - name = "Basilan"; - break; - case 23: - name = "Eastern Samar"; - break; - case 24: - name = "Davao"; - break; - case 25: - name = "Davao del Sur"; - break; - case 26: - name = "Davao Oriental"; - break; - case 27: - name = "Ifugao"; - break; - case 28: - name = "Ilocos Norte"; - break; - case 29: - name = "Ilocos Sur"; - break; - case 30: - name = "Iloilo"; - break; - case 31: - name = "Isabela"; - break; - case 32: - name = "Kalinga-Apayao"; - break; - case 33: - name = "Laguna"; - break; - case 34: - name = "Lanao del Norte"; - break; - case 35: - name = "Lanao del Sur"; - break; - case 36: - name = "La Union"; - break; - case 37: - name = "Leyte"; - break; - case 38: - name = "Marinduque"; - break; - case 39: - name = "Masbate"; - break; - case 40: - name = "Mindoro Occidental"; - break; - case 41: - name = "Mindoro Oriental"; - break; - case 42: - name = "Misamis Occidental"; - break; - case 43: - name = "Misamis Oriental"; - break; - case 44: - name = "Mountain"; - break; - case 45: - name = "Negros Occidental"; - break; - case 46: - name = "Negros Oriental"; - break; - case 47: - name = "Nueva Ecija"; - break; - case 48: - name = "Nueva Vizcaya"; - break; - case 49: - name = "Palawan"; - break; - case 50: - name = "Pampanga"; - break; - case 51: - name = "Pangasinan"; - break; - case 53: - name = "Rizal"; - break; - case 54: - name = "Romblon"; - break; - case 55: - name = "Samar"; - break; - case 56: - name = "Maguindanao"; - break; - case 57: - name = "North Cotabato"; - break; - case 58: - name = "Sorsogon"; - break; - case 59: - name = "Southern Leyte"; - break; - case 60: - name = "Sulu"; - break; - case 61: - name = "Surigao del Norte"; - break; - case 62: - name = "Surigao del Sur"; - break; - case 63: - name = "Tarlac"; - break; - case 64: - name = "Zambales"; - break; - case 65: - name = "Zamboanga del Norte"; - break; - case 66: - name = "Zamboanga del Sur"; - break; - case 67: - name = "Northern Samar"; - break; - case 68: - name = "Quirino"; - break; - case 69: - name = "Siquijor"; - break; - case 70: - name = "South Cotabato"; - break; - case 71: - name = "Sultan Kudarat"; - break; - case 72: - name = "Tawitawi"; - break; - case 832: - name = "Angeles"; - break; - case 833: - name = "Bacolod"; - break; - case 834: - name = "Bago"; - break; - case 835: - name = "Baguio"; - break; - case 836: - name = "Bais"; - break; - case 837: - name = "Basilan City"; - break; - case 838: - name = "Batangas City"; - break; - case 839: - name = "Butuan"; - break; - case 840: - name = "Cabanatuan"; - break; - case 875: - name = "Cadiz"; - break; - case 876: - name = "Cagayan de Oro"; - break; - case 877: - name = "Calbayog"; - break; - case 878: - name = "Caloocan"; - break; - case 879: - name = "Canlaon"; - break; - case 880: - name = "Cavite City"; - break; - case 881: - name = "Cebu City"; - break; - case 882: - name = "Cotabato"; - break; - case 883: - name = "Dagupan"; - break; - case 918: - name = "Danao"; - break; - case 919: - name = "Dapitan"; - break; - case 920: - name = "Davao City"; - break; - case 921: - name = "Dipolog"; - break; - case 922: - name = "Dumaguete"; - break; - case 923: - name = "General Santos"; - break; - case 924: - name = "Gingoog"; - break; - case 925: - name = "Iligan"; - break; - case 926: - name = "Iloilo City"; - break; - case 961: - name = "Iriga"; - break; - case 962: - name = "La Carlota"; - break; - case 963: - name = "Laoag"; - break; - case 964: - name = "Lapu-Lapu"; - break; - case 965: - name = "Legaspi"; - break; - case 966: - name = "Lipa"; - break; - case 967: - name = "Lucena"; - break; - case 968: - name = "Mandaue"; - break; - case 969: - name = "Manila"; - break; - case 1004: - name = "Marawi"; - break; - case 1005: - name = "Naga"; - break; - case 1006: - name = "Olongapo"; - break; - case 1007: - name = "Ormoc"; - break; - case 1008: - name = "Oroquieta"; - break; - case 1009: - name = "Ozamis"; - break; - case 1010: - name = "Pagadian"; - break; - case 1011: - name = "Palayan"; - break; - case 1012: - name = "Pasay"; - break; - case 1047: - name = "Puerto Princesa"; - break; - case 1048: - name = "Quezon City"; - break; - case 1049: - name = "Roxas"; - break; - case 1050: - name = "San Carlos"; - break; - case 1051: - name = "San Carlos"; - break; - case 1052: - name = "San Jose"; - break; - case 1053: - name = "San Pablo"; - break; - case 1054: - name = "Silay"; - break; - case 1055: - name = "Surigao"; - break; - case 1090: - name = "Tacloban"; - break; - case 1091: - name = "Tagaytay"; - break; - case 1092: - name = "Tagbilaran"; - break; - case 1093: - name = "Tangub"; - break; - case 1094: - name = "Toledo"; - break; - case 1095: - name = "Trece Martires"; - break; - case 1096: - name = "Zamboanga"; - break; - case 1097: - name = "Aurora"; - break; - case 1134: - name = "Quezon"; - break; - case 1135: - name = "Negros Occidental"; - break; - } - } - if (strcmp(country_code,"PK") == 0) { - switch (region_code2) { - case 1: - name = "Federally Administered Tribal Areas"; - break; - case 2: - name = "Balochistan"; - break; - case 3: - name = "North-West Frontier"; - break; - case 4: - name = "Punjab"; - break; - case 5: - name = "Sindh"; - break; - case 6: - name = "Azad Kashmir"; - break; - case 7: - name = "Northern Areas"; - break; - case 8: - name = "Islamabad"; - break; - } - } - if (strcmp(country_code,"PL") == 0) { - switch (region_code2) { - case 72: - name = "Dolnoslaskie"; - break; - case 73: - name = "Kujawsko-Pomorskie"; - break; - case 74: - name = "Lodzkie"; - break; - case 75: - name = "Lubelskie"; - break; - case 76: - name = "Lubuskie"; - break; - case 77: - name = "Malopolskie"; - break; - case 78: - name = "Mazowieckie"; - break; - case 79: - name = "Opolskie"; - break; - case 80: - name = "Podkarpackie"; - break; - case 81: - name = "Podlaskie"; - break; - case 82: - name = "Pomorskie"; - break; - case 83: - name = "Slaskie"; - break; - case 84: - name = "Swietokrzyskie"; - break; - case 85: - name = "Warminsko-Mazurskie"; - break; - case 86: - name = "Wielkopolskie"; - break; - case 87: - name = "Zachodniopomorskie"; - break; - } - } - if (strcmp(country_code,"PS") == 0) { - switch (region_code2) { - case 1131: - name = "Gaza"; - break; - case 1798: - name = "West Bank"; - break; - } - } - if (strcmp(country_code,"PT") == 0) { - switch (region_code2) { - case 2: - name = "Aveiro"; - break; - case 3: - name = "Beja"; - break; - case 4: - name = "Braga"; - break; - case 5: - name = "Braganca"; - break; - case 6: - name = "Castelo Branco"; - break; - case 7: - name = "Coimbra"; - break; - case 8: - name = "Evora"; - break; - case 9: - name = "Faro"; - break; - case 10: - name = "Madeira"; - break; - case 11: - name = "Guarda"; - break; - case 13: - name = "Leiria"; - break; - case 14: - name = "Lisboa"; - break; - case 16: - name = "Portalegre"; - break; - case 17: - name = "Porto"; - break; - case 18: - name = "Santarem"; - break; - case 19: - name = "Setubal"; - break; - case 20: - name = "Viana do Castelo"; - break; - case 21: - name = "Vila Real"; - break; - case 22: - name = "Viseu"; - break; - case 23: - name = "Azores"; - break; - } - } - if (strcmp(country_code,"PY") == 0) { - switch (region_code2) { - case 1: - name = "Alto Parana"; - break; - case 2: - name = "Amambay"; - break; - case 3: - name = "Boqueron"; - break; - case 4: - name = "Caaguazu"; - break; - case 5: - name = "Caazapa"; - break; - case 6: - name = "Central"; - break; - case 7: - name = "Concepcion"; - break; - case 8: - name = "Cordillera"; - break; - case 10: - name = "Guaira"; - break; - case 11: - name = "Itapua"; - break; - case 12: - name = "Misiones"; - break; - case 13: - name = "Neembucu"; - break; - case 15: - name = "Paraguari"; - break; - case 16: - name = "Presidente Hayes"; - break; - case 17: - name = "San Pedro"; - break; - case 19: - name = "Canindeyu"; - break; - case 20: - name = "Chaco"; - break; - case 21: - name = "Nueva Asuncion"; - break; - case 23: - name = "Alto Paraguay"; - break; - } - } - if (strcmp(country_code,"QA") == 0) { - switch (region_code2) { - case 1: - name = "Ad Dawhah"; - break; - case 2: - name = "Al Ghuwariyah"; - break; - case 3: - name = "Al Jumaliyah"; - break; - case 4: - name = "Al Khawr"; - break; - case 5: - name = "Al Wakrah Municipality"; - break; - case 6: - name = "Ar Rayyan"; - break; - case 8: - name = "Madinat ach Shamal"; - break; - case 9: - name = "Umm Salal"; - break; - case 10: - name = "Al Wakrah"; - break; - case 11: - name = "Jariyan al Batnah"; - break; - case 12: - name = "Umm Sa'id"; - break; - } - } - if (strcmp(country_code,"RO") == 0) { - switch (region_code2) { - case 1: - name = "Alba"; - break; - case 2: - name = "Arad"; - break; - case 3: - name = "Arges"; - break; - case 4: - name = "Bacau"; - break; - case 5: - name = "Bihor"; - break; - case 6: - name = "Bistrita-Nasaud"; - break; - case 7: - name = "Botosani"; - break; - case 8: - name = "Braila"; - break; - case 9: - name = "Brasov"; - break; - case 10: - name = "Bucuresti"; - break; - case 11: - name = "Buzau"; - break; - case 12: - name = "Caras-Severin"; - break; - case 13: - name = "Cluj"; - break; - case 14: - name = "Constanta"; - break; - case 15: - name = "Covasna"; - break; - case 16: - name = "Dambovita"; - break; - case 17: - name = "Dolj"; - break; - case 18: - name = "Galati"; - break; - case 19: - name = "Gorj"; - break; - case 20: - name = "Harghita"; - break; - case 21: - name = "Hunedoara"; - break; - case 22: - name = "Ialomita"; - break; - case 23: - name = "Iasi"; - break; - case 25: - name = "Maramures"; - break; - case 26: - name = "Mehedinti"; - break; - case 27: - name = "Mures"; - break; - case 28: - name = "Neamt"; - break; - case 29: - name = "Olt"; - break; - case 30: - name = "Prahova"; - break; - case 31: - name = "Salaj"; - break; - case 32: - name = "Satu Mare"; - break; - case 33: - name = "Sibiu"; - break; - case 34: - name = "Suceava"; - break; - case 35: - name = "Teleorman"; - break; - case 36: - name = "Timis"; - break; - case 37: - name = "Tulcea"; - break; - case 38: - name = "Vaslui"; - break; - case 39: - name = "Valcea"; - break; - case 40: - name = "Vrancea"; - break; - case 41: - name = "Calarasi"; - break; - case 42: - name = "Giurgiu"; - break; - case 43: - name = "Ilfov"; - break; - } - } - if (strcmp(country_code,"RS") == 0) { - switch (region_code2) { - case 1: - name = "Kosovo"; - break; - case 2: - name = "Vojvodina"; - break; - } - } - if (strcmp(country_code,"RU") == 0) { - switch (region_code2) { - case 1: - name = "Adygeya, Republic of"; - break; - case 2: - name = "Aginsky Buryatsky AO"; - break; - case 3: - name = "Gorno-Altay"; - break; - case 4: - name = "Altaisky krai"; - break; - case 5: - name = "Amur"; - break; - case 6: - name = "Arkhangel'sk"; - break; - case 7: - name = "Astrakhan'"; - break; - case 8: - name = "Bashkortostan"; - break; - case 9: - name = "Belgorod"; - break; - case 10: - name = "Bryansk"; - break; - case 11: - name = "Buryat"; - break; - case 12: - name = "Chechnya"; - break; - case 13: - name = "Chelyabinsk"; - break; - case 14: - name = "Chita"; - break; - case 15: - name = "Chukot"; - break; - case 16: - name = "Chuvashia"; - break; - case 17: - name = "Dagestan"; - break; - case 18: - name = "Evenk"; - break; - case 19: - name = "Ingush"; - break; - case 20: - name = "Irkutsk"; - break; - case 21: - name = "Ivanovo"; - break; - case 22: - name = "Kabardin-Balkar"; - break; - case 23: - name = "Kaliningrad"; - break; - case 24: - name = "Kalmyk"; - break; - case 25: - name = "Kaluga"; - break; - case 26: - name = "Kamchatka"; - break; - case 27: - name = "Karachay-Cherkess"; - break; - case 28: - name = "Karelia"; - break; - case 29: - name = "Kemerovo"; - break; - case 30: - name = "Khabarovsk"; - break; - case 31: - name = "Khakass"; - break; - case 32: - name = "Khanty-Mansiy"; - break; - case 33: - name = "Kirov"; - break; - case 34: - name = "Komi"; - break; - case 35: - name = "Komi-Permyak"; - break; - case 36: - name = "Koryak"; - break; - case 37: - name = "Kostroma"; - break; - case 38: - name = "Krasnodar"; - break; - case 39: - name = "Krasnoyarsk"; - break; - case 40: - name = "Kurgan"; - break; - case 41: - name = "Kursk"; - break; - case 42: - name = "Leningrad"; - break; - case 43: - name = "Lipetsk"; - break; - case 44: - name = "Magadan"; - break; - case 45: - name = "Mariy-El"; - break; - case 46: - name = "Mordovia"; - break; - case 47: - name = "Moskva"; - break; - case 48: - name = "Moscow City"; - break; - case 49: - name = "Murmansk"; - break; - case 50: - name = "Nenets"; - break; - case 51: - name = "Nizhegorod"; - break; - case 52: - name = "Novgorod"; - break; - case 53: - name = "Novosibirsk"; - break; - case 54: - name = "Omsk"; - break; - case 55: - name = "Orenburg"; - break; - case 56: - name = "Orel"; - break; - case 57: - name = "Penza"; - break; - case 58: - name = "Perm'"; - break; - case 59: - name = "Primor'ye"; - break; - case 60: - name = "Pskov"; - break; - case 61: - name = "Rostov"; - break; - case 62: - name = "Ryazan'"; - break; - case 63: - name = "Sakha"; - break; - case 64: - name = "Sakhalin"; - break; - case 65: - name = "Samara"; - break; - case 66: - name = "Saint Petersburg City"; - break; - case 67: - name = "Saratov"; - break; - case 68: - name = "North Ossetia"; - break; - case 69: - name = "Smolensk"; - break; - case 70: - name = "Stavropol'"; - break; - case 71: - name = "Sverdlovsk"; - break; - case 72: - name = "Tambovskaya oblast"; - break; - case 73: - name = "Tatarstan"; - break; - case 74: - name = "Taymyr"; - break; - case 75: - name = "Tomsk"; - break; - case 76: - name = "Tula"; - break; - case 77: - name = "Tver'"; - break; - case 78: - name = "Tyumen'"; - break; - case 79: - name = "Tuva"; - break; - case 80: - name = "Udmurt"; - break; - case 81: - name = "Ul'yanovsk"; - break; - case 82: - name = "Ust-Orda Buryat"; - break; - case 83: - name = "Vladimir"; - break; - case 84: - name = "Volgograd"; - break; - case 85: - name = "Vologda"; - break; - case 86: - name = "Voronezh"; - break; - case 87: - name = "Yamal-Nenets"; - break; - case 88: - name = "Yaroslavl'"; - break; - case 89: - name = "Yevrey"; - break; - case 90: - name = "Permskiy Kray"; - break; - case 91: - name = "Krasnoyarskiy Kray"; - break; - case 942: - name = "Chechnya Republic"; - break; - } - } - if (strcmp(country_code,"RW") == 0) { - switch (region_code2) { - case 1: - name = "Butare"; - break; - case 6: - name = "Gitarama"; - break; - case 7: - name = "Kibungo"; - break; - case 9: - name = "Kigali"; - break; - case 11: - name = "Est"; - break; - case 12: - name = "Kigali"; - break; - case 13: - name = "Nord"; - break; - case 14: - name = "Ouest"; - break; - case 15: - name = "Sud"; - break; - } - } - if (strcmp(country_code,"SA") == 0) { - switch (region_code2) { - case 2: - name = "Al Bahah"; - break; - case 3: - name = "Al Jawf"; - break; - case 5: - name = "Al Madinah"; - break; - case 6: - name = "Ash Sharqiyah"; - break; - case 8: - name = "Al Qasim"; - break; - case 9: - name = "Al Qurayyat"; - break; - case 10: - name = "Ar Riyad"; - break; - case 13: - name = "Ha'il"; - break; - case 14: - name = "Makkah"; - break; - case 15: - name = "Al Hudud ash Shamaliyah"; - break; - case 16: - name = "Najran"; - break; - case 17: - name = "Jizan"; - break; - case 19: - name = "Tabuk"; - break; - case 20: - name = "Al Jawf"; - break; - } - } - if (strcmp(country_code,"SB") == 0) { - switch (region_code2) { - case 3: - name = "Malaita"; - break; - case 6: - name = "Guadalcanal"; - break; - case 7: - name = "Isabel"; - break; - case 8: - name = "Makira"; - break; - case 9: - name = "Temotu"; - break; - case 10: - name = "Central"; - break; - case 11: - name = "Western"; - break; - case 12: - name = "Choiseul"; - break; - case 13: - name = "Rennell and Bellona"; - break; - } - } - if (strcmp(country_code,"SC") == 0) { - switch (region_code2) { - case 1: - name = "Anse aux Pins"; - break; - case 2: - name = "Anse Boileau"; - break; - case 3: - name = "Anse Etoile"; - break; - case 4: - name = "Anse Louis"; - break; - case 5: - name = "Anse Royale"; - break; - case 6: - name = "Baie Lazare"; - break; - case 7: - name = "Baie Sainte Anne"; - break; - case 8: - name = "Beau Vallon"; - break; - case 9: - name = "Bel Air"; - break; - case 10: - name = "Bel Ombre"; - break; - case 11: - name = "Cascade"; - break; - case 12: - name = "Glacis"; - break; - case 13: - name = "Grand' Anse"; - break; - case 14: - name = "Grand' Anse"; - break; - case 15: - name = "La Digue"; - break; - case 16: - name = "La Riviere Anglaise"; - break; - case 17: - name = "Mont Buxton"; - break; - case 18: - name = "Mont Fleuri"; - break; - case 19: - name = "Plaisance"; - break; - case 20: - name = "Pointe La Rue"; - break; - case 21: - name = "Port Glaud"; - break; - case 22: - name = "Saint Louis"; - break; - case 23: - name = "Takamaka"; - break; - } - } - if (strcmp(country_code,"SD") == 0) { - switch (region_code2) { - case 27: - name = "Al Wusta"; - break; - case 28: - name = "Al Istiwa'iyah"; - break; - case 29: - name = "Al Khartum"; - break; - case 30: - name = "Ash Shamaliyah"; - break; - case 31: - name = "Ash Sharqiyah"; - break; - case 32: - name = "Bahr al Ghazal"; - break; - case 33: - name = "Darfur"; - break; - case 34: - name = "Kurdufan"; - break; - case 35: - name = "Upper Nile"; - break; - case 40: - name = "Al Wahadah State"; - break; - case 44: - name = "Central Equatoria State"; - break; - } - } - if (strcmp(country_code,"SE") == 0) { - switch (region_code2) { - case 2: - name = "Blekinge Lan"; - break; - case 3: - name = "Gavleborgs Lan"; - break; - case 5: - name = "Gotlands Lan"; - break; - case 6: - name = "Hallands Lan"; - break; - case 7: - name = "Jamtlands Lan"; - break; - case 8: - name = "Jonkopings Lan"; - break; - case 9: - name = "Kalmar Lan"; - break; - case 10: - name = "Dalarnas Lan"; - break; - case 12: - name = "Kronobergs Lan"; - break; - case 14: - name = "Norrbottens Lan"; - break; - case 15: - name = "Orebro Lan"; - break; - case 16: - name = "Ostergotlands Lan"; - break; - case 18: - name = "Sodermanlands Lan"; - break; - case 21: - name = "Uppsala Lan"; - break; - case 22: - name = "Varmlands Lan"; - break; - case 23: - name = "Vasterbottens Lan"; - break; - case 24: - name = "Vasternorrlands Lan"; - break; - case 25: - name = "Vastmanlands Lan"; - break; - case 26: - name = "Stockholms Lan"; - break; - case 27: - name = "Skane Lan"; - break; - case 28: - name = "Vastra Gotaland"; - break; - } - } - if (strcmp(country_code,"SH") == 0) { - switch (region_code2) { - case 1: - name = "Ascension"; - break; - case 2: - name = "Saint Helena"; - break; - case 3: - name = "Tristan da Cunha"; - break; - } - } - if (strcmp(country_code,"SI") == 0) { - switch (region_code2) { - case 1: - name = "Ajdovscina"; - break; - case 2: - name = "Beltinci"; - break; - case 3: - name = "Bled"; - break; - case 4: - name = "Bohinj"; - break; - case 5: - name = "Borovnica"; - break; - case 6: - name = "Bovec"; - break; - case 7: - name = "Brda"; - break; - case 8: - name = "Brezice"; - break; - case 9: - name = "Brezovica"; - break; - case 11: - name = "Celje"; - break; - case 12: - name = "Cerklje na Gorenjskem"; - break; - case 13: - name = "Cerknica"; - break; - case 14: - name = "Cerkno"; - break; - case 15: - name = "Crensovci"; - break; - case 16: - name = "Crna na Koroskem"; - break; - case 17: - name = "Crnomelj"; - break; - case 19: - name = "Divaca"; - break; - case 20: - name = "Dobrepolje"; - break; - case 22: - name = "Dol pri Ljubljani"; - break; - case 24: - name = "Dornava"; - break; - case 25: - name = "Dravograd"; - break; - case 26: - name = "Duplek"; - break; - case 27: - name = "Gorenja Vas-Poljane"; - break; - case 28: - name = "Gorisnica"; - break; - case 29: - name = "Gornja Radgona"; - break; - case 30: - name = "Gornji Grad"; - break; - case 31: - name = "Gornji Petrovci"; - break; - case 32: - name = "Grosuplje"; - break; - case 34: - name = "Hrastnik"; - break; - case 35: - name = "Hrpelje-Kozina"; - break; - case 36: - name = "Idrija"; - break; - case 37: - name = "Ig"; - break; - case 38: - name = "Ilirska Bistrica"; - break; - case 39: - name = "Ivancna Gorica"; - break; - case 40: - name = "Izola-Isola"; - break; - case 42: - name = "Jursinci"; - break; - case 44: - name = "Kanal"; - break; - case 45: - name = "Kidricevo"; - break; - case 46: - name = "Kobarid"; - break; - case 47: - name = "Kobilje"; - break; - case 49: - name = "Komen"; - break; - case 50: - name = "Koper-Capodistria"; - break; - case 51: - name = "Kozje"; - break; - case 52: - name = "Kranj"; - break; - case 53: - name = "Kranjska Gora"; - break; - case 54: - name = "Krsko"; - break; - case 55: - name = "Kungota"; - break; - case 57: - name = "Lasko"; - break; - case 61: - name = "Ljubljana"; - break; - case 62: - name = "Ljubno"; - break; - case 64: - name = "Logatec"; - break; - case 66: - name = "Loski Potok"; - break; - case 68: - name = "Lukovica"; - break; - case 71: - name = "Medvode"; - break; - case 72: - name = "Menges"; - break; - case 73: - name = "Metlika"; - break; - case 74: - name = "Mezica"; - break; - case 76: - name = "Mislinja"; - break; - case 77: - name = "Moravce"; - break; - case 78: - name = "Moravske Toplice"; - break; - case 79: - name = "Mozirje"; - break; - case 80: - name = "Murska Sobota"; - break; - case 81: - name = "Muta"; - break; - case 82: - name = "Naklo"; - break; - case 83: - name = "Nazarje"; - break; - case 84: - name = "Nova Gorica"; - break; - case 86: - name = "Odranci"; - break; - case 87: - name = "Ormoz"; - break; - case 88: - name = "Osilnica"; - break; - case 89: - name = "Pesnica"; - break; - case 91: - name = "Pivka"; - break; - case 92: - name = "Podcetrtek"; - break; - case 94: - name = "Postojna"; - break; - case 97: - name = "Puconci"; - break; - case 98: - name = "Racam"; - break; - case 99: - name = "Radece"; - break; - case 832: - name = "Radenci"; - break; - case 833: - name = "Radlje ob Dravi"; - break; - case 834: - name = "Radovljica"; - break; - case 837: - name = "Rogasovci"; - break; - case 838: - name = "Rogaska Slatina"; - break; - case 839: - name = "Rogatec"; - break; - case 875: - name = "Semic"; - break; - case 876: - name = "Sencur"; - break; - case 877: - name = "Sentilj"; - break; - case 878: - name = "Sentjernej"; - break; - case 880: - name = "Sevnica"; - break; - case 881: - name = "Sezana"; - break; - case 882: - name = "Skocjan"; - break; - case 883: - name = "Skofja Loka"; - break; - case 918: - name = "Skofljica"; - break; - case 919: - name = "Slovenj Gradec"; - break; - case 921: - name = "Slovenske Konjice"; - break; - case 922: - name = "Smarje pri Jelsah"; - break; - case 923: - name = "Smartno ob Paki"; - break; - case 924: - name = "Sostanj"; - break; - case 925: - name = "Starse"; - break; - case 926: - name = "Store"; - break; - case 961: - name = "Sveti Jurij"; - break; - case 962: - name = "Tolmin"; - break; - case 963: - name = "Trbovlje"; - break; - case 964: - name = "Trebnje"; - break; - case 965: - name = "Trzic"; - break; - case 966: - name = "Turnisce"; - break; - case 967: - name = "Velenje"; - break; - case 968: - name = "Velike Lasce"; - break; - case 1004: - name = "Vipava"; - break; - case 1005: - name = "Vitanje"; - break; - case 1006: - name = "Vodice"; - break; - case 1008: - name = "Vrhnika"; - break; - case 1009: - name = "Vuzenica"; - break; - case 1010: - name = "Zagorje ob Savi"; - break; - case 1012: - name = "Zavrc"; - break; - case 1047: - name = "Zelezniki"; - break; - case 1048: - name = "Ziri"; - break; - case 1049: - name = "Zrece"; - break; - case 1093: - name = "Dobrova-Horjul-Polhov Gradec"; - break; - case 1096: - name = "Domzale"; - break; - case 1136: - name = "Jesenice"; - break; - case 1138: - name = "Kamnik"; - break; - case 1139: - name = "Kocevje"; - break; - case 1177: - name = "Kuzma"; - break; - case 1178: - name = "Lenart"; - break; - case 1180: - name = "Litija"; - break; - case 1181: - name = "Ljutomer"; - break; - case 1182: - name = "Loska Dolina"; - break; - case 1184: - name = "Luce"; - break; - case 1219: - name = "Majsperk"; - break; - case 1220: - name = "Maribor"; - break; - case 1223: - name = "Miren-Kostanjevica"; - break; - case 1225: - name = "Novo Mesto"; - break; - case 1227: - name = "Piran"; - break; - case 1266: - name = "Preddvor"; - break; - case 1268: - name = "Ptuj"; - break; - case 1305: - name = "Ribnica"; - break; - case 1307: - name = "Ruse"; - break; - case 1311: - name = "Sentjur pri Celju"; - break; - case 1312: - name = "Slovenska Bistrica"; - break; - case 1392: - name = "Videm"; - break; - case 1393: - name = "Vojnik"; - break; - case 1395: - name = "Zalec"; - break; - } - } - if (strcmp(country_code,"SK") == 0) { - switch (region_code2) { - case 1: - name = "Banska Bystrica"; - break; - case 2: - name = "Bratislava"; - break; - case 3: - name = "Kosice"; - break; - case 4: - name = "Nitra"; - break; - case 5: - name = "Presov"; - break; - case 6: - name = "Trencin"; - break; - case 7: - name = "Trnava"; - break; - case 8: - name = "Zilina"; - break; - } - } - if (strcmp(country_code,"SL") == 0) { - switch (region_code2) { - case 1: - name = "Eastern"; - break; - case 2: - name = "Northern"; - break; - case 3: - name = "Southern"; - break; - case 4: - name = "Western Area"; - break; - } - } - if (strcmp(country_code,"SM") == 0) { - switch (region_code2) { - case 1: - name = "Acquaviva"; - break; - case 2: - name = "Chiesanuova"; - break; - case 3: - name = "Domagnano"; - break; - case 4: - name = "Faetano"; - break; - case 5: - name = "Fiorentino"; - break; - case 6: - name = "Borgo Maggiore"; - break; - case 7: - name = "San Marino"; - break; - case 8: - name = "Monte Giardino"; - break; - case 9: - name = "Serravalle"; - break; - } - } - if (strcmp(country_code,"SN") == 0) { - switch (region_code2) { - case 1: - name = "Dakar"; - break; - case 3: - name = "Diourbel"; - break; - case 5: - name = "Tambacounda"; - break; - case 7: - name = "Thies"; - break; - case 9: - name = "Fatick"; - break; - case 10: - name = "Kaolack"; - break; - case 11: - name = "Kolda"; - break; - case 12: - name = "Ziguinchor"; - break; - case 13: - name = "Louga"; - break; - case 14: - name = "Saint-Louis"; - break; - case 15: - name = "Matam"; - break; - } - } - if (strcmp(country_code,"SO") == 0) { - switch (region_code2) { - case 1: - name = "Bakool"; - break; - case 2: - name = "Banaadir"; - break; - case 3: - name = "Bari"; - break; - case 4: - name = "Bay"; - break; - case 5: - name = "Galguduud"; - break; - case 6: - name = "Gedo"; - break; - case 7: - name = "Hiiraan"; - break; - case 8: - name = "Jubbada Dhexe"; - break; - case 9: - name = "Jubbada Hoose"; - break; - case 10: - name = "Mudug"; - break; - case 11: - name = "Nugaal"; - break; - case 12: - name = "Sanaag"; - break; - case 13: - name = "Shabeellaha Dhexe"; - break; - case 14: - name = "Shabeellaha Hoose"; - break; - case 16: - name = "Woqooyi Galbeed"; - break; - case 18: - name = "Nugaal"; - break; - case 19: - name = "Togdheer"; - break; - case 20: - name = "Woqooyi Galbeed"; - break; - case 21: - name = "Awdal"; - break; - case 22: - name = "Sool"; - break; - } - } - if (strcmp(country_code,"SR") == 0) { - switch (region_code2) { - case 10: - name = "Brokopondo"; - break; - case 11: - name = "Commewijne"; - break; - case 12: - name = "Coronie"; - break; - case 13: - name = "Marowijne"; - break; - case 14: - name = "Nickerie"; - break; - case 15: - name = "Para"; - break; - case 16: - name = "Paramaribo"; - break; - case 17: - name = "Saramacca"; - break; - case 18: - name = "Sipaliwini"; - break; - case 19: - name = "Wanica"; - break; - } - } - if (strcmp(country_code,"ST") == 0) { - switch (region_code2) { - case 1: - name = "Principe"; - break; - case 2: - name = "Sao Tome"; - break; - } - } - if (strcmp(country_code,"SV") == 0) { - switch (region_code2) { - case 1: - name = "Ahuachapan"; - break; - case 2: - name = "Cabanas"; - break; - case 3: - name = "Chalatenango"; - break; - case 4: - name = "Cuscatlan"; - break; - case 5: - name = "La Libertad"; - break; - case 6: - name = "La Paz"; - break; - case 7: - name = "La Union"; - break; - case 8: - name = "Morazan"; - break; - case 9: - name = "San Miguel"; - break; - case 10: - name = "San Salvador"; - break; - case 11: - name = "Santa Ana"; - break; - case 12: - name = "San Vicente"; - break; - case 13: - name = "Sonsonate"; - break; - case 14: - name = "Usulutan"; - break; - } - } - if (strcmp(country_code,"SY") == 0) { - switch (region_code2) { - case 1: - name = "Al Hasakah"; - break; - case 2: - name = "Al Ladhiqiyah"; - break; - case 3: - name = "Al Qunaytirah"; - break; - case 4: - name = "Ar Raqqah"; - break; - case 5: - name = "As Suwayda'"; - break; - case 6: - name = "Dar"; - break; - case 7: - name = "Dayr az Zawr"; - break; - case 8: - name = "Rif Dimashq"; - break; - case 9: - name = "Halab"; - break; - case 10: - name = "Hamah"; - break; - case 11: - name = "Hims"; - break; - case 12: - name = "Idlib"; - break; - case 13: - name = "Dimashq"; - break; - case 14: - name = "Tartus"; - break; - } - } - if (strcmp(country_code,"SZ") == 0) { - switch (region_code2) { - case 1: - name = "Hhohho"; - break; - case 2: - name = "Lubombo"; - break; - case 3: - name = "Manzini"; - break; - case 4: - name = "Shiselweni"; - break; - case 5: - name = "Praslin"; - break; - } - } - if (strcmp(country_code,"TD") == 0) { - switch (region_code2) { - case 1: - name = "Batha"; - break; - case 2: - name = "Biltine"; - break; - case 3: - name = "Borkou-Ennedi-Tibesti"; - break; - case 4: - name = "Chari-Baguirmi"; - break; - case 5: - name = "Guera"; - break; - case 6: - name = "Kanem"; - break; - case 7: - name = "Lac"; - break; - case 8: - name = "Logone Occidental"; - break; - case 9: - name = "Logone Oriental"; - break; - case 10: - name = "Mayo-Kebbi"; - break; - case 11: - name = "Moyen-Chari"; - break; - case 12: - name = "Ouaddai"; - break; - case 13: - name = "Salamat"; - break; - case 14: - name = "Tandjile"; - break; - } - } - if (strcmp(country_code,"TG") == 0) { - switch (region_code2) { - case 22: - name = "Centrale"; - break; - case 23: - name = "Kara"; - break; - case 24: - name = "Maritime"; - break; - case 25: - name = "Plateaux"; - break; - case 26: - name = "Savanes"; - break; - } - } - if (strcmp(country_code,"TH") == 0) { - switch (region_code2) { - case 1: - name = "Mae Hong Son"; - break; - case 2: - name = "Chiang Mai"; - break; - case 3: - name = "Chiang Rai"; - break; - case 4: - name = "Nan"; - break; - case 5: - name = "Lamphun"; - break; - case 6: - name = "Lampang"; - break; - case 7: - name = "Phrae"; - break; - case 8: - name = "Tak"; - break; - case 9: - name = "Sukhothai"; - break; - case 10: - name = "Uttaradit"; - break; - case 11: - name = "Kamphaeng Phet"; - break; - case 12: - name = "Phitsanulok"; - break; - case 13: - name = "Phichit"; - break; - case 14: - name = "Phetchabun"; - break; - case 15: - name = "Uthai Thani"; - break; - case 16: - name = "Nakhon Sawan"; - break; - case 17: - name = "Nong Khai"; - break; - case 18: - name = "Loei"; - break; - case 20: - name = "Sakon Nakhon"; - break; - case 21: - name = "Nakhon Phanom"; - break; - case 22: - name = "Khon Kaen"; - break; - case 23: - name = "Kalasin"; - break; - case 24: - name = "Maha Sarakham"; - break; - case 25: - name = "Roi Et"; - break; - case 26: - name = "Chaiyaphum"; - break; - case 27: - name = "Nakhon Ratchasima"; - break; - case 28: - name = "Buriram"; - break; - case 29: - name = "Surin"; - break; - case 30: - name = "Sisaket"; - break; - case 31: - name = "Narathiwat"; - break; - case 32: - name = "Chai Nat"; - break; - case 33: - name = "Sing Buri"; - break; - case 34: - name = "Lop Buri"; - break; - case 35: - name = "Ang Thong"; - break; - case 36: - name = "Phra Nakhon Si Ayutthaya"; - break; - case 37: - name = "Saraburi"; - break; - case 38: - name = "Nonthaburi"; - break; - case 39: - name = "Pathum Thani"; - break; - case 40: - name = "Krung Thep"; - break; - case 41: - name = "Phayao"; - break; - case 42: - name = "Samut Prakan"; - break; - case 43: - name = "Nakhon Nayok"; - break; - case 44: - name = "Chachoengsao"; - break; - case 45: - name = "Prachin Buri"; - break; - case 46: - name = "Chon Buri"; - break; - case 47: - name = "Rayong"; - break; - case 48: - name = "Chanthaburi"; - break; - case 49: - name = "Trat"; - break; - case 50: - name = "Kanchanaburi"; - break; - case 51: - name = "Suphan Buri"; - break; - case 52: - name = "Ratchaburi"; - break; - case 53: - name = "Nakhon Pathom"; - break; - case 54: - name = "Samut Songkhram"; - break; - case 55: - name = "Samut Sakhon"; - break; - case 56: - name = "Phetchaburi"; - break; - case 57: - name = "Prachuap Khiri Khan"; - break; - case 58: - name = "Chumphon"; - break; - case 59: - name = "Ranong"; - break; - case 60: - name = "Surat Thani"; - break; - case 61: - name = "Phangnga"; - break; - case 62: - name = "Phuket"; - break; - case 63: - name = "Krabi"; - break; - case 64: - name = "Nakhon Si Thammarat"; - break; - case 65: - name = "Trang"; - break; - case 66: - name = "Phatthalung"; - break; - case 67: - name = "Satun"; - break; - case 68: - name = "Songkhla"; - break; - case 69: - name = "Pattani"; - break; - case 70: - name = "Yala"; - break; - case 71: - name = "Ubon Ratchathani"; - break; - case 72: - name = "Yasothon"; - break; - case 73: - name = "Nakhon Phanom"; - break; - case 75: - name = "Ubon Ratchathani"; - break; - case 76: - name = "Udon Thani"; - break; - case 77: - name = "Amnat Charoen"; - break; - case 78: - name = "Mukdahan"; - break; - case 79: - name = "Nong Bua Lamphu"; - break; - case 80: - name = "Sa Kaeo"; - break; - } - } - if (strcmp(country_code,"TJ") == 0) { - switch (region_code2) { - case 1: - name = "Kuhistoni Badakhshon"; - break; - case 2: - name = "Khatlon"; - break; - case 3: - name = "Sughd"; - break; - } - } - if (strcmp(country_code,"TM") == 0) { - switch (region_code2) { - case 1: - name = "Ahal"; - break; - case 2: - name = "Balkan"; - break; - case 3: - name = "Dashoguz"; - break; - case 4: - name = "Lebap"; - break; - case 5: - name = "Mary"; - break; - } - } - if (strcmp(country_code,"TN") == 0) { - switch (region_code2) { - case 2: - name = "Kasserine"; - break; - case 3: - name = "Kairouan"; - break; - case 6: - name = "Jendouba"; - break; - case 10: - name = "Qafsah"; - break; - case 14: - name = "El Kef"; - break; - case 15: - name = "Al Mahdia"; - break; - case 16: - name = "Al Munastir"; - break; - case 17: - name = "Bajah"; - break; - case 18: - name = "Bizerte"; - break; - case 19: - name = "Nabeul"; - break; - case 22: - name = "Siliana"; - break; - case 23: - name = "Sousse"; - break; - case 27: - name = "Ben Arous"; - break; - case 28: - name = "Madanin"; - break; - case 29: - name = "Gabes"; - break; - case 31: - name = "Kebili"; - break; - case 32: - name = "Sfax"; - break; - case 33: - name = "Sidi Bou Zid"; - break; - case 34: - name = "Tataouine"; - break; - case 35: - name = "Tozeur"; - break; - case 36: - name = "Tunis"; - break; - case 37: - name = "Zaghouan"; - break; - case 38: - name = "Aiana"; - break; - case 39: - name = "Manouba"; - break; - } - } - if (strcmp(country_code,"TO") == 0) { - switch (region_code2) { - case 1: - name = "Ha"; - break; - case 2: - name = "Tongatapu"; - break; - case 3: - name = "Vava"; - break; - } - } - if (strcmp(country_code,"TR") == 0) { - switch (region_code2) { - case 2: - name = "Adiyaman"; - break; - case 3: - name = "Afyonkarahisar"; - break; - case 4: - name = "Agri"; - break; - case 5: - name = "Amasya"; - break; - case 7: - name = "Antalya"; - break; - case 8: - name = "Artvin"; - break; - case 9: - name = "Aydin"; - break; - case 10: - name = "Balikesir"; - break; - case 11: - name = "Bilecik"; - break; - case 12: - name = "Bingol"; - break; - case 13: - name = "Bitlis"; - break; - case 14: - name = "Bolu"; - break; - case 15: - name = "Burdur"; - break; - case 16: - name = "Bursa"; - break; - case 17: - name = "Canakkale"; - break; - case 19: - name = "Corum"; - break; - case 20: - name = "Denizli"; - break; - case 21: - name = "Diyarbakir"; - break; - case 22: - name = "Edirne"; - break; - case 23: - name = "Elazig"; - break; - case 24: - name = "Erzincan"; - break; - case 25: - name = "Erzurum"; - break; - case 26: - name = "Eskisehir"; - break; - case 28: - name = "Giresun"; - break; - case 31: - name = "Hatay"; - break; - case 32: - name = "Mersin"; - break; - case 33: - name = "Isparta"; - break; - case 34: - name = "Istanbul"; - break; - case 35: - name = "Izmir"; - break; - case 37: - name = "Kastamonu"; - break; - case 38: - name = "Kayseri"; - break; - case 39: - name = "Kirklareli"; - break; - case 40: - name = "Kirsehir"; - break; - case 41: - name = "Kocaeli"; - break; - case 43: - name = "Kutahya"; - break; - case 44: - name = "Malatya"; - break; - case 45: - name = "Manisa"; - break; - case 46: - name = "Kahramanmaras"; - break; - case 48: - name = "Mugla"; - break; - case 49: - name = "Mus"; - break; - case 50: - name = "Nevsehir"; - break; - case 52: - name = "Ordu"; - break; - case 53: - name = "Rize"; - break; - case 54: - name = "Sakarya"; - break; - case 55: - name = "Samsun"; - break; - case 57: - name = "Sinop"; - break; - case 58: - name = "Sivas"; - break; - case 59: - name = "Tekirdag"; - break; - case 60: - name = "Tokat"; - break; - case 61: - name = "Trabzon"; - break; - case 62: - name = "Tunceli"; - break; - case 63: - name = "Sanliurfa"; - break; - case 64: - name = "Usak"; - break; - case 65: - name = "Van"; - break; - case 66: - name = "Yozgat"; - break; - case 68: - name = "Ankara"; - break; - case 69: - name = "Gumushane"; - break; - case 70: - name = "Hakkari"; - break; - case 71: - name = "Konya"; - break; - case 72: - name = "Mardin"; - break; - case 73: - name = "Nigde"; - break; - case 74: - name = "Siirt"; - break; - case 75: - name = "Aksaray"; - break; - case 76: - name = "Batman"; - break; - case 77: - name = "Bayburt"; - break; - case 78: - name = "Karaman"; - break; - case 79: - name = "Kirikkale"; - break; - case 80: - name = "Sirnak"; - break; - case 81: - name = "Adana"; - break; - case 82: - name = "Cankiri"; - break; - case 83: - name = "Gaziantep"; - break; - case 84: - name = "Kars"; - break; - case 85: - name = "Zonguldak"; - break; - case 86: - name = "Ardahan"; - break; - case 87: - name = "Bartin"; - break; - case 88: - name = "Igdir"; - break; - case 89: - name = "Karabuk"; - break; - case 90: - name = "Kilis"; - break; - case 91: - name = "Osmaniye"; - break; - case 92: - name = "Yalova"; - break; - case 93: - name = "Duzce"; - break; - } - } - if (strcmp(country_code,"TT") == 0) { - switch (region_code2) { - case 1: - name = "Arima"; - break; - case 2: - name = "Caroni"; - break; - case 3: - name = "Mayaro"; - break; - case 4: - name = "Nariva"; - break; - case 5: - name = "Port-of-Spain"; - break; - case 6: - name = "Saint Andrew"; - break; - case 7: - name = "Saint David"; - break; - case 8: - name = "Saint George"; - break; - case 9: - name = "Saint Patrick"; - break; - case 10: - name = "San Fernando"; - break; - case 11: - name = "Tobago"; - break; - case 12: - name = "Victoria"; - break; - } - } - if (strcmp(country_code,"TW") == 0) { - switch (region_code2) { - case 1: - name = "Fu-chien"; - break; - case 2: - name = "Kao-hsiung"; - break; - case 3: - name = "T'ai-pei"; - break; - case 4: - name = "T'ai-wan"; - break; - } - } - if (strcmp(country_code,"TZ") == 0) { - switch (region_code2) { - case 2: - name = "Pwani"; - break; - case 3: - name = "Dodoma"; - break; - case 4: - name = "Iringa"; - break; - case 5: - name = "Kigoma"; - break; - case 6: - name = "Kilimanjaro"; - break; - case 7: - name = "Lindi"; - break; - case 8: - name = "Mara"; - break; - case 9: - name = "Mbeya"; - break; - case 10: - name = "Morogoro"; - break; - case 11: - name = "Mtwara"; - break; - case 12: - name = "Mwanza"; - break; - case 13: - name = "Pemba North"; - break; - case 14: - name = "Ruvuma"; - break; - case 15: - name = "Shinyanga"; - break; - case 16: - name = "Singida"; - break; - case 17: - name = "Tabora"; - break; - case 18: - name = "Tanga"; - break; - case 19: - name = "Kagera"; - break; - case 20: - name = "Pemba South"; - break; - case 21: - name = "Zanzibar Central"; - break; - case 22: - name = "Zanzibar North"; - break; - case 23: - name = "Dar es Salaam"; - break; - case 24: - name = "Rukwa"; - break; - case 25: - name = "Zanzibar Urban"; - break; - case 26: - name = "Arusha"; - break; - case 27: - name = "Manyara"; - break; - } - } - if (strcmp(country_code,"UA") == 0) { - switch (region_code2) { - case 1: - name = "Cherkas'ka Oblast'"; - break; - case 2: - name = "Chernihivs'ka Oblast'"; - break; - case 3: - name = "Chernivets'ka Oblast'"; - break; - case 4: - name = "Dnipropetrovs'ka Oblast'"; - break; - case 5: - name = "Donets'ka Oblast'"; - break; - case 6: - name = "Ivano-Frankivs'ka Oblast'"; - break; - case 7: - name = "Kharkivs'ka Oblast'"; - break; - case 8: - name = "Khersons'ka Oblast'"; - break; - case 9: - name = "Khmel'nyts'ka Oblast'"; - break; - case 10: - name = "Kirovohrads'ka Oblast'"; - break; - case 11: - name = "Krym"; - break; - case 12: - name = "Kyyiv"; - break; - case 13: - name = "Kyyivs'ka Oblast'"; - break; - case 14: - name = "Luhans'ka Oblast'"; - break; - case 15: - name = "L'vivs'ka Oblast'"; - break; - case 16: - name = "Mykolayivs'ka Oblast'"; - break; - case 17: - name = "Odes'ka Oblast'"; - break; - case 18: - name = "Poltavs'ka Oblast'"; - break; - case 19: - name = "Rivnens'ka Oblast'"; - break; - case 20: - name = "Sevastopol'"; - break; - case 21: - name = "Sums'ka Oblast'"; - break; - case 22: - name = "Ternopil's'ka Oblast'"; - break; - case 23: - name = "Vinnyts'ka Oblast'"; - break; - case 24: - name = "Volyns'ka Oblast'"; - break; - case 25: - name = "Zakarpats'ka Oblast'"; - break; - case 26: - name = "Zaporiz'ka Oblast'"; - break; - case 27: - name = "Zhytomyrs'ka Oblast'"; - break; - } - } - if (strcmp(country_code,"UG") == 0) { - switch (region_code2) { - case 26: - name = "Apac"; - break; - case 28: - name = "Bundibugyo"; - break; - case 29: - name = "Bushenyi"; - break; - case 30: - name = "Gulu"; - break; - case 31: - name = "Hoima"; - break; - case 33: - name = "Jinja"; - break; - case 36: - name = "Kalangala"; - break; - case 37: - name = "Kampala"; - break; - case 38: - name = "Kamuli"; - break; - case 39: - name = "Kapchorwa"; - break; - case 40: - name = "Kasese"; - break; - case 41: - name = "Kibale"; - break; - case 42: - name = "Kiboga"; - break; - case 43: - name = "Kisoro"; - break; - case 45: - name = "Kotido"; - break; - case 46: - name = "Kumi"; - break; - case 47: - name = "Lira"; - break; - case 50: - name = "Masindi"; - break; - case 52: - name = "Mbarara"; - break; - case 56: - name = "Mubende"; - break; - case 58: - name = "Nebbi"; - break; - case 59: - name = "Ntungamo"; - break; - case 60: - name = "Pallisa"; - break; - case 61: - name = "Rakai"; - break; - case 65: - name = "Adjumani"; - break; - case 66: - name = "Bugiri"; - break; - case 67: - name = "Busia"; - break; - case 69: - name = "Katakwi"; - break; - case 70: - name = "Luwero"; - break; - case 71: - name = "Masaka"; - break; - case 72: - name = "Moyo"; - break; - case 73: - name = "Nakasongola"; - break; - case 74: - name = "Sembabule"; - break; - case 76: - name = "Tororo"; - break; - case 77: - name = "Arua"; - break; - case 78: - name = "Iganga"; - break; - case 79: - name = "Kabarole"; - break; - case 80: - name = "Kaberamaido"; - break; - case 81: - name = "Kamwenge"; - break; - case 82: - name = "Kanungu"; - break; - case 83: - name = "Kayunga"; - break; - case 84: - name = "Kitgum"; - break; - case 85: - name = "Kyenjojo"; - break; - case 86: - name = "Mayuge"; - break; - case 87: - name = "Mbale"; - break; - case 88: - name = "Moroto"; - break; - case 89: - name = "Mpigi"; - break; - case 90: - name = "Mukono"; - break; - case 91: - name = "Nakapiripirit"; - break; - case 92: - name = "Pader"; - break; - case 93: - name = "Rukungiri"; - break; - case 94: - name = "Sironko"; - break; - case 95: - name = "Soroti"; - break; - case 96: - name = "Wakiso"; - break; - case 97: - name = "Yumbe"; - break; - } - } - if (strcmp(country_code,"UY") == 0) { - switch (region_code2) { - case 1: - name = "Artigas"; - break; - case 2: - name = "Canelones"; - break; - case 3: - name = "Cerro Largo"; - break; - case 4: - name = "Colonia"; - break; - case 5: - name = "Durazno"; - break; - case 6: - name = "Flores"; - break; - case 7: - name = "Florida"; - break; - case 8: - name = "Lavalleja"; - break; - case 9: - name = "Maldonado"; - break; - case 10: - name = "Montevideo"; - break; - case 11: - name = "Paysandu"; - break; - case 12: - name = "Rio Negro"; - break; - case 13: - name = "Rivera"; - break; - case 14: - name = "Rocha"; - break; - case 15: - name = "Salto"; - break; - case 16: - name = "San Jose"; - break; - case 17: - name = "Soriano"; - break; - case 18: - name = "Tacuarembo"; - break; - case 19: - name = "Treinta y Tres"; - break; - } - } - if (strcmp(country_code,"UZ") == 0) { - switch (region_code2) { - case 1: - name = "Andijon"; - break; - case 2: - name = "Bukhoro"; - break; - case 3: - name = "Farghona"; - break; - case 4: - name = "Jizzakh"; - break; - case 5: - name = "Khorazm"; - break; - case 6: - name = "Namangan"; - break; - case 7: - name = "Nawoiy"; - break; - case 8: - name = "Qashqadaryo"; - break; - case 9: - name = "Qoraqalpoghiston"; - break; - case 10: - name = "Samarqand"; - break; - case 11: - name = "Sirdaryo"; - break; - case 12: - name = "Surkhondaryo"; - break; - case 13: - name = "Toshkent"; - break; - case 14: - name = "Toshkent"; - break; - } - } - if (strcmp(country_code,"VC") == 0) { - switch (region_code2) { - case 1: - name = "Charlotte"; - break; - case 2: - name = "Saint Andrew"; - break; - case 3: - name = "Saint David"; - break; - case 4: - name = "Saint George"; - break; - case 5: - name = "Saint Patrick"; - break; - case 6: - name = "Grenadines"; - break; - } - } - if (strcmp(country_code,"VE") == 0) { - switch (region_code2) { - case 1: - name = "Amazonas"; - break; - case 2: - name = "Anzoategui"; - break; - case 3: - name = "Apure"; - break; - case 4: - name = "Aragua"; - break; - case 5: - name = "Barinas"; - break; - case 6: - name = "Bolivar"; - break; - case 7: - name = "Carabobo"; - break; - case 8: - name = "Cojedes"; - break; - case 9: - name = "Delta Amacuro"; - break; - case 11: - name = "Falcon"; - break; - case 12: - name = "Guarico"; - break; - case 13: - name = "Lara"; - break; - case 14: - name = "Merida"; - break; - case 15: - name = "Miranda"; - break; - case 16: - name = "Monagas"; - break; - case 17: - name = "Nueva Esparta"; - break; - case 18: - name = "Portuguesa"; - break; - case 19: - name = "Sucre"; - break; - case 20: - name = "Tachira"; - break; - case 21: - name = "Trujillo"; - break; - case 22: - name = "Yaracuy"; - break; - case 23: - name = "Zulia"; - break; - case 24: - name = "Dependencias Federales"; - break; - case 25: - name = "Distrito Federal"; - break; - case 26: - name = "Vargas"; - break; - } - } - if (strcmp(country_code,"VN") == 0) { - switch (region_code2) { - case 1: - name = "An Giang"; - break; - case 3: - name = "Ben Tre"; - break; - case 5: - name = "Cao Bang"; - break; - case 9: - name = "Dong Thap"; - break; - case 13: - name = "Hai Phong"; - break; - case 20: - name = "Ho Chi Minh"; - break; - case 21: - name = "Kien Giang"; - break; - case 23: - name = "Lam Dong"; - break; - case 24: - name = "Long An"; - break; - case 30: - name = "Quang Ninh"; - break; - case 32: - name = "Son La"; - break; - case 33: - name = "Tay Ninh"; - break; - case 34: - name = "Thanh Hoa"; - break; - case 35: - name = "Thai Binh"; - break; - case 37: - name = "Tien Giang"; - break; - case 39: - name = "Lang Son"; - break; - case 43: - name = "An Giang"; - break; - case 44: - name = "Dac Lac"; - break; - case 45: - name = "Dong Nai"; - break; - case 46: - name = "Dong Thap"; - break; - case 47: - name = "Kien Giang"; - break; - case 49: - name = "Song Be"; - break; - case 50: - name = "Vinh Phu"; - break; - case 51: - name = "Ha Noi"; - break; - case 52: - name = "Ho Chi Minh"; - break; - case 53: - name = "Ba Ria-Vung Tau"; - break; - case 54: - name = "Binh Dinh"; - break; - case 55: - name = "Binh Thuan"; - break; - case 58: - name = "Ha Giang"; - break; - case 59: - name = "Ha Tay"; - break; - case 60: - name = "Ha Tinh"; - break; - case 61: - name = "Hoa Binh"; - break; - case 62: - name = "Khanh Hoa"; - break; - case 63: - name = "Kon Tum"; - break; - case 64: - name = "Quang Tri"; - break; - case 65: - name = "Nam Ha"; - break; - case 66: - name = "Nghe An"; - break; - case 67: - name = "Ninh Binh"; - break; - case 68: - name = "Ninh Thuan"; - break; - case 69: - name = "Phu Yen"; - break; - case 70: - name = "Quang Binh"; - break; - case 71: - name = "Quang Ngai"; - break; - case 72: - name = "Quang Tri"; - break; - case 73: - name = "Soc Trang"; - break; - case 74: - name = "Thua Thien"; - break; - case 75: - name = "Tra Vinh"; - break; - case 76: - name = "Tuyen Quang"; - break; - case 77: - name = "Vinh Long"; - break; - case 78: - name = "Da Nang"; - break; - case 79: - name = "Hai Duong"; - break; - case 80: - name = "Ha Nam"; - break; - case 81: - name = "Hung Yen"; - break; - case 82: - name = "Nam Dinh"; - break; - case 83: - name = "Phu Tho"; - break; - case 84: - name = "Quang Nam"; - break; - case 85: - name = "Thai Nguyen"; - break; - case 86: - name = "Vinh Puc Province"; - break; - case 87: - name = "Can Tho"; - break; - case 88: - name = "Dak Lak"; - break; - case 89: - name = "Lai Chau"; - break; - case 90: - name = "Lao Cai"; - break; - case 91: - name = "Dak Nong"; - break; - case 92: - name = "Dien Bien"; - break; - case 93: - name = "Hau Giang"; - break; - } - } - if (strcmp(country_code,"VU") == 0) { - switch (region_code2) { - case 5: - name = "Ambrym"; - break; - case 6: - name = "Aoba"; - break; - case 7: - name = "Torba"; - break; - case 8: - name = "Efate"; - break; - case 9: - name = "Epi"; - break; - case 10: - name = "Malakula"; - break; - case 11: - name = "Paama"; - break; - case 12: - name = "Pentecote"; - break; - case 13: - name = "Sanma"; - break; - case 14: - name = "Shepherd"; - break; - case 15: - name = "Tafea"; - break; - case 16: - name = "Malampa"; - break; - case 17: - name = "Penama"; - break; - case 18: - name = "Shefa"; - break; - } - } - if (strcmp(country_code,"WS") == 0) { - switch (region_code2) { - case 2: - name = "Aiga-i-le-Tai"; - break; - case 3: - name = "Atua"; - break; - case 4: - name = "Fa"; - break; - case 5: - name = "Gaga"; - break; - case 6: - name = "Va"; - break; - case 7: - name = "Gagaifomauga"; - break; - case 8: - name = "Palauli"; - break; - case 9: - name = "Satupa"; - break; - case 10: - name = "Tuamasaga"; - break; - case 11: - name = "Vaisigano"; - break; - } - } - if (strcmp(country_code,"YE") == 0) { - switch (region_code2) { - case 1: - name = "Abyan"; - break; - case 2: - name = "Adan"; - break; - case 3: - name = "Al Mahrah"; - break; - case 4: - name = "Hadramawt"; - break; - case 5: - name = "Shabwah"; - break; - case 6: - name = "Al Ghaydah"; - break; - case 8: - name = "Al Hudaydah"; - break; - case 10: - name = "Al Mahwit"; - break; - case 11: - name = "Dhamar"; - break; - case 14: - name = "Ma'rib"; - break; - case 15: - name = "Sa"; - break; - case 16: - name = "San"; - break; - case 20: - name = "Al Bayda'"; - break; - case 21: - name = "Al Jawf"; - break; - case 22: - name = "Hajjah"; - break; - case 23: - name = "Ibb"; - break; - case 24: - name = "Lahij"; - break; - case 25: - name = "Ta"; - break; - } - } - if (strcmp(country_code,"ZA") == 0) { - switch (region_code2) { - case 1: - name = "North-Western Province"; - break; - case 2: - name = "KwaZulu-Natal"; - break; - case 3: - name = "Free State"; - break; - case 5: - name = "Eastern Cape"; - break; - case 6: - name = "Gauteng"; - break; - case 7: - name = "Mpumalanga"; - break; - case 8: - name = "Northern Cape"; - break; - case 9: - name = "Limpopo"; - break; - case 10: - name = "North-West"; - break; - case 11: - name = "Western Cape"; - break; - } - } - if (strcmp(country_code,"ZM") == 0) { - switch (region_code2) { - case 1: - name = "Western"; - break; - case 2: - name = "Central"; - break; - case 3: - name = "Eastern"; - break; - case 4: - name = "Luapula"; - break; - case 5: - name = "Northern"; - break; - case 6: - name = "North-Western"; - break; - case 7: - name = "Southern"; - break; - case 8: - name = "Copperbelt"; - break; - case 9: - name = "Lusaka"; - break; - } - } - if (strcmp(country_code,"ZW") == 0) { - switch (region_code2) { - case 1: - name = "Manicaland"; - break; - case 2: - name = "Midlands"; - break; - case 3: - name = "Mashonaland Central"; - break; - case 4: - name = "Mashonaland East"; - break; - case 5: - name = "Mashonaland West"; - break; - case 6: - name = "Matabeleland North"; - break; - case 7: - name = "Matabeleland South"; - break; - case 8: - name = "Masvingo"; - break; - case 9: - name = "Bulawayo"; - break; - case 10: - name = "Harare"; - break; - } - } - return name; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c deleted file mode 100644 index 9db5fb8a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/timeZone.c +++ /dev/null @@ -1,2077 +0,0 @@ -#include <string.h> -const char* GeoIP_time_zone_by_country_and_region(const char * country,const char * region) { - const char* timezone = NULL; - if (country == NULL) { - return NULL; - } - if (region == NULL) { - region = ""; - } - if ( strcmp (country, "AD") == 0 ) { - timezone = "Europe/Andorra"; - } - else if ( strcmp (country, "AE") == 0 ) { - timezone = "Asia/Dubai"; - } - else if ( strcmp (country, "AF") == 0 ) { - timezone = "Asia/Kabul"; - } - else if ( strcmp (country, "AG") == 0 ) { - timezone = "America/Antigua"; - } - else if ( strcmp (country, "AI") == 0 ) { - timezone = "America/Anguilla"; - } - else if ( strcmp (country, "AL") == 0 ) { - timezone = "Europe/Tirane"; - } - else if ( strcmp (country, "AM") == 0 ) { - timezone = "Asia/Yerevan"; - } - else if ( strcmp (country, "AO") == 0 ) { - timezone = "Africa/Luanda"; - } - else if ( strcmp (country, "AR") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Argentina/Catamarca"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Argentina/Tucuman"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "America/Argentina/Rio_Gallegos"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "America/Argentina/Cordoba"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "America/Argentina/Tucuman"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "America/Argentina/Tucuman"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "America/Argentina/Jujuy"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "America/Argentina/San_Luis"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "America/Argentina/La_Rioja"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "America/Argentina/Mendoza"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "America/Argentina/San_Luis"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "America/Argentina/Salta"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "America/Argentina/San_Juan"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "America/Argentina/San_Luis"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "America/Argentina/Rio_Gallegos"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "America/Argentina/Buenos_Aires"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "America/Argentina/Catamarca"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "America/Argentina/Ushuaia"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "America/Argentina/Tucuman"; - } - } - else if ( strcmp (country, "AS") == 0 ) { - timezone = "US/Samoa"; - } - else if ( strcmp (country, "AT") == 0 ) { - timezone = "Europe/Vienna"; - } - else if ( strcmp (country, "AU") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Australia/Canberra"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Australia/NSW"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Australia/North"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Australia/Queensland"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Australia/South"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Australia/Tasmania"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Australia/Victoria"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Australia/West"; - } - } - else if ( strcmp (country, "AW") == 0 ) { - timezone = "America/Aruba"; - } - else if ( strcmp (country, "AX") == 0 ) { - timezone = "Europe/Mariehamn"; - } - else if ( strcmp (country, "AZ") == 0 ) { - timezone = "Asia/Baku"; - } - else if ( strcmp (country, "BA") == 0 ) { - timezone = "Europe/Sarajevo"; - } - else if ( strcmp (country, "BB") == 0 ) { - timezone = "America/Barbados"; - } - else if ( strcmp (country, "BD") == 0 ) { - timezone = "Asia/Dhaka"; - } - else if ( strcmp (country, "BE") == 0 ) { - timezone = "Europe/Brussels"; - } - else if ( strcmp (country, "BF") == 0 ) { - timezone = "Africa/Ouagadougou"; - } - else if ( strcmp (country, "BG") == 0 ) { - timezone = "Europe/Sofia"; - } - else if ( strcmp (country, "BH") == 0 ) { - timezone = "Asia/Bahrain"; - } - else if ( strcmp (country, "BI") == 0 ) { - timezone = "Africa/Bujumbura"; - } - else if ( strcmp (country, "BJ") == 0 ) { - timezone = "Africa/Porto-Novo"; - } - else if ( strcmp (country, "BL") == 0 ) { - timezone = "America/St_Barthelemy"; - } - else if ( strcmp (country, "BM") == 0 ) { - timezone = "Atlantic/Bermuda"; - } - else if ( strcmp (country, "BN") == 0 ) { - timezone = "Asia/Brunei"; - } - else if ( strcmp (country, "BO") == 0 ) { - timezone = "America/La_Paz"; - } - else if ( strcmp (country, "BQ") == 0 ) { - timezone = "America/Curacao"; - } - else if ( strcmp (country, "BR") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "America/Rio_Branco"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Maceio"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "America/Manaus"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "America/Bahia"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "America/Fortaleza"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "America/Campo_Grande"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "America/Belem"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "America/Cuiaba"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "America/Belem"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "America/Recife"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "America/Fortaleza"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "America/Recife"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "America/Porto_Velho"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "America/Boa_Vista"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "28") == 0 ) { - timezone = "America/Maceio"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "America/Sao_Paulo"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "America/Recife"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "America/Araguaina"; - } - } - else if ( strcmp (country, "BS") == 0 ) { - timezone = "America/Nassau"; - } - else if ( strcmp (country, "BT") == 0 ) { - timezone = "Asia/Thimphu"; - } - else if ( strcmp (country, "BW") == 0 ) { - timezone = "Africa/Gaborone"; - } - else if ( strcmp (country, "BY") == 0 ) { - timezone = "Europe/Minsk"; - } - else if ( strcmp (country, "BZ") == 0 ) { - timezone = "America/Belize"; - } - else if ( strcmp (country, "CA") == 0 ) { - if ( strcmp (region, "AB") == 0 ) { - timezone = "America/Edmonton"; - } - else if ( strcmp (region, "BC") == 0 ) { - timezone = "America/Vancouver"; - } - else if ( strcmp (region, "MB") == 0 ) { - timezone = "America/Winnipeg"; - } - else if ( strcmp (region, "NB") == 0 ) { - timezone = "America/Halifax"; - } - else if ( strcmp (region, "NL") == 0 ) { - timezone = "America/St_Johns"; - } - else if ( strcmp (region, "NS") == 0 ) { - timezone = "America/Halifax"; - } - else if ( strcmp (region, "NT") == 0 ) { - timezone = "America/Yellowknife"; - } - else if ( strcmp (region, "NU") == 0 ) { - timezone = "America/Rankin_Inlet"; - } - else if ( strcmp (region, "ON") == 0 ) { - timezone = "America/Rainy_River"; - } - else if ( strcmp (region, "PE") == 0 ) { - timezone = "America/Halifax"; - } - else if ( strcmp (region, "QC") == 0 ) { - timezone = "America/Montreal"; - } - else if ( strcmp (region, "SK") == 0 ) { - timezone = "America/Regina"; - } - else if ( strcmp (region, "YT") == 0 ) { - timezone = "America/Whitehorse"; - } - } - else if ( strcmp (country, "CC") == 0 ) { - timezone = "Indian/Cocos"; - } - else if ( strcmp (country, "CD") == 0 ) { - if ( strcmp (region, "02") == 0 ) { - timezone = "Africa/Kinshasa"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Africa/Lubumbashi"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Africa/Kinshasa"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Africa/Kinshasa"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Africa/Lubumbashi"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Africa/Lubumbashi"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Africa/Lubumbashi"; - } - } - else if ( strcmp (country, "CF") == 0 ) { - timezone = "Africa/Bangui"; - } - else if ( strcmp (country, "CG") == 0 ) { - timezone = "Africa/Brazzaville"; - } - else if ( strcmp (country, "CH") == 0 ) { - timezone = "Europe/Zurich"; - } - else if ( strcmp (country, "CI") == 0 ) { - timezone = "Africa/Abidjan"; - } - else if ( strcmp (country, "CK") == 0 ) { - timezone = "Pacific/Rarotonga"; - } - else if ( strcmp (country, "CL") == 0 ) { - timezone = "Chile/Continental"; - } - else if ( strcmp (country, "CM") == 0 ) { - timezone = "Africa/Lagos"; - } - else if ( strcmp (country, "CN") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Urumqi"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Asia/Harbin"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "28") == 0 ) { - timezone = "Asia/Shanghai"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "32") == 0 ) { - timezone = "Asia/Chongqing"; - } - else if ( strcmp (region, "33") == 0 ) { - timezone = "Asia/Chongqing"; - } - } - else if ( strcmp (country, "CO") == 0 ) { - timezone = "America/Bogota"; - } - else if ( strcmp (country, "CR") == 0 ) { - timezone = "America/Costa_Rica"; - } - else if ( strcmp (country, "CU") == 0 ) { - timezone = "America/Havana"; - } - else if ( strcmp (country, "CV") == 0 ) { - timezone = "Atlantic/Cape_Verde"; - } - else if ( strcmp (country, "CW") == 0 ) { - timezone = "America/Curacao"; - } - else if ( strcmp (country, "CX") == 0 ) { - timezone = "Indian/Christmas"; - } - else if ( strcmp (country, "CY") == 0 ) { - timezone = "Asia/Nicosia"; - } - else if ( strcmp (country, "CZ") == 0 ) { - timezone = "Europe/Prague"; - } - else if ( strcmp (country, "DE") == 0 ) { - timezone = "Europe/Berlin"; - } - else if ( strcmp (country, "DJ") == 0 ) { - timezone = "Africa/Djibouti"; - } - else if ( strcmp (country, "DK") == 0 ) { - timezone = "Europe/Copenhagen"; - } - else if ( strcmp (country, "DM") == 0 ) { - timezone = "America/Dominica"; - } - else if ( strcmp (country, "DO") == 0 ) { - timezone = "America/Santo_Domingo"; - } - else if ( strcmp (country, "DZ") == 0 ) { - timezone = "Africa/Algiers"; - } - else if ( strcmp (country, "EC") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Pacific/Galapagos"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "America/Guayaquil"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "America/Guayaquil"; - } - } - else if ( strcmp (country, "EE") == 0 ) { - timezone = "Europe/Tallinn"; - } - else if ( strcmp (country, "EG") == 0 ) { - timezone = "Africa/Cairo"; - } - else if ( strcmp (country, "EH") == 0 ) { - timezone = "Africa/El_Aaiun"; - } - else if ( strcmp (country, "ER") == 0 ) { - timezone = "Africa/Asmera"; - } - else if ( strcmp (country, "ES") == 0 ) { - if ( strcmp (region, "07") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "32") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "34") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "39") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "51") == 0 ) { - timezone = "Africa/Ceuta"; - } - else if ( strcmp (region, "52") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "53") == 0 ) { - timezone = "Atlantic/Canary"; - } - else if ( strcmp (region, "54") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "55") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "56") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "57") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "58") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "59") == 0 ) { - timezone = "Europe/Madrid"; - } - else if ( strcmp (region, "60") == 0 ) { - timezone = "Europe/Madrid"; - } - } - else if ( strcmp (country, "ET") == 0 ) { - timezone = "Africa/Addis_Ababa"; - } - else if ( strcmp (country, "FI") == 0 ) { - timezone = "Europe/Helsinki"; - } - else if ( strcmp (country, "FJ") == 0 ) { - timezone = "Pacific/Fiji"; - } - else if ( strcmp (country, "FK") == 0 ) { - timezone = "Atlantic/Stanley"; - } - else if ( strcmp (country, "FO") == 0 ) { - timezone = "Atlantic/Faeroe"; - } - else if ( strcmp (country, "FR") == 0 ) { - timezone = "Europe/Paris"; - } - else if ( strcmp (country, "GA") == 0 ) { - timezone = "Africa/Libreville"; - } - else if ( strcmp (country, "GB") == 0 ) { - timezone = "Europe/London"; - } - else if ( strcmp (country, "GD") == 0 ) { - timezone = "America/Grenada"; - } - else if ( strcmp (country, "GE") == 0 ) { - timezone = "Asia/Tbilisi"; - } - else if ( strcmp (country, "GF") == 0 ) { - timezone = "America/Cayenne"; - } - else if ( strcmp (country, "GG") == 0 ) { - timezone = "Europe/Guernsey"; - } - else if ( strcmp (country, "GH") == 0 ) { - timezone = "Africa/Accra"; - } - else if ( strcmp (country, "GI") == 0 ) { - timezone = "Europe/Gibraltar"; - } - else if ( strcmp (country, "GL") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "America/Thule"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Godthab"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Godthab"; - } - } - else if ( strcmp (country, "GM") == 0 ) { - timezone = "Africa/Banjul"; - } - else if ( strcmp (country, "GN") == 0 ) { - timezone = "Africa/Conakry"; - } - else if ( strcmp (country, "GP") == 0 ) { - timezone = "America/Guadeloupe"; - } - else if ( strcmp (country, "GQ") == 0 ) { - timezone = "Africa/Malabo"; - } - else if ( strcmp (country, "GR") == 0 ) { - timezone = "Europe/Athens"; - } - else if ( strcmp (country, "GS") == 0 ) { - timezone = "Atlantic/South_Georgia"; - } - else if ( strcmp (country, "GT") == 0 ) { - timezone = "America/Guatemala"; - } - else if ( strcmp (country, "GU") == 0 ) { - timezone = "Pacific/Guam"; - } - else if ( strcmp (country, "GW") == 0 ) { - timezone = "Africa/Bissau"; - } - else if ( strcmp (country, "GY") == 0 ) { - timezone = "America/Guyana"; - } - else if ( strcmp (country, "HK") == 0 ) { - timezone = "Asia/Hong_Kong"; - } - else if ( strcmp (country, "HN") == 0 ) { - timezone = "America/Tegucigalpa"; - } - else if ( strcmp (country, "HR") == 0 ) { - timezone = "Europe/Zagreb"; - } - else if ( strcmp (country, "HT") == 0 ) { - timezone = "America/Port-au-Prince"; - } - else if ( strcmp (country, "HU") == 0 ) { - timezone = "Europe/Budapest"; - } - else if ( strcmp (country, "ID") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Jayapura"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "Asia/Pontianak"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "Asia/Jakarta"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "Asia/Makassar"; - } - else if ( strcmp (region, "33") == 0 ) { - timezone = "Asia/Jakarta"; - } - } - else if ( strcmp (country, "IE") == 0 ) { - timezone = "Europe/Dublin"; - } - else if ( strcmp (country, "IL") == 0 ) { - timezone = "Asia/Jerusalem"; - } - else if ( strcmp (country, "IM") == 0 ) { - timezone = "Europe/Isle_of_Man"; - } - else if ( strcmp (country, "IN") == 0 ) { - timezone = "Asia/Calcutta"; - } - else if ( strcmp (country, "IO") == 0 ) { - timezone = "Indian/Chagos"; - } - else if ( strcmp (country, "IQ") == 0 ) { - timezone = "Asia/Baghdad"; - } - else if ( strcmp (country, "IR") == 0 ) { - timezone = "Asia/Tehran"; - } - else if ( strcmp (country, "IS") == 0 ) { - timezone = "Atlantic/Reykjavik"; - } - else if ( strcmp (country, "IT") == 0 ) { - timezone = "Europe/Rome"; - } - else if ( strcmp (country, "JE") == 0 ) { - timezone = "Europe/Jersey"; - } - else if ( strcmp (country, "JM") == 0 ) { - timezone = "America/Jamaica"; - } - else if ( strcmp (country, "JO") == 0 ) { - timezone = "Asia/Amman"; - } - else if ( strcmp (country, "JP") == 0 ) { - timezone = "Asia/Tokyo"; - } - else if ( strcmp (country, "KE") == 0 ) { - timezone = "Africa/Nairobi"; - } - else if ( strcmp (country, "KG") == 0 ) { - timezone = "Asia/Bishkek"; - } - else if ( strcmp (country, "KH") == 0 ) { - timezone = "Asia/Phnom_Penh"; - } - else if ( strcmp (country, "KI") == 0 ) { - timezone = "Pacific/Tarawa"; - } - else if ( strcmp (country, "KM") == 0 ) { - timezone = "Indian/Comoro"; - } - else if ( strcmp (country, "KN") == 0 ) { - timezone = "America/St_Kitts"; - } - else if ( strcmp (country, "KP") == 0 ) { - timezone = "Asia/Pyongyang"; - } - else if ( strcmp (country, "KR") == 0 ) { - timezone = "Asia/Seoul"; - } - else if ( strcmp (country, "KW") == 0 ) { - timezone = "Asia/Kuwait"; - } - else if ( strcmp (country, "KY") == 0 ) { - timezone = "America/Cayman"; - } - else if ( strcmp (country, "KZ") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Almaty"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Almaty"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Aqtobe"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Aqtau"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Oral"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Aqtau"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Almaty"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Aqtobe"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Qyzylorda"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Almaty"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Asia/Aqtobe"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Asia/Almaty"; - } - } - else if ( strcmp (country, "LA") == 0 ) { - timezone = "Asia/Vientiane"; - } - else if ( strcmp (country, "LB") == 0 ) { - timezone = "Asia/Beirut"; - } - else if ( strcmp (country, "LC") == 0 ) { - timezone = "America/St_Lucia"; - } - else if ( strcmp (country, "LI") == 0 ) { - timezone = "Europe/Vaduz"; - } - else if ( strcmp (country, "LK") == 0 ) { - timezone = "Asia/Colombo"; - } - else if ( strcmp (country, "LR") == 0 ) { - timezone = "Africa/Monrovia"; - } - else if ( strcmp (country, "LS") == 0 ) { - timezone = "Africa/Maseru"; - } - else if ( strcmp (country, "LT") == 0 ) { - timezone = "Europe/Vilnius"; - } - else if ( strcmp (country, "LU") == 0 ) { - timezone = "Europe/Luxembourg"; - } - else if ( strcmp (country, "LV") == 0 ) { - timezone = "Europe/Riga"; - } - else if ( strcmp (country, "LY") == 0 ) { - timezone = "Africa/Tripoli"; - } - else if ( strcmp (country, "MA") == 0 ) { - timezone = "Africa/Casablanca"; - } - else if ( strcmp (country, "MC") == 0 ) { - timezone = "Europe/Monaco"; - } - else if ( strcmp (country, "MD") == 0 ) { - timezone = "Europe/Chisinau"; - } - else if ( strcmp (country, "ME") == 0 ) { - timezone = "Europe/Podgorica"; - } - else if ( strcmp (country, "MF") == 0 ) { - timezone = "America/Marigot"; - } - else if ( strcmp (country, "MG") == 0 ) { - timezone = "Indian/Antananarivo"; - } - else if ( strcmp (country, "MK") == 0 ) { - timezone = "Europe/Skopje"; - } - else if ( strcmp (country, "ML") == 0 ) { - timezone = "Africa/Bamako"; - } - else if ( strcmp (country, "MM") == 0 ) { - timezone = "Asia/Rangoon"; - } - else if ( strcmp (country, "MN") == 0 ) { - timezone = "Asia/Choibalsan"; - } - else if ( strcmp (country, "MO") == 0 ) { - timezone = "Asia/Macao"; - } - else if ( strcmp (country, "MP") == 0 ) { - timezone = "Pacific/Saipan"; - } - else if ( strcmp (country, "MQ") == 0 ) { - timezone = "America/Martinique"; - } - else if ( strcmp (country, "MR") == 0 ) { - timezone = "Africa/Nouakchott"; - } - else if ( strcmp (country, "MS") == 0 ) { - timezone = "America/Montserrat"; - } - else if ( strcmp (country, "MT") == 0 ) { - timezone = "Europe/Malta"; - } - else if ( strcmp (country, "MU") == 0 ) { - timezone = "Indian/Mauritius"; - } - else if ( strcmp (country, "MV") == 0 ) { - timezone = "Indian/Maldives"; - } - else if ( strcmp (country, "MW") == 0 ) { - timezone = "Africa/Blantyre"; - } - else if ( strcmp (country, "MX") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "America/Tijuana"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "America/Hermosillo"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "America/Merida"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "America/Chihuahua"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "America/Monterrey"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "America/Mazatlan"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "America/Mazatlan"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "America/Chihuahua"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "America/Mazatlan"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "America/Monterrey"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "America/Cancun"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "America/Mazatlan"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "America/Hermosillo"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "America/Merida"; - } - else if ( strcmp (region, "28") == 0 ) { - timezone = "America/Monterrey"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "America/Mexico_City"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "America/Merida"; - } - else if ( strcmp (region, "32") == 0 ) { - timezone = "America/Monterrey"; - } - } - else if ( strcmp (country, "MY") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Kuching"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Kuala_Lumpur"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Kuching"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Asia/Kuching"; - } - } - else if ( strcmp (country, "MZ") == 0 ) { - timezone = "Africa/Maputo"; - } - else if ( strcmp (country, "NA") == 0 ) { - timezone = "Africa/Windhoek"; - } - else if ( strcmp (country, "NC") == 0 ) { - timezone = "Pacific/Noumea"; - } - else if ( strcmp (country, "NE") == 0 ) { - timezone = "Africa/Niamey"; - } - else if ( strcmp (country, "NF") == 0 ) { - timezone = "Pacific/Norfolk"; - } - else if ( strcmp (country, "NG") == 0 ) { - timezone = "Africa/Lagos"; - } - else if ( strcmp (country, "NI") == 0 ) { - timezone = "America/Managua"; - } - else if ( strcmp (country, "NL") == 0 ) { - timezone = "Europe/Amsterdam"; - } - else if ( strcmp (country, "NO") == 0 ) { - timezone = "Europe/Oslo"; - } - else if ( strcmp (country, "NP") == 0 ) { - timezone = "Asia/Katmandu"; - } - else if ( strcmp (country, "NR") == 0 ) { - timezone = "Pacific/Nauru"; - } - else if ( strcmp (country, "NU") == 0 ) { - timezone = "Pacific/Niue"; - } - else if ( strcmp (country, "NZ") == 0 ) { - if ( strcmp (region, "85") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "E7") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "E8") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "E9") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F1") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F2") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F3") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F4") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F5") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F7") == 0 ) { - timezone = "Pacific/Chatham"; - } - else if ( strcmp (region, "F8") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "F9") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "G1") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "G2") == 0 ) { - timezone = "Pacific/Auckland"; - } - else if ( strcmp (region, "G3") == 0 ) { - timezone = "Pacific/Auckland"; - } - } - else if ( strcmp (country, "OM") == 0 ) { - timezone = "Asia/Muscat"; - } - else if ( strcmp (country, "PA") == 0 ) { - timezone = "America/Panama"; - } - else if ( strcmp (country, "PE") == 0 ) { - timezone = "America/Lima"; - } - else if ( strcmp (country, "PF") == 0 ) { - timezone = "Pacific/Marquesas"; - } - else if ( strcmp (country, "PG") == 0 ) { - timezone = "Pacific/Port_Moresby"; - } - else if ( strcmp (country, "PH") == 0 ) { - timezone = "Asia/Manila"; - } - else if ( strcmp (country, "PK") == 0 ) { - timezone = "Asia/Karachi"; - } - else if ( strcmp (country, "PL") == 0 ) { - timezone = "Europe/Warsaw"; - } - else if ( strcmp (country, "PM") == 0 ) { - timezone = "America/Miquelon"; - } - else if ( strcmp (country, "PN") == 0 ) { - timezone = "Pacific/Pitcairn"; - } - else if ( strcmp (country, "PR") == 0 ) { - timezone = "America/Puerto_Rico"; - } - else if ( strcmp (country, "PS") == 0 ) { - timezone = "Asia/Gaza"; - } - else if ( strcmp (country, "PT") == 0 ) { - if ( strcmp (region, "02") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Atlantic/Madeira"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Europe/Lisbon"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Europe/Lisbon"; - } - } - else if ( strcmp (country, "PW") == 0 ) { - timezone = "Pacific/Palau"; - } - else if ( strcmp (country, "PY") == 0 ) { - timezone = "America/Asuncion"; - } - else if ( strcmp (country, "QA") == 0 ) { - timezone = "Asia/Qatar"; - } - else if ( strcmp (country, "RE") == 0 ) { - timezone = "Indian/Reunion"; - } - else if ( strcmp (country, "RO") == 0 ) { - timezone = "Europe/Bucharest"; - } - else if ( strcmp (country, "RS") == 0 ) { - timezone = "Europe/Belgrade"; - } - else if ( strcmp (country, "RU") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Novokuznetsk"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Asia/Novosibirsk"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Asia/Vladivostok"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Asia/Anadyr"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Asia/Krasnoyarsk"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "Europe/Kaliningrad"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "Asia/Kamchatka"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "28") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "29") == 0 ) { - timezone = "Asia/Novokuznetsk"; - } - else if ( strcmp (region, "30") == 0 ) { - timezone = "Asia/Vladivostok"; - } - else if ( strcmp (region, "31") == 0 ) { - timezone = "Asia/Krasnoyarsk"; - } - else if ( strcmp (region, "32") == 0 ) { - timezone = "Asia/Omsk"; - } - else if ( strcmp (region, "33") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "34") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "35") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "36") == 0 ) { - timezone = "Asia/Anadyr"; - } - else if ( strcmp (region, "37") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "38") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "39") == 0 ) { - timezone = "Asia/Krasnoyarsk"; - } - else if ( strcmp (region, "40") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "41") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "42") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "43") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "44") == 0 ) { - timezone = "Asia/Magadan"; - } - else if ( strcmp (region, "45") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "46") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "47") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "48") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "49") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "50") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "51") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "52") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "53") == 0 ) { - timezone = "Asia/Novosibirsk"; - } - else if ( strcmp (region, "54") == 0 ) { - timezone = "Asia/Omsk"; - } - else if ( strcmp (region, "55") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "56") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "57") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "58") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "59") == 0 ) { - timezone = "Asia/Vladivostok"; - } - else if ( strcmp (region, "60") == 0 ) { - timezone = "Europe/Kaliningrad"; - } - else if ( strcmp (region, "61") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "62") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "63") == 0 ) { - timezone = "Asia/Yakutsk"; - } - else if ( strcmp (region, "64") == 0 ) { - timezone = "Asia/Sakhalin"; - } - else if ( strcmp (region, "65") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "66") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "67") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "68") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "69") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "70") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "71") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "72") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "73") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "74") == 0 ) { - timezone = "Asia/Krasnoyarsk"; - } - else if ( strcmp (region, "75") == 0 ) { - timezone = "Asia/Novosibirsk"; - } - else if ( strcmp (region, "76") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "77") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "78") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "79") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "80") == 0 ) { - timezone = "Asia/Yekaterinburg"; - } - else if ( strcmp (region, "81") == 0 ) { - timezone = "Europe/Samara"; - } - else if ( strcmp (region, "82") == 0 ) { - timezone = "Asia/Irkutsk"; - } - else if ( strcmp (region, "83") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "84") == 0 ) { - timezone = "Europe/Volgograd"; - } - else if ( strcmp (region, "85") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "86") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "87") == 0 ) { - timezone = "Asia/Novosibirsk"; - } - else if ( strcmp (region, "88") == 0 ) { - timezone = "Europe/Moscow"; - } - else if ( strcmp (region, "89") == 0 ) { - timezone = "Asia/Vladivostok"; - } - } - else if ( strcmp (country, "RW") == 0 ) { - timezone = "Africa/Kigali"; - } - else if ( strcmp (country, "SA") == 0 ) { - timezone = "Asia/Riyadh"; - } - else if ( strcmp (country, "SB") == 0 ) { - timezone = "Pacific/Guadalcanal"; - } - else if ( strcmp (country, "SC") == 0 ) { - timezone = "Indian/Mahe"; - } - else if ( strcmp (country, "SD") == 0 ) { - timezone = "Africa/Khartoum"; - } - else if ( strcmp (country, "SE") == 0 ) { - timezone = "Europe/Stockholm"; - } - else if ( strcmp (country, "SG") == 0 ) { - timezone = "Asia/Singapore"; - } - else if ( strcmp (country, "SH") == 0 ) { - timezone = "Atlantic/St_Helena"; - } - else if ( strcmp (country, "SI") == 0 ) { - timezone = "Europe/Ljubljana"; - } - else if ( strcmp (country, "SJ") == 0 ) { - timezone = "Arctic/Longyearbyen"; - } - else if ( strcmp (country, "SK") == 0 ) { - timezone = "Europe/Bratislava"; - } - else if ( strcmp (country, "SL") == 0 ) { - timezone = "Africa/Freetown"; - } - else if ( strcmp (country, "SM") == 0 ) { - timezone = "Europe/San_Marino"; - } - else if ( strcmp (country, "SN") == 0 ) { - timezone = "Africa/Dakar"; - } - else if ( strcmp (country, "SO") == 0 ) { - timezone = "Africa/Mogadishu"; - } - else if ( strcmp (country, "SR") == 0 ) { - timezone = "America/Paramaribo"; - } - else if ( strcmp (country, "ST") == 0 ) { - timezone = "Africa/Sao_Tome"; - } - else if ( strcmp (country, "SV") == 0 ) { - timezone = "America/El_Salvador"; - } - else if ( strcmp (country, "SX") == 0 ) { - timezone = "America/Curacao"; - } - else if ( strcmp (country, "SY") == 0 ) { - timezone = "Asia/Damascus"; - } - else if ( strcmp (country, "SZ") == 0 ) { - timezone = "Africa/Mbabane"; - } - else if ( strcmp (country, "TC") == 0 ) { - timezone = "America/Grand_Turk"; - } - else if ( strcmp (country, "TD") == 0 ) { - timezone = "Africa/Ndjamena"; - } - else if ( strcmp (country, "TF") == 0 ) { - timezone = "Indian/Kerguelen"; - } - else if ( strcmp (country, "TG") == 0 ) { - timezone = "Africa/Lome"; - } - else if ( strcmp (country, "TH") == 0 ) { - timezone = "Asia/Bangkok"; - } - else if ( strcmp (country, "TJ") == 0 ) { - timezone = "Asia/Dushanbe"; - } - else if ( strcmp (country, "TK") == 0 ) { - timezone = "Pacific/Fakaofo"; - } - else if ( strcmp (country, "TL") == 0 ) { - timezone = "Asia/Dili"; - } - else if ( strcmp (country, "TM") == 0 ) { - timezone = "Asia/Ashgabat"; - } - else if ( strcmp (country, "TN") == 0 ) { - timezone = "Africa/Tunis"; - } - else if ( strcmp (country, "TO") == 0 ) { - timezone = "Pacific/Tongatapu"; - } - else if ( strcmp (country, "TR") == 0 ) { - timezone = "Asia/Istanbul"; - } - else if ( strcmp (country, "TT") == 0 ) { - timezone = "America/Port_of_Spain"; - } - else if ( strcmp (country, "TV") == 0 ) { - timezone = "Pacific/Funafuti"; - } - else if ( strcmp (country, "TW") == 0 ) { - timezone = "Asia/Taipei"; - } - else if ( strcmp (country, "TZ") == 0 ) { - timezone = "Africa/Dar_es_Salaam"; - } - else if ( strcmp (country, "UA") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "04") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "05") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Europe/Simferopol"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "11") == 0 ) { - timezone = "Europe/Simferopol"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "15") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "16") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "17") == 0 ) { - timezone = "Europe/Simferopol"; - } - else if ( strcmp (region, "18") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "19") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "20") == 0 ) { - timezone = "Europe/Simferopol"; - } - else if ( strcmp (region, "21") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "22") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "23") == 0 ) { - timezone = "Europe/Kiev"; - } - else if ( strcmp (region, "24") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "25") == 0 ) { - timezone = "Europe/Uzhgorod"; - } - else if ( strcmp (region, "26") == 0 ) { - timezone = "Europe/Zaporozhye"; - } - else if ( strcmp (region, "27") == 0 ) { - timezone = "Europe/Kiev"; - } - } - else if ( strcmp (country, "UG") == 0 ) { - timezone = "Africa/Kampala"; - } - else if ( strcmp (country, "US") == 0 ) { - if ( strcmp (region, "AK") == 0 ) { - timezone = "America/Anchorage"; - } - else if ( strcmp (region, "AL") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "AR") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "AZ") == 0 ) { - timezone = "America/Phoenix"; - } - else if ( strcmp (region, "CA") == 0 ) { - timezone = "America/Los_Angeles"; - } - else if ( strcmp (region, "CO") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "CT") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "DC") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "DE") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "FL") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "GA") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "HI") == 0 ) { - timezone = "Pacific/Honolulu"; - } - else if ( strcmp (region, "IA") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "ID") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "IL") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "IN") == 0 ) { - timezone = "America/Indianapolis"; - } - else if ( strcmp (region, "KS") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "KY") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "LA") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "MA") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "MD") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "ME") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "MI") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "MN") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "MO") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "MS") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "MT") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "NC") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "ND") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "NE") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "NH") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "NJ") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "NM") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "NV") == 0 ) { - timezone = "America/Los_Angeles"; - } - else if ( strcmp (region, "NY") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "OH") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "OK") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "OR") == 0 ) { - timezone = "America/Los_Angeles"; - } - else if ( strcmp (region, "PA") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "RI") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "SC") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "SD") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "TN") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "TX") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "UT") == 0 ) { - timezone = "America/Denver"; - } - else if ( strcmp (region, "VA") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "VT") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "WA") == 0 ) { - timezone = "America/Los_Angeles"; - } - else if ( strcmp (region, "WI") == 0 ) { - timezone = "America/Chicago"; - } - else if ( strcmp (region, "WV") == 0 ) { - timezone = "America/New_York"; - } - else if ( strcmp (region, "WY") == 0 ) { - timezone = "America/Denver"; - } - } - else if ( strcmp (country, "UY") == 0 ) { - timezone = "America/Montevideo"; - } - else if ( strcmp (country, "UZ") == 0 ) { - if ( strcmp (region, "01") == 0 ) { - timezone = "Asia/Tashkent"; - } - else if ( strcmp (region, "02") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "03") == 0 ) { - timezone = "Asia/Tashkent"; - } - else if ( strcmp (region, "06") == 0 ) { - timezone = "Asia/Tashkent"; - } - else if ( strcmp (region, "07") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "08") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "09") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "10") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "12") == 0 ) { - timezone = "Asia/Samarkand"; - } - else if ( strcmp (region, "13") == 0 ) { - timezone = "Asia/Tashkent"; - } - else if ( strcmp (region, "14") == 0 ) { - timezone = "Asia/Tashkent"; - } - } - else if ( strcmp (country, "VA") == 0 ) { - timezone = "Europe/Vatican"; - } - else if ( strcmp (country, "VC") == 0 ) { - timezone = "America/St_Vincent"; - } - else if ( strcmp (country, "VE") == 0 ) { - timezone = "America/Caracas"; - } - else if ( strcmp (country, "VG") == 0 ) { - timezone = "America/Tortola"; - } - else if ( strcmp (country, "VI") == 0 ) { - timezone = "America/St_Thomas"; - } - else if ( strcmp (country, "VN") == 0 ) { - timezone = "Asia/Phnom_Penh"; - } - else if ( strcmp (country, "VU") == 0 ) { - timezone = "Pacific/Efate"; - } - else if ( strcmp (country, "WF") == 0 ) { - timezone = "Pacific/Wallis"; - } - else if ( strcmp (country, "WS") == 0 ) { - timezone = "Pacific/Samoa"; - } - else if ( strcmp (country, "YE") == 0 ) { - timezone = "Asia/Aden"; - } - else if ( strcmp (country, "YT") == 0 ) { - timezone = "Indian/Mayotte"; - } - else if ( strcmp (country, "YU") == 0 ) { - timezone = "Europe/Belgrade"; - } - else if ( strcmp (country, "ZA") == 0 ) { - timezone = "Africa/Johannesburg"; - } - else if ( strcmp (country, "ZM") == 0 ) { - timezone = "Africa/Lusaka"; - } - else if ( strcmp (country, "ZW") == 0 ) { - timezone = "Africa/Harare"; - } - return timezone; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/types.h b/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/types.h deleted file mode 100644 index 42c5ddd0..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/libGeoIP/types.h +++ /dev/null @@ -1,140 +0,0 @@ -/* types.h - some common typedefs - * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - * - * This file is part of GNUPG. - * - * GNUPG 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 of the License, or - * (at your option) any later version. - * - * GNUPG 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 - */ - -#ifndef G10_TYPES_H -#define G10_TYPES_H - -#ifdef HAVE_INTTYPES_H -/* For uint64_t */ -#include <inttypes.h> -#endif - -/* The AC_CHECK_SIZEOF() in configure fails for some machines. - * we provide some fallback values here */ -#if !SIZEOF_UNSIGNED_SHORT -#undef SIZEOF_UNSIGNED_SHORT -#define SIZEOF_UNSIGNED_SHORT 2 -#endif -#if !SIZEOF_UNSIGNED_INT -#undef SIZEOF_UNSIGNED_INT -#define SIZEOF_UNSIGNED_INT 4 -#endif -#if !SIZEOF_UNSIGNED_LONG -#undef SIZEOF_UNSIGNED_LONG -#define SIZEOF_UNSIGNED_LONG 4 -#endif - - -#include <sys/types.h> - -#ifndef HAVE_BYTE_TYPEDEF -#undef byte /* maybe there is a macro with this name */ -#ifndef __riscos__ -typedef unsigned char byte; -#else -/* Norcroft treats char = unsigned char as legal assignment - but char* = unsigned char* as illegal assignment - and the same applies to the signed variants as well */ -typedef char byte; -#endif -#define HAVE_BYTE_TYPEDEF -#endif - -#ifndef HAVE_USHORT_TYPEDEF -#undef ushort /* maybe there is a macro with this name */ -typedef unsigned short ushort; -#define HAVE_USHORT_TYPEDEF -#endif - -#ifndef HAVE_ULONG_TYPEDEF -#undef ulong /* maybe there is a macro with this name */ -typedef unsigned long ulong; -#define HAVE_ULONG_TYPEDEF -#endif - -#ifndef HAVE_U16_TYPEDEF -#undef u16 /* maybe there is a macro with this name */ -#if SIZEOF_UNSIGNED_INT == 2 -typedef unsigned int u16; -#elif SIZEOF_UNSIGNED_SHORT == 2 -typedef unsigned short u16; -#else -#error no typedef for u16 -#endif -#define HAVE_U16_TYPEDEF -#endif - -#ifndef HAVE_U32_TYPEDEF -#undef u32 /* maybe there is a macro with this name */ -#if SIZEOF_UNSIGNED_INT == 4 -typedef unsigned int u32; -#elif SIZEOF_UNSIGNED_LONG == 4 -typedef unsigned long u32; -#else -#error no typedef for u32 -#endif -#define HAVE_U32_TYPEDEF -#endif - -/**************** - * Warning: Some systems segfault when this u64 typedef and - * the dummy code in cipher/md.c is not available. Examples are - * Solaris and IRIX. - */ -#ifndef HAVE_U64_TYPEDEF -#undef u64 /* maybe there is a macro with this name */ -#if SIZEOF_UINT64_T == 8 -typedef uint64_t u64; -#define U64_C(c) (UINT64_C(c)) -#define HAVE_U64_TYPEDEF -#elif SIZEOF_UNSIGNED_INT == 8 -typedef unsigned int u64; -#define U64_C(c) (c ## U) -#define HAVE_U64_TYPEDEF -#elif SIZEOF_UNSIGNED_LONG == 8 -typedef unsigned long u64; -#define U64_C(c) (c ## UL) -#define HAVE_U64_TYPEDEF -#elif SIZEOF_UNSIGNED_LONG_LONG == 8 -typedef unsigned long long u64; -#define U64_C(c) (c ## ULL) -#define HAVE_U64_TYPEDEF -#endif -#endif - -typedef union { - int a; - short b; - char c[1]; - long d; -#ifdef HAVE_U64_TYPEDEF - u64 e; -#endif - float f; - double g; -} PROPERLY_ALIGNED_TYPE; - -typedef struct string_list { - struct string_list *next; - unsigned int flags; - char d[1]; -} *STRLIST; - -#endif /*G10_TYPES_H*/ diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh b/Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh deleted file mode 100644 index 7ed280bc..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/ltmain.sh +++ /dev/null @@ -1,8413 +0,0 @@ -# Generated from ltmain.m4sh. - -# ltmain.sh (GNU libtool) 2.2.6b -# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool 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 of the License, or -# (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, -# or obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Usage: $progname [OPTION]... [MODE-ARG]... -# -# Provide generalized library-building support services. -# -# --config show all configuration variables -# --debug enable verbose shell tracing -# -n, --dry-run display commands without modifying any files -# --features display basic configuration information and exit -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print informational messages (default) -# --version print version information -# -h, --help print short or long help message -# -# MODE must be one of the following: -# -# clean remove files from the build directory -# compile compile a source file into a libtool object -# execute automatically set library path, then run a program -# finish complete the installation of libtool libraries -# install install libraries or executables -# link create a library or an executable -# uninstall remove libraries from an installed directory -# -# MODE-ARGS vary depending on the MODE. -# Try `$progname --help --mode=MODE' for a more detailed description of MODE. -# -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: -# -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 -# automake: $automake_version -# autoconf: $autoconf_version -# -# Report bugs to <bug-libtool@gnu.org>. - -PROGRAM=ltmain.sh -PACKAGE=libtool -VERSION="2.2.6b Debian-2.2.6b-2ubuntu1" -TIMESTAMP="" -package_revision=1.3017 - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# NLS nuisances: We save the old values to restore during execute mode. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -lt_user_locale= -lt_safe_locale= -for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test \"\${$lt_var+set}\" = set; then - save_$lt_var=\$$lt_var - $lt_var=C - export $lt_var - lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" - lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" - fi" -done - -$lt_unset CDPATH - - - - - -: ${CP="cp -f"} -: ${ECHO="echo"} -: ${EGREP="/bin/grep -E"} -: ${FGREP="/bin/grep -F"} -: ${GREP="/bin/grep"} -: ${LN_S="ln -s"} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SED="/bin/sed"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} -: ${Xsed="$SED -e 1s/^X//"} - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -exit_status=$EXIT_SUCCESS - -# Make sure IFS has a sensible default -lt_nl=' -' -IFS=" $lt_nl" - -dirname="s,/[^/]*$,," -basename="s,^.*/,," - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` -} - -# Generated shell functions inserted here. - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" - -# The name of this program: -# In the unlikely event $progname began with a '-', it would play havoc with -# func_echo (imagine progname=-n), so we prepend ./ in that case: -func_dirname_and_basename "$progpath" -progname=$func_basename_result -case $progname in - -*) progname=./$progname ;; -esac - -# Make sure we have an absolute path for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=$func_dirname_result - progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" - ;; - *) - save_IFS="$IFS" - IFS=: - for progdir in $PATH; do - IFS="$save_IFS" - test -x "$progdir/$progname" && break - done - IFS="$save_IFS" - test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed="${SED}"' -e 1s/^X//' -sed_quote_subst='s/\([`"$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Re-`\' parameter expansions in output of double_quote_subst that were -# `\'-ed in input to the same. If an odd number of `\' preceded a '$' -# in input to double_quote_subst, that '$' was protected from expansion. -# Since each input `\' is now two `\'s, look for any number of runs of -# four `\'s followed by two `\'s and then a '$'. `\' that '$'. -bs='\\' -bs2='\\\\' -bs4='\\\\\\\\' -dollar='\$' -sed_double_backslash="\ - s/$bs4/&\\ -/g - s/^$bs2$dollar/$bs&/ - s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g - s/\n//g" - -# Standard options: -opt_dry_run=false -opt_help=false -opt_quiet=false -opt_verbose=false -opt_warning=: - -# func_echo arg... -# Echo program name prefixed message, along with the current mode -# name if it has been set yet. -func_echo () -{ - $ECHO "$progname${mode+: }$mode: $*" -} - -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - -# func_error arg... -# Echo program name prefixed message to standard error. -func_error () -{ - $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 -} - -# func_warning arg... -# Echo program name prefixed warning message to standard error. -func_warning () -{ - $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 - - # bash bug again: - : -} - -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - -# func_fatal_help arg... -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - func_error ${1+"$@"} - func_fatal_error "$help" -} -help="Try \`$progname --help' for more information." ## default - - -# func_grep expression filename -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_mkdir_p directory-path -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - my_directory_path="$1" - my_dir_list= - - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then - - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - my_dir_list="$my_directory_path:$my_dir_list" - - # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` - done - my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` - - save_mkdir_p_IFS="$IFS"; IFS=':' - for my_dir in $my_dir_list; do - IFS="$save_mkdir_p_IFS" - # mkdir can fail with a `File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$my_dir" 2>/dev/null || : - done - IFS="$save_mkdir_p_IFS" - - # Bail out if we (or some other process) failed to create a directory. - test -d "$my_directory_path" || \ - func_fatal_error "Failed to create \`$1'" - fi -} - - -# func_mktempdir [string] -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, STRING is the basename for that directory. -func_mktempdir () -{ - my_template="${TMPDIR-/tmp}/${1-$progname}" - - if test "$opt_dry_run" = ":"; then - # Return a directory name, but don't create it in dry-run mode - my_tmpdir="${my_template}-$$" - else - - # If mktemp works, use that first and foremost - my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` - - if test ! -d "$my_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" - - save_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$my_tmpdir" - umask $save_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$my_tmpdir" || \ - func_fatal_error "cannot create temporary directory \`$my_tmpdir'" - fi - - $ECHO "X$my_tmpdir" | $Xsed -} - - -# func_quote_for_eval arg -# Aesthetically quote ARG to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -func_quote_for_eval () -{ - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; - *) - func_quote_for_eval_unquoted_result="$1" ;; - esac - - case $func_quote_for_eval_unquoted_result in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable - # expansion for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" - ;; - *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" - esac -} - - -# func_quote_for_expand arg -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "X$1" | $Xsed \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; - esac - - case $my_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_arg="\"$my_arg\"" - ;; - esac - - func_quote_for_expand_result="$my_arg" -} - - -# func_show_eval cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$my_cmd" - my_status=$? - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - -# func_show_eval_locale cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$lt_user_locale - $my_cmd" - my_status=$? - eval "$lt_safe_locale" - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - - - - -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { - s/^# // - s/^# *$// - s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ - p - }' < "$progpath" - exit $? -} - -# func_usage -# Echo short help message to standard output and exit. -func_usage () -{ - $SED -n '/^# Usage:/,/# -h/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - $ECHO - $ECHO "run \`$progname --help | more' for full usage" - exit $? -} - -# func_help -# Echo long help message to standard output and exit. -func_help () -{ - $SED -n '/^# Usage:/,/# Report bugs to/ { - s/^# // - s/^# *$// - s*\$progname*'$progname'* - s*\$host*'"$host"'* - s*\$SHELL*'"$SHELL"'* - s*\$LTCC*'"$LTCC"'* - s*\$LTCFLAGS*'"$LTCFLAGS"'* - s*\$LD*'"$LD"'* - s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ - p - }' < "$progpath" - exit $? -} - -# func_missing_arg argname -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - func_error "missing argument for $1" - exit_cmd=exit -} - -exit_cmd=: - - - - - -# Check that we have a working $ECHO. -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then - # Yippee, $ECHO works! - : -else - # Restart under the correct shell, and then maybe $ECHO will work. - exec $SHELL "$progpath" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <<EOF -$* -EOF - exit $EXIT_SUCCESS -fi - -magic="%%%MAGIC variable%%%" -magic_exe="%%%MAGIC EXE variable%%%" - -# Global variables. -# $mode is unset -nonopt= -execute_dlfiles= -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" -extracted_archives= -extracted_serial=0 - -opt_dry_run=false -opt_duplicate_deps=false -opt_silent=false -opt_debug=: - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -# func_fatal_configuration arg... -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func_error ${1+"$@"} - func_error "See the $PACKAGE documentation for more information." - func_fatal_error "Fatal configuration error." -} - - -# func_config -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - -# func_features -# Display the features supported by this script. -func_features () -{ - $ECHO "host: $host" - if test "$build_libtool_libs" = yes; then - $ECHO "enable shared libraries" - else - $ECHO "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - $ECHO "enable static libraries" - else - $ECHO "disable static libraries" - fi - - exit $? -} - -# func_enable_tag tagname -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname="$1" - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf="/$re_begincf/,/$re_endcf/p" - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - -# Parse options once, thoroughly. This comes as soon as possible in -# the script to make things like `libtool --version' happen quickly. -{ - - # Shorthand for --mode=foo, only valid as the first argument - case $1 in - clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; - compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; - execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; - finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; - install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; - link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; - uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; - esac - - # Parse non-mode specific arguments: - while test "$#" -gt 0; do - opt="$1" - shift - - case $opt in - --config) func_config ;; - - --debug) preserve_args="$preserve_args $opt" - func_echo "enabling shell trace mode" - opt_debug='set -x' - $opt_debug - ;; - - -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break - execute_dlfiles="$execute_dlfiles $1" - shift - ;; - - --dry-run | -n) opt_dry_run=: ;; - --features) func_features ;; - --finish) mode="finish" ;; - - --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break - case $1 in - # Valid mode arguments: - clean) ;; - compile) ;; - execute) ;; - finish) ;; - install) ;; - link) ;; - relink) ;; - uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; - esac - - mode="$1" - shift - ;; - - --preserve-dup-deps) - opt_duplicate_deps=: ;; - - --quiet|--silent) preserve_args="$preserve_args $opt" - opt_silent=: - ;; - - --verbose| -v) preserve_args="$preserve_args $opt" - opt_silent=false - ;; - - --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break - preserve_args="$preserve_args $opt $1" - func_enable_tag "$1" # tagname is set here - shift - ;; - - # Separate optargs to long options: - -dlopen=*|--mode=*|--tag=*) - func_opt_split "$opt" - set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} - shift - ;; - - -\?|-h) func_usage ;; - --help) opt_help=: ;; - --version) func_version ;; - - -*) func_fatal_help "unrecognized option \`$opt'" ;; - - *) nonopt="$opt" - break - ;; - esac - done - - - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_duplicate_deps - ;; - esac - - # Having warned about all mis-specified options, bail out if - # anything was wrong. - $exit_cmd $EXIT_FAILURE -} - -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -## ----------- ## -## Main. ## -## ----------- ## - -$opt_help || { - # Sanity checks first: - func_check_version_match - - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" - fi - - test -z "$mode" && func_fatal_error "error: you must specify a MODE." - - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$execute_dlfiles" && test "$mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$mode' for more information." -} - - -# func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if `file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case "$lalib_p_line" in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test "$lalib_p" = yes -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - func_lalib_p "$1" -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_ltwrapper_scriptname_result="" - if func_ltwrapper_executable_p "$1"; then - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" - fi -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $opt_debug - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$save_ifs - eval cmd=\"$cmd\" - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE and FILE.exe exist: automatic-append-.exe -# behavior happens only for exec(3), not for open(2)! Also, sourcing -# `FILE.' does not work on cygwin managed mounts. -func_source () -{ - $opt_debug - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - $opt_debug - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_quote_for_eval "$arg" - CC_quoted="$CC_quoted $func_quote_for_eval_result" - done - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - func_quote_for_eval "$arg" - CC_quoted="$CC_quoted $func_quote_for_eval_result" - done - case "$@ " in - " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' - else - write_lobj=none - fi - - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T <<EOF -# $write_libobj - a libtool object file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# Name of the PIC object. -pic_object=$write_lobj - -# Name of the non-PIC object -non_pic_object=$write_oldobj - -EOF - $MV "${write_libobj}T" "${write_libobj}" - } -} - -# func_mode_compile arg... -func_mode_compile () -{ - $opt_debug - # Get the compilation command and the source file. - base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - pie_flag= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg="$arg" - arg_mode=normal - ;; - - target ) - libobj="$arg" - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - test -n "$libobj" && \ - func_fatal_error "you cannot specify \`-o' more than once" - arg_mode=target - continue - ;; - - -pie | -fpie | -fPIE) - pie_flag="$pie_flag $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - later="$later $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - func_quote_for_eval "$arg" - lastarg="$lastarg $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result - - # Add the arguments to base_compile. - base_compile="$base_compile $lastarg" - continue - ;; - - *) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg="$srcfile" - srcfile="$arg" - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - func_quote_for_eval "$lastarg" - base_compile="$base_compile $func_quote_for_eval_result" - done # for arg - - case $arg_mode in - arg) - func_fatal_error "you must specify an argument for -Xcompile" - ;; - target) - func_fatal_error "you must specify a target with \`-o'" - ;; - *) - # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj="$func_basename_result" - } - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.obj | *.sx) - func_xform "$libobj" - libobj=$func_xform_result - ;; - esac - - case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; - *) - func_fatal_error "cannot determine name of library object from \`$libobj'" - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - continue - ;; - - -static) - build_libtool_libs=no - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname="$func_basename_result" - xdir="$func_dirname_result" - lobj=${xdir}$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - pic_mode=default - ;; - esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - $ECHO "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - removelist="$removelist $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - removelist="$removelist $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - if test -n "$fix_srcfile_path"; then - eval srcfile=\"$fix_srcfile_path\" - fi - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test "$pic_mode" != no; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - command="$command -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test "$suppress_opt" = yes; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test "$compiler_c_o" = yes; then - command="$command -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - command="$command$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { -test "$mode" = compile && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - - compile) - $ECHO \ -"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to building PIC objects only - -prefer-non-pic try to building non-PIC objects only - -shared do not build a \`.o' file suitable for static linking - -static only build a \`.o' file suitable for static linking - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - - execute) - $ECHO \ -"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - - finish) - $ECHO \ -"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - - install) - $ECHO \ -"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The following components of INSTALL-COMMAND are treated specially: - - -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - - uninstall) - $ECHO \ -"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - - *) - func_fatal_help "invalid operation mode \`$mode'" - ;; - esac - - $ECHO - $ECHO "Try \`$progname --help' for more information about other modes." - - exit $? -} - - # Now that we've collected a possible --mode arg, show help if necessary - $opt_help && func_mode_help - - -# func_mode_execute arg... -func_mode_execute () -{ - $opt_debug - # The first argument is the command name. - cmd="$nonopt" - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $execute_dlfiles; do - test -f "$file" \ - || func_fatal_help "\`$file' is not a file" - - dir= - case $file in - *.la) - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "\`$file' was not linked with \`-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir="$func_dirname_result" - - if test -f "$dir/$objdir/$dlname"; then - dir="$dir/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir="$func_dirname_result" - ;; - - *) - func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -*) ;; - *) - # Do a test to see if this is really a libtool program. - if func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file="$progdir/$program" - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_quote_for_eval "$file" - args="$args $func_quote_for_eval_result" - done - - if test "X$opt_dry_run" = Xfalse; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # Now prepare to actually exec the command. - exec_cmd="\$cmd$args" - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - $ECHO "export $shlibpath_var" - fi - $ECHO "$cmd$args" - exit $EXIT_SUCCESS - fi -} - -test "$mode" = execute && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $opt_debug - libdirs="$nonopt" - admincmds= - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for dir - do - libdirs="$libdirs $dir" - done - - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || admincmds="$admincmds - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_silent && exit $EXIT_SUCCESS - - $ECHO "X----------------------------------------------------------------------" | $Xsed - $ECHO "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - $ECHO - $ECHO "If you ever happen to want to link against installed libraries" - $ECHO "in a given directory, LIBDIR, you must either use libtool, and" - $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" - $ECHO "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" - $ECHO " during execution" - fi - if test -n "$runpath_var"; then - $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" - $ECHO " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $ECHO " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - $ECHO - - $ECHO "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" - $ECHO "pages." - ;; - *) - $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - $ECHO "X----------------------------------------------------------------------" | $Xsed - exit $EXIT_SUCCESS -} - -test "$mode" = finish && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $opt_debug - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - $ECHO "X$nonopt" | $GREP shtool >/dev/null; then - # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_for_eval "$arg" - install_prog="$install_prog$func_quote_for_eval_result" - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - for arg - do - if test -n "$dest"; then - files="$files $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) - case " $install_prog " in - *[\\\ /]cp\ *) ;; - *) prev=$arg ;; - esac - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_for_eval "$arg" - install_prog="$install_prog $func_quote_for_eval_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the \`$prev' option requires an argument" - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "\`$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "\`$destdir' must be an absolute directory name" - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - staticlibs="$staticlibs $file" - ;; - - *.la) - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) current_libdirs="$current_libdirs $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) future_libdirs="$future_libdirs $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir="$func_dirname_result" - dir="$dir$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking \`$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname="$1" - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme="$stripme" - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme="" - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_eval "$striplib $destdir/$realname" 'exit $?' - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name="$func_basename_result" - instname="$dir/$name"i - func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - $opt_dry_run || { - if test "$finalize" = yes; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_silent || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink \`$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file="$outputname" - else - func_warning "cannot relink \`$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name="$func_basename_result" - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test "$mode" = install && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $opt_debug - my_outputname="$1" - my_originator="$2" - my_pic_p="${3-no}" - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_verbose "extracting global C symbols from \`$progfile'" - $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $opt_dry_run || { - $RM $export_symbols - eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" - func_basename "$dlprefile" - name="$func_basename_result" - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - done - - $opt_dry_run || { - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $MV "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if $GREP -v "^: " < "$nlist" | - if sort -k 3 </dev/null >/dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - $GREP -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' - else - $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - $ECHO >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -" - case $host in - *cygwin* | *mingw* | *cegcc* ) - $ECHO >> "$output_objdir/$my_dlsyms" "\ -/* DATA imports from DLLs on WIN32 con't be const, because - runtime relocations are performed -- see ld's documentation - on pseudo-relocs. */" - lt_dlsym_const= ;; - *osf5*) - echo >> "$output_objdir/$my_dlsyms" "\ -/* This system does not cope well with relocations in const data */" - lt_dlsym_const= ;; - *) - lt_dlsym_const=const ;; - esac - - $ECHO >> "$output_objdir/$my_dlsyms" "\ -extern $lt_dlsym_const lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; -$lt_dlsym_const lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - $ECHO >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - if test "X$my_pic_p" != Xno; then - pic_flag_for_symtable=" $pic_flag" - fi - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) symtab_cflags="$symtab_cflags $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' - - # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` - finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` - fi -} - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -func_win32_libid () -{ - $opt_debug - win32_libid_type="unknown" - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then - win32_nmres=`eval $NM -f posix -A $1 | - $SED -n -e ' - 1,100{ - / I /{ - s,.*,import, - p - q - } - }'` - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $ECHO "$win32_libid_type" -} - - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $opt_debug - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $opt_debug - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - func_basename "$my_xlib" - my_xlib="$func_basename_result" - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" - $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" - cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" - func_extract_an_archive "`pwd`" "${darwin_base_archive}" - cd "$darwin_curdir" - $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" - done # $darwin_arches - ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` - done - - func_extract_archives_result="$my_oldobjs" -} - - - -# func_emit_wrapper_part1 [arg=no] -# -# Emit the first part of a libtool wrapper script on stdout. -# For more information, see the description associated with -# func_emit_wrapper(), below. -func_emit_wrapper_part1 () -{ - func_emit_wrapper_part1_arg1=no - if test -n "$1" ; then - func_emit_wrapper_part1_arg1=$1 - fi - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='${SED} -e 1s/^X//' -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variables: - generated_by_libtool_version='$macro_version' - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$ECHO are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - ECHO=\"$qecho\" - file=\"\$0\" - # Make sure echo works. - if test \"X\$1\" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift - elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then - # Yippee, \$ECHO works! - : - else - # Restart under the correct shell, and then maybe \$ECHO will work. - exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} - fi - fi\ -" - $ECHO "\ - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` - done -" -} -# end: func_emit_wrapper_part1 - -# func_emit_wrapper_part2 [arg=no] -# -# Emit the second part of a libtool wrapper script on stdout. -# For more information, see the description associated with -# func_emit_wrapper(), below. -func_emit_wrapper_part2 () -{ - func_emit_wrapper_part2_arg1=no - if test -n "$1" ; then - func_emit_wrapper_part2_arg1=$1 - fi - - $ECHO "\ - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $ECHO "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $MKDIR \"\$progdir\" - else - $RM \"\$progdir/\$file\" - fi" - - $ECHO "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $ECHO \"\$relink_command_output\" >&2 - $RM \"\$progdir/\$file\" - exit 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` - - export $shlibpath_var -" - fi - - # fixup the dll searchpath if we need to. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 - fi - else - # The program doesn't exist. - \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 - \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" -} -# end: func_emit_wrapper_part2 - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=no - if test -n "$1" ; then - func_emit_wrapper_arg1=$1 - fi - - # split this up so that func_emit_cwrapperexe_src - # can call each part independently. - func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" - func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" -} - - -# func_to_host_path arg -# -# Convert paths to host format when used with build tools. -# Intended for use with "native" mingw (where libtool itself -# is running under the msys shell), or in the following cross- -# build environments: -# $build $host -# mingw (msys) mingw [e.g. native] -# cygwin mingw -# *nix + wine mingw -# where wine is equipped with the `winepath' executable. -# In the native mingw case, the (msys) shell automatically -# converts paths for any non-msys applications it launches, -# but that facility isn't available from inside the cwrapper. -# Similar accommodations are necessary for $host mingw and -# $build cygwin. Calling this function does no harm for other -# $host/$build combinations not listed above. -# -# ARG is the path (on $build) that should be converted to -# the proper representation for $host. The result is stored -# in $func_to_host_path_result. -func_to_host_path () -{ - func_to_host_path_result="$1" - if test -n "$1" ; then - case $host in - *mingw* ) - lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - case $build in - *mingw* ) # actually, msys - # awkward: cmd appends spaces to result - lt_sed_strip_trailing_spaces="s/[ ]*\$//" - func_to_host_path_tmp1=`( cmd //c echo "$1" |\ - $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - *cygwin* ) - func_to_host_path_tmp1=`cygpath -w "$1"` - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - * ) - # Unfortunately, winepath does not exit with a non-zero - # error code, so we are forced to check the contents of - # stdout. On the other hand, if the command is not - # found, the shell will set an exit code of 127 and print - # *an error message* to stdout. So we must check for both - # error code of zero AND non-empty stdout, which explains - # the odd construction: - func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` - if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then - func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ - $SED -e "$lt_sed_naive_backslashify"` - else - # Allow warning below. - func_to_host_path_result="" - fi - ;; - esac - if test -z "$func_to_host_path_result" ; then - func_error "Could not determine host path corresponding to" - func_error " '$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_path_result="$1" - fi - ;; - esac - fi -} -# end: func_to_host_path - -# func_to_host_pathlist arg -# -# Convert pathlists to host format when used with build tools. -# See func_to_host_path(), above. This function supports the -# following $build/$host combinations (but does no harm for -# combinations not listed here): -# $build $host -# mingw (msys) mingw [e.g. native] -# cygwin mingw -# *nix + wine mingw -# -# Path separators are also converted from $build format to -# $host format. If ARG begins or ends with a path separator -# character, it is preserved (but converted to $host format) -# on output. -# -# ARG is a pathlist (on $build) that should be converted to -# the proper representation on $host. The result is stored -# in $func_to_host_pathlist_result. -func_to_host_pathlist () -{ - func_to_host_pathlist_result="$1" - if test -n "$1" ; then - case $host in - *mingw* ) - lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_to_host_pathlist_tmp2="$1" - # Once set for this call, this variable should not be - # reassigned. It is used in tha fallback case. - func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e 's|^:*||' -e 's|:*$||'` - case $build in - *mingw* ) # Actually, msys. - # Awkward: cmd appends spaces to result. - lt_sed_strip_trailing_spaces="s/[ ]*\$//" - func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ - $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - *cygwin* ) - func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ - $SED -e "$lt_sed_naive_backslashify"` - ;; - * ) - # unfortunately, winepath doesn't convert pathlists - func_to_host_pathlist_result="" - func_to_host_pathlist_oldIFS=$IFS - IFS=: - for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do - IFS=$func_to_host_pathlist_oldIFS - if test -n "$func_to_host_pathlist_f" ; then - func_to_host_path "$func_to_host_pathlist_f" - if test -n "$func_to_host_path_result" ; then - if test -z "$func_to_host_pathlist_result" ; then - func_to_host_pathlist_result="$func_to_host_path_result" - else - func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" - fi - fi - fi - IFS=: - done - IFS=$func_to_host_pathlist_oldIFS - ;; - esac - if test -z "$func_to_host_pathlist_result" ; then - func_error "Could not determine the host path(s) corresponding to" - func_error " '$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This may break if $1 contains DOS-style drive - # specifications. The fix is not to complicate the expression - # below, but for the user to provide a working wine installation - # with winepath so that path translation in the cross-to-mingw - # case works properly. - lt_replace_pathsep_nix_to_dos="s|:|;|g" - func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ - $SED -e "$lt_replace_pathsep_nix_to_dos"` - fi - # Now, add the leading and trailing path separators back - case "$1" in - :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" - ;; - esac - case "$1" in - *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" - ;; - esac - ;; - esac - fi -} -# end: func_to_host_pathlist - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat <<EOF - -/* $cwrappersource - temporary wrapper executable for $objdir/$outputname - Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION - - The $output program cannot be directly executed until all the libtool - libraries that it depends on are installed. - - This wrapper executable should never be moved out of the build directory. - If it is, it will not operate correctly. - - Currently, it simply execs the wrapper *script* "$SHELL $output", - but could eventually absorb all of the scripts functionality and - exec $objdir/$outputname directly. -*/ -EOF - cat <<"EOF" -#include <stdio.h> -#include <stdlib.h> -#ifdef _MSC_VER -# include <direct.h> -# include <process.h> -# include <io.h> -# define setmode _setmode -#else -# include <unistd.h> -# include <stdint.h> -# ifdef __CYGWIN__ -# include <io.h> -# define HAVE_SETENV -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -# endif -#endif -#include <malloc.h> -#include <stdarg.h> -#include <assert.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/stat.h> - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -#ifdef _MSC_VER -# define S_IXUSR _S_IEXEC -# define stat _stat -# ifndef _INTPTR_T_DEFINED -# define intptr_t int -# endif -#endif - -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) -# define HAVE_DOS_BASED_FILE_SYSTEM -# define FOPEN_WB "wb" -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#ifdef __CYGWIN__ -# define FOPEN_WB "wb" -#endif - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -#undef LTWRAPPER_DEBUGPRINTF -#if defined DEBUGWRAPPER -# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args -static void -ltwrapper_debugprintf (const char *fmt, ...) -{ - va_list args; - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); -} -#else -# define LTWRAPPER_DEBUGPRINTF(args) -#endif - -const char *program_name = NULL; - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_fatal (const char *message, ...); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_opt_process_env_set (const char *arg); -void lt_opt_process_env_prepend (const char *arg); -void lt_opt_process_env_append (const char *arg); -int lt_split_name_value (const char *arg, char** name, char** value); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); - -static const char *script_text_part1 = -EOF - - func_emit_wrapper_part1 yes | - $SED -e 's/\([\\"]\)/\\\1/g' \ - -e 's/^/ "/' -e 's/$/\\n"/' - echo ";" - cat <<EOF - -static const char *script_text_part2 = -EOF - func_emit_wrapper_part2 yes | - $SED -e 's/\([\\"]\)/\\\1/g' \ - -e 's/^/ "/' -e 's/$/\\n"/' - echo ";" - - cat <<EOF -const char * MAGIC_EXE = "$magic_exe"; -const char * LIB_PATH_VARNAME = "$shlibpath_var"; -EOF - - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - func_to_host_pathlist "$temp_rpath" - cat <<EOF -const char * LIB_PATH_VALUE = "$func_to_host_pathlist_result"; -EOF - else - cat <<"EOF" -const char * LIB_PATH_VALUE = ""; -EOF - fi - - if test -n "$dllsearchpath"; then - func_to_host_pathlist "$dllsearchpath:" - cat <<EOF -const char * EXE_PATH_VARNAME = "PATH"; -const char * EXE_PATH_VALUE = "$func_to_host_pathlist_result"; -EOF - else - cat <<"EOF" -const char * EXE_PATH_VARNAME = ""; -const char * EXE_PATH_VALUE = ""; -EOF - fi - - if test "$fast_install" = yes; then - cat <<EOF -const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ -EOF - else - cat <<EOF -const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ -EOF - fi - - - cat <<"EOF" - -#define LTWRAPPER_OPTION_PREFIX "--lt-" -#define LTWRAPPER_OPTION_PREFIX_LENGTH 5 - -static const size_t opt_prefix_len = LTWRAPPER_OPTION_PREFIX_LENGTH; -static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; - -static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; - -static const size_t env_set_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 7; -static const char *env_set_opt = LTWRAPPER_OPTION_PREFIX "env-set"; - /* argument is putenv-style "foo=bar", value of foo is set to bar */ - -static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11; -static const char *env_prepend_opt = LTWRAPPER_OPTION_PREFIX "env-prepend"; - /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */ - -static const size_t env_append_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 10; -static const char *env_append_opt = LTWRAPPER_OPTION_PREFIX "env-append"; - /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */ - -int -main (int argc, char *argv[]) -{ - char **newargz; - int newargc; - char *tmp_pathspec; - char *actual_cwrapper_path; - char *actual_cwrapper_name; - char *target_name; - char *lt_argv_zero; - intptr_t rval = 127; - - int i; - - program_name = (char *) xstrdup (base_name (argv[0])); - LTWRAPPER_DEBUGPRINTF (("(main) argv[0] : %s\n", argv[0])); - LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name)); - - /* very simple arg parsing; don't want to rely on getopt */ - for (i = 1; i < argc; i++) - { - if (strcmp (argv[i], dumpscript_opt) == 0) - { -EOF - case "$host" in - *mingw* | *cygwin* ) - # make stdout use "unix" line endings - echo " setmode(1,_O_BINARY);" - ;; - esac - - cat <<"EOF" - printf ("%s", script_text_part1); - printf ("%s", script_text_part2); - return 0; - } - } - - newargz = XMALLOC (char *, argc + 1); - tmp_pathspec = find_executable (argv[0]); - if (tmp_pathspec == NULL) - lt_fatal ("Couldn't find %s", argv[0]); - LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n", - tmp_pathspec)); - - actual_cwrapper_path = chase_symlinks (tmp_pathspec); - LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n", - actual_cwrapper_path)); - XFREE (tmp_pathspec); - - actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path)); - strendzap (actual_cwrapper_path, actual_cwrapper_name); - - /* wrapper name transforms */ - strendzap (actual_cwrapper_name, ".exe"); - tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); - XFREE (actual_cwrapper_name); - actual_cwrapper_name = tmp_pathspec; - tmp_pathspec = 0; - - /* target_name transforms -- use actual target program name; might have lt- prefix */ - target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); - strendzap (target_name, ".exe"); - tmp_pathspec = lt_extend_str (target_name, ".exe", 1); - XFREE (target_name); - target_name = tmp_pathspec; - tmp_pathspec = 0; - - LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n", - target_name)); -EOF - - cat <<EOF - newargz[0] = - XMALLOC (char, (strlen (actual_cwrapper_path) + - strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); - strcpy (newargz[0], actual_cwrapper_path); - strcat (newargz[0], "$objdir"); - strcat (newargz[0], "/"); -EOF - - cat <<"EOF" - /* stop here, and copy so we don't have to do this twice */ - tmp_pathspec = xstrdup (newargz[0]); - - /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ - strcat (newargz[0], actual_cwrapper_name); - - /* DO want the lt- prefix here if it exists, so use target_name */ - lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); - XFREE (tmp_pathspec); - tmp_pathspec = NULL; -EOF - - case $host_os in - mingw*) - cat <<"EOF" - { - char* p; - while ((p = strchr (newargz[0], '\\')) != NULL) - { - *p = '/'; - } - while ((p = strchr (lt_argv_zero, '\\')) != NULL) - { - *p = '/'; - } - } -EOF - ;; - esac - - cat <<"EOF" - XFREE (target_name); - XFREE (actual_cwrapper_path); - XFREE (actual_cwrapper_name); - - lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ - lt_setenv ("DUALCASE", "1"); /* for MSK sh */ - lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); - lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); - - newargc=0; - for (i = 1; i < argc; i++) - { - if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0) - { - if (argv[i][env_set_opt_len] == '=') - { - const char *p = argv[i] + env_set_opt_len + 1; - lt_opt_process_env_set (p); - } - else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc) - { - lt_opt_process_env_set (argv[++i]); /* don't copy */ - } - else - lt_fatal ("%s missing required argument", env_set_opt); - continue; - } - if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0) - { - if (argv[i][env_prepend_opt_len] == '=') - { - const char *p = argv[i] + env_prepend_opt_len + 1; - lt_opt_process_env_prepend (p); - } - else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc) - { - lt_opt_process_env_prepend (argv[++i]); /* don't copy */ - } - else - lt_fatal ("%s missing required argument", env_prepend_opt); - continue; - } - if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0) - { - if (argv[i][env_append_opt_len] == '=') - { - const char *p = argv[i] + env_append_opt_len + 1; - lt_opt_process_env_append (p); - } - else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc) - { - lt_opt_process_env_append (argv[++i]); /* don't copy */ - } - else - lt_fatal ("%s missing required argument", env_append_opt); - continue; - } - if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0) - { - /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX - namespace, but it is not one of the ones we know about and - have already dealt with, above (inluding dump-script), then - report an error. Otherwise, targets might begin to believe - they are allowed to use options in the LTWRAPPER_OPTION_PREFIX - namespace. The first time any user complains about this, we'll - need to make LTWRAPPER_OPTION_PREFIX a configure-time option - or a configure.ac-settable value. - */ - lt_fatal ("Unrecognized option in %s namespace: '%s'", - ltwrapper_option_prefix, argv[i]); - } - /* otherwise ... */ - newargz[++newargc] = xstrdup (argv[i]); - } - newargz[++newargc] = NULL; - - LTWRAPPER_DEBUGPRINTF (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>"))); - for (i = 0; i < newargc; i++) - { - LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>"))); - } - -EOF - - case $host_os in - mingw*) - cat <<"EOF" - /* execv doesn't actually work on mingw as expected on unix */ - rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); - if (rval == -1) - { - /* failed to start process */ - LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); - return 127; - } - return rval; -EOF - ;; - *) - cat <<"EOF" - execv (lt_argv_zero, newargz); - return rval; /* =127, but avoids unused variable warning */ -EOF - ;; - esac - - cat <<"EOF" -} - -void * -xmalloc (size_t num) -{ - void *p = (void *) malloc (num); - if (!p) - lt_fatal ("Memory exhausted"); - - return p; -} - -char * -xstrdup (const char *string) -{ - return string ? strcpy ((char *) xmalloc (strlen (string) + 1), - string) : NULL; -} - -const char * -base_name (const char *name) -{ - const char *base; - -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - /* Skip over the disk name in MSDOS pathnames. */ - if (isalpha ((unsigned char) name[0]) && name[1] == ':') - name += 2; -#endif - - for (base = name; *name; name++) - if (IS_DIR_SEPARATOR (*name)) - base = name + 1; - return base; -} - -int -check_executable (const char *path) -{ - struct stat st; - - LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", - path ? (*path ? path : "EMPTY!") : "NULL!")); - if ((!path) || (!*path)) - return 0; - - if ((stat (path, &st) >= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", - path ? (*path ? path : "EMPTY!") : "NULL!")); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -char * -find_executable (const char *wrapper) -{ - int has_slash = 0; - const char *p; - const char *p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - int tmp_len; - char *concat_name; - - LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", - wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char *path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char *q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR (*q)) - break; - p_len = q - p; - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); - tmp_len = strlen (tmp); - concat_name = - XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = - XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); - tmp_len = strlen (tmp); - concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - return NULL; -} - -char * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", - tmp_pathspec)); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - char *errstr = strerror (errno); - lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal ("Could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -char * -strendzap (char *str, const char *pat) -{ - size_t len, patlen; - - assert (str != NULL); - assert (pat != NULL); - - len = strlen (str); - patlen = strlen (pat); - - if (patlen <= len) - { - str += len - patlen; - if (strcmp (str, pat) == 0) - *str = '\0'; - } - return str; -} - -static void -lt_error_core (int exit_status, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s: %s: ", program_name, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, "FATAL", message, ap); - va_end (ap); -} - -void -lt_setenv (const char *name, const char *value) -{ - LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", - (name ? name : "<NULL>"), - (value ? value : "<NULL>"))); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - int len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - int orig_value_len = strlen (orig_value); - int add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -int -lt_split_name_value (const char *arg, char** name, char** value) -{ - const char *p; - int len; - if (!arg || !*arg) - return 1; - - p = strchr (arg, (int)'='); - - if (!p) - return 1; - - *value = xstrdup (++p); - - len = strlen (arg) - strlen (*value); - *name = XMALLOC (char, len); - strncpy (*name, arg, len-1); - (*name)[len - 1] = '\0'; - - return 0; -} - -void -lt_opt_process_env_set (const char *arg) -{ - char *name = NULL; - char *value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); - } - - lt_setenv (name, value); - XFREE (name); - XFREE (value); -} - -void -lt_opt_process_env_prepend (const char *arg) -{ - char *name = NULL; - char *value = NULL; - char *new_value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); - } - - new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - XFREE (name); - XFREE (value); -} - -void -lt_opt_process_env_append (const char *arg) -{ - char *name = NULL; - char *value = NULL; - char *new_value = NULL; - - if (lt_split_name_value (arg, &name, &value) != 0) - { - XFREE (name); - XFREE (value); - lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); - } - - new_value = lt_extend_str (getenv (name), value, 1); - lt_setenv (name, new_value); - XFREE (new_value); - XFREE (name); - XFREE (value); -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - (name ? name : "<NULL>"), - (value ? value : "<NULL>"))); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - int len = strlen (new_value); - while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[len-1] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - (name ? name : "<NULL>"), - (value ? value : "<NULL>"))); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - - -EOF -} -# end: func_emit_cwrapperexe_src - -# func_mode_link arg... -func_mode_link () -{ - $opt_debug - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module="${wl}-single_module" - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg="$1" - shift - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" - preload=yes - fi - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - else - dlprefiles="$dlprefiles $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) deplibs="$deplibs $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# moreargs="$moreargs $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file \`$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - precious_regex) - precious_files_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) rpath="$rpath $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) xrpath="$xrpath $arg" ;; - esac - fi - prev= - continue - ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - weak) - weak_libs="$weak_libs $arg" - prev= - continue - ;; - xcclinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - compiler_flags="$compiler_flags $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg="$arg" - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname '-L' '' "$arg" - dir=$func_stripname_result - if test -z "$dir"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between \`-L' and \`$1'" - else - func_fatal_error "need path for \`-L' option" - fi - fi - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "*) ;; - *) - deplibs="$deplibs -L$dir" - lib_search_path="$lib_search_path $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) dllsearchpath="$dllsearchpath:$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) dllsearchpath="$dllsearchpath:$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - deplibs="$deplibs System.ltframework" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test "X$arg" = "X-lc" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test "X$arg" = "X-lc" && continue - ;; - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - deplibs="$deplibs $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot) - compiler_flags="$compiler_flags $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - compiler_flags="$compiler_flags $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; - esac - continue - ;; - - -multi_module) - single_module="${wl}-multi_module" - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "\`-no-install' is ignored for $host" - func_warning "assuming \`-no-fast-install' instead" - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - arg="$arg $wl$func_quote_for_eval_result" - compiler_flags="$compiler_flags $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - arg="$arg $wl$func_quote_for_eval_result" - compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" - linker_flags="$linker_flags $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - # -64, -mips[0-9] enable 64-bit mode on the SGI compiler - # -r[0-9][0-9]* specifies the processor on the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler - # +DA*, +DD* enable 64-bit mode on the HP compiler - # -q* pass through compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* pass through architecture-specific - # compiler args for GCC - # -F/path gives path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC - # @file GCC response files - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - func_append compile_command " $arg" - func_append finalize_command " $arg" - compiler_flags="$compiler_flags $arg" - continue - ;; - - # Some other compiler flag. - -* | +*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - *.$objext) - # A standard object. - objs="$objs $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - ;; - - *.$libext) - # An archive. - deplibs="$deplibs $arg" - old_deplibs="$old_deplibs $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - dlfiles="$dlfiles $arg" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - dlprefiles="$dlprefiles $arg" - prev= - else - deplibs="$deplibs $arg" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname="$func_basename_result" - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if $opt_duplicate_deps ; then - case "$libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - libs="$libs $deplib" - done - - if test "$linkmode" = lib; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if $opt_duplicate_compiler_generated_deps; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; - esac - pre_post_deps="$pre_post_deps $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - - for pass in $passes; do - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test "$linkmode,$pass" = "lib,link"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs="$tmp_deplibs" - fi - - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" - deplibs= - fi - if test "$linkmode" = prog; then - case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; - link) - libs="$deplibs %DEPLIBS%" - test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" - ;; - esac - fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - case $lib in - *.la) func_source "$lib" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` - case " $weak_libs " in - *" $deplib_base "*) ;; - *) deplibs="$deplibs $deplib" ;; - esac - done - done - libs="$dlprefiles" - fi - if test "$pass" = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi - - for deplib in $libs; do - lib= - found=no - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - compiler_flags="$compiler_flags $deplib" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test "$linkmode" = lib; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib="$searchdir/lib${name}${search_ext}" - if test -f "$lib"; then - if test "$search_ext" = ".la"; then - found=yes - else - found=no - fi - break 2 - fi - done - done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - else # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $deplib "*) - if func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - for l in $old_library $library_names; do - ll="$l" - done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - fi - ;; # -l - *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - newlib_search_path="$newlib_search_path $func_stripname_result" - ;; - prog) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - if test "$pass" = scan; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - func_stripname '-L' '' "$deplib" - newlib_search_path="$newlib_search_path $func_stripname_result" - ;; - *) - func_warning "\`-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - func_stripname '-R' '' "$deplib" - dir=$func_stripname_result - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) lib="$deplib" ;; - *.$libext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=yes - fi - ;; - pass_all) - valid_a_lib=yes - ;; - esac - if test "$valid_a_lib" != yes; then - $ECHO - $ECHO "*** Warning: Trying to link with static lib archive $deplib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because the file extensions .$libext of this argument makes me believe" - $ECHO "*** that it is just a static archive that I should not use here." - else - $ECHO - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - ;; - esac - continue - ;; - prog) - if test "$pass" != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - newdlprefiles="$newdlprefiles $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - newdlfiles="$newdlfiles $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - - if test "$found" = yes || test -f "$lib"; then : - else - func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" - fi - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "\`$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && dlfiles="$dlfiles $dlopen" - test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" - fi - - if test "$pass" = conv; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - # It is a libtool convenience library, so add in its objects. - convenience="$convenience $ladir/$objdir/$old_library" - old_convenience="$old_convenience $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if $opt_duplicate_deps ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done - elif test "$linkmode" != prog && test "$linkmode" != lib; then - func_fatal_error "\`$lib' is not a convenience library" - fi - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - for l in $old_library $library_names; do - linklib="$l" - done - if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - func_fatal_error "cannot -dlopen a convenience library: \`$lib'" - fi - if test -z "$dlname" || - test "$dlopen_support" != yes || - test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - dlprefiles="$dlprefiles $lib $dependency_libs" - else - newdlfiles="$newdlfiles $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of \`$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir="$ladir" - fi - ;; - esac - func_basename "$lib" - laname="$func_basename_result" - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library \`$lib' was moved." - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$libdir" - absdir="$libdir" - fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir="$ladir" - absdir="$abs_ladir" - # Remove this search path later - notinst_path="$notinst_path $abs_ladir" - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - notinst_path="$notinst_path $abs_ladir" - fi - fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir" && test "$linkmode" = prog; then - func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" - fi - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - newdlprefiles="$newdlprefiles $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - newdlprefiles="$newdlprefiles $dir/$dlname" - else - newdlprefiles="$newdlprefiles $dir/$linklib" - fi - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test "$linkmode" = lib; then - deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test "$linkmode" = prog && test "$pass" != link; then - newlib_search_path="$newlib_search_path $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - newlib_search_path="$newlib_search_path $func_stripname_result" - ;; - esac - # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if $opt_duplicate_deps ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { { test "$prefer_static_libs" = no || - test "$prefer_static_libs,$installed" = "built,yes"; } || - test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath:" in - *"$absdir:"*) ;; - *) temp_rpath="$temp_rpath$absdir:" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test "$use_static_libs" = built && test "$installed" = yes; then - use_static_libs=no - fi - if test -n "$library_names" && - { test "$use_static_libs" = no || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc*) - # No point in relinking DLLs because paths are not encoded - notinst_deplibs="$notinst_deplibs $lib" - need_relink=no - ;; - *) - if test "$installed" = no; then - notinst_deplibs="$notinst_deplibs $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" - break - fi - done - if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then - $ECHO - if test "$linkmode" = prog; then - $ECHO "*** Warning: Linking the executable $output against the loadable module" - else - $ECHO "*** Warning: Linking the shared library $output against the loadable module" - fi - $ECHO "*** $linklib is not portable!" - fi - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - shift - realname="$1" - shift - libname=`eval "\\$ECHO \"$libname_spec\""` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname="$dlname" - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw* | *cegcc*) - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - func_basename "$soroot" - soname="$func_basename_result" - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from \`$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for \`$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test "$linkmode" = prog || test "$mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" - case $host in - *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; - *-*-sysv4*uw2*) add_dir="-L$dir" ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir="-L$dir" ;; - *-*-darwin* ) - # if the lib is a (non-dlopened) module then we can not - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then - if test "X$dlopenmodule" != "X$lib"; then - $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then - $ECHO - $ECHO "*** And there doesn't seem to be a static archive available" - $ECHO "*** The link will probably fail, sorry" - else - add="$dir/$old_library" - fi - elif test -n "$old_library"; then - add="$dir/$old_library" - fi - fi - esac - elif test "$hardcode_minus_L" = no; then - case $host in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$dir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - add_dir="$add_dir -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - func_fatal_configuration "unsupported hardcode properties" - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; - esac - fi - if test "$linkmode" = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && - test "$hardcode_minus_L" != yes && - test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - fi - fi - fi - - if test "$linkmode" = prog || test "$mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - add="-l$name" - elif test "$hardcode_automatic" = yes; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" - else - add="$libdir/$linklib" - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - add_dir="$add_dir -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - fi - - if test "$linkmode" = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test "$linkmode" = prog; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - $ECHO - $ECHO "*** Warning: This system can not link to static lib archive $lib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then - $ECHO "*** But as you try to build a module library, libtool will still create " - $ECHO "*** a static module, that should work as long as the dlopening application" - $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - $ECHO - $ECHO "*** However, this would only work if libtool was able to extract symbol" - $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" - $ECHO "*** not find such a program. So, this module is probably useless." - $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test "$linkmode" = lib; then - if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || - test "$build_old_libs" = yes || - test "$link_static" = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) xrpath="$xrpath $temp_xrpath";; - esac;; - *) temp_deplibs="$temp_deplibs $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - newlib_search_path="$newlib_search_path $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - if $opt_duplicate_deps ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done - - if test "$link_all_deplibs" != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - path= - case $deplib in - -L*) path="$deplib" ;; - *.la) - func_dirname "$deplib" "" "." - dir="$func_dirname_result" - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of \`$dir'" - absdir="$dir" - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names" ; then - for tmp in $deplibrary_names ; do - depdepl=$tmp - done - if test -f "$absdir/$objdir/$depdepl" ; then - depdepl="$absdir/$objdir/$depdepl" - darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" - path= - fi - fi - ;; - *) - path="-L$absdir/$objdir" - ;; - esac - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" - - path="-L$absdir" - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) lib_search_path="$lib_search_path $dir" ;; - esac - done - newlib_search_path= - fi - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs ; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i="" - ;; - esac - if test -n "$i" ; then - tmp_libs="$tmp_libs $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" - fi - if test "$linkmode" = prog || test "$linkmode" = lib; then - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "\`-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - objs="$objs$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" - - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" - else - $ECHO - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - libobjs="$libobjs $objs" - fi - fi - - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test "$#" -gt 1 && \ - func_warning "ignoring multiple \`-rpath's for a libtool library" - - install_libdir="$1" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - shift - IFS="$save_ifs" - - test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major="$1" - number_minor="$2" - number_revision="$3" - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # which has an extra 1 added just for fun - # - case $version_type in - darwin|linux|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_minor" - lt_irix_increment=no - ;; - *) - func_fatal_configuration "$modename: unknown library version type \`$version_type'" - ;; - esac - ;; - no) - current="$1" - revision="$2" - age="$3" - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "CURRENT \`$current' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "REVISION \`$revision' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "AGE \`$age' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE \`$age' is greater than the current interface number \`$current'" - func_fatal_error "\`$vinfo' is not valid version information" - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current" - ;; - - irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring="$verstring_prefix$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test "$loop" -ne 0; do - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test "$loop" -ne 0; do - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - verstring="$verstring:${current}.0" - ;; - - qnx) - major=".$current" - versuffix=".$current" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - - *) - func_fatal_configuration "unknown library version type \`$version_type'" - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring="0.0" - ;; - esac - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - func_warning "undefined symbols not allowed in $host shared libraries" - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - - fi - - func_generate_dlsyms "$libname" "$libname" "yes" - libobjs="$libobjs $symfileobj" - test "X$libobjs" = "X " && libobjs= - - if test "$mode" != relink; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$ECHO "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext | *.gcno) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - if test "X$precious_files_regex" != "X"; then - if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - removelist="$removelist $p" - ;; - *) ;; - esac - done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - oldlibs="$oldlibs $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` - # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` - # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` - #done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - temp_xrpath="$temp_xrpath -R$libdir" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) dlfiles="$dlfiles $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) dlprefiles="$dlprefiles $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - deplibs="$deplibs System.ltframework" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then - deplibs="$deplibs -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $opt_dry_run || $RM conftest.c - cat > conftest.c <<EOF - int main() { return 0; } -EOF - $opt_dry_run || $RM conftest - if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then - ldd_output=`ldd conftest` - for i in $deplibs; do - case $i in - -l*) - func_stripname -l '' "$i" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $i "*) - newdeplibs="$newdeplibs $i" - i="" - ;; - esac - fi - if test -n "$i" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` - set dummy $deplib_matches; shift - deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" - else - droppeddeps=yes - $ECHO - $ECHO "*** Warning: dynamic linker does not accept needed library $i." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which I believe you do not have" - $ECHO "*** because a test_compile did reveal that the linker did not use it for" - $ECHO "*** its dynamic dependency list that programs get resolved with at runtime." - fi - fi - ;; - *) - newdeplibs="$newdeplibs $i" - ;; - esac - done - else - # Error occurred in the first compile. Let's try to salvage - # the situation: Compile a separate program for each library. - for i in $deplibs; do - case $i in - -l*) - func_stripname -l '' "$i" - name=$func_stripname_result - $opt_dry_run || $RM conftest - if $LTCC $LTCFLAGS -o conftest conftest.c $i; then - ldd_output=`ldd conftest` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $i "*) - newdeplibs="$newdeplibs $i" - i="" - ;; - esac - fi - if test -n "$i" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` - set dummy $deplib_matches; shift - deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - newdeplibs="$newdeplibs $i" - else - droppeddeps=yes - $ECHO - $ECHO "*** Warning: dynamic linker does not accept needed library $i." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because a test_compile did reveal that the linker did not use this one" - $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime." - fi - fi - else - droppeddeps=yes - $ECHO - $ECHO "*** Warning! Library $i is needed by this library but I was not able to" - $ECHO "*** make it link in! You will probably need to install it or some" - $ECHO "*** library that it depends on before this library will be fully" - $ECHO "*** functional. Installing it before continuing would be even better." - fi - ;; - *) - newdeplibs="$newdeplibs $i" - ;; - esac - done - fi - ;; - file_magic*) - set dummy $deplibs_check_method; shift - file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null | - $GREP " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - $ECHO - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for file magic test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a file magic. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test - if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ - $EGREP "$match_pattern_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - $ECHO - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - $ECHO "*** I have the capability to make that library automatically link in when" - $ECHO "*** you link to this library. But I can only do this if you have a" - $ECHO "*** shared version of the library, which you do not appear to have" - $ECHO "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a regex pattern. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ - -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` - done - fi - if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | - $GREP . >/dev/null; then - $ECHO - if test "X$deplibs_check_method" = "Xnone"; then - $ECHO "*** Warning: inter-library dependencies are not supported in this platform." - else - $ECHO "*** Warning: inter-library dependencies are not known to be supported." - fi - $ECHO "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - fi - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` - ;; - esac - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - $ECHO - $ECHO "*** Warning: libtool could not satisfy all declared inter-library" - $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - $ECHO "*** a static module, that should work as long as the dlopening" - $ECHO "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - $ECHO - $ECHO "*** However, this would only work if libtool was able to extract symbol" - $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" - $ECHO "*** not find such a program. So, this module is probably useless." - $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - $ECHO "*** The inter-library dependencies that have been dropped here will be" - $ECHO "*** automatically added whenever a program is linked with this library" - $ECHO "*** or is declared to -dlopen it." - - if test "$allow_undefined" = no; then - $ECHO - $ECHO "*** Since this library must not contain undefined symbols," - $ECHO "*** because either the platform does not support them or" - $ECHO "*** it was explicitly requested with -no-undefined," - $ECHO "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - new_libs="$new_libs -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$new_libs $deplib" ;; - esac - ;; - *) new_libs="$new_libs $deplib" ;; - esac - done - deplibs="$new_libs" - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - if test "$hardcode_into_libs" = yes; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - dep_rpath="$dep_rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - if test -n "$hardcode_libdir_flag_spec_ld"; then - eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" - else - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - shift - realname="$1" - shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib="$output_objdir/$realname" - linknames= - for link - do - linknames="$linknames $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols="$output_objdir/$libname.uexp" - delfiles="$delfiles $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols="$export_symbols" - export_symbols= - always_export_symbols=yes - fi - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - func_len " $cmd" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS="$save_ifs" - if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' - fi - - if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - tmp_deplibs="$tmp_deplibs $test_deplib" - ;; - esac - done - deplibs="$tmp_deplibs" - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test "$compiler_needs_object" = yes && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $convenience - libobjs="$libobjs $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - linker_flags="$linker_flags $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test "X$skipped_export" != "X:" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - output_la=`$ECHO "X$output" | $Xsed -e "$basename"` - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - last_robj= - k=1 - - if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then - output=${output_objdir}/${output_la}.lnkscript - func_verbose "creating GNU ld script: $output" - $ECHO 'INPUT (' > $output - for obj in $save_libobjs - do - $ECHO "$obj" >> $output - done - $ECHO ')' >> $output - delfiles="$delfiles $output" - elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then - output=${output_objdir}/${output_la}.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test "$compiler_needs_object" = yes; then - firstobj="$1 " - shift - fi - for obj - do - $ECHO "$obj" >> $output - done - delfiles="$delfiles $output" - output=$firstobj\"$file_list_spec$output\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test "X$objlist" = X || - test "$len" -lt "$max_cmd_len"; then - func_append objlist " $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - eval concat_cmds=\"$reload_cmds $objlist $last_robj\" - else - # All subsequent reloadable object files will link in - # the last one created. - eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext - objlist=$obj - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" - if test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" - fi - delfiles="$delfiles $output" - - else - output= - fi - - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - fi - - test -n "$save_libobjs" && - func_verbose "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - if ${skipped_export-false}; then - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - fi - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $dlprefiles - libobjs="$libobjs $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - func_show_eval '${RM}r "$gentop"' - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "\`-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object \`$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $opt_dry_run || $RM $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec and hope we can get by with - # turning comma into space.. - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` - else - gentop="$output_objdir/${obj}x" - generated="$generated $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "\`-release' is ignored for programs" - - test "$preload" = yes \ - && test "$dlopen_support" = unknown \ - && test "$dlopen_self" = unknown \ - && test "$dlopen_self_static" = unknown && \ - func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test "$tagname" = CXX ; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - compile_command="$compile_command ${wl}-bind_at_load" - finalize_command="$finalize_command ${wl}-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - new_libs="$new_libs -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$new_libs $deplib" ;; - esac - ;; - *) new_libs="$new_libs $deplib" ;; - esac - done - compile_deplibs="$new_libs" - - - compile_command="$compile_command $compile_deplibs" - finalize_command="$finalize_command $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) dllsearchpath="$dllsearchpath:$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) dllsearchpath="$dllsearchpath:$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - fi - - func_generate_dlsyms "$outputname" "@PROGRAM@" "no" - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=yes - case $host in - *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - *cegcc) - # Disable wrappers for cegcc, we are cross compiling anyway. - wrappers_required=no - ;; - *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - esac - if test "$wrappers_required" = no; then - # Replace the output file specification. - compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' - fi - - exit $exit_status - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - rpath="$rpath$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - exit $EXIT_SUCCESS - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "\`$output' will be relinked during installation" - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - # Now create the wrapper script. - func_verbose "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` - fi - - # Quote $ECHO for shipping. - if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then - case $progpath in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; - *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; - esac - qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` - else - qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` - fi - - # Only actually do things if not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - cwrappersource="$output_path/$objdir/lt-$output_name.c" - cwrapper="$output_path/$output_name.exe" - $RM $cwrappersource $cwrapper - trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host" ; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save $symfileobj" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$old_deplibs $non_pic_objects" - if test "$preload" = yes && test -f "$symfileobj"; then - oldobjs="$oldobjs $symfileobj" - fi - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $addlibs - oldobjs="$oldobjs $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - cmds=$old_archive_from_new_cmds - else - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $dlprefiles - oldobjs="$oldobjs $func_extract_archives_result" - fi - - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - $ECHO "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase="$func_basename_result" - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - oldobjs="$oldobjs $gentop/$newobj" - ;; - *) oldobjs="$oldobjs $obj" ;; - esac - done - fi - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - oldobjs= - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" - objlist= - len=$len0 - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test "X$oldobjs" = "X" ; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - func_verbose "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` - if test "$hardcode_automatic" = yes ; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - func_basename "$deplib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - newdependency_libs="$newdependency_libs $libdir/$name" - ;; - *) newdependency_libs="$newdependency_libs $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - newdlfiles="$newdlfiles $libdir/$name" - ;; - *) newdlfiles="$newdlfiles $lib" ;; - esac - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - newdlprefiles="$newdlprefiles $libdir/$name" - ;; - esac - done - dlprefiles="$newdlprefiles" - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - newdlfiles="$newdlfiles $abs" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - newdlprefiles="$newdlprefiles $abs" - done - dlprefiles="$newdlprefiles" - fi - $RM $output - # place dlname in correct position for cygwin - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then - $ECHO >> $output "\ -relink_command=\"$relink_command\"" - fi - done - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -{ test "$mode" = link || test "$mode" = relink; } && - func_mode_link ${1+"$@"} - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $opt_debug - RM="$nonopt" - files= - rmforce= - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case $arg in - -f) RM="$RM $arg"; rmforce=yes ;; - -*) RM="$RM $arg" ;; - *) files="$files $arg" ;; - esac - done - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - origobjdir="$objdir" - for file in $files; do - func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - objdir="$origobjdir" - else - objdir="$dir/$origobjdir" - fi - func_basename "$file" - name="$func_basename_result" - test "$mode" = uninstall && objdir="$dir" - - # Remember objdir for removal later, being careful to avoid duplicates - if test "$mode" = clean; then - case " $rmdirs " in - *" $objdir "*) ;; - *) rmdirs="$rmdirs $objdir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if { test -L "$file"; } >/dev/null 2>&1 || - { test -h "$file"; } >/dev/null 2>&1 || - test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif test "$rmforce" = yes; then - continue - fi - - rmfiles="$file" - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if func_lalib_p "$file"; then - func_source $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - rmfiles="$rmfiles $objdir/$n" - done - test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - - case "$mode" in - clean) - case " $library_names " in - # " " in the beginning catches empty $dlname - *" $dlname "*) ;; - *) rmfiles="$rmfiles $objdir/$dlname" ;; - esac - test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" && - test "$pic_object" != none; then - rmfiles="$rmfiles $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && - test "$non_pic_object" != none; then - rmfiles="$rmfiles $dir/$non_pic_object" - fi - fi - ;; - - *) - if test "$mode" = clean ; then - noexename=$name - case $file in - *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $file with .exe has already been added to rmfiles, - # add $file without .exe - rmfiles="$rmfiles $file" - ;; - esac - # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - rmfiles="$rmfiles $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - rmfiles="$rmfiles $objdir/lt-$name" - fi - if test "X$noexename" != "X$name" ; then - rmfiles="$rmfiles $objdir/lt-${noexename}.c" - fi - fi - fi - ;; - esac - func_show_eval "$RM $rmfiles" 'exit_status=1' - done - objdir="$origobjdir" - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -{ test "$mode" = uninstall || test "$mode" = clean; } && - func_mode_uninstall ${1+"$@"} - -test -z "$mode" && { - help="$generic_help" - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: -# vi:sw=2 - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.am deleted file mode 100644 index 0db02e3c..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -man_MANS = geoipupdate.1 geoiplookup6.1 geoiplookup.1 - -EXTRA_DIST = geoiplookup6.1.in geoiplookup.1.in geoipupdate.1.in - - -edit = sed \ - -e 's|DATADIR|$(pkgdatadir)|g' \ - -e 's|CONF_DIR|$(sysconfdir)|g' - -geoipupdate.1 geoiplookup.1 geoiplookup6.1: Makefile - rm -f $@ $@.tmp - $(edit) '$(srcdir)/$@.in' >$@.tmp - mv $@.tmp $@ - -geoipupdate.1: geoipupdate.1.in -geoiplookup.1: geoiplookup.1.in -geoiplookup6.1: geoiplookup6.1.in - -CLEANFILES = geoiplookup6.1 geoipupdate.1 geoiplookup.1 - -UPDATE_MAN = $(mandir)/man1/geoipupdate.1 -LOOKUP_MAN = $(mandir)/man1/geoiplookup.1 -LOOKUP6_MAN = $(mandir)/man1/geoiplookup6.1 - -install-data-hook: - cat geoipupdate.1 | sed s,DATADIR,$(pkgdatadir), | sed s,CONF_DIR,$(sysconfdir), > $(DESTDIR)$(UPDATE_MAN) - cat geoiplookup.1 | sed s,DATADIR,$(pkgdatadir), > $(DESTDIR)$(LOOKUP_MAN) - cat geoiplookup6.1 | sed s,DATADIR,$(pkgdatadir), > $(DESTDIR)$(LOOKUP6_MAN) - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.in deleted file mode 100644 index 0e8b1436..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/Makefile.in +++ /dev/null @@ -1,455 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = man -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -man1dir = $(mandir)/man1 -am__installdirs = "$(DESTDIR)$(man1dir)" -NROFF = nroff -MANS = $(man_MANS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -man_MANS = geoipupdate.1 geoiplookup6.1 geoiplookup.1 -EXTRA_DIST = geoiplookup6.1.in geoiplookup.1.in geoipupdate.1.in -edit = sed \ - -e 's|DATADIR|$(pkgdatadir)|g' \ - -e 's|CONF_DIR|$(sysconfdir)|g' - -CLEANFILES = geoiplookup6.1 geoipupdate.1 geoiplookup.1 -UPDATE_MAN = $(mandir)/man1/geoipupdate.1 -LOOKUP_MAN = $(mandir)/man1/geoiplookup.1 -LOOKUP6_MAN = $(mandir)/man1/geoiplookup6.1 -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu man/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-man1: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.1[a-z]*$$/p'; \ - } | while read p; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; echo "$$p"; \ - done | \ - sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ - sed 'N;N;s,\n, ,g' | { \ - list=; while read file base inst; do \ - if test "$$base" = "$$inst"; then list="$$list $$file"; else \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ - fi; \ - done; \ - for i in $$list; do echo "$$i"; done | $(am__base_list) | \ - while read files; do \ - test -z "$$files" || { \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ - done; } - -uninstall-man1: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man1dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.1[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @list='$(MANS)'; if test -n "$$list"; then \ - list=`for p in $$list; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ - if test -n "$$list" && \ - grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ - echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ - grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ - echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ - echo " typically \`make maintainer-clean' will remove them" >&2; \ - exit 1; \ - else :; fi; \ - else :; fi - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(MANS) -installdirs: - for dir in "$(DESTDIR)$(man1dir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man1 - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-man - -uninstall-man: uninstall-man1 - -.MAKE: install-am install-data-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-man1 install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ - ps ps-am uninstall uninstall-am uninstall-man uninstall-man1 - - -geoipupdate.1 geoiplookup.1 geoiplookup6.1: Makefile - rm -f $@ $@.tmp - $(edit) '$(srcdir)/$@.in' >$@.tmp - mv $@.tmp $@ - -geoipupdate.1: geoipupdate.1.in -geoiplookup.1: geoiplookup.1.in -geoiplookup6.1: geoiplookup6.1.in - -install-data-hook: - cat geoipupdate.1 | sed s,DATADIR,$(pkgdatadir), | sed s,CONF_DIR,$(sysconfdir), > $(DESTDIR)$(UPDATE_MAN) - cat geoiplookup.1 | sed s,DATADIR,$(pkgdatadir), > $(DESTDIR)$(LOOKUP_MAN) - cat geoiplookup6.1 | sed s,DATADIR,$(pkgdatadir), > $(DESTDIR)$(LOOKUP6_MAN) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup.1.in b/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup.1.in deleted file mode 100644 index ede2e518..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup.1.in +++ /dev/null @@ -1,37 +0,0 @@ -.TH GEOIPLOOKUP 1 "2 Jan 2007" -.UC 4 -.SH NAME -geoiplookup \- look up country using IP Address or hostname -.SH SYNOPSIS -geoiplookup [\-d directory] [\-f filename] [\-v] <ipaddress|hostname> -.SH DESCRIPTION -geoiplookup uses the GeoIP library and database to find the Country -that an IP address or hostname originates from. -.PP -For example -.PP -.I geoiplookup 80.60.233.195 -.PP -will find the Country that 80.60.233.195 originates from, in the following format: -.PP -.I NL, Netherlands -.PP -.SH OPTIONS -.IP "\-f" -Specify a custom path to a single GeoIP datafile. -.IP "\-d" -Specify a custom directory containing GeoIP datafile(s). By default geoiplookup looks in DATADIR -.IP "\-v" -Lists the date and build number for the GeoIP datafile(s). -.SH AUTHOR -Written by T.J. Mather -.SH "REPORTING BUGS" -Report bugs to <support@maxmind.com> -.SH COPYRIGHT -Copyright � 2006 MaxMind LLC - -This is free software; see the source for copying conditions. -There is NO warranty; not even for MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. -.SH "SEE ALSO" -geoipupdate(1), nslookup(1). diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in b/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in deleted file mode 100644 index 2a49ee1a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoiplookup6.1.in +++ /dev/null @@ -1,42 +0,0 @@ -.TH GEOIPLOOKUP6 1 "28 Oct 2008" -.UC 4 -.SH NAME -geouplookup6 \- look up country using IP Address or hostname -.SH SYNOPSIS -geouplookup6 [\-d directory] [\-f filename] [\-v] <ipaddress|hostname> -.SH DESCRIPTION -geouplookup6 uses the GeoIP library and database to find the Country -that an IP address or hostname originates from. You must install a database suitable for geoiplookup6. IE: GeoIPv6.dat -.PP -For example: -.PP -.I geouplookup6 2001:4860:0:1001::68 -.PP -.I geoiplookup6 ipv6.google.com -.PP -will find the Country that 2001:4860:0:1001::68 originates from, in the following format: -.PP -.I US, United States -.PP -.PP Please notice, that names must resolve to a ipv6 address. For example -.PP geoiplookup6 www.maxmind.com does not work, since there is no ipv6 -.PP DNS entry -.SH OPTIONS -.IP "\-f" -Specify a custom path to a single GeoIP datafile. -.IP "\-d" -Specify a custom directory containing GeoIP datafile(s). By default geouplookup6 looks in DATADIR -.IP "\-v" -Lists the date and build number for the GeoIP datafile(s). -.SH AUTHOR -Written by T.J. Mather -.SH "REPORTING BUGS" -Report bugs to <support@maxmind.com> -.SH COPYRIGHT -Copyright � 2008 MaxMind LLC - -This is free software; see the source for copying conditions. -There is NO warranty; not even for MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. -.SH "SEE ALSO" -geoipupdate(1), nslookup(1). diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoipupdate.1.in b/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoipupdate.1.in deleted file mode 100644 index c0f9a854..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/man/geoipupdate.1.in +++ /dev/null @@ -1,68 +0,0 @@ -.TH GEOIPUPDATE 1 "5 Oct 2010" -.UC 4 -.SH NAME -geoipupdate \- a program for updating the MaxMind GeoIP databases -.SH SYNOPSIS -geoipupdate [\-v] [\-f licensefile] -.SH DESCRIPTION -geoipupdate automatically updates the GeoIP database for GeoIP -subscribers. It connects to the MaxMind GeoIP Update server -and checks for an updated database. If it finds an updated -database, then it downloads it, uncompresses it, and installs it. -If you are running a firewall, it requires that the DNS and -HTTP (80) ports be open. -.PP -For example -.PP -.I geoipupdate \-v -.PP -Performs the update in verbose mode. -.PP -.SH OPTIONS -.IP "\-v" -Verbose mode, prints out the steps that geoipupdate takes. -.IP "\-d" -Specify a custom directory target to install the GeoIP datafile(s). By default geoipupdate installs to DATADIR -.IP "\-f" -Specifies the configuration file that contains the license key. -Defaults to CONF_DIR/GeoIP.conf -.SH USAGE -Typically you'll want to write a weekly crontab that will run geoipupdate. -Below is a sample crontab that runs geoipupdate on each Wednesday at noon: -.PP -.RS -# top of crontab -.PP -MAILTO=your@email.com -.PP -0 12 * * 3 BIN_DIR/geoipupdate -.PP -# end of crontab -.RE -To use with a proxy server, set the http_proxy environment variable. -E.g. -.RS -export http_proxy="http://proxy-hostname:port" -.RE -.SH RETURN CODES -geoipupdate returns 0 on success, 1 on error. -.SH FILES -.PP -.I CONF_DIR/GeoIP.conf -.PP -Configuration file for GeoIP, should contain license key. -.SH AUTHOR -Written by T.J. Mather -.SH "REPORTING BUGS" -Report bugs to <support@maxmind.com> -.SH COPYRIGHT -Copyright � 2011 MaxMind LLC - -This is free software; see the source for copying conditions. -There is NO warranty; not even for MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. -.SH "SEE ALSO" -Visit <http://www.maxmind.com/app/products> to -sign up for a GeoIP subscription. -.PP -geoiplookup(1), crontab(5) diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/missing b/Src/Plugins/DSP/sc_serv3/GeoIP/missing deleted file mode 100644 index 28055d2a..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/missing +++ /dev/null @@ -1,376 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. - -scriptversion=2009-04-28.21; # UTC - -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, -# 2008, 2009 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. - -# 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, see <http://www.gnu.org/licenses/>. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -msg="missing on your system" - -case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - autom4te touch the output file, or create a stub one - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch] - -Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and -\`g' are ignored when checking the name. - -Send bug reports to <bug-automake@gnu.org>." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - -esac - -# normalize program name to check for. -program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). This is about non-GNU programs, so use $1 not -# $program. -case $1 in - lex*|yacc*) - # Not GNU programs, they don't have --version. - ;; - - tar*) - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - exit 1 - fi - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $program in - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te*) - echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get \`$1' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison*|yacc*) - echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex*|flex*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit $? - fi - ;; - - makeinfo*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; - - tar*) - shift - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar "$@" && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar "$@" && exit 0 - fi - firstarg="$1" - if shift; then - case $firstarg in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - case $firstarg in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.am b/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.am deleted file mode 100644 index fffcbed3..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -INCLUDES = \ - -I$(top_srcdir)/libGeoIP \ - -Wall - -check_PROGRAMS = test-geoip - -noinst_PROGRAMS = benchmark test-geoip-region test-geoip-city test-geoip-org test-geoip-asnum test-geoip-isp test-geoip-netspeed - -EXTRA_PROGRAMS = benchmark \ - test-geoip-region \ - test-geoip-city \ - test-geoip-org \ - test-geoip-asnum \ - test-geoip-isp \ - test-geoip-netspeed - -LDADD = $(top_builddir)/libGeoIP/libGeoIP.la -AM_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\" - -test_geoip_SOURCES = test-geoip.c - -test_geoip_region_SOURCES = test-geoip-region.c - -test_geoip_org_SOURCES = test-geoip-org.c - -test_geoip_isp_SOURCES = test-geoip-isp.c - -test_geoip_asnum_SOURCES = test-geoip-asnum.c - -test_geoip_netspeed_SOURCES = test-geoip-netspeed.c - -test_geoip_city_SOURCES = test-geoip-city.c - -benchmark_SOURCES = benchmark.c - -EXTRA_DIST = Makefile.vc city_test.txt country_test.txt country_test2.txt country_test_name.txt region_test.txt -TESTS = test-geoip diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.in b/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.in deleted file mode 100644 index 6d1282bd..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.in +++ /dev/null @@ -1,657 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -check_PROGRAMS = test-geoip$(EXEEXT) -noinst_PROGRAMS = benchmark$(EXEEXT) test-geoip-region$(EXEEXT) \ - test-geoip-city$(EXEEXT) test-geoip-org$(EXEEXT) \ - test-geoip-asnum$(EXEEXT) test-geoip-isp$(EXEEXT) \ - test-geoip-netspeed$(EXEEXT) -EXTRA_PROGRAMS = benchmark$(EXEEXT) test-geoip-region$(EXEEXT) \ - test-geoip-city$(EXEEXT) test-geoip-org$(EXEEXT) \ - test-geoip-asnum$(EXEEXT) test-geoip-isp$(EXEEXT) \ - test-geoip-netspeed$(EXEEXT) -TESTS = test-geoip$(EXEEXT) -subdir = test -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am_benchmark_OBJECTS = benchmark.$(OBJEXT) -benchmark_OBJECTS = $(am_benchmark_OBJECTS) -benchmark_LDADD = $(LDADD) -benchmark_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_OBJECTS = test-geoip.$(OBJEXT) -test_geoip_OBJECTS = $(am_test_geoip_OBJECTS) -test_geoip_LDADD = $(LDADD) -test_geoip_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_asnum_OBJECTS = test-geoip-asnum.$(OBJEXT) -test_geoip_asnum_OBJECTS = $(am_test_geoip_asnum_OBJECTS) -test_geoip_asnum_LDADD = $(LDADD) -test_geoip_asnum_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_city_OBJECTS = test-geoip-city.$(OBJEXT) -test_geoip_city_OBJECTS = $(am_test_geoip_city_OBJECTS) -test_geoip_city_LDADD = $(LDADD) -test_geoip_city_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_isp_OBJECTS = test-geoip-isp.$(OBJEXT) -test_geoip_isp_OBJECTS = $(am_test_geoip_isp_OBJECTS) -test_geoip_isp_LDADD = $(LDADD) -test_geoip_isp_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_netspeed_OBJECTS = test-geoip-netspeed.$(OBJEXT) -test_geoip_netspeed_OBJECTS = $(am_test_geoip_netspeed_OBJECTS) -test_geoip_netspeed_LDADD = $(LDADD) -test_geoip_netspeed_DEPENDENCIES = \ - $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_org_OBJECTS = test-geoip-org.$(OBJEXT) -test_geoip_org_OBJECTS = $(am_test_geoip_org_OBJECTS) -test_geoip_org_LDADD = $(LDADD) -test_geoip_org_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -am_test_geoip_region_OBJECTS = test-geoip-region.$(OBJEXT) -test_geoip_region_OBJECTS = $(am_test_geoip_region_OBJECTS) -test_geoip_region_LDADD = $(LDADD) -test_geoip_region_DEPENDENCIES = $(top_builddir)/libGeoIP/libGeoIP.la -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(benchmark_SOURCES) $(test_geoip_SOURCES) \ - $(test_geoip_asnum_SOURCES) $(test_geoip_city_SOURCES) \ - $(test_geoip_isp_SOURCES) $(test_geoip_netspeed_SOURCES) \ - $(test_geoip_org_SOURCES) $(test_geoip_region_SOURCES) -DIST_SOURCES = $(benchmark_SOURCES) $(test_geoip_SOURCES) \ - $(test_geoip_asnum_SOURCES) $(test_geoip_city_SOURCES) \ - $(test_geoip_isp_SOURCES) $(test_geoip_netspeed_SOURCES) \ - $(test_geoip_org_SOURCES) $(test_geoip_region_SOURCES) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GEOIP_VERSION_INFO = @GEOIP_VERSION_INFO@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -INCLUDES = \ - -I$(top_srcdir)/libGeoIP \ - -Wall - -LDADD = $(top_builddir)/libGeoIP/libGeoIP.la -AM_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\" -test_geoip_SOURCES = test-geoip.c -test_geoip_region_SOURCES = test-geoip-region.c -test_geoip_org_SOURCES = test-geoip-org.c -test_geoip_isp_SOURCES = test-geoip-isp.c -test_geoip_asnum_SOURCES = test-geoip-asnum.c -test_geoip_netspeed_SOURCES = test-geoip-netspeed.c -test_geoip_city_SOURCES = test-geoip-city.c -benchmark_SOURCES = benchmark.c -EXTRA_DIST = Makefile.vc city_test.txt country_test.txt country_test2.txt country_test_name.txt region_test.txt -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu test/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -clean-checkPROGRAMS: - @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list -benchmark$(EXEEXT): $(benchmark_OBJECTS) $(benchmark_DEPENDENCIES) - @rm -f benchmark$(EXEEXT) - $(LINK) $(benchmark_OBJECTS) $(benchmark_LDADD) $(LIBS) -test-geoip$(EXEEXT): $(test_geoip_OBJECTS) $(test_geoip_DEPENDENCIES) - @rm -f test-geoip$(EXEEXT) - $(LINK) $(test_geoip_OBJECTS) $(test_geoip_LDADD) $(LIBS) -test-geoip-asnum$(EXEEXT): $(test_geoip_asnum_OBJECTS) $(test_geoip_asnum_DEPENDENCIES) - @rm -f test-geoip-asnum$(EXEEXT) - $(LINK) $(test_geoip_asnum_OBJECTS) $(test_geoip_asnum_LDADD) $(LIBS) -test-geoip-city$(EXEEXT): $(test_geoip_city_OBJECTS) $(test_geoip_city_DEPENDENCIES) - @rm -f test-geoip-city$(EXEEXT) - $(LINK) $(test_geoip_city_OBJECTS) $(test_geoip_city_LDADD) $(LIBS) -test-geoip-isp$(EXEEXT): $(test_geoip_isp_OBJECTS) $(test_geoip_isp_DEPENDENCIES) - @rm -f test-geoip-isp$(EXEEXT) - $(LINK) $(test_geoip_isp_OBJECTS) $(test_geoip_isp_LDADD) $(LIBS) -test-geoip-netspeed$(EXEEXT): $(test_geoip_netspeed_OBJECTS) $(test_geoip_netspeed_DEPENDENCIES) - @rm -f test-geoip-netspeed$(EXEEXT) - $(LINK) $(test_geoip_netspeed_OBJECTS) $(test_geoip_netspeed_LDADD) $(LIBS) -test-geoip-org$(EXEEXT): $(test_geoip_org_OBJECTS) $(test_geoip_org_DEPENDENCIES) - @rm -f test-geoip-org$(EXEEXT) - $(LINK) $(test_geoip_org_OBJECTS) $(test_geoip_org_LDADD) $(LIBS) -test-geoip-region$(EXEEXT): $(test_geoip_region_OBJECTS) $(test_geoip_region_DEPENDENCIES) - @rm -f test-geoip-region$(EXEEXT) - $(LINK) $(test_geoip_region_OBJECTS) $(test_geoip_region_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/benchmark.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-asnum.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-city.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-isp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-netspeed.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-org.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip-region.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-geoip.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ - fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ - else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ - fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) - $(MAKE) $(AM_MAKEFLAGS) check-TESTS -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstPROGRAMS mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: check-am install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ - clean-checkPROGRAMS clean-generic clean-libtool \ - clean-noinstPROGRAMS ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.vc b/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.vc deleted file mode 100644 index eaa23763..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/Makefile.vc +++ /dev/null @@ -1,29 +0,0 @@ -#NMAKE makefile for Windows developers. -#Produces a static library (GeoIP.lib). - -COMPILER=cl - -LINK = link -nologo - -CFLAGS=-DWIN32 -MD -nologo - -GEOIPINC = -I..\libGeoIP - -CC1 = $(COMPILER) $(CFLAGS) $(GEOIPINC) - -GEOIPLIB = ..\libGeoIP\GeoIP.lib - -EXTRA_LIBS= advapi32.lib wsock32.lib - -AR=lib - -TEST: benchmark.exe test-geoip.exe - -benchmark.exe: benchmark.c - $(CC1) -c benchmark.c - $(LINK) benchmark.obj $(GEOIPLIB) - -test-geoip.exe: test-geoip.c - $(CC1) -c test-geoip.c - $(LINK) test-geoip.obj $(GEOIPLIB) - diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/benchmark.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/benchmark.c deleted file mode 100644 index 3d2346f2..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/benchmark.c +++ /dev/null @@ -1,135 +0,0 @@ -#include <stdio.h> -#include <GeoIP.h> -#include <GeoIPCity.h> -#if !defined(_WIN32) -#include <sys/time.h> -#endif /* !defined(_WIN32) */ - -char *ipstring[4] = {"24.24.24.24","80.24.24.80", -"200.24.24.40","68.24.24.46"}; -int numipstrings = 4; - -#if !defined(_WIN32) -struct timeval timer_t1; -struct timeval timer_t2; -#else /* !defined(_WIN32) */ -FILETIME timer_t1; /* 100 ns */ -FILETIME timer_t2; -#endif /* !defined(_WIN32) */ - -#if !defined(_WIN32) -void timerstart() { - gettimeofday(&timer_t1,NULL); -} -double timerstop() { - int a1 = 0; - int a2 = 0; - double r = 0; - gettimeofday(&timer_t2,NULL); - a1 = timer_t2.tv_sec - timer_t1.tv_sec; - a2 = timer_t2.tv_usec - timer_t1.tv_usec; - if (a1 < 0) { - a1 = a1 - 1; - a2 = a2 + 1000000; - } - r = (((double) a1) + (((double) a2) / 1000000)); - return r; -} -#else /* !defined(_WIN32) */ -void timerstart() { - GetSystemTimeAsFileTime(&timer_t1); -} -double timerstop() { - __int64 delta; /* VC6 can't convert an unsigned int64 to to double */ - GetSystemTimeAsFileTime(&timer_t2); - delta = FILETIME_TO_USEC(timer_t2) - FILETIME_TO_USEC(timer_t2); - return delta; -} -#endif /* !defined(_WIN32) */ - -void testgeoipcountry(int flags,const char *msg,int numlookups) { - const char *str = NULL; - double t = 0; - int i4 = 0; - int i2 = 0; - GeoIP *i = NULL; - i = GeoIP_open("/usr/local/share/GeoIP/GeoIP.dat",flags); - if (i == NULL) { - printf("error: GeoIP.dat does not exist\n"); - return; - } - timerstart(); - for (i2 = 0;i2 < numlookups;i2++) { - str = GeoIP_country_name_by_addr(i,ipstring[i4]); - i4 = (i4 + 1) % numipstrings; - } - t = timerstop(); - printf("%s\n", msg); - printf("%d lookups made in %f seconds \n",numlookups,t); - GeoIP_delete(i); -} - -void testgeoipregion(int flags,const char *msg,int numlookups) { - GeoIP *i = NULL; - GeoIPRegion *i3 = NULL; - int i4 = 0; - int i2 = 0; - double t = 0; - i = GeoIP_open("/usr/local/share/GeoIP/GeoIPRegion.dat",flags); - if (i == NULL) { - printf("error: GeoIPRegion.dat does not exist\n"); - return; - } - timerstart(); - for (i2 = 0;i2 < numlookups;i2++) { - i3 = GeoIP_region_by_addr(i,ipstring[i4]); - GeoIPRegion_delete(i3); - i4 = (i4 + 1) % numipstrings; - } - t = timerstop(); - printf("%s\n", msg); - printf("%d lookups made in %f seconds \n",numlookups,t); - GeoIP_delete(i); -} - -void testgeoipcity(int flags,const char *msg,int numlookups) { - GeoIP *i = NULL; - GeoIPRecord * i3 = NULL; - int i4 = 0; - int i2 = 0; - double t = 0; - i = GeoIP_open("/usr/local/share/GeoIP/GeoIPCity.dat",flags); - if (i == NULL) { - printf("error: GeoLiteCity.dat does not exist\n"); - return; - } - timerstart(); - for (i2 = 0;i2 < numlookups;i2++) { - i3 = GeoIP_record_by_addr(i,ipstring[i4]); - GeoIPRecord_delete(i3); - i4 = (i4 + 1) % numipstrings; - } - t = timerstop(); - printf("%s\n", msg); - printf("%d lookups made in %f seconds \n",numlookups,t); - GeoIP_delete(i); -} - -int main(){ - int time = 300*numipstrings; - testgeoipcountry(0,"GeoIP Country",100*time); - testgeoipcountry(GEOIP_CHECK_CACHE,"GeoIP Country with GEOIP_CHECK_CACHE",100*time); - testgeoipcountry(GEOIP_MEMORY_CACHE,"GeoIP Country with GEOIP_MEMORY_CACHE",1000*time); - testgeoipcountry(GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE,"GeoIP Country with GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE",1000*time); - - testgeoipregion(0,"GeoIP Region",100*time); - testgeoipregion(GEOIP_CHECK_CACHE,"GeoIP Region with GEOIP_CHECK_CACHE",100*time); - testgeoipregion(GEOIP_MEMORY_CACHE,"GeoIP Region with GEOIP_MEMORY_CACHE",1000*time); - testgeoipregion(GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE,"GeoIP Region with GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE",1000*time); - - testgeoipcity(0,"GeoIP City",50*time); - testgeoipcity(GEOIP_INDEX_CACHE,"GeoIP City with GEOIP_INDEX_CACHE",200*time); - testgeoipcity(GEOIP_INDEX_CACHE | GEOIP_CHECK_CACHE,"GeoIP City with GEOIP_INDEX_CACHE and GEOIP_CHECK_CACHE",200*time); - testgeoipcity(GEOIP_MEMORY_CACHE,"GeoIP City with GEOIP_MEMORY_CACHE",500*time); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/city_test.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/city_test.txt deleted file mode 100644 index 20cd8e15..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/city_test.txt +++ /dev/null @@ -1,2 +0,0 @@ -24.24.24.24 # Should return Ithaca, NY, US -80.24.24.24 # Should return Madrid, 29, ES diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test.txt deleted file mode 100644 index eaffb935..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test.txt +++ /dev/null @@ -1,69 +0,0 @@ -216.236.135.152 US USA -192.106.51.100 IT ITA -147.251.48.1 CZ CZE -203.174.65.12 JP JPN -212.208.74.140 FR FRA -200.219.192.106 BR BRA -134.102.101.18 DE DEU -193.75.148.28 BE BEL -194.244.83.2 IT ITA -203.15.106.23 AU AUS -196.31.1.1 ZA ZAF -151.28.39.114 IT ITA -151.38.70.94 IT ITA -193.56.4.124 FR FRA -195.142.146.198 TR TUR -211.232.0.0 KR KOR -211.240.0.0 KR KOR -193.194.4.0 MA MAR -139.20.112.104 DE DEU -139.20.112.3 DE DEU -145.236.125.211 HU HUN -149.225.169.61 DE DEU -151.17.191.46 IT ITA -151.24.176.194 IT ITA -151.25.8.136 IT ITA -151.26.146.192 IT ITA -151.26.153.66 IT ITA -151.26.167.71 IT ITA -151.26.35.204 IT ITA -151.26.64.157 IT ITA -151.27.138.182 IT ITA -151.28.39.114 IT ITA -151.29.150.217 IT ITA -151.29.237.39 IT ITA -151.29.73.189 IT ITA -151.30.134.242 IT ITA -151.30.135.85 IT ITA -151.30.168.224 IT ITA -151.35.80.202 IT ITA -151.35.80.240 IT ITA -151.36.191.229 IT ITA -151.38.70.94 IT ITA -151.38.92.126 IT ITA -151.42.100.132 IT ITA -151.42.169.71 IT ITA -193.56.4.124 FR FRA -195.142.146.198 TR TUR -195.142.49.205 TR TUR -202.247.74.18 JP JPN -202.247.74.71 JP JPN -202.247.74.81 JP JPN -202.247.74.88 JP JPN -203.242.239.188 KR KOR -203.174.65.12 JP JPN -212.208.74.140 FR FRA -200.219.192.106 BR BRA -202.53.254.193 ID IDN -12.168.0.0 US USA -12.169.0.0 US USA -12.200.0.0 US USA -203.121.0.8 MY MYS -203.20.231.1 AU AUS -203.87.98.29 AU AUS -203.181.121.150 JP JPN -202.166.127.246 SG SGP -62.188.202.242 GB GBR -12.12.197.23 US USA -12.12.199.3 US USA -12.12.200.79 US USA diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test2.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test2.txt deleted file mode 100644 index eb078a83..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test2.txt +++ /dev/null @@ -1,29 +0,0 @@ -212.118.5.94 JO -64.170.57.29 US -202.7.216.215 AU -212.33.164.149 SA -68.96.110.210 US -213.166.131.168 SA -64.158.191.179 US -24.247.251.23 US -203.199.228.66 IN -195.14.141.225 CY -200.52.94.98 MX -203.197.187.193 IN -203.128.9.170 PK -144.106.240.140 US -195.248.180.102 UA -213.1.0.118 GB -64.255.148.52 US -12.78.124.119 US -212.68.224.183 BE -62.148.73.85 PL -203.146.135.180 TH -209.204.179.145 US -64.123.0.164 US -202.56.198.16 IN -61.0.94.172 IN -62.42.171.190 ES -192.117.245.177 IL -213.123.75.243 GB -80.56.171.62 NL diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test_name.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test_name.txt deleted file mode 100644 index 366b2f26..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/country_test_name.txt +++ /dev/null @@ -1 +0,0 @@ -yahoo.com US diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/region_test.txt b/Src/Plugins/DSP/sc_serv3/GeoIP/test/region_test.txt deleted file mode 100644 index 4df7ea79..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/region_test.txt +++ /dev/null @@ -1,24 +0,0 @@ -216.236.135.152 US USA -24.24.24.24 US USA -147.251.48.1 CZ CZE -203.174.65.12 JP JPN -212.208.74.140 FR FRA -200.219.192.106 BR BRA -134.102.101.18 DE DEU -193.75.148.28 BE BEL -194.244.83.2 IT ITA -203.15.106.23 AU AUS -196.31.1.1 ZA ZAF -151.28.39.114 IT ITA -151.38.70.94 IT ITA -193.56.4.124 FR FRA -195.142.146.198 TR TUR -211.232.0.0 KR KOR -211.240.0.0 KR KOR -193.194.4.0 MA MAR -139.20.112.104 DE DEU -139.20.112.3 DE DEU -145.236.125.211 HU HUN -yahoo.com US USA -amazon.com US USA -www.uspto.gov US USA diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-asnum.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-asnum.c deleted file mode 100644 index d6c3afcd..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-asnum.c +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-asnum.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -int main (int argc, char* argv[]) { - FILE *f; - GeoIP * gi; - char * org; - int generate = 0; - char host[50]; - - if (argc == 2) - if (!strcmp(argv[1],"gen")) - generate = 1; - - gi = GeoIP_open("../data/GeoIPASNum.dat", GEOIP_STANDARD); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("asnum_test.txt","r"); - - if (f == NULL) { - fprintf(stderr, "Error opening asnum_test.txt\n"); - exit(1); - } - - while (fscanf(f, "%s", host) != EOF) { - org = GeoIP_org_by_name (gi, (const char *)host); - - if (org != NULL) { - printf("%s\t%s\n", host, _mk_NA(org)); - } - } - - GeoIP_delete(gi); - - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-city.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-city.c deleted file mode 100644 index 4a48fdea..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-city.c +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-city.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" -#include "GeoIPCity.h" - - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -int -main(int argc, char *argv[]) -{ - FILE *f; - GeoIP *gi; - GeoIPRecord *gir; - int generate = 0; - char host[50]; - const char *time_zone = NULL; - char **ret; - if (argc == 2) - if (!strcmp(argv[1], "gen")) - generate = 1; - - gi = GeoIP_open("../data/GeoIPCity.dat", GEOIP_INDEX_CACHE); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("city_test.txt", "r"); - - if (f == NULL) { - fprintf(stderr, "Error opening city_test.txt\n"); - exit(1); - } - - while (fscanf(f, "%s", host) != EOF) { - gir = GeoIP_record_by_name(gi, (const char *) host); - - if (gir != NULL) { - ret = GeoIP_range_by_ip(gi, (const char *) host); - time_zone = GeoIP_time_zone_by_country_and_region(gir->country_code, gir->region); - printf("%s\t%s\t%s\t%s\t%s\t%s\t%f\t%f\t%d\t%d\t%s\t%s\t%s\n", host, - _mk_NA(gir->country_code), - _mk_NA(gir->region), - _mk_NA(GeoIP_region_name_by_code(gir->country_code, gir->region)), - _mk_NA(gir->city), - _mk_NA(gir->postal_code), - gir->latitude, - gir->longitude, - gir->metro_code, - gir->area_code, - _mk_NA(time_zone), - ret[0], - ret[1]); - GeoIP_range_by_ip_delete(ret); - GeoIPRecord_delete(gir); - } - } - GeoIP_delete(gi); - return 0; - -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-isp.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-isp.c deleted file mode 100644 index d6212b86..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-isp.c +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-isp.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -int main (int argc, char* argv[]) { - FILE *f; - GeoIP * gi; - char * org; - int generate = 0; - char host[50]; - - if (argc == 2) - if (!strcmp(argv[1],"gen")) - generate = 1; - - gi = GeoIP_open("../data/GeoIPISP.dat", GEOIP_STANDARD); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("isp_test.txt","r"); - - if (f == NULL) { - fprintf(stderr, "Error opening isp_test.txt\n"); - exit(1); - } - - while (fscanf(f, "%s", host) != EOF) { - org = GeoIP_org_by_name (gi, (const char *)host); - - if (org != NULL) { - printf("%s\t%s\n", host, _mk_NA(org)); - free(org); - } - } - - fclose(f); - GeoIP_delete(gi); - - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-netspeed.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-netspeed.c deleted file mode 100644 index 05def4e9..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-netspeed.c +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-netspeed.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "GeoIP.h" - -int main (int argc, char* argv[]) { - FILE *f; - GeoIP * gi; - int netspeed; - char host[50]; - - gi = GeoIP_open("../data/GeoIPNetSpeed.dat", GEOIP_STANDARD); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("netspeed_test.txt","r"); - - if (f == NULL) { - fprintf(stderr, "Error opening netspeed_test.txt\n"); - exit(1); - } - - while (fscanf(f, "%s", host) != EOF) { - netspeed = GeoIP_id_by_name (gi, (const char *)host); - if (netspeed == GEOIP_UNKNOWN_SPEED) { - printf("%s\tUnknown\n", host); - } else if (netspeed == GEOIP_DIALUP_SPEED) { - printf("%s\tDialup\n", host); - } else if (netspeed == GEOIP_CABLEDSL_SPEED) { - printf("%s\tCable/DSL\n", host); - } else if (netspeed == GEOIP_CORPORATE_SPEED) { - printf("%s\tCorporate\n", host); - } - } - fclose(f); - GeoIP_delete(gi); - - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-org.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-org.c deleted file mode 100644 index 74ba01be..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-org.c +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-org.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "GeoIP.h" - -static const char * _mk_NA( const char * p ){ - return p ? p : "N/A"; -} - -int -main(int argc, char *argv[]) -{ - FILE *f; - GeoIP *gi; - char *org; - int generate = 0; - char host[50]; - char **ret; - if (argc == 2) - if (!strcmp(argv[1], "gen")) - generate = 1; - - gi = GeoIP_open("../data/GeoIPOrg.dat", GEOIP_INDEX_CACHE); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("org_test.txt", "r"); - - if (f == NULL) { - fprintf(stderr, "Error opening org_test.txt\n"); - exit(1); - } - - printf("IP\torganization\tnetmask\tbeginIp\tendIp\n"); - while (fscanf(f, "%s", host) != EOF) { - org = GeoIP_name_by_name(gi, (const char *) host); - - if (org != NULL) { - ret = GeoIP_range_by_ip(gi, (const char *) host); - - printf("%s\t%s\t%d\t%s\t%s\n", host, _mk_NA(org), GeoIP_last_netmask(gi), ret[0], ret[1]); - GeoIP_range_by_ip_delete(ret); - free(org); - } - } - - fclose(f); - GeoIP_delete(gi); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-region.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-region.c deleted file mode 100644 index 0be75177..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip-region.c +++ /dev/null @@ -1,114 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip-region.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <GeoIP.h> -#include <sys/types.h> /* For uint32_t */ -#ifdef HAVE_STDINT_H -#include <stdint.h> /* For uint32_t */ -#endif -#if !defined(_WIN32) -#include <netdb.h> /* For gethostbyname */ -#include <netinet/in.h> /* For ntohl */ -#else -#include <windows.h> -#include <winsock.h> -#endif -#include <assert.h> - -unsigned long inetaddr(const char * name) -{ - struct hostent * host; - struct in_addr inaddr; - - host = gethostbyname(name); assert(host); - inaddr.s_addr = *((uint32_t*)host->h_addr_list[0]); - return inaddr.s_addr; -} - -static const char * _mk_NA ( const char * p ){ - return p ? p : "N/A"; -} - -int main () { - GeoIP * gi; - GeoIPRegion * gir, giRegion; - - FILE *f; - char ipAddress[30]; - char expectedCountry[3]; - char expectedCountry3[4]; - const char * time_zone; - - gi = GeoIP_open("../data/GeoIPRegion.dat", GEOIP_MEMORY_CACHE); - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - f = fopen("region_test.txt","r"); - - if (f == NULL) { - fprintf(stderr, "Error opening region_test.txt\n"); - exit(1); - } - - gir = GeoIP_region_by_addr (gi, "10.0.0.0"); - if (gir != NULL) { - printf("lookup of private IP address: country = %s, region = %s\n", gir->country_code, gir->region); - } - - while (fscanf(f, "%s%s%s", ipAddress, expectedCountry, expectedCountry3 ) != EOF) { - printf("ip = %s\n",ipAddress); - - gir = GeoIP_region_by_name (gi, ipAddress); - time_zone = GeoIP_time_zone_by_country_and_region(gir->country_code, gir->region); - if (gir != NULL) { - printf("%s, %s, %s, %s\n", - gir->country_code, - (!gir->region[0]) ? "N/A" : gir->region, - _mk_NA(GeoIP_region_name_by_code(gir->country_code, gir->region)), - _mk_NA(time_zone)); - } else { - printf("NULL!\n"); - } - - GeoIP_assign_region_by_inetaddr (gi, inetaddr(ipAddress), &giRegion); - if (gir != NULL) { - assert(giRegion.country_code[0]); - assert(!strcmp(gir->country_code, giRegion.country_code)); - if ( gir->region[0] ) { - assert(giRegion.region[0]); - assert(!strcmp(gir->region, giRegion.region)); - } else { - assert(!giRegion.region[0]); - } - } else { - assert(!giRegion.country_code[0]); - } - - if ( gir != NULL ) { - GeoIPRegion_delete(gir); - } - } - - GeoIP_delete(gi); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip.c b/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip.c deleted file mode 100644 index 4bb209e8..00000000 --- a/Src/Plugins/DSP/sc_serv3/GeoIP/test/test-geoip.c +++ /dev/null @@ -1,113 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ -/* test-geoip.c - * - * Copyright (C) 2006 MaxMind LLC - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <GeoIP.h> - -int main () { - FILE *f; - char ipAddress[30]; - char expectedCountry[3]; - char expectedCountry3[4]; - const char * returnedCountry; - GeoIP * gi; - int failed = 0; - int test_num = 1; - - int i; - for (i = 0; i < 2; ++i) { - if (0 == i) { - /* Read from filesystem, check for updated file */ - gi = GeoIP_open(SRCDIR"/data/GeoIP.dat", GEOIP_STANDARD | GEOIP_CHECK_CACHE); - } else { - /* Read from memory, faster but takes up more memory */ - gi = GeoIP_open(SRCDIR"/data/GeoIP.dat", GEOIP_MEMORY_CACHE); - } - - if (gi == NULL) { - fprintf(stderr, "Error opening database\n"); - exit(1); - } - - /* make sure GeoIP deals with invalid query gracefully */ - returnedCountry = GeoIP_country_code_by_addr(gi,NULL); - if (returnedCountry != NULL) { - fprintf(stderr,"Invalid Query test failed, got non NULL, expected NULL\n"); - failed = 1; - } - - returnedCountry = GeoIP_country_code_by_name(gi,NULL); - if (returnedCountry != NULL) { - fprintf(stderr,"Invalid Query test failed, got non NULL, expected NULL\n"); - failed = 1; - } - - f = fopen(SRCDIR"/test/country_test.txt","r"); - - while (fscanf(f, "%s%s%s", ipAddress, expectedCountry, expectedCountry3) != EOF) { - returnedCountry = GeoIP_country_code_by_addr(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry) != 0) { - fprintf(stderr,"Test addr %d for %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - returnedCountry = GeoIP_country_code_by_name(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry) != 0) { - fprintf(stderr,"Test name %d for %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - returnedCountry = GeoIP_country_code3_by_addr(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry3) != 0) { - fprintf(stderr,"Test addr %d for %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - returnedCountry = GeoIP_country_code3_by_name(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry3) != 0) { - fprintf(stderr,"Test name %d for %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - test_num++; - } - fclose(f); - - f = fopen(SRCDIR"/test/country_test2.txt","r"); - while (fscanf(f, "%s%s", ipAddress, expectedCountry ) != EOF) { - returnedCountry = GeoIP_country_code_by_addr(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry) != 0) { - fprintf(stderr,"Test addr %d %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - test_num++; - } - fclose(f); - - f = fopen(SRCDIR"/test/country_test_name.txt","r"); - while (fscanf(f, "%s%s", ipAddress, expectedCountry) != EOF) { - returnedCountry = GeoIP_country_code_by_name(gi,ipAddress); - if (returnedCountry == NULL || strcmp(returnedCountry, expectedCountry) != 0) { - fprintf(stderr,"Test addr %d %s failed, got %s, expected %s\n",test_num,ipAddress,returnedCountry,expectedCountry); - failed = 1; - } - test_num++; - } - - fclose(f); - GeoIP_delete(gi); - } - return failed; -} diff --git a/Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp b/Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp deleted file mode 100644 index 430c8c4b..00000000 --- a/Src/Plugins/DSP/sc_serv3/ID3miniParsers.cpp +++ /dev/null @@ -1,827 +0,0 @@ -#include "ID3miniParsers.h" -#include "stl/stringUtils.h" -#include <locale> - -using namespace ID3V2; -using namespace uniString; -using namespace std; - -static const __uint8 E_LATIN1(0); -static const __uint8 E_UTF16(1); // with COM -static const __uint8 E_UTF16BE(2); // big endian no BOM -static const __uint8 E_UTF8(3); // utf8 - -void ID3V2::base64encode(const char *in,size_t siz,string &out) throw() -{ - char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - int shift = 0; - int accum = 0; - - while (siz) - { - accum <<= 8; - shift += 8; - accum |= *in++; - siz--; - while ( shift >= 6 ) - { - shift -= 6; - out.push_back(alphabet[(accum >> shift) & 0x3F]); - } - } - if (shift == 4) - { - out.push_back(alphabet[(accum & 0xF)<<2]); - out.push_back('='); - } - else if (shift == 2) - { - out.push_back(alphabet[(accum & 0x3)<<4]); - out.push_back('='); - out.push_back('='); - } -} - -// way cool function. Given a hunk of data from an ID3V2 entry, break it into a collection -// of unicode strings based on a format string (sort of like sprintf for ID3V2 data) -vector<utf8> ID3V2::extractor(const vector<__uint8> &data,const char *format) throw(exception) -{ - vector<utf8> result; - - __uint8 encoding = E_LATIN1; - - int bytesRemaining = (int)data.size(); - vector<__uint8>::size_type offset = 0; - - const char *f = format; - while((*f) && (bytesRemaining > 0)) - { - switch(*f) - { - case ' ': break; // do nothing, just move to next - case 'e': // encoding - encoding = data[offset++]; - --bytesRemaining; - break; - - case 'c': // single digit code - { - __uint8 code = data[offset++]; - --bytesRemaining; - result.push_back(stringUtil::tos((int)code)); - } - break; - - case 'y': // dynamic counter - { - __uint64 counter = 0; - while(bytesRemaining > 0) - { - counter = counter << 8; - counter += data[offset]; - ++offset; - --bytesRemaining; - } - result.push_back(stringUtil::tos(counter)); - } - break; - - case 'u': // non-encoding string - { - size_t slen = uniString::strlen(&(data[offset]),bytesRemaining); - utf32 u32; - u32.assignFromLatinExtended(&(data[offset]),slen); - offset += (slen+1); - bytesRemaining -= (slen+1); - result.push_back(u32.toUtf8()); - } - break; - - case 's': // encoding string - { - if (encoding == E_LATIN1) - { - size_t slen = uniString::strlen(&(data[offset]),bytesRemaining); - utf32 u32; - u32.assignFromLatinExtended(&(data[offset]),slen); - offset += (slen+1); - bytesRemaining -= (slen+1); - result.push_back(u32.toUtf8()); - } - else if (encoding == E_UTF16) - { - const utf16::value_type *v16 = reinterpret_cast<const utf16::value_type*>(&(data[offset])); - size_t slen = uniString::strlen(v16,bytesRemaining / 2); - utf32 u32(v16,slen); - offset += ((slen * 2) + 2); - bytesRemaining -= ((slen * 2) + 2); - result.push_back(u32.toUtf8()); - } - else if (encoding == E_UTF16BE) - { - const utf16::value_type *v16 = reinterpret_cast<const utf16::value_type*>(&(data[offset])); - size_t slen = uniString::strlen(v16,bytesRemaining / 2); - utf32 u32(v16,slen,false); // assume big endian - offset += ((slen * 2) + 2); - bytesRemaining -= ((slen * 2) + 2); - result.push_back(u32.toUtf8()); - } - else if (encoding == E_UTF8) - { - size_t slen = uniString::strlen(&(data[offset]),bytesRemaining); - utf32 u32(&(data[offset]),slen); - offset += (slen+1); - bytesRemaining -= (slen+1); - result.push_back(u32.toUtf8()); - } - else throw runtime_error("unknown encoding " + stringUtil::tos((int)encoding)); - } - break; - - case 'b': // binary data - { - string b64; - base64encode((const char *)&(data[offset]),bytesRemaining,b64); - result.push_back(b64); - offset += bytesRemaining; - bytesRemaining = 0; - } - break; - - case 'l': // three char language code - { - if (bytesRemaining < 3) throw runtime_error("not enough data"); - utf8 l; - bool bad = - (data[offset] < '0' || data[offset] > 'z' || - data[offset+1] < '0' || data[offset+1] > 'z' || - data[offset+2] < '0' || data[offset+2] > 'z'); - - l.push_back(data[offset++]); l.push_back(data[offset++]); l.push_back(data[offset++]); - bytesRemaining -= 3; - if (bad) - result.push_back(utf8()); - else - result.push_back(l); - } - break; - - case '+': - while(f > format && ((*f) == '+' || (*f) == ' ')) --f; - --f; - break; - } - ++f; - } - - while((!result.empty()) && (result.back().empty())) result.pop_back(); - return result; -} - -static const utf8 LT("<"); -static const utf8 GT(">"); -static const utf8 LTSLASH("</"); -static const utf8 EMPTYSTRING; -static const utf8::value_type LPAREN('('); -static const utf8::value_type RPAREN(')'); - -// genres can be a list of codes and subgenres of high complexity. Parse it all out -// (see ID3V2 specification for genre tag) -// -// some examples -// (21) -// (42) Eurodisco -// (16) (18) Trance -void ID3V2::fromStringList(const vector<utf8> &slist,genreList_t &gl) throw(runtime_error) -{ - gl.clear(); - - static const int state_Initial = 0; - static const int state_LeadingParen = 1; - static const int state_Code = 2; - static const int state_Subgenre = 3; - int state = state_Initial; - - genreEntry e; - - for(vector<utf8>::const_iterator li = slist.begin(); li != slist.end(); ++li) - { - for(utf8::const_iterator i = (*li).begin(); i != (*li).end(); ++i) - { - switch(state) - { - case state_Initial: - e.m_genreCode = EMPTYSTRING; - e.m_refinement = EMPTYSTRING; - if (stringUtil::safe_is_space(*i)) {} - else if ((*i) == LPAREN) - { - state = state_LeadingParen; - } - else - { - state = state_Subgenre; - e.m_refinement += (*i); - } - break; - - case state_LeadingParen: - if ((*i) == LPAREN) - { - state = state_Subgenre; - e.m_refinement += (*i); - } - else if ((*i) == RPAREN) - { - if (!e.m_genreCode.empty() || !e.m_refinement.empty()) - gl.push_back(e); - e.m_genreCode = EMPTYSTRING; - e.m_refinement = EMPTYSTRING; - state = state_Initial; - } - else - { - if (!e.m_genreCode.empty() || !e.m_refinement.empty()) - gl.push_back(e); - e.m_genreCode = EMPTYSTRING; - e.m_refinement = EMPTYSTRING; - e.m_genreCode += (*i); - state = state_Code; - } - break; - - case state_Code: - if ((*i) == RPAREN) - { - state = state_Subgenre; - } - else - { - e.m_genreCode += *i; - } - break; - - case state_Subgenre: - if ((*i) == LPAREN) - { - state = state_LeadingParen; - } - else - { - e.m_refinement += (*i); - } - break; - - default: - throw logic_error(string(__FUNCTION__) + " internal error. Bad state"); - break; - } - } - - switch(state) - { - case state_Initial: - break; - - case state_LeadingParen: - throw runtime_error(string(__FUNCTION__) + " badly formed TCON data " + (*li).hideAsString()); - break; - - case state_Code: - throw runtime_error(string(__FUNCTION__) + " badly formed TCON data " + (*li).hideAsString()); - break; - - case state_Subgenre: - if (!e.m_genreCode.empty() || !e.m_refinement.empty()) - gl.push_back(e); - break; - - default: - throw logic_error(string(__FUNCTION__) + " internal error. Bad state"); - break; - } // character iteration - } // end string list iteration -} - -uniString::utf8 ID3V2::toXML(const utf8 &tag,const genreList_t &l) throw() -{ - utf8 result; - utf8 endTag = utf8("</") + tag + utf8(">"); - - for(genreList_t::const_iterator i = l.begin(); i != l.end(); ++i) - { - result += LT + tag; - if (!(*i).m_genreCode.empty()) - result += utf8(" v1=\"") + (*i).m_genreCode.escapeXML() + utf8("\""); - result += GT + (*i).m_refinement.escapeXML() + endTag; - } - return result; -} - -uniString::utf8 ID3V2::toString(const genreList_t &l) throw() -{ - for(genreList_t::const_iterator i = l.begin(); i != l.end(); ++i) - { - if (!(*i).m_genreCode.empty()) return (*i).m_genreCode; - } - return uniString::utf8(); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const vector<uniString::utf8> &s,stringList_t &l) throw() -{ - //l = stringUtil::tokenizer(s,(utf8::value_type)'/'); - l = s; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const stringList_t &l) throw() -{ - utf8 result; - utf8 startTag = LT + tag + GT; - utf8 endTag = LTSLASH + tag + GT; - for(stringList_t::const_iterator i = l.begin(); i != l.end(); ++i) - { - result += startTag + (*i).escapeXML() + endTag; - } - return result; -} - -uniString::utf8 ID3V2::toString(const stringList_t &l) throw() -{ - return (l.empty() ? uniString::utf8() : l.front()); -} - -///////////////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,comment_t &c) throw() -{ - if (s.size() >= 3) - { - c.m_languageCode = s[0]; - c.m_id = s[1]; - c.m_comment = s[2]; - } -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const comment_t &c) throw() -{ - utf8 result; - result += LT + tag; - if (!c.m_languageCode.empty()) - result += utf8(" language=\"") + c.m_languageCode.escapeXML() + utf8("\""); - if (!c.m_id.empty()) - result += utf8(" id=\"") + c.m_id.escapeXML() + utf8("\""); - result += GT + c.m_comment.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const comment_t &c) throw() -{ - return c.m_comment; -} - -///////////////////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,userUrl_t &c) throw() -{ - if (!s.empty()) - c.m_id = s[0]; - if (s.size() > 1) - c.m_url = s[1]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const userUrl_t &c) throw() -{ - if (c.m_id.empty() && c.m_url.empty()) return utf8(); - - utf8 result = LT + tag; - if (!c.m_id.empty()) - result += utf8(" id=\"") + c.m_id.escapeXML() + utf8("\""); - result += GT + c.m_url.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const userUrl_t &c) throw() -{ return c.m_url; } - -///////////////////////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,userText_t &t) throw() -{ - if (!s.empty()) - t.m_id = s[0]; - if (s.size() > 1) - t.m_text = s[1]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const userText_t &t) throw() -{ - if (t.m_id.empty() && t.m_text.empty()) return utf8(); - - utf8 result = LT + tag; - if (!t.m_id.empty()) - result += utf8(" id=\"") + t.m_id.escapeXML() + utf8("\""); - result += GT + t.m_text.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const userText_t &t) throw() -{ return t.m_text; } - -///////////////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,popularimeter_t &p) throw() -{ - vector<utf8>::size_type siz = s.size(); - - if (siz > 0) - p.m_email = s[0]; - if (siz > 1) - p.m_rating = s[1]; - if (siz > 2) - p.m_counter = s[2]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const popularimeter_t &p) throw() -{ - if (p.m_counter.empty() && p.m_email.empty() && p.m_rating.empty()) return utf8(); - - utf8 result = LT + tag + GT; - - result += LT + utf8("email") + GT; - result += p.m_email.escapeXML(); - result += LTSLASH + utf8("email") + GT; - - result += LT + utf8("rating") + GT; - result += p.m_rating.escapeXML(); - result += LTSLASH + utf8("rating") + GT; - - result += LT + utf8("counter") + GT; - result += p.m_counter.escapeXML(); - result += LTSLASH + utf8("counter") + GT; - - result += LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const popularimeter_t &p) throw() -{ return p.m_rating; } - -///////////////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,unsyncLyrics_t &c) throw() -{ - if (s.size() >= 3) - { - c.m_languageCode = s[0]; - c.m_id = s[1]; - c.m_lyrics = s[2]; - } -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const unsyncLyrics_t &c) throw() -{ - if (c.m_lyrics.empty()) return utf8(); - - utf8 result; - result += LT + tag; - if (!c.m_languageCode.empty()) - result += utf8(" language=\"") + c.m_languageCode.escapeXML() + utf8("\""); - if (!c.m_id.empty()) - result += utf8(" id=\"") + c.m_id.escapeXML() + utf8("\""); - result += GT + c.m_lyrics.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const unsyncLyrics_t &c) throw() -{ - return c.m_lyrics; -} - -///////////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,picture_t &p) throw() -{ - vector<uniString::utf8>::size_type siz = s.size(); - if (siz > 0) p.m_mimeType = s[0]; - if (siz > 1) p.m_pictureType = s[1]; - if (siz > 2) p.m_id = s[2]; - if (siz > 3) p.m_pictureData = s[3]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const picture_t &p) throw() -{ - utf8 result; - result += LT + tag; - if (!p.m_mimeType.empty()) - result += utf8(" mime=\"") + p.m_mimeType.escapeXML() + utf8("\""); - if (!p.m_id.empty()) - result += utf8(" id=\"") + p.m_id.escapeXML() + utf8("\""); - if (!p.m_pictureType.empty()) - result += utf8(" type=\"") + p.m_pictureType.escapeXML() + utf8("\""); - result += GT + p.m_pictureData.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const picture_t &p) throw() -{ - return p.m_pictureData; -} - -//////////////////////////////////////////////////////////////////////////////////// -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,mcdi_t &m) throw() -{ - if (!s.empty()) m.m_cdTOC = s[0]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const mcdi_t &m) throw() -{ - utf8 result; - result += LT + tag; - result += GT + m.m_cdTOC.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const mcdi_t &m) throw() -{ return m.m_cdTOC; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,ufid_t &u) throw() -{ - vector<utf8>::size_type siz = s.size(); - if (siz > 0) u.m_id = s[0]; - if (siz > 1) u.m_data = s[1]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const ufid_t &u) throw() -{ - utf8 result; - result += LT + tag; - if (!u.m_id.empty()) - result += utf8(" id=\"") + u.m_id.escapeXML() + utf8("\""); - result += GT + u.m_data.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const ufid_t &u) throw() -{ return u.m_data; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,part_t &p) throw() -{ - if (!s.empty()) - { - vector<utf8> l = stringUtil::tokenizer(s[0],(utf8::value_type)'/'); - if (!l.empty()) p.m_part = l[0]; - if (l.size() > 1) p.m_total = l[1]; - } -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const part_t &p) throw() -{ - utf8 result; - result += LT + tag; - if (!p.m_total.empty()) - result += utf8(" total=\"") + p.m_total.escapeXML() + utf8("\""); - result += GT + p.m_part.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const part_t &p) throw() -{ return p.m_part; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,geob_t &g) throw() -{ - vector<utf8>::size_type siz = s.size(); - if (siz > 0) g.m_mimeType = s[0]; - if (siz > 1) g.m_filename = s[1]; - if (siz > 2) g.m_id = s[2]; - if (siz > 3) g.m_data = s[3]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const geob_t &g) throw() -{ - utf8 result; - result += LT + tag; - if (!g.m_mimeType.empty()) - result += utf8(" mime=\"") + g.m_mimeType.escapeXML() + utf8("\""); - if (!g.m_id.empty()) - result += utf8(" id=\"") + g.m_id.escapeXML() + utf8("\""); - if (!g.m_filename.empty()) - result += utf8(" filename=\"") + g.m_filename.escapeXML() + utf8("\""); - result += GT + g.m_data.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const geob_t &g) throw() -{ return g.m_data; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,priv_t &p) throw() -{ - vector<utf8>::size_type siz = s.size(); - if (siz > 0) p.m_id = s[0]; - if (siz > 1) p.m_data = s[1]; -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const priv_t &p) throw() -{ - utf8 result; - result += LT + tag; - if (!p.m_id.empty()) - result += utf8(" id=\"") + p.m_id.escapeXML() + utf8("\""); - result += GT + p.m_data.escapeXML() + LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const priv_t &p) throw() -{ return p.m_data; } - -//////////////////////////////////////////////////////////////////////////////////// - -void ID3V2::fromStringList(const std::vector<uniString::utf8> &s,timestamp_t &t) throw(runtime_error) -{ - if (s.empty()) return; - - static const int state_year = 0; - static const int state_month = 1; - static const int state_day = 2; - static const int state_hour = 3; - static const int state_minute = 4; - static const int state_second = 5; - - int state = state_year; - utf8 value; - for(utf8::const_iterator i = s[0].begin(); i != s[0].end(); ++i) - { - switch(state) - { - case state_year: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 4) throw runtime_error("Year has too many digits"); - } - else if ((*i) == '-') - { - if (value.size() != 4) throw runtime_error("Year has the wrong digit count"); - t.m_year = value; - value.clear(); - state = state_month; - } - else throw runtime_error("Unexpected character while processing year"); - break; - - case state_month: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Month has too many digits"); - } - else if ((*i) == '-') - { - if (value.empty()) throw runtime_error("No digits for month"); - t.m_month = value; - value.clear(); - state = state_day; - } - else throw runtime_error("Unexpected character while processing month"); - break; - - case state_day: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Day has too many digits"); - } - else if ((*i) == 'T') - { - if (value.empty()) throw runtime_error("No digits for day"); - t.m_day = value; - value.clear(); - state = state_hour; - } - else throw runtime_error("Unexpected character while processing day"); - break; - - case state_hour: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Hour has too many digits"); - } - else if ((*i) == ':') - { - if (value.empty()) throw runtime_error("No digits for hour"); - t.m_hour = value; - value.clear(); - state = state_minute; - } - else throw runtime_error("Unexpected character while processing hour"); - break; - - case state_minute: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Minute has too many digits"); - } - else if ((*i) == ':') - { - if (value.empty()) throw runtime_error("No digits for minute"); - t.m_minute = value; - value.clear(); - state = state_second; - } - else throw runtime_error("Unexpected character while processing minute"); - break; - - case state_second: - if (uniString::is_a_number(*i)) - { - value += *i; - if (value.size() > 2) throw runtime_error("Second has too many digits"); - } - else throw runtime_error("Unexpected character while processing second"); - break; - - default: - throw runtime_error(string(__FUNCTION__) + " internal error. Unknown state"); - break; - } - } - - if (!value.empty()) - { - switch(state) - { - case state_year: - if (value.size() != 4) throw runtime_error("Wrong digit count for year"); - t.m_year = value; - break; - - case state_month: - if (value.size() > 2) throw runtime_error("Month has too many digits"); - t.m_month = value; - break; - - case state_day: - if (value.size() > 2) throw runtime_error("Day has too many digits"); - t.m_day = value; - break; - - case state_hour: - if (value.size() > 2) throw runtime_error("Hour has too many digits"); - t.m_hour = value; - break; - - case state_minute: - if (value.size() > 2) throw runtime_error("Minute has too many digits"); - t.m_minute = value; - break; - - case state_second: - if (value.size() > 2) throw runtime_error("Second has too many digits"); - t.m_second = value; - break; - - default: - throw runtime_error(string(__FUNCTION__) + " internal error. Unknown state"); - break; - } - } -} - -uniString::utf8 ID3V2::toXML(const uniString::utf8 &tag,const timestamp_t &t) throw() -{ - utf8 result; - if (t.m_year.empty()) return result; - result += LT + tag + GT; - if (!t.m_year.empty()) result += LT + utf8("year") + GT + t.m_year.escapeXML() + LTSLASH + utf8("year") + GT; - if (!t.m_month.empty()) result += LT + utf8("month") + GT + t.m_month.escapeXML() + LTSLASH + utf8("month") + GT; - if (!t.m_day.empty()) result += LT + utf8("day") + GT + t.m_day.escapeXML() + LTSLASH + utf8("day") + GT; - if (!t.m_hour.empty()) result += LT + utf8("hour") + GT + t.m_hour.escapeXML() + LTSLASH + utf8("hour") + GT; - if (!t.m_minute.empty()) result += LT + utf8("minute") + GT + t.m_minute.escapeXML() + LTSLASH + utf8("minute") + GT; - if (!t.m_second.empty()) result += LT + utf8("second") + GT + t.m_second.escapeXML() + LTSLASH + utf8("second") + GT; - result += LTSLASH + tag + GT; - return result; -} - -uniString::utf8 ID3V2::toString(const timestamp_t &t) throw() -{ - utf8 result; - if (t.m_year.empty()) return result; - result += t.m_year; - if (t.m_month.empty()) return result; - result += utf8("-") + t.m_month; - if (t.m_day.empty()) return result; - result += utf8("-") + t.m_day; - if (t.m_hour.empty()) return result; - result += utf8("T") + t.m_hour; - if (t.m_minute.empty()) return result; - result += utf8(":") + t.m_minute; - if (t.m_second.empty()) return result; - result += utf8(":") + t.m_second; - return result; -} diff --git a/Src/Plugins/DSP/sc_serv3/ID3miniParsers.h b/Src/Plugins/DSP/sc_serv3/ID3miniParsers.h deleted file mode 100644 index 263a5cda..00000000 --- a/Src/Plugins/DSP/sc_serv3/ID3miniParsers.h +++ /dev/null @@ -1,184 +0,0 @@ -#ifndef ID3miniParsers_H_ -#define ID3miniParsers_H_ - -#include "unicode/uniString.h" -#include <vector> -#include <stdexcept> - -// parsers for complex ID3V2 fields (like genre) - -namespace ID3V2 -{ - void base64encode(const char *in,size_t siz,std::string &out) throw(); - - //////////////////// - /* Extracts strings based on a coded formatter - - e - single byte encoding. Will be used for all subsequence encoding based strings - u - non-encoded latin-1 string - s - encoded string - b - binary coded data to end of block - l - three char language code - c - single byte code - y - dynamic counter (value in popularimeter) - - modifiers: - - + - repeats to end of block - */ - - std::vector<uniString::utf8> extractor(const std::vector<__uint8> &data,const char *format) throw(std::exception); - ////////////////////// - //// structs for various tag types - struct genreEntry - { - uniString::utf8 m_genreCode; - uniString::utf8 m_refinement; - }; - - struct comment_t - { - uniString::utf8 m_languageCode; - uniString::utf8 m_id; - uniString::utf8 m_comment; - }; - - struct userUrl_t - { - uniString::utf8 m_id; - uniString::utf8 m_url; - }; - - struct userText_t - { - uniString::utf8 m_id; - uniString::utf8 m_text; - }; - - struct popularimeter_t - { - uniString::utf8 m_email; - uniString::utf8 m_rating; - uniString::utf8 m_counter; - }; - - struct unsyncLyrics_t - { - uniString::utf8 m_languageCode; - uniString::utf8 m_id; - uniString::utf8 m_lyrics; - }; - - struct picture_t - { - uniString::utf8 m_mimeType; - uniString::utf8 m_pictureType; - uniString::utf8 m_id; - uniString::utf8 m_pictureData; - }; - - struct mcdi_t // CD TOC - { - uniString::utf8 m_cdTOC; - }; - - struct ufid_t // universal file id - { - uniString::utf8 m_id; - uniString::utf8 m_data; - }; - - struct part_t // TRCK or TPOS (ie 3/7) - { - uniString::utf8 m_part; - uniString::utf8 m_total; - }; - - struct geob_t // general encapsulated object - { - uniString::utf8 m_mimeType; - uniString::utf8 m_filename; - uniString::utf8 m_id; - uniString::utf8 m_data; - }; - - struct priv_t // private frame - { - uniString::utf8 m_id; - uniString::utf8 m_data; - }; - - struct timestamp_t - { - uniString::utf8 m_year; - uniString::utf8 m_month; - uniString::utf8 m_day; - uniString::utf8 m_hour; - uniString::utf8 m_minute; - uniString::utf8 m_second; - }; - - typedef std::vector<ID3V2::genreEntry> genreList_t; - typedef std::vector<uniString::utf8> stringList_t; - typedef uniString::utf8 string_t; - - // parser and extractor overloads for the various data types - ///// - void fromStringList(const std::vector<uniString::utf8> &s,genreList_t &l) throw(std::runtime_error); - uniString::utf8 toXML(const uniString::utf8 &tag,const genreList_t &l) throw(); - uniString::utf8 toString(const genreList_t &l) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,stringList_t &l) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const stringList_t &l) throw(); - uniString::utf8 toString(const stringList_t &l) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,comment_t &c) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const comment_t &c) throw(); - uniString::utf8 toString(const comment_t &c) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,userUrl_t &c) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const userUrl_t &c) throw(); - uniString::utf8 toString(const userUrl_t &c) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,userText_t &t) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const userText_t &t) throw(); - uniString::utf8 toString(const userText_t &t) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,popularimeter_t &p) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const popularimeter_t &p) throw(); - uniString::utf8 toString(const popularimeter_t &p) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,unsyncLyrics_t &c) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const unsyncLyrics_t &c) throw(); - uniString::utf8 toString(const unsyncLyrics_t &c) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,picture_t &c) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const picture_t &c) throw(); - uniString::utf8 toString(const picture_t &c) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,mcdi_t &m) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const mcdi_t &m) throw(); - uniString::utf8 toString(const mcdi_t &m) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,ufid_t &u) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const ufid_t &u) throw(); - uniString::utf8 toString(const ufid_t &u) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,part_t &u) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const part_t &u) throw(); - uniString::utf8 toString(const part_t &u) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,geob_t &g) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const geob_t &g) throw(); - uniString::utf8 toString(const geob_t &g) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,priv_t &p) throw(); - uniString::utf8 toXML(const uniString::utf8 &tag,const priv_t &p) throw(); - uniString::utf8 toString(const priv_t &p) throw(); - - void fromStringList(const std::vector<uniString::utf8> &s,timestamp_t &t) throw(std::runtime_error); - uniString::utf8 toXML(const uniString::utf8 &tag,const timestamp_t &t) throw(); - uniString::utf8 toString(const timestamp_t &t) throw(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/MP3Header.cpp b/Src/Plugins/DSP/sc_serv3/MP3Header.cpp deleted file mode 100644 index 5ac4a465..00000000 --- a/Src/Plugins/DSP/sc_serv3/MP3Header.cpp +++ /dev/null @@ -1,216 +0,0 @@ -#include "MP3Header.h" -#include "global.h" -#include "nmrCommon/stl/stringUtils.h" -#include "nmrCommon/services/stdServiceImpl.h" -#include "nmrCommon/unicode/uniString.h" - -const __uint32 make28BitValue(const __uint8 buf[4]) -{ - return ((((__uint32)buf[0]) << 21) | - (((__uint32)buf[1]) << 14) | - (((__uint32)buf[2]) << 7) | - (((__uint32)buf[3]))); -} - -// Bitrates - use [version][layer][bitrate] -const __uint16 mpeg_bitrates[4][4][16] = { - { // Version 2.5 - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1 - }, - { // Reserved - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Invalid - }, - { // Version 2 - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1 - }, - { // Version 1 - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved - { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 }, // Layer 3 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // Layer 2 - { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // Layer 1 - } -}; - -// Sample rates - use [version][srate] -const __uint16 mpeg_srates[4][4] = { - { 11025, 12000, 8000, 0 }, // MPEG 2.5 - { 0, 0, 0, 0 }, // Reserved - { 22050, 24000, 16000, 0 }, // MPEG 2 - { 44100, 48000, 32000, 0 } // MPEG 1 -}; - -// Samples per frame - use [version][layer] -const __uint16 mpeg_frame_samples[4][4] = { -// Rsvd 3 2 1 < Layer v Version - { 0, 576, 1152, 384 }, // 2.5 - { 0, 0, 0, 0 }, // Reserved - { 0, 576, 1152, 384 }, // 2 - { 0, 1152, 1152, 384 } // 1 -}; - -// Slot size (MPEG unit of measurement) - use [layer] -const __uint8 mpeg_slot_size[4] = { 0, 1, 1, 4 }; // Rsvd, 3, 2, 1 - -const char *MP3_FrameInfo::getLayerName() const -{ - switch (m_layer) - { - case 1: return "3"; - case 2: return "2"; - case 3: return "1"; - } - return "unknown layer"; -} - -const char *MP3_FrameInfo::getVersionName() const -{ - switch (m_version) - { - case 0: return "v2.5"; - case 2: return "v2"; - case 3: return "v1"; - } - return "unknown version"; -} - -int getMP3FrameSize (MP3_FrameInfo &info, const unsigned char *hdr, unsigned int len) -{ - if (len < 4) - return 0; - int samples = mpeg_frame_samples[info.m_version][info.m_layer]; - if (samples == 0) - return -1; - int bitrate = mpeg_bitrates [info.m_version] [info.m_layer] [((hdr[2] & 0xf0) >> 4)]; - if (bitrate == 0) - return -1; - info.m_bitrate = bitrate; - info.m_samples = samples; - - return (int)(((float)(samples / 8.0) * (float)bitrate * 1000) / - (float)info.m_samplerate) + (((hdr[2] & 0x02) >> 1) ? mpeg_slot_size[info.m_layer] : 0); -} - -const int getMP3FrameInfo(const char *hdr, unsigned int *samplerate, int *bitrate, bool *mono) -{ - // Quick validity check - if ( ( ((unsigned char)hdr[0] & 0xFF) != 0xFF) - || ( ((unsigned char)hdr[1] & 0xE0) != 0xE0) // 3 sync bits - || ( ((unsigned char)hdr[1] & 0x18) == 0x08) // Version rsvd - || ( ((unsigned char)hdr[1] & 0x06) == 0x00) // Layer rsvd - || ( ((unsigned char)hdr[2] & 0xF0) == 0xF0) // Bitrate rsvd - ) return 0; - - // Data to be extracted from the header - __uint8 ver = (hdr[1] & 0x18) >> 3; // Version index - __uint8 lyr = (hdr[1] & 0x06) >> 1; // Layer index - //__uint8 pad = (hdr[2] & 0x02) >> 1; // Padding? 0/1 - //__uint8 brx = (hdr[2] & 0xf0) >> 4; // Bitrate index - __uint8 srx = (hdr[2] & 0x0c) >> 2; // SampRate index - - if (mono) - { - *mono = (((hdr[3] >> 6) & 3) == 0x3); // Channel mode - } - - // Lookup real values of these fields - *samplerate = mpeg_srates[ver][srx]; - *bitrate = mpeg_bitrates[ver][lyr][((hdr[2] & 0xf0) >> 4)]; - //__uint16 samples = mpeg_frame_samples[ver][lyr]; - //__uint8 slot_size = mpeg_slot_size[lyr]; - - // Frame sizes are truncated integers - return (__uint16)(((float)(mpeg_frame_samples[ver][lyr] / 8.0) * - (float)*bitrate * 1000) / (float)mpeg_srates[ver][srx]) + - (((hdr[2] & 0x02) >> 1) ? mpeg_slot_size[lyr] : 0); -} - - -const int getMP3FrameInfo (const unsigned char *hdr, unsigned int len, MP3_FrameInfo &info) -{ - // Quick validity check - if ( len < 4 - || ( ((unsigned char)hdr[0] & 0xFF) != 0xFF) - || ( ((unsigned char)hdr[1] & 0xE0) != 0xE0) // 3 sync bits - || ( ((unsigned char)hdr[1] & 0x18) == 0x08) // Version rsvd - || ( ((unsigned char)hdr[1] & 0x06) == 0x00) // Layer rsvd - || ( ((unsigned char)hdr[2] & 0xF0) == 0xF0) // Bitrate rsvd - ) return -1; - - // Data to be extracted from the header - __uint8 ver = (hdr[1] & 0x18) >> 3; // Version index - __uint8 lyr = (hdr[1] & 0x06) >> 1; // Layer index - __uint8 srx = (hdr[2] & 0x0c) >> 2; // SampRate index - - do - { - // Lookup real values of these fields - unsigned int samplerate = mpeg_srates [ver][srx]; - if (samplerate == 0) - break; - - int bitrate = mpeg_bitrates [ver][lyr][((hdr[2] & 0xf0) >> 4)]; - if (bitrate == 0) - break; - info.m_bitrate = bitrate; - // the following are not supposed to change - info.m_samplerate = samplerate; - info.m_mono = (((hdr[3] >> 6) & 3) == 0x3); // Channel mode - info.m_layer = lyr; // Layer index - info.m_version = ver; - if (info.m_pattern == 0) - info.m_pattern = (unsigned long)(hdr[0]<<24 | (hdr[1]<<16) | (hdr[2]<<8) | hdr[0]) & info.m_mask; - - // DLOG (uniString::utf8("MPEG ") + info.getVersionName() + " layer " + info.getLayerName() + (info.m_mono ? " mono (" : " stereo (") + stringUtil::tos(bitrate) + "k)"); - - return getMP3FrameSize (info, hdr, 4); - } while (0); - return -1; -} - -int MP3_FrameInfo::verifyFrame (const unsigned char *buf, unsigned int len) -{ - if (len > 4) - { - unsigned long v = (unsigned long)(buf[0])<<24 | (buf[1]<<16) | (buf[2]<<8) | buf[0]; - - if ((v & m_mask) == m_pattern) - { -#if 0 - if (len > 40) - { - unsigned char str[6] = "LAME"; - int i; - for (i=0; i < 5 && buf[36+i] == str[i]; i++) - ; - if (str[i] == '\0') DLOG ("LAME header found"); - } -#endif - return getMP3FrameSize (*this, buf, len); - } - // DLOG ("MPG: mask is " + stringUtil::tos(v&m_mask) + ", patt " + stringUtil::tos(m_pattern)); - return -1; - } - return 0; -} - -MP3_FrameInfo::MP3_FrameInfo (unsigned long value) : parserInfo (0xFFFE0000, value) -{ - m_description = "MPEG "; -} - -MP3_FrameInfo::MP3_FrameInfo(const unsigned char *p, unsigned int len) : parserInfo() -{ - m_mask = 0xFFFE0000; - m_description = "MPEG "; - getMP3FrameInfo (p, len, *this); -} - diff --git a/Src/Plugins/DSP/sc_serv3/MP3Header.h b/Src/Plugins/DSP/sc_serv3/MP3Header.h deleted file mode 100644 index d1fbe704..00000000 --- a/Src/Plugins/DSP/sc_serv3/MP3Header.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once -#ifndef _MP3_HEADER_H -#define _MP3_HEADER_H - -#include "nmrCommon/intTypes.h" -#include <stddef.h> -#include "global.h" -#include "uvox2Common.h" - - -struct MP3_FrameInfo : public parserInfo -{ - bool m_mono; - int m_layer; - int m_samples; - - int verifyFrame (const unsigned char *buf, unsigned int len); - - MP3_FrameInfo (unsigned long value = 0); - MP3_FrameInfo (const unsigned char *p, unsigned int len); - - const char *getLayerName() const; - const char *getVersionName() const; - int getUvoxType() { return MP3_DATA; } -}; - - -const __uint32 make28BitValue(const __uint8 buf[4]); -const int getMP3FrameInfo(const char *hdr, unsigned int *samplerate, int *bitrate, bool *mono = 0); -const int getMP3FrameInfo (const unsigned char *hdr, unsigned int len, MP3_FrameInfo &info); -int getMP3FrameSize (MP3_FrameInfo &info, const unsigned char *hdr, unsigned int len); - - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/MSG00001.bin b/Src/Plugins/DSP/sc_serv3/MSG00001.bin deleted file mode 100644 index a528a83b86febcd25e060d0558b10e08070bfc2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32 hcmZQ%U|?WmU^oE60zkF^kf+LE$iU0M1>`X>001eB0ulfK diff --git a/Src/Plugins/DSP/sc_serv3/adminList.cpp b/Src/Plugins/DSP/sc_serv3/adminList.cpp deleted file mode 100644 index 547a2176..00000000 --- a/Src/Plugins/DSP/sc_serv3/adminList.cpp +++ /dev/null @@ -1,303 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#else -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#endif - -#include <algorithm> -#include <stdio.h> -#include "adminList.h" -#include "global.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include "webNet/socketOps.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include <assert.h> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[ADMINCGI] " - -#ifdef _WIN32 -typedef unsigned long in_addr_t; -#endif - -adminList g_adminList; - -class adminList::impl -{ -private: - struct adminEntry: public admin_t - { - in_addr_t m_ip; // ip as binary type. Old style, but that's how the old sc_serv did it and we'll - // continue to do it that way until we're ready to break the old software - - bool validIP() throw() - { - return ((m_ip != INADDR_NONE) && (m_ip != 0)); - } - - static in_addr_t stringToIP(const utf8 &sIP, utf8 &hostIP) - { - // default is to assume a raw IP address in the list - in_addr_t ip = inet_addr((const char *)sIP.c_str()); - if (ip == INADDR_NONE) - { - // though if that fails then attempt to - // get an IP address from a hostname... - string sHost; - try - { - sHost = socketOps::hostNameToAddress(sIP.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - ip = inet_addr((const char *)sHost.c_str()); - if (ip != INADDR_NONE) - { - hostIP = sHost; - } - } - } - return ip; - } - - explicit adminEntry(const utf8 &numericIP) throw() : admin_t(numericIP), m_ip(stringToIP(numericIP, m_hostIP)) {} - adminEntry() throw() : m_ip(0) {} - }; - - AOL_namespace::mutex m_lock; - list<adminEntry> m_list; - -public: - bool load(const uniFile::filenameType &fn) throw(exception) - { - if (fn.empty()) - { - throwEx<tagged_error>(LOGNAME "No admin access file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "Attempting to read admin access file: " + fileUtil::getFullFilePath(fn)); - } - - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"rb"); - if (!f) return false; - - bool updating = (!m_list.empty()); - m_list.clear(); - - try - { - int l = 0; - int count = 0; - while (true) - { - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), f)) break; // get a line - - ++l; // increment line counter - - utf8 s; - - // skip utf-8 BOM - if ((strlen(buffer) > 2) && - (((unsigned char*)buffer)[0] == 0xef) && - (((unsigned char*)buffer)[1] == 0xbb) && - (((unsigned char*)buffer)[2] == 0xbf)) - { - s = &(buffer[3]); - } - else - { - s = buffer; - } - - adminEntry e(stripWhitespace(s)); - - if (!e.validIP()) - { - WLOG(LOGNAME "Line " + tos(l) + " of admin access list has been ignored (bad IP)"); - } - else - { - if (this->find(e.m_numericIP,false) < 1) - { - m_list.push_back(e); - ++count; - } - } - } - if (!updating) - { - if (count > 0) - { - ILOG(LOGNAME "Enabled " + tos(count) + " IP" + - (count != 1 ? "'s" : "") + " from admin access file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "No IPs read from admin access file"); - } - } - else - { - ILOG(LOGNAME "Reloaded " + tos(count) + " IP" + - (count != 1 ? "'s" : "") + " from admin access file"); - } - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - return true; - } - - bool add(const utf8 &ipAddr, const bool soft) throw(exception) - { - // skip loopback addresses as we treat them specially anyway - if ((ipAddr.find(utf8("127.")) == utf8::npos)) - { - adminEntry e(ipAddr); - if (!e.validIP()) - { - if (!soft) - { - throwEx<runtime_error>(LOGNAME "Invalid IP specified - `" + ipAddr + "'"); - } - else - { - return false; - } - } - - stackLock sml(m_lock); - m_list.push_back(e); - return true; - } - return false; - } - - // true if removed - bool remove(const utf8 &ipAddr, const bool allStream, const bool fallback = false, const bool use_lock = true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - for ( list<adminEntry>::iterator i = m_list.begin(); i != m_list.end(); ++i ) - { - if ( ( allStream || ( ( !allStream && ( ( *i ).m_numericIP == ipAddr ) ) || ( ( *i ).m_hostIP == ipAddr ) ) ) ) - { - m_list.erase( i ); - return true; - } - } - - // attempt to see if we've got a hostname which has not been detected from the loading mapping - if (!fallback) - { - string sHost; - try - { - sHost = socketOps::hostNameToAddress(ipAddr.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - return remove(sHost, allStream, true, false); - } - } - - return false; - } - - // 1 if found, 0 if not, -1 if empty (assume allowed) - int find(const utf8 &ipAddr, const bool use_lock=true) throw() - { - if (use_lock) - { - stackLock sml(m_lock); - } - - if (!m_list.empty()) - { - for (list<adminEntry>::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ((ipAddr == (*i).m_numericIP) || (ipAddr == (*i).m_hostIP)) - { - return 1; - } - } - return 0; - } - return -1; - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -adminList::adminList():m_impl(0) -{ - m_impl = new adminList::impl; -} - -adminList::~adminList() throw() -{ - forget(m_impl); -} - -bool adminList::load(const uniFile::filenameType &fn) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - result = m_impl->load(fn); - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -// throws if parameters are invalid -bool adminList::add(const utf8 &ipAddr, const bool soft) throw(exception) -{ - assert(m_impl); - return m_impl->add(ipAddr, soft); -} - -// true if removed -bool adminList::remove(const utf8 &ipAddr, const bool allStream) throw() -{ - assert(m_impl); - return m_impl->remove(ipAddr, allStream); -} - -// 1 if found, 0 if not, -1 if empty (assume allowed) -int adminList::find(const utf8 &ipAddr) throw() -{ - assert(m_impl); - return m_impl->find(ipAddr); -} diff --git a/Src/Plugins/DSP/sc_serv3/adminList.h b/Src/Plugins/DSP/sc_serv3/adminList.h deleted file mode 100644 index 32645f76..00000000 --- a/Src/Plugins/DSP/sc_serv3/adminList.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#ifndef adminList_H_ -#define adminList_H_ - -#include "unicode/uniFile.h" - -// class that manages lists of reserved IPs -// these are remote addresses that must always be allowed in no matter what. - -class adminList -{ -private: - class impl; - impl *m_impl; - -public: - struct admin_t - { - uniString::utf8 m_numericIP; - uniString::utf8 m_hostIP; // used to hold the converted IP from a hostname - - explicit admin_t(const uniString::utf8 &numericIP) throw() : m_numericIP(numericIP) {} - admin_t() throw() {} - }; - - // throws if parameters are invalid - bool add(const uniString::utf8 &ipAddr, const bool soft) throw(std::exception); - // true if removed - bool remove(const uniString::utf8 &ipAddr, const bool allStream) throw(); - // 1 if found, 0 if not, -1 if empty (assume allowed) - int find(const uniString::utf8 &ipAddr) throw(); - - bool load(const uniFile::filenameType &fn) throw(); - - adminList(); - ~adminList() throw(); -}; - -extern adminList g_adminList; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/agentList.cpp b/Src/Plugins/DSP/sc_serv3/agentList.cpp deleted file mode 100644 index 28202f33..00000000 --- a/Src/Plugins/DSP/sc_serv3/agentList.cpp +++ /dev/null @@ -1,294 +0,0 @@ -#include <algorithm> -#include <stdio.h> -#include "agentList.h" -#include "global.h" -#include "stl/stringUtils.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include "macros.h" -#include <assert.h> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[AGENT] " - -agentList g_agentList; - -class agentList::impl -{ -private: - struct agentEntrySave - { - FILE *f; - size_t stream_ID; - }; - - struct agentEntry: public agent_t - { - void save(agentEntrySave entrySave) throw(exception) - { - if(m_stream_ID == entrySave.stream_ID) - { - utf8 s(m_agent + eol()); - if (fwrite(s.c_str(),1,s.size(),entrySave.f) != s.size()) - { - throwEx<tagged_error>(LOGNAME "I/O error writing " + (!entrySave.stream_ID ? "global" : "sid=" + tos(entrySave.stream_ID)) + " agent file"); - } - } - } - - agentEntry(const utf8 &agent, const size_t stream_ID) throw() : agent_t(agent, stream_ID) {} - agentEntry() throw() {} - }; - - AOL_namespace::mutex m_lock; - list<agentEntry> m_list; - -public: - bool load(const uniFile::filenameType &fn, size_t stream_ID) throw(exception) - { - if (fn.empty()) - { - throwEx<tagged_error>(LOGNAME "No " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " agent file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "Attempting to read agent file: " + fileUtil::getFullFilePath(fn)); - } - - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"rb"); - if (!f) return false; - - bool updating = (!m_list.empty()); - m_list.clear(); - - try - { - int l = 0; - int count = 0; - while (true) - { - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), f)) break; // get a line - - ++l; // increment line counter - - utf8 s; - - // skip utf-8 BOM - if ((strlen(buffer) > 2) && - (((unsigned char*)buffer)[0] == 0xef) && - (((unsigned char*)buffer)[1] == 0xbb) && - (((unsigned char*)buffer)[2] == 0xbf)) - s = &(buffer[3]); - else - s = buffer; - - if (stripWhitespace(s).empty()) - { - WLOG(LOGNAME "Line " + tos(l) + " of " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list has been ignored"); - } - else - { - agentEntry e(stripWhitespace(s),stream_ID); - if(this->find(e.m_agent,e.m_stream_ID,false) == false) - { - m_list.push_back(e); - ++count; - } - } - } - if (!updating) - { - ILOG(LOGNAME "Loaded " + tos(count) + " blocked user agents" + (count != 1 ? "'s" : "") + " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " agent file"); - } - else - { - ILOG(LOGNAME "Reloaded " + tos(count) + " blocked user agents" + (count != 1 ? "'s" : "") + " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " agent file"); - } - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - return true; - } - - void save(const uniFile::filenameType &fn,size_t stream_ID) throw(exception) - { - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"wb"); - if (!f) - { - throwEx<tagged_error>(LOGNAME "Could not open " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + - " agent file `" + fn + "' for writing (" + errMessage().hideAsString() + ")"); - } - try - { - agentEntrySave entrySave; - entrySave.f = f; - entrySave.stream_ID = stream_ID; - for_each(m_list.begin(),m_list.end(),bind2nd(mem_fun_ref(&agentEntry::save),entrySave)); - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - - if(!uniFile::fileSize(fn)) - { - uniFile::unlink(fn); - } - } - - bool add(const utf8 &agent, const size_t stream_ID, const bool soft) throw(exception) - { - if (agent.empty()) - { - if (!soft) throwEx<runtime_error>(LOGNAME "Empty User Agent specified"); - else return false; - } - - agentEntry e(agent,stream_ID); - stackLock sml(m_lock); - m_list.push_back(e); - return true; - } - - // true if removed - bool remove(const utf8 &agent, const size_t stream_ID, const bool allStream) throw() - { - stackLock sml(m_lock); - - for (list<agentEntry>::iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (allStream || (((!allStream && ((*i).m_agent == agent))) && ((*i).m_stream_ID == stream_ID))) - { - m_list.erase(i); - return true; - } - } - - return false; - } - - // true if found - bool find(const utf8 &agent, size_t stream_ID, bool use_lock = true) throw() - { - if(use_lock) - { - stackLock sml(m_lock); - } - - if(!m_list.empty()) - { - for (list<agentEntry>::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (((*i).m_stream_ID == stream_ID) && (agent == (*i).m_agent)) - { - return true; - } - } - } - - return false; - } - - void get(std::vector<agentList::agent_t> &rl, size_t stream_ID) throw() - { - stackLock sml(m_lock); - - for (list<agentEntry>::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ((*i).m_stream_ID == stream_ID) - { - rl.push_back(*i); - } - } - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -agentList::agentList():m_impl(0) -{ - m_impl = new agentList::impl; -} - -agentList::~agentList() throw() -{ - forget(m_impl); -} - -bool agentList::load(const uniFile::filenameType &fn,size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - result = m_impl->load(fn,stream_ID); - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -bool agentList::save(const uniFile::filenameType &fn,size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - m_impl->save(fn,stream_ID); - result = true; - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -// throws if parameters are invalid -bool agentList::add(const utf8 &agent, const size_t stream_ID, bool soft) throw(exception) -{ - assert(m_impl); - return m_impl->add(agent,stream_ID,soft); -} - -// true if removed -bool agentList::remove(const utf8 &agent, const size_t stream_ID, bool allStream) throw() -{ - assert(m_impl); - return m_impl->remove(agent,stream_ID,allStream); -} - -// true if found -bool agentList::find(const utf8 &agent, const size_t stream_ID) throw() -{ - assert(m_impl); - return m_impl->find(agent, stream_ID); -} - -void agentList::get(vector<agentList::agent_t> &bl,size_t stream_ID) throw() -{ - assert(m_impl); - m_impl->get(bl,stream_ID); -} diff --git a/Src/Plugins/DSP/sc_serv3/agentList.h b/Src/Plugins/DSP/sc_serv3/agentList.h deleted file mode 100644 index 87b1861d..00000000 --- a/Src/Plugins/DSP/sc_serv3/agentList.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once -#ifndef agentList_H_ -#define agentList_H_ - -#include "unicode/uniFile.h" - -// class that manages lists of blocked user agents - -class agentList -{ -private: - class impl; - impl *m_impl; - -public: - struct agent_t - { - uniString::utf8 m_agent; // used to hold the user agent to not allow - size_t m_stream_ID; // used to differentiate - - agent_t(const uniString::utf8 &agent, const size_t stream_ID) throw() : m_agent(agent), m_stream_ID(stream_ID) {} - agent_t() throw() : m_stream_ID(0) {} - }; - - // throws if parameters are invalid - bool add(const uniString::utf8 &agent, const size_t stream_ID, const bool soft) throw(std::exception); - // true if removed - bool remove(const uniString::utf8 &agent, const size_t stream_ID, const bool allStream) throw(); - // true if found - bool find(const uniString::utf8 &agent, const size_t stream_ID) throw(); - - bool load(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - bool save(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - - agentList(); - ~agentList() throw(); - - // for web administration reference - void get(std::vector<agent_t> &rl, const size_t stream_ID) throw(); -}; - -extern agentList g_agentList; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/amf.cpp b/Src/Plugins/DSP/sc_serv3/amf.cpp deleted file mode 100644 index bb7adddb..00000000 --- a/Src/Plugins/DSP/sc_serv3/amf.cpp +++ /dev/null @@ -1,759 +0,0 @@ -#if 0 -#include "amf.h" -#include "global.h" - -#define DEBUG_LOG(x) { if (gOptions.RTMPClientDebug()) DLOG((x)); } - -#ifndef _WIN32 -#include <arpa/inet.h> -#endif - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#ifdef _WIN32 -// Windows is little endian only -#define __LITTLE_ENDIAN 1234 -#define __BIG_ENDIAN 4321 -#define __BYTE_ORDER __LITTLE_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER - -typedef unsigned char uint8_t; - -#else /* !_WIN32 */ - -#include <sys/param.h> - -#if defined(BYTE_ORDER) && !defined(__BYTE_ORDER) -#define __BYTE_ORDER BYTE_ORDER -#endif - -#if defined(BIG_ENDIAN) && !defined(__BIG_ENDIAN) -#define __BIG_ENDIAN BIG_ENDIAN -#endif - -#if defined(LITTLE_ENDIAN) && !defined(__LITTLE_ENDIAN) -#define __LITTLE_ENDIAN LITTLE_ENDIAN -#endif - -#endif /* !_WIN32 */ - -// define default endianness -#ifndef __LITTLE_ENDIAN -#define __LITTLE_ENDIAN 1234 -#endif - -#ifndef __BIG_ENDIAN -#define __BIG_ENDIAN 4321 -#endif - -#ifndef __BYTE_ORDER -#warning "Byte order not defined on your system, assuming little endian!" -#define __BYTE_ORDER __LITTLE_ENDIAN -#endif - -// ok, we assume to have the same float word order and byte order if float word order is not defined -#ifndef __FLOAT_WORD_ORDER -//#warning "Float word order not defined, assuming the same as byte order!" -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#endif - -#if !defined(__BYTE_ORDER) || !defined(__FLOAT_WORD_ORDER) -#error "Undefined byte or float word order!" -#endif - -#if __FLOAT_WORD_ORDER != __BIG_ENDIAN && __FLOAT_WORD_ORDER != __LITTLE_ENDIAN -#error "Unknown/unsupported float word order!" -#endif - -#if __BYTE_ORDER != __BIG_ENDIAN && __BYTE_ORDER != __LITTLE_ENDIAN -#error "Unknown/unsupported byte order!" -#endif - -static double -AMF0_DecodeNumber(const char *data) -{ - double dVal; -#if __FLOAT_WORD_ORDER == __BYTE_ORDER -#if __BYTE_ORDER == __BIG_ENDIAN - memcpy(&dVal, data, 8); -#elif __BYTE_ORDER == __LITTLE_ENDIAN - unsigned char *ci, *co; - ci = (unsigned char *)data; - co = (unsigned char *)&dVal; - co[0] = ci[7]; - co[1] = ci[6]; - co[2] = ci[5]; - co[3] = ci[4]; - co[4] = ci[3]; - co[5] = ci[2]; - co[6] = ci[1]; - co[7] = ci[0]; -#endif -#else -#if __BYTE_ORDER == __LITTLE_ENDIAN // __FLOAT_WORD_ORER == __BIG_ENDIAN - unsigned char *ci, *co; - ci = (unsigned char *)data; - co = (unsigned char *)&dVal; - co[0] = ci[3]; - co[1] = ci[2]; - co[2] = ci[1]; - co[3] = ci[0]; - co[4] = ci[7]; - co[5] = ci[6]; - co[6] = ci[5]; - co[7] = ci[4]; -#else // __BYTE_ORDER == __BIG_ENDIAN && __FLOAT_WORD_ORER == __LITTLE_ENDIAN - unsigned char *ci, *co; - ci = (unsigned char *)data; - co = (unsigned char *)&dVal; - co[0] = ci[4]; - co[1] = ci[5]; - co[2] = ci[6]; - co[3] = ci[7]; - co[4] = ci[0]; - co[5] = ci[1]; - co[6] = ci[2]; - co[7] = ci[3]; -#endif -#endif - return dVal; -} - -char * -AMF0_EncodeNumber(char *output, char *outend, double dVal) -{ - if (output+8 > outend) - return NULL; - -// *output++ = AMF_NUMBER; // type: Number - -#if __FLOAT_WORD_ORDER == __BYTE_ORDER -#if __BYTE_ORDER == __BIG_ENDIAN - memcpy(output, &dVal, 8); -#elif __BYTE_ORDER == __LITTLE_ENDIAN - { - unsigned char *ci, *co; - ci = (unsigned char *)&dVal; - co = (unsigned char *)output; - co[0] = ci[7]; - co[1] = ci[6]; - co[2] = ci[5]; - co[3] = ci[4]; - co[4] = ci[3]; - co[5] = ci[2]; - co[6] = ci[1]; - co[7] = ci[0]; - } -#endif -#else -#if __BYTE_ORDER == __LITTLE_ENDIAN /* __FLOAT_WORD_ORER == __BIG_ENDIAN */ - { - unsigned char *ci, *co; - ci = (unsigned char *)&dVal; - co = (unsigned char *)output; - co[0] = ci[3]; - co[1] = ci[2]; - co[2] = ci[1]; - co[3] = ci[0]; - co[4] = ci[7]; - co[5] = ci[6]; - co[6] = ci[5]; - co[7] = ci[4]; - } -#else /* __BYTE_ORDER == __BIG_ENDIAN && __FLOAT_WORD_ORER == __LITTLE_ENDIAN */ - { - unsigned char *ci, *co; - ci = (unsigned char *)&dVal; - co = (unsigned char *)output; - co[0] = ci[4]; - co[1] = ci[5]; - co[2] = ci[6]; - co[3] = ci[7]; - co[4] = ci[0]; - co[5] = ci[1]; - co[6] = ci[2]; - co[7] = ci[3]; - } -#endif -#endif - return output+8; -} - -static void serialize(vector<__uint8> &s,const utf8 &v,int mode,const utf8 &logMsgPrefix) throw(exception) -{ - assert(mode == 0); // AMF3 not yet implemented - __uint16 slen = (__uint16)v.length(); - slen = htons(slen); - s.insert(s.end(),(const char *)&slen,((const char *)&slen) + 2); - s.insert(s.end(),v.begin(),v.end()); -} - -///////////////////////////////////////////////////////////////////////////////////////////////// - -AMFObject::AMFObject() throw() {} - -AMFObject::~AMFObject() throw() -{ - clearProperties(); -} - -AMFObject::AMFObject(const AMFObject &obj) throw() -{ - for(propertyMap_t::const_iterator i = obj.m_properties.begin(); i != obj.m_properties.end(); ++i) - { - m_properties[(*i).first] = new AMFVal(*(*i).second); - } -} - -AMFObject& AMFObject::operator=(const AMFObject &obj) throw() -{ - clearProperties(); - for(propertyMap_t::const_iterator i = obj.m_properties.begin(); i != obj.m_properties.end(); ++i) - { - m_properties[(*i).first] = new AMFVal(*(*i).second); - } - return *this; -} - -void AMFObject::clearProperties() throw() -{ - for(propertyMap_t::iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - delete (*i).second; - } - m_properties.clear(); -} - -// add property. Takes possession of value "v" -// throws if value already exists -void AMFObject::addProperty(const utf8 &key,AMFVal *v) throw(exception) -{ - assert(v); - assert(m_properties.find(key) == m_properties.end()); - - if (m_properties.find(key) != m_properties.end()) - throwEx<runtime_error>(string(__FUNCTION__) + " property " + key + " already exists"); - if (!v) - throwEx<runtime_error>(string(__FUNCTION__) + " value is null."); - - m_properties[key] = v; -} - -const AMFVal* AMFObject::getProperty(const uniString::utf8 &key) const throw() -{ - propertyMap_t::const_iterator i = m_properties.find(key); - if (i == m_properties.end()) return 0; - return (*i).second; -} - -utf8 AMFObject::prettyPrint(int mode,const utf8 &tabs) const throw() -{ - utf8 result; - result += tabs + "{" + eol(); - - for(propertyMap_t::const_iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - assert((*i).second); - result += tabs + "\t" + (*i).first + ": "; - result += (*i).second->prettyPrint(mode,tabs + "\t"); - result += eol(); - } - - result += tabs + "}"; - return result; -} - -void AMFObject::serialize(vector<__uint8> &s,int mode,const utf8 &logMsgPrefix) const throw(exception) -{ - assert(mode == 0); // AMF3 not yet implemented - for(propertyMap_t::const_iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - assert((*i).second); - ::serialize(s,(*i).first,mode,logMsgPrefix); - (*i).second->serialize(s,mode,logMsgPrefix); - } - s.push_back(0); - s.push_back(0); - s.push_back(AMF0_object_end_marker); -} - -void AMFObject::loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const utf8 &logMsgPrefix) throw(exception) -{ - assert(mode == 0); // AMF3 not implemented yet - propertyMap_t pmap; - - AMFVal *val = 0; - try - { - while(true) - { - if (bitstreamLen < 3) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 object marker."); - if (bitstream[0] == 0 && bitstream[1] == 0 && bitstream[2] == 9) - { - // end of object - bitstream += 3; - bitstreamLen -= 3; - break; - } - if (bitstream[0] == 0 && bitstream[1] == 0) throwEx<runtime_error>(logMsgPrefix + " AMF0 object has null string keyed property"); - if (bitstreamLen < 4) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 object marker."); - - // alright, we've taken care of the abberant cases and end-of-object. Now let's get a property - int slen = ntohs(*(__uint16*)bitstream); - bitstream += 2; - bitstreamLen -= 2; - if (bitstreamLen < slen) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 object property key."); - utf8 key(bitstream,bitstream + slen); - bitstream += slen; - bitstreamLen -= slen; - assert(!val); - val = new AMFVal; - val->loadFromBitstream(bitstream,bitstreamLen,mode,logMsgPrefix); - pmap[key] = val; - val = 0; - } - - clearProperties(); - m_properties = pmap; - } - catch(...) - { - delete val; - throw; - } -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////// - -AMFEMCAArray::AMFEMCAArray() throw() {} - -AMFEMCAArray::~AMFEMCAArray() throw() -{ - clearProperties(); -} - -AMFEMCAArray::AMFEMCAArray(const AMFEMCAArray &obj) throw() -{ - for(propertyMap_t::const_iterator i = obj.m_properties.begin(); i != obj.m_properties.end(); ++i) - { - m_properties[(*i).first] = new AMFVal(*(*i).second); - } -} - -AMFEMCAArray& AMFEMCAArray::operator=(const AMFEMCAArray &obj) throw() -{ - clearProperties(); - for(propertyMap_t::const_iterator i = obj.m_properties.begin(); i != obj.m_properties.end(); ++i) - { - m_properties[(*i).first] = new AMFVal(*(*i).second); - } - return *this; -} - -void AMFEMCAArray::clearProperties() throw() -{ - for(propertyMap_t::iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - delete (*i).second; - } - m_properties.clear(); -} - -// add property. Takes possession of value "v" -// throws if value already exists -void AMFEMCAArray::addProperty(const utf8 &key,AMFVal *v) throw(exception) -{ - assert(v); - assert(m_properties.find(key) == m_properties.end()); - - if (m_properties.find(key) != m_properties.end()) - throwEx<runtime_error>(string(__FUNCTION__) + " property " + key + " already exists"); - if (!v) - throwEx<runtime_error>(string(__FUNCTION__) + " value is null."); - - m_properties[key] = v; -} - -const AMFVal* AMFEMCAArray::getProperty(const uniString::utf8 &key) const throw() -{ - propertyMap_t::const_iterator i = m_properties.find(key); - if (i == m_properties.end()) return 0; - return (*i).second; -} - -utf8 AMFEMCAArray::prettyPrint(int mode,const utf8 &tabs) const throw() -{ - utf8 result; - result += tabs + "{" + eol(); - - for(propertyMap_t::const_iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - assert((*i).second); - result += tabs + "\t" + (*i).first + ": "; - result += (*i).second->prettyPrint(mode,tabs + "\t"); - result += eol(); - } - - result += tabs + "}"; - return result; -} - -void AMFEMCAArray::serialize(vector<__uint8> &s,int mode,const utf8 &logMsgPrefix) const throw(exception) -{ - assert(mode == 0); // amf3 not implemented - // wowza seems to always just use zero as array length - s.push_back(0); s.push_back(0); s.push_back(0); s.push_back(0); - - for(propertyMap_t::const_iterator i = m_properties.begin(); i != m_properties.end(); ++i) - { - assert((*i).second); - ::serialize(s,(*i).first,mode,logMsgPrefix); - (*i).second->serialize(s,mode,logMsgPrefix); - } - s.push_back(0); - s.push_back(0); - s.push_back(AMF0_object_end_marker); -} - -void AMFEMCAArray::loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const utf8 &logMsgPrefix) throw(exception) -{ - assert(mode == 0); // AMF3 not implemented yet - propertyMap_t pmap; - - AMFVal *val = 0; - try - { - if (bitstreamLen < 7) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 ECMA array type."); - - // skip length - bitstream += 4; - bitstreamLen -= 4; - - while(true) - { - if (bitstreamLen < 3) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for ECMA array type."); - if (bitstream[0] == 0 && bitstream[1] == 0 && bitstream[2] == 9) - { - // end of object - bitstream += 3; - bitstreamLen -= 3; - break; - } - if (bitstream[0] == 0 && bitstream[1] == 0) throwEx<runtime_error>(logMsgPrefix + " AMF0 ECMA array type has null string keyed property"); - if (bitstreamLen < 4) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 ECMA array type."); - - // alright, we've taken care of the abberant cases and end-of-object. Now let's get a property - int slen = ntohs(*(__uint16*)bitstream); - bitstream += 2; - bitstreamLen -= 2; - if (bitstreamLen < slen) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 ECMA array type property key."); - utf8 key(bitstream,bitstream + slen); - bitstream += slen; - bitstreamLen -= slen; - assert(!val); - val = new AMFVal; - val->loadFromBitstream(bitstream,bitstreamLen,mode,logMsgPrefix); - pmap[key] = val; - val = 0; - } - - clearProperties(); - m_properties = pmap; - } - catch(...) - { - delete val; - throw; - } -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const uniString::utf8 & AMFVal::getString() const throw(std::exception) -{ - if (m_type3 == AMF3_string_marker) return m_string_val; - if (m_type0 != AMF0_string_marker) throwEx<runtime_error>("AMFVal type error. Wanted string but type is " + tos(m_type0)); - return m_string_val; -} - -int AMFVal::getInteger() const throw(std::exception) -{ - if (m_type3 != AMF3_integer_marker) throwEx<runtime_error>("AMFVal type error. Wanted integer but type is " + tos(m_type3)); - return m_integer_val; -} - -double AMFVal::getNumber() const throw(std::exception) -{ - if (m_type3 == AMF3_double_marker) return m_number_val; - if (m_type0 != AMF0_number_marker) throwEx<runtime_error>("AMFVal type error. Wanted number but type is " + tos(m_type0)); - return m_number_val; -} - -bool AMFVal::getBool() const throw(std::exception) -{ - if (m_type3 == AMF3_true_marker) return true; - if (m_type3 == AMF3_false_marker) return false; - if (m_type0 != AMF0_boolean_marker) throwEx<runtime_error>("AMFVal type error. Wanted boolean but type is " + tos(m_type0)); - return m_boolean_val; -} - -const AMFObject& AMFVal::getObject() const throw(std::exception) -{ - if (m_type3 == AMF3_object_marker) return m_object_val; - if (m_type0 != AMF0_object_marker) throwEx<runtime_error>("AMFVal type error. Wanted object but type is " + tos(m_type0)); - return m_object_val; -} - -void AMFVal::serialize(vector<__uint8> &s,int mode,const utf8 &logMsgPrefix) const throw(exception) -{ - s.push_back(mode == 3 ? (__uint8)m_type3 : (__uint8)m_type0); - if (mode == 3) - { - switch(m_type3) - { - case AMF3_double_marker: - { - __uint8 buf[8] = {0}; - AMF0_EncodeNumber((char *)buf,(char *)buf+8,m_number_val); - s.insert(s.end(),buf,buf+8); - } - break; - - default: - throwEx<runtime_error>(logMsgPrefix + __FUNCTION__ + " unsupported type " + tos(m_type3)); - } - } - else - { - switch(m_type0) - { - case AMF0_number_marker: - { - __uint8 buf[8] = {0}; - AMF0_EncodeNumber((char *)buf,(char *)buf+8,m_number_val); - s.insert(s.end(),buf,buf+8); - } - break; - - case AMF0_boolean_marker: - s.push_back(m_boolean_val ? 1 : 0); - break; - - case AMF0_string_marker: - ::serialize(s,m_string_val,mode,logMsgPrefix); - break; - - case AMF0_object_marker: - m_object_val.serialize(s,mode,logMsgPrefix); - break; - - case AMF0_ecma_array_marker: - m_ecma_array_val.serialize(s,mode,logMsgPrefix); - break; - - case AMF0_null_marker: - break; - - default: - throwEx<runtime_error>(logMsgPrefix + __FUNCTION__ + " unsupported type " + tos(m_type0)); - break; - } - } -} - -utf8 AMFVal::prettyPrint(int mode,const utf8 &tabs) const throw() -{ - if (mode == 3) - { - switch(m_type3) - { - case AMF3_double_marker: - return tabs + tos(m_number_val); - - case AMF3_integer_marker: - return tabs + tos(m_integer_val); - - default: - break; - } - } - else - { - switch(m_type0) - { - case AMF0_number_marker: - return tabs + tos(m_number_val); - - case AMF0_boolean_marker: - return tabs + (m_boolean_val ? "true" : "false"); - - case AMF0_string_marker: - return tabs + m_string_val; - - case AMF0_object_marker: - return m_object_val.prettyPrint(mode,tabs); - - case AMF0_ecma_array_marker: - return m_ecma_array_val.prettyPrint(mode,tabs); - - default: - break; - } - } - return ""; -} - -void AMFVal::loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const utf8 &logMsgPrefix) throw(exception) -{ - if (!bitstreamLen) throwEx<runtime_error>(logMsgPrefix + " AMF bitstream is empty"); - if (mode == 3) - { - m_type3 = (AMF3Marker_t)*bitstream; - bitstreamLen -= 1; - bitstream += 1; - switch(m_type3) - { - case AMF3_double_marker: - if (bitstreamLen < 8) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF3 double marker."); - m_number_val = AMF0_DecodeNumber(bitstream); - bitstream += 8; - bitstreamLen -= 8; - break; - - case AMF3_null_marker: - case AMF3_false_marker: - case AMF3_true_marker: - case AMF3_integer_marker: - case AMF3_string_marker: - case AMF3_xml_doc_marker: - case AMF3_date_marker: - case AMF3_array_marker: - case AMF3_object_marker: - case AMF3_xml_marker: - case AMF3_byte_array_marker: - case AMF3_undefined_marker: - throwEx<runtime_error>(logMsgPrefix + " Unsupported AMF3 marker " + tos(m_type3)); - break; - - default: - throwEx<runtime_error>(logMsgPrefix + " Unknown AMF3 marker " + tos(m_type3)); - break; - } - } - else - { - m_type0 = (AMF0Marker_t)*bitstream; - bitstreamLen -= 1; - bitstream += 1; - switch(m_type0) - { - case AMF0_number_marker: - if (bitstreamLen < 8) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 number marker."); - m_number_val = AMF0_DecodeNumber(bitstream); - bitstream += 8; - bitstreamLen -= 8; - break; - - case AMF0_boolean_marker: - if (bitstreamLen < 1) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 boolean marker."); - m_boolean_val = ((*bitstream) ? true : false); - bitstream += 1; - bitstreamLen -= 1; - break; - - case AMF0_string_marker: - { - if (bitstreamLen < 2) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 string marker."); - __uint16 slen = ntohs(*(__uint16*)bitstream); - bitstream += 2; - bitstreamLen -= 2; - if (bitstreamLen < slen) throwEx<runtime_error>(logMsgPrefix + " Insufficient data for AMF0 string marker."); - m_string_val = utf8(bitstream,bitstream + slen); - bitstream += slen; - bitstreamLen -= slen; - } - break; - - case AMF0_object_marker: - m_object_val.loadFromBitstream(bitstream,bitstreamLen,0,logMsgPrefix); - break; - - case AMF0_ecma_array_marker: - m_ecma_array_val.loadFromBitstream(bitstream,bitstreamLen,0,logMsgPrefix); - break; - - case AMF0_undefined_marker: - DEBUG_LOG(logMsgPrefix + "Warning - Undefined AMF0 marker " + tos(m_type0)); - case AMF0_null_marker: - break; - - case AMF0_reference_marker: - case AMF0_object_end_marker: - case AMF0_strict_array_marker: - case AMF0_date_marker: - case AMF0_long_string_marker: - case AMF0_unsupported_marker: - case AMF0_recordset_marker: - case AMF0_xml_Document_marker: - case AMF0_typed_object_marker: - case AMF0_amvplus_object_marker: - case AMF0_movieclip_marker: - throwEx<runtime_error>(logMsgPrefix + " Unsupported AMF0 marker " + tos(m_type0)); - break; - - default: - throwEx<runtime_error>(logMsgPrefix + " Unknown AMF0 marker " + tos(m_type0)); - break; - } - } -} - -/////////////////////////////////////////////////////////////////////////////////////////// - -void AMFEncoding::loadFromBitstream(const char *bitstream, int bitstreamLen,const uniString::utf8 &logMsgPrefix) throw(exception) -{ - int blen = bitstreamLen; - const char *bs = bitstream; - vector<AMFVal> values; - while(blen) - { - AMFVal v; - v.loadFromBitstream(bs,blen,m_mode,logMsgPrefix); - values.push_back(v); - } - m_values=values; -} - -const AMFVal& AMFEncoding::getValue(size_t index) const throw(std::exception) -{ - if (index >= m_values.size()) - throwEx<runtime_error>("AMFEncoding::getValue(" + tos(index) + ") out of range"); - return m_values[index]; -} - -void AMFEncoding::appendValue(const AMFVal &v) throw() -{ - m_values.push_back(v); -} - -void AMFEncoding::serialize(vector<__uint8> &s,const utf8 &logMsgPrefix) const throw(exception) -{ - for(vector<AMFVal>::const_iterator i = m_values.begin(); i != m_values.end(); ++i) - (*i).serialize(s,m_mode,logMsgPrefix); -} - -utf8 AMFEncoding::prettyPrint() const throw() -{ - utf8 result("INVOKE("); - result += eol(); - for(vector<AMFVal>::const_iterator i = m_values.begin(); i != m_values.end(); ++i) - result += (*i).prettyPrint(m_mode,"\t") + eol(); - result += ")"; - return result; -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/amf.h b/Src/Plugins/DSP/sc_serv3/amf.h deleted file mode 100644 index 41ae87f9..00000000 --- a/Src/Plugins/DSP/sc_serv3/amf.h +++ /dev/null @@ -1,156 +0,0 @@ -#ifndef amf_H_ -#define amf_H_ - -#include <vector> -#include <map> -#include <stdexcept> -#include "unicode/uniString.h" - -enum AMF0Marker_t -{ - AMF0_number_marker = 0x00, - AMF0_boolean_marker, - AMF0_string_marker, - AMF0_object_marker, - AMF0_movieclip_marker, - AMF0_null_marker, - AMF0_undefined_marker, - AMF0_reference_marker, - AMF0_ecma_array_marker, - AMF0_object_end_marker, - AMF0_strict_array_marker, - AMF0_date_marker, - AMF0_long_string_marker, - AMF0_unsupported_marker, - AMF0_recordset_marker, - AMF0_xml_Document_marker, - AMF0_typed_object_marker, - AMF0_amvplus_object_marker -}; - -enum AMF3Marker_t -{ - AMF3_undefined_marker = 0x00, - AMF3_null_marker, - AMF3_false_marker, - AMF3_true_marker, - AMF3_integer_marker, - AMF3_double_marker, - AMF3_string_marker, - AMF3_xml_doc_marker, - AMF3_date_marker, - AMF3_array_marker, - AMF3_object_marker, - AMF3_xml_marker, - AMF3_byte_array_marker, -}; - -struct AMFStrictArray -{ -}; - -struct AMFDate -{ -}; - -class AMFVal; - -struct AMFEMCAArray -{ -private: - typedef std::map<uniString::utf8,AMFVal*> propertyMap_t; - std::map<uniString::utf8,AMFVal*> m_properties; - -public: - AMFEMCAArray() throw(); - ~AMFEMCAArray() throw(); - AMFEMCAArray(const AMFEMCAArray &obj) throw(); - AMFEMCAArray& operator=(const AMFEMCAArray &obj) throw(); - - void loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const uniString::utf8 &logMsgPrefix) throw(std::exception); - const AMFVal* getProperty(const uniString::utf8 &key) const throw(); - void addProperty(const uniString::utf8 &key,AMFVal *v) throw(std::exception); // takes possession of "v" - void clearProperties() throw(); - void serialize(std::vector<__uint8> &s,int mode,const uniString::utf8 &logMsgPrefix) const throw(std::exception); - uniString::utf8 prettyPrint(int mode,const uniString::utf8 &tabs) const throw(); -}; - -class AMFObject -{ -private: - typedef std::map<uniString::utf8,AMFVal*> propertyMap_t; - std::map<uniString::utf8,AMFVal*> m_properties; - -public: - AMFObject() throw(); - ~AMFObject() throw(); - AMFObject(const AMFObject &obj) throw(); - AMFObject& operator=(const AMFObject &obj) throw(); - - void loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const uniString::utf8 &logMsgPrefix) throw(std::exception); - const AMFVal* getProperty(const uniString::utf8 &key) const throw(); - void addProperty(const uniString::utf8 &key,AMFVal *v) throw(std::exception); // takes possession of "v" - void clearProperties() throw(); - void serialize(std::vector<__uint8> &s,int mode,const uniString::utf8 &logMsgPrefix) const throw(std::exception); - uniString::utf8 prettyPrint(int mode,const uniString::utf8 &tabs) const throw(); -}; - -class AMFVal -{ -private: - AMF0Marker_t m_type0; // type - AMF3Marker_t m_type3; - - // value depends on type - int m_integer_val; - double m_number_val; - bool m_boolean_val; - uniString::utf8 m_string_val; - AMFObject m_object_val; - __uint16 m_reference_val; - AMFEMCAArray m_ecma_array_val; - AMFStrictArray m_strict_array_val; - AMFDate m_date_val; - -public: - void loadFromBitstream(const char *&bitstream,int &bitstreamLen,int mode,const uniString::utf8 &logMsgPrefix) throw(std::exception); - - const uniString::utf8 &getString() const throw(std::exception); - double getNumber() const throw(std::exception); - bool getBool() const throw(std::exception); - const AMFObject& getObject() const throw(std::exception); - int getInteger() const throw(std::exception); - - AMFVal() throw(): m_type0(AMF0_null_marker),m_type3(AMF3_undefined_marker){} - AMFVal(double v) throw(): m_type0(AMF0_number_marker),m_type3(AMF3_undefined_marker) ,m_number_val(v){} - AMFVal(bool v) throw(): m_type0(AMF0_boolean_marker),m_type3(AMF3_undefined_marker),m_boolean_val(v){} - AMFVal(const uniString::utf8 &v) throw(): m_type0(AMF0_string_marker),m_type3(AMF3_undefined_marker) ,m_string_val(v){} - AMFVal(const AMFObject &v) throw(): m_type0(AMF0_object_marker),m_type3(AMF3_undefined_marker) ,m_object_val(v){} - AMFVal(const AMFEMCAArray &v) throw(): m_type0(AMF0_ecma_array_marker),m_type3(AMF3_undefined_marker),m_ecma_array_val(v){} - - void serialize(std::vector<__uint8> &s,int mode,const uniString::utf8 &logMsgPrefix) const throw(std::exception); - uniString::utf8 prettyPrint(int mode,const uniString::utf8 &tabs) const throw(); -}; - -class AMFEncoding -{ -private: - std::vector<AMFVal> m_values; - int m_mode; - -public: - AMFEncoding(int mode = 0) throw():m_mode(mode){} - ~AMFEncoding() throw(){} - - void clear() throw() { m_values.clear(); } - - void loadFromBitstream(const char *bitstream,int bitstreamLen,const uniString::utf8 &logMsgPrefix) throw(std::exception); - const AMFVal& getValue(size_t index) const throw(std::exception); - - void appendValue(const AMFVal &v) throw(); - void serialize(std::vector<__uint8> &s,const uniString::utf8 &logMsgPrefix) const throw(std::exception); - - uniString::utf8 prettyPrint() const throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile b/Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile deleted file mode 100644 index f1a5feaf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/GNUmakefile +++ /dev/null @@ -1,2 +0,0 @@ -build: - ./unix_build_expat diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMake.README b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMake.README deleted file mode 100644 index eda302d9..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMake.README +++ /dev/null @@ -1,42 +0,0 @@ -== How to build expat with cmake (experimental) == - -The cmake based buildsystem for expat works on Windows (cygwin, mingw, Visual -Studio) and should work on all other platform cmake supports. - -Assuming ~/expat-2.1.0 is the source directory of expat, add a subdirectory -build and change into that directory: -~/expat-2.1.0$ mkdir build && cd build -~/expat-2.1.0/build$ - -From that directory, call cmake first, then call make, make test and -make install in the usual way: -~/expat-2.1.0/build$ cmake .. --- The C compiler identification is GNU --- The CXX compiler identification is GNU -.... --- Configuring done --- Generating done --- Build files have been written to: /home/patrick/expat-2.1.0/build - -If you want to specify the install location for your files, append --DCMAKE_INSTALL_PREFIX=/your/install/path to the cmake call. - -~/expat-2.1.0/build$ make && make test && make install -Scanning dependencies of target expat -[ 5%] Building C object CMakeFiles/expat.dir/lib/xmlparse.c.o -[ 11%] Building C object CMakeFiles/expat.dir/lib/xmlrole.c.o -.... --- Installing: /usr/local/lib/pkgconfig/expat.pc --- Installing: /usr/local/bin/xmlwf --- Installing: /usr/local/share/man/man1/xmlwf.1 - -For Windows builds, you must make sure to call cmake from an environment where -your compiler is reachable, that means either you call it from the -Visual Studio Command Prompt or when using mingw, you must open a cmd.exe and -make sure that gcc can be called. On Windows, you also might want to specify a -special Generator for CMake: -for Visual Studio builds do: -cmake .. -G "Visual Studio 10" && vcexpress expat.sln -for mingw builds do: -cmake .. -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=D:\expat-install - && gmake && gmake install diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMakeLists.txt b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMakeLists.txt deleted file mode 100644 index 0c923baa..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/CMakeLists.txt +++ /dev/null @@ -1,111 +0,0 @@ -# This file is copyrighted under the BSD-license for buildsystem files of KDE -# copyright 2010, Patrick Spendrin <ps_ml@gmx.de> - -project(expat) - -cmake_minimum_required(VERSION 2.6) -set(PACKAGE_BUGREPORT "expat-bugs@libexpat.org") -set(PACKAGE_NAME "expat") -set(PACKAGE_VERSION "2.1.0") -set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") -set(PACKAGE_TARNAME "${PACKAGE_NAME}") - -option(BUILD_tools "build the xmlwf tool for expat library" ON) -option(BUILD_examples "build the examples for expat library" ON) -option(BUILD_tests "build the tests for expat library" ON) -option(BUILD_shared "build a shared expat library" ON) - -# configuration options -set(XML_CONTEXT_BYTES 1024 CACHE STRING "Define to specify how much context to retain around the current parse point") -option(XML_DTD "Define to make parameter entity parsing functionality available" ON) -option(XML_NS "Define to make XML Namespaces functionality available" ON) - -if(XML_DTD) - set(XML_DTD 1) -else(XML_DTD) - set(XML_DTD 0) -endif(XML_DTD) -if(XML_NS) - set(XML_NS 1) -else(XML_NS) - set(XML_NS 0) -endif(XML_NS) - -if(BUILD_tests) - enable_testing() -endif(BUILD_tests) - -include(ConfigureChecks.cmake) - -include_directories(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/lib) -if(MSVC) - add_definitions(-D_CRT_SECURE_NO_WARNINGS -wd4996) -endif(MSVC) - -set(expat_SRCS - lib/xmlparse.c - lib/xmlrole.c - lib/xmltok.c - lib/xmltok_impl.c - lib/xmltok_ns.c -) - -if(WIN32 AND BUILD_shared) - set(expat_SRCS ${expat_SRCS} lib/libexpat.def) -endif(WIN32 AND BUILD_shared) - -if(BUILD_shared) - set(_SHARED SHARED) -else(BUILD_shared) - set(_SHARED STATIC) -endif(BUILD_shared) - -add_library(expat ${_SHARED} ${expat_SRCS}) - -install(TARGETS expat RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) - -set(prefix ${CMAKE_INSTALL_PREFIX}) -set(exec_prefix "\${prefix}/bin") -set(libdir "\${prefix}/lib") -set(includedir "\${prefix}/include") -configure_file(expat.pc.in ${CMAKE_CURRENT_BINARY_DIR}/expat.pc) - -install(FILES lib/expat.h lib/expat_external.h DESTINATION include) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/expat.pc DESTINATION lib/pkgconfig) - - - -if(BUILD_tools AND NOT WINCE) - set(xmlwf_SRCS - xmlwf/xmlwf.c - xmlwf/xmlfile.c - xmlwf/codepage.c - xmlwf/readfilemap.c - ) - - add_executable(xmlwf ${xmlwf_SRCS}) - target_link_libraries(xmlwf expat) - install(TARGETS xmlwf DESTINATION bin) - install(FILES doc/xmlwf.1 DESTINATION share/man/man1) -endif(BUILD_tools AND NOT WINCE) - -if(BUILD_examples) - add_executable(elements examples/elements.c) - target_link_libraries(elements expat) - - add_executable(outline examples/outline.c) - target_link_libraries(outline expat) -endif(BUILD_examples) - -if(BUILD_tests) - ## these are unittests that can be run on any platform - add_executable(runtests tests/runtests.c tests/chardata.c tests/minicheck.c) - target_link_libraries(runtests expat) - add_test(runtests runtests) - - add_executable(runtestspp tests/runtestspp.cpp tests/chardata.c tests/minicheck.c) - target_link_libraries(runtestspp expat) - add_test(runtestspp runtestspp) -endif(BUILD_tests) diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/COPYING b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/COPYING deleted file mode 100644 index dcb45064..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/COPYING +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - and Clark Cooper -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Changes b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Changes deleted file mode 100644 index 08897b9f..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Changes +++ /dev/null @@ -1,205 +0,0 @@ -Release 2.1.0 Sat March 24 2012 - - Bug Fixes: - #1742315: Harmful XML_ParserCreateNS suggestion. - #2895533: CVE-2012-1147 - Resource leak in readfilemap.c. - #1785430: Expat build fails on linux-amd64 with gcc version>=4.1 -O3. - #1983953, 2517952, 2517962, 2649838: - Build modifications using autoreconf instead of buildconf.sh. - #2815947, #2884086: OBJEXT and EXEEXT support while building. - #1990430: CVE-2009-3720 - Parser crash with special UTF-8 sequences. - #2517938: xmlwf should return non-zero exit status if not well-formed. - #2517946: Wrong statement about XMLDecl in xmlwf.1 and xmlwf.sgml. - #2855609: Dangling positionPtr after error. - #2894085: CVE-2009-3560 - Buffer over-read and crash in big2_toUtf8(). - #2958794: CVE-2012-1148 - Memory leak in poolGrow. - #2990652: CMake support. - #3010819: UNEXPECTED_STATE with a trailing "%" in entity value. - #3206497: Unitialized memory returned from XML_Parse. - #3287849: make check fails on mingw-w64. - #3496608: CVE-2012-0876 - Hash DOS attack. - - Patches: - #1749198: pkg-config support. - #3010222: Fix for bug #3010819. - #3312568: CMake support. - #3446384: Report byte offsets for attr names and values. - - New Features / API changes: - Added new API member XML_SetHashSalt() that allows setting an intial - value (salt) for hash calculations. This is part of the fix for - bug #3496608 to randomize hash parameters. - When compiled with XML_ATTR_INFO defined, adds new API member - XML_GetAttributeInfo() that allows retrieving the byte - offsets for attribute names and values (patch #3446384). - Added CMake build system. - See bug #2990652 and patch #3312568. - Added run-benchmark target to Makefile.in - relies on testdata module - present in the same relative location as in the repository. - -Release 2.0.1 Tue June 5 2007 - - Fixed bugs #1515266, #1515600: The character data handler's calling - of XML_StopParser() was not handled properly; if the parser was - stopped and the handler set to NULL, the parser would segfault. - - Fixed bug #1690883: Expat failed on EBCDIC systems as it assumed - some character constants to be ASCII encoded. - - Minor cleanups of the test harness. - - Fixed xmlwf bug #1513566: "out of memory" error on file size zero. - - Fixed outline.c bug #1543233: missing a final XML_ParserFree() call. - - Fixes and improvements for Windows platform: - bugs #1409451, #1476160, #1548182, #1602769, #1717322. - - Build fixes for various platforms: - HP-UX, Tru64, Solaris 9: patch #1437840, bug #1196180. - All Unix: #1554618 (refreshed config.sub/config.guess). - #1490371, #1613457: support both, DESTDIR and INSTALL_ROOT, - without relying on GNU-Make specific features. - #1647805: Patched configure.in to work better with Intel compiler. - - Fixes to Makefile.in to have make check work correctly: - bugs #1408143, #1535603, #1536684. - - Added Open Watcom support: patch #1523242. - -Release 2.0.0 Wed Jan 11 2006 - - We no longer use the "check" library for C unit testing; we - always use the (partial) internal implementation of the API. - - Report XML_NS setting via XML_GetFeatureList(). - - Fixed headers for use from C++. - - XML_GetCurrentLineNumber() and XML_GetCurrentColumnNumber() - now return unsigned integers. - - Added XML_LARGE_SIZE switch to enable 64-bit integers for - byte indexes and line/column numbers. - - Updated to use libtool 1.5.22 (the most recent). - - Added support for AmigaOS. - - Some mostly minor bug fixes. SF issues include: #1006708, - #1021776, #1023646, #1114960, #1156398, #1221160, #1271642. - -Release 1.95.8 Fri Jul 23 2004 - - Major new feature: suspend/resume. Handlers can now request - that a parse be suspended for later resumption or aborted - altogether. See "Temporarily Stopping Parsing" in the - documentation for more details. - - Some mostly minor bug fixes, but compilation should no - longer generate warnings on most platforms. SF issues - include: #827319, #840173, #846309, #888329, #896188, #923913, - #928113, #961698, #985192. - -Release 1.95.7 Mon Oct 20 2003 - - Fixed enum XML_Status issue (reported on SourceForge many - times), so compilers that are properly picky will be happy. - - Introduced an XMLCALL macro to control the calling - convention used by the Expat API; this macro should be used - to annotate prototypes and definitions of callback - implementations in code compiled with a calling convention - other than the default convention for the host platform. - - Improved ability to build without the configure-generated - expat_config.h header. This is useful for applications - which embed Expat rather than linking in the library. - - Fixed a variety of bugs: see SF issues #458907, #609603, - #676844, #679754, #692878, #692964, #695401, #699323, #699487, - #820946. - - Improved hash table lookups. - - Added more regression tests and improved documentation. - -Release 1.95.6 Tue Jan 28 2003 - - Added XML_FreeContentModel(). - - Added XML_MemMalloc(), XML_MemRealloc(), XML_MemFree(). - - Fixed a variety of bugs: see SF issues #615606, #616863, - #618199, #653180, #673791. - - Enhanced the regression test suite. - - Man page improvements: includes SF issue #632146. - -Release 1.95.5 Fri Sep 6 2002 - - Added XML_UseForeignDTD() for improved SAX2 support. - - Added XML_GetFeatureList(). - - Defined XML_Bool type and the values XML_TRUE and XML_FALSE. - - Use an incomplete struct instead of a void* for the parser - (may not retain). - - Fixed UTF-8 decoding bug that caused legal UTF-8 to be rejected. - - Finally fixed bug where default handler would report DTD - events that were already handled by another handler. - Initial patch contributed by Darryl Miles. - - Removed unnecessary DllMain() function that caused static - linking into a DLL to be difficult. - - Added VC++ projects for building static libraries. - - Reduced line-length for all source code and headers to be - no longer than 80 characters, to help with AS/400 support. - - Reduced memory copying during parsing (SF patch #600964). - - Fixed a variety of bugs: see SF issues #580793, #434664, - #483514, #580503, #581069, #584041, #584183, #584832, #585537, - #596555, #596678, #598352, #598944, #599715, #600479, #600971. - -Release 1.95.4 Fri Jul 12 2002 - - Added support for VMS, contributed by Craig Berry. See - vms/README.vms for more information. - - Added Mac OS (classic) support, with a makefile for MPW, - contributed by Thomas Wegner and Daryle Walker. - - Added Borland C++ Builder 5 / BCC 5.5 support, contributed - by Patrick McConnell (SF patch #538032). - - Fixed a variety of bugs: see SF issues #441449, #563184, - #564342, #566334, #566901, #569461, #570263, #575168, #579196. - - Made skippedEntityHandler conform to SAX2 (see source comment) - - Re-implemented WFC: Entity Declared from XML 1.0 spec and - added a new error "entity declared in parameter entity": - see SF bug report #569461 and SF patch #578161 - - Re-implemented section 5.1 from XML 1.0 spec: - see SF bug report #570263 and SF patch #578161 - -Release 1.95.3 Mon Jun 3 2002 - - Added a project to the MSVC workspace to create a wchar_t - version of the library; the DLLs are named libexpatw.dll. - - Changed the name of the Windows DLLs from expat.dll to - libexpat.dll; this fixes SF bug #432456. - - Added the XML_ParserReset() API function. - - Fixed XML_SetReturnNSTriplet() to work for element names. - - Made the XML_UNICODE builds usable (thanks, Karl!). - - Allow xmlwf to read from standard input. - - Install a man page for xmlwf on Unix systems. - - Fixed many bugs; see SF bug reports #231864, #461380, #464837, - #466885, #469226, #477667, #484419, #487840, #494749, #496505, - #547350. Other bugs which we can't test as easily may also - have been fixed, especially in the area of build support. - -Release 1.95.2 Fri Jul 27 2001 - - More changes to make MSVC happy with the build; add a single - workspace to support both the library and xmlwf application. - - Added a Windows installer for Windows users; includes - xmlwf.exe. - - Added compile-time constants that can be used to determine the - Expat version - - Removed a lot of GNU-specific dependencies to aide portability - among the various Unix flavors. - - Fix the UTF-8 BOM bug. - - Cleaned up warning messages for several compilers. - - Added the -Wall, -Wstrict-prototypes options for GCC. - -Release 1.95.1 Sun Oct 22 15:11:36 EDT 2000 - - Changes to get expat to build under Microsoft compiler - - Removed all aborts and instead return an UNEXPECTED_STATE error. - - Fixed a bug where a stray '%' in an entity value would cause an - abort. - - Defined XML_SetEndNamespaceDeclHandler. Thanks to Darryl Miles for - finding this oversight. - - Changed default patterns in lib/Makefile.in to fit non-GNU makes - Thanks to robin@unrated.net for reporting and providing an - account to test on. - - The reference had the wrong label for XML_SetStartNamespaceDecl. - Reported by an anonymous user. - -Release 1.95.0 Fri Sep 29 2000 - - XML_ParserCreate_MM - Allows you to set a memory management suite to replace the - standard malloc,realloc, and free. - - XML_SetReturnNSTriplet - If you turn this feature on when namespace processing is in - effect, then qualified, prefixed element and attribute names - are returned as "uri|name|prefix" where '|' is whatever - separator character is used in namespace processing. - - Merged in features from perl-expat - o XML_SetElementDeclHandler - o XML_SetAttlistDeclHandler - o XML_SetXmlDeclHandler - o XML_SetEntityDeclHandler - o StartDoctypeDeclHandler takes 3 additional parameters: - sysid, pubid, has_internal_subset - o Many paired handler setters (like XML_SetElementHandler) - now have corresponding individual handler setters - o XML_GetInputContext for getting the input context of - the current parse position. - - Added reference material - - Packaged into a distribution that builds a sharable library diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/ConfigureChecks.cmake b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/ConfigureChecks.cmake deleted file mode 100644 index f03faa63..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/ConfigureChecks.cmake +++ /dev/null @@ -1,44 +0,0 @@ -include(CheckIncludeFile) -include(CheckIncludeFiles) -include(CheckFunctionExists) -include(CheckSymbolExists) -include(TestBigEndian) - -check_include_file("dlfcn.h" HAVE_DLFCN_H) -check_include_file("fcntl.h" HAVE_FCNTL_H) -check_include_file("inttypes.h" HAVE_INTTYPES_H) -check_include_file("memory.h" HAVE_MEMORY_H) -check_include_file("stdint.h" HAVE_STDINT_H) -check_include_file("stdlib.h" HAVE_STDLIB_H) -check_include_file("strings.h" HAVE_STRINGS_H) -check_include_file("string.h" HAVE_STRING_H) -check_include_file("sys/stat.h" HAVE_SYS_STAT_H) -check_include_file("sys/types.h" HAVE_SYS_TYPES_H) -check_include_file("unistd.h" HAVE_UNISTD_H) - -check_function_exists("getpagesize" HAVE_GETPAGESIZE) -check_function_exists("bcopy" HAVE_BCOPY) -check_symbol_exists("memmove" "string.h" HAVE_MEMMOVE) -check_function_exists("mmap" HAVE_MMAP) - -#/* Define to 1 if you have the ANSI C header files. */ -check_include_files("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) - -test_big_endian(WORDS_BIGENDIAN) -#/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -if(WORDS_BIGENDIAN) - set(BYTEORDER 4321) -else(WORDS_BIGENDIAN) - set(BYTEORDER 1234) -endif(WORDS_BIGENDIAN) - -if(HAVE_SYS_TYPES_H) - check_symbol_exists("off_t" "sys/types.h" OFF_T) - check_symbol_exists("size_t" "sys/types.h" SIZE_T) -else(HAVE_SYS_TYPES_H) - set(OFF_T "long") - set(SIZE_T "unsigned") -endif(HAVE_SYS_TYPES_H) - -configure_file(expat_config.h.cmake expat_config.h) -add_definitions(-DHAVE_EXPAT_CONFIG_H) diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/MANIFEST b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/MANIFEST deleted file mode 100644 index 7a020dc0..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/MANIFEST +++ /dev/null @@ -1,141 +0,0 @@ -amiga/launch.c -amiga/expat_68k.c -amiga/expat_68k.h -amiga/expat_68k_handler_stubs.c -amiga/expat_base.h -amiga/expat_vectors.c -amiga/expat_lib.c -amiga/expat.xml -amiga/README.txt -amiga/Makefile -amiga/include/proto/expat.h -amiga/include/libraries/expat.h -amiga/include/interfaces/expat.h -amiga/include/inline4/expat.h -bcb5/README.txt -bcb5/all_projects.bpg -bcb5/elements.bpf -bcb5/elements.bpr -bcb5/elements.mak -bcb5/expat.bpf -bcb5/expat.bpr -bcb5/expat.mak -bcb5/expat_static.bpf -bcb5/expat_static.bpr -bcb5/expat_static.mak -bcb5/expatw.bpf -bcb5/expatw.bpr -bcb5/expatw.mak -bcb5/expatw_static.bpf -bcb5/expatw_static.bpr -bcb5/expatw_static.mak -bcb5/libexpat_mtd.def -bcb5/libexpatw_mtd.def -bcb5/makefile.mak -bcb5/outline.bpf -bcb5/outline.bpr -bcb5/outline.mak -bcb5/setup.bat -bcb5/xmlwf.bpf -bcb5/xmlwf.bpr -bcb5/xmlwf.mak -doc/expat.png -doc/reference.html -doc/style.css -doc/valid-xhtml10.png -doc/xmlwf.1 -doc/xmlwf.sgml -CMakeLists.txt -CMake.README -COPYING -Changes -ConfigureChecks.cmake -MANIFEST -Makefile.in -README -configure -configure.in -expat_config.h.in -expat_config.h.cmake -expat.pc.in -expat.dsw -aclocal.m4 -conftools/PrintPath -conftools/ac_c_bigendian_cross.m4 -conftools/expat.m4 -conftools/get-version.sh -conftools/mkinstalldirs -conftools/config.guess -conftools/config.sub -conftools/install-sh -conftools/ltmain.sh -m4/libtool.m4 -m4/ltversion.m4 -m4/ltoptions.m4 -m4/ltsugar.m4 -m4/lt~obsolete.m4 -examples/elements.c -examples/elements.dsp -examples/outline.c -examples/outline.dsp -lib/Makefile.MPW -lib/amigaconfig.h -lib/ascii.h -lib/asciitab.h -lib/expat.dsp -lib/expat.h -lib/expat_external.h -lib/expat_static.dsp -lib/expatw.dsp -lib/expatw_static.dsp -lib/iasciitab.h -lib/internal.h -lib/latin1tab.h -lib/libexpat.def -lib/libexpatw.def -lib/macconfig.h -lib/nametab.h -lib/utf8tab.h -lib/winconfig.h -lib/xmlparse.c -lib/xmlrole.c -lib/xmlrole.h -lib/xmltok.c -lib/xmltok.h -lib/xmltok_impl.c -lib/xmltok_impl.h -lib/xmltok_ns.c -tests/benchmark/README.txt -tests/benchmark/benchmark.c -tests/benchmark/benchmark.dsp -tests/benchmark/benchmark.dsw -tests/README.txt -tests/chardata.c -tests/chardata.h -tests/minicheck.c -tests/minicheck.h -tests/runtests.c -tests/runtestspp.cpp -tests/xmltest.sh -vms/README.vms -vms/descrip.mms -vms/expat_config.h -win32/MANIFEST.txt -win32/README.txt -win32/expat.iss -xmlwf/codepage.c -xmlwf/codepage.h -xmlwf/ct.c -xmlwf/filemap.h -xmlwf/readfilemap.c -xmlwf/unixfilemap.c -xmlwf/win32filemap.c -xmlwf/xmlfile.c -xmlwf/xmlfile.h -xmlwf/xmlmime.c -xmlwf/xmlmime.h -xmlwf/xmltchar.h -xmlwf/xmlurl.h -xmlwf/xmlwf.c -xmlwf/xmlwf.dsp -xmlwf/xmlwin32url.cxx diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Makefile.in b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Makefile.in deleted file mode 100644 index 9c0f5d49..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/Makefile.in +++ /dev/null @@ -1,201 +0,0 @@ -################################################################ -# Process this file with top-level configure script to produce Makefile -# -# Copyright 2000 Clark Cooper -# -# This file is part of EXPAT. -# -# EXPAT is free software; you can redistribute it and/or modify it -# under the terms of the License (based on the MIT/X license) contained -# in the file COPYING that comes with this distribution. -# -# EXPAT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN EXPAT. -# - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -libdir = @libdir@ -includedir = @includedir@ -man1dir = @mandir@/man1 -pkgconfigdir = $(libdir)/pkgconfig - -top_builddir = . - - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -mkinstalldirs = $(SHELL) $(top_srcdir)/conftools/mkinstalldirs - -MANFILE = $(srcdir)/doc/xmlwf.1 -APIHEADER = $(srcdir)/lib/expat.h $(srcdir)/lib/expat_external.h -LIBRARY = libexpat.la - -DESTDIR = $(INSTALL_ROOT) - -default: buildlib xmlwf/xmlwf@EXEEXT@ - -buildlib: $(LIBRARY) expat.pc - -all: $(LIBRARY) expat.pc xmlwf/xmlwf@EXEEXT@ examples/elements examples/outline - -clean: - cd lib && rm -f $(LIBRARY) *.@OBJEXT@ *.lo && rm -rf .libs _libs - cd xmlwf && rm -f xmlwf *.@OBJEXT@ *.lo && rm -rf .libs _libs - cd examples && rm -f elements outline *.@OBJEXT@ *.lo && rm -rf .libs _libs - cd tests && rm -rf .libs runtests runtests.@OBJEXT@ runtestspp runtestspp.@OBJEXT@ - cd tests && rm -f chardata.@OBJEXT@ minicheck.@OBJEXT@ - rm -rf .libs libexpat.la - rm -f examples/core tests/core xmlwf/core - -clobber: clean - -distclean: clean - rm -f expat_config.h config.status config.log config.cache libtool - rm -f Makefile expat.pc - -extraclean: distclean - rm -f expat_config.h.in configure - rm -f aclocal.m4 m4/* - rm -f conftools/ltmain.sh conftools/install-sh conftools/config.guess conftools/config.sub - -check: tests/runtests tests/runtestspp - tests/runtests - tests/runtestspp - -install: xmlwf/xmlwf@EXEEXT@ installlib - $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir) - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) xmlwf/xmlwf@EXEEXT@ $(DESTDIR)$(bindir)/xmlwf - $(INSTALL_DATA) $(MANFILE) $(DESTDIR)$(man1dir) - -installlib: $(LIBRARY) $(APIHEADER) expat.pc - $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir) $(DESTDIR)$(pkgconfigdir) - $(LIBTOOL) --mode=install $(INSTALL) $(LIBRARY) $(DESTDIR)$(libdir)/$(LIBRARY) - for FN in $(APIHEADER) ; do $(INSTALL_DATA) $$FN $(DESTDIR)$(includedir) ; done - $(INSTALL_DATA) expat.pc $(DESTDIR)$(pkgconfigdir)/expat.pc - -uninstall: uninstalllib - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(bindir)/xmlwf@EXEEXT@ - rm -f $(DESTDIR)$(man1dir)/xmlwf.1 - -uninstalllib: - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$(LIBRARY) - rm -f $(DESTDIR)$(includedir)/expat.h - rm -f $(DESTDIR)$(includedir)/expat_external.h - rm -f $(DESTDIR)$(pkgconfigdir)/expat.pc - -# for VPATH builds (invoked by configure) -mkdir-init: - @for d in lib xmlwf examples tests ; do \ - (mkdir $$d 2> /dev/null || test 1) ; \ - done - -CC = @CC@ -CXX = @CXX@ -LIBTOOL = @LIBTOOL@ - -INCLUDES = -I$(srcdir)/lib -I. -LDFLAGS = @LDFLAGS@ -CPPFLAGS = @CPPFLAGS@ -DHAVE_EXPAT_CONFIG_H -CFLAGS = @CFLAGS@ -CXXFLAGS = @CXXFLAGS@ -VSNFLAG = -version-info @LIBCURRENT@:@LIBREVISION@:@LIBAGE@ - -### autoconf this? -LTFLAGS = --silent - -COMPILE = $(CC) $(INCLUDES) $(CFLAGS) $(DEFS) $(CPPFLAGS) -CXXCOMPILE = $(CXX) $(INCLUDES) $(CXXFLAGS) $(DEFS) $(CPPFLAGS) -LTCOMPILE = $(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -LINK_LIB = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) -no-undefined $(VSNFLAG) -rpath $(libdir) $(LDFLAGS) -o $@ -LINK_EXE = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) $(LDFLAGS) -o $@ -LINK_CXX_EXE = $(LIBTOOL) $(LTFLAGS) --mode=link $(CXXCOMPILE) $(LDFLAGS) -o $@ - -LIB_OBJS = lib/xmlparse.lo lib/xmltok.lo lib/xmlrole.lo -$(LIBRARY): $(LIB_OBJS) - $(LINK_LIB) $(LIB_OBJS) - -expat.pc: $(top_builddir)/config.status - cd $(top_builddir) && $(SHELL) ./config.status $@ - -lib/xmlparse.lo: lib/xmlparse.c lib/expat.h lib/xmlrole.h lib/xmltok.h \ - $(top_builddir)/expat_config.h lib/expat_external.h lib/internal.h - -lib/xmlrole.lo: lib/xmlrole.c lib/ascii.h lib/xmlrole.h \ - $(top_builddir)/expat_config.h lib/expat_external.h lib/internal.h - -lib/xmltok.lo: lib/xmltok.c lib/xmltok_impl.c lib/xmltok_ns.c \ - lib/ascii.h lib/asciitab.h lib/iasciitab.h lib/latin1tab.h \ - lib/nametab.h lib/utf8tab.h lib/xmltok.h lib/xmltok_impl.h \ - $(top_builddir)/expat_config.h lib/expat_external.h lib/internal.h - - -XMLWF_OBJS = xmlwf/xmlwf.@OBJEXT@ xmlwf/xmlfile.@OBJEXT@ xmlwf/codepage.@OBJEXT@ xmlwf/@FILEMAP@.@OBJEXT@ -xmlwf/xmlwf.@OBJEXT@: xmlwf/xmlwf.c -xmlwf/xmlfile.@OBJEXT@: xmlwf/xmlfile.c -xmlwf/codepage.@OBJEXT@: xmlwf/codepage.c -xmlwf/@FILEMAP@.@OBJEXT@: xmlwf/@FILEMAP@.c -xmlwf/xmlwf@EXEEXT@: $(XMLWF_OBJS) $(LIBRARY) - $(LINK_EXE) $(XMLWF_OBJS) $(LIBRARY) - -examples/elements.@OBJEXT@: examples/elements.c -examples/elements: examples/elements.@OBJEXT@ $(LIBRARY) - $(LINK_EXE) $< $(LIBRARY) - -examples/outline.@OBJEXT@: examples/outline.c -examples/outline: examples/outline.@OBJEXT@ $(LIBRARY) - $(LINK_EXE) $< $(LIBRARY) - -tests/chardata.@OBJEXT@: tests/chardata.c tests/chardata.h -tests/minicheck.@OBJEXT@: tests/minicheck.c tests/minicheck.h -tests/runtests.@OBJEXT@: tests/runtests.c tests/chardata.h -tests/runtests: tests/runtests.@OBJEXT@ tests/chardata.@OBJEXT@ tests/minicheck.@OBJEXT@ $(LIBRARY) - $(LINK_EXE) tests/runtests.@OBJEXT@ tests/chardata.@OBJEXT@ tests/minicheck.@OBJEXT@ $(LIBRARY) -tests/runtestspp.@OBJEXT@: tests/runtestspp.cpp tests/runtests.c tests/chardata.h -tests/runtestspp: tests/runtestspp.@OBJEXT@ tests/chardata.@OBJEXT@ tests/minicheck.@OBJEXT@ $(LIBRARY) - $(LINK_CXX_EXE) tests/runtestspp.@OBJEXT@ tests/chardata.@OBJEXT@ tests/minicheck.@OBJEXT@ $(LIBRARY) - -tests/benchmark/benchmark.@OBJEXT@: tests/benchmark/benchmark.c -tests/benchmark/benchmark: tests/benchmark/benchmark.@OBJEXT@ $(LIBRARY) - $(LINK_EXE) tests/benchmark/benchmark.@OBJEXT@ $(LIBRARY) - -run-benchmark: tests/benchmark/benchmark - tests/benchmark/benchmark@EXEEXT@ -n $(top_srcdir)/../testdata/largefiles/recset.xml 65535 3 - -tests/xmlts.zip: - wget --output-document=tests/xmlts.zip \ - http://www.w3.org/XML/Test/xmlts20080827.zip - -tests/XML-Test-Suite: tests/xmlts.zip - cd tests && unzip -q xmlts.zip - -run-xmltest: xmlwf/xmlwf@EXEEXT@ tests/XML-Test-Suite - tests/xmltest.sh - -.SUFFIXES: .c .cpp .lo .@OBJEXT@ - -.cpp.@OBJEXT@: - $(CXXCOMPILE) -o $@ -c $< -.c.@OBJEXT@: - $(COMPILE) -o $@ -c $< -.c.lo: - $(LTCOMPILE) -o $@ -c $< - -.PHONY: buildlib all \ - clean distclean extraclean maintainer-clean \ - dist distdir \ - install uninstall diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/README b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/README deleted file mode 100644 index 1f88467d..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/README +++ /dev/null @@ -1,139 +0,0 @@ - - Expat, Release 2.1.0 - -This is Expat, a C library for parsing XML, written by James Clark. -Expat is a stream-oriented XML parser. This means that you register -handlers with the parser before starting the parse. These handlers -are called when the parser discovers the associated structures in the -document being parsed. A start tag is an example of the kind of -structures for which you may register handlers. - -Windows users should use the expat_win32bin package, which includes -both precompiled libraries and executables, and source code for -developers. - -Expat is free software. You may copy, distribute, and modify it under -the terms of the License contained in the file COPYING distributed -with this package. This license is the same as the MIT/X Consortium -license. - -Versions of Expat that have an odd minor version (the middle number in -the release above), are development releases and should be considered -as beta software. Releases with even minor version numbers are -intended to be production grade software. - -If you are building Expat from a check-out from the CVS repository, -you need to run a script that generates the configure script using the -GNU autoconf and libtool tools. To do this, you need to have -autoconf 2.58 or newer. Run the script like this: - - ./buildconf.sh - -Once this has been done, follow the same instructions as for building -from a source distribution. - -To build Expat from a source distribution, you first run the -configuration shell script in the top level distribution directory: - - ./configure - -There are many options which you may provide to configure (which you -can discover by running configure with the --help option). But the -one of most interest is the one that sets the installation directory. -By default, the configure script will set things up to install -libexpat into /usr/local/lib, expat.h into /usr/local/include, and -xmlwf into /usr/local/bin. If, for example, you'd prefer to install -into /home/me/mystuff/lib, /home/me/mystuff/include, and -/home/me/mystuff/bin, you can tell configure about that with: - - ./configure --prefix=/home/me/mystuff - -Another interesting option is to enable 64-bit integer support for -line and column numbers and the over-all byte index: - - ./configure CPPFLAGS=-DXML_LARGE_SIZE - -However, such a modification would be a breaking change to the ABI -and is therefore not recommended for general use - e.g. as part of -a Linux distribution - but rather for builds with special requirements. - -After running the configure script, the "make" command will build -things and "make install" will install things into their proper -location. Have a look at the "Makefile" to learn about additional -"make" options. Note that you need to have write permission into -the directories into which things will be installed. - -If you are interested in building Expat to provide document -information in UTF-16 encoding rather than the default UTF-8, follow -these instructions (after having run "make distclean"): - - 1. For UTF-16 output as unsigned short (and version/error - strings as char), run: - - ./configure CPPFLAGS=-DXML_UNICODE - - For UTF-16 output as wchar_t (incl. version/error strings), - run: - - ./configure CFLAGS="-g -O2 -fshort-wchar" \ - CPPFLAGS=-DXML_UNICODE_WCHAR_T - - 2. Edit the MakeFile, changing: - - LIBRARY = libexpat.la - - to: - - LIBRARY = libexpatw.la - - (Note the additional "w" in the library name.) - - 3. Run "make buildlib" (which builds the library only). - Or, to save step 2, run "make buildlib LIBRARY=libexpatw.la". - - 4. Run "make installlib" (which installs the library only). - Or, if step 2 was omitted, run "make installlib LIBRARY=libexpatw.la". - -Using DESTDIR or INSTALL_ROOT is enabled, with INSTALL_ROOT being the default -value for DESTDIR, and the rest of the make file using only DESTDIR. -It works as follows: - $ make install DESTDIR=/path/to/image -overrides the in-makefile set DESTDIR, while both - $ INSTALL_ROOT=/path/to/image make install - $ make install INSTALL_ROOT=/path/to/image -use DESTDIR=$(INSTALL_ROOT), even if DESTDIR eventually is defined in the -environment, because variable-setting priority is -1) commandline -2) in-makefile -3) environment - -Note: This only applies to the Expat library itself, building UTF-16 versions -of xmlwf and the tests is currently not supported. - -Note for Solaris users: The "ar" command is usually located in -"/usr/ccs/bin", which is not in the default PATH. You will need to -add this to your path for the "make" command, and probably also switch -to GNU make (the "make" found in /usr/ccs/bin does not seem to work -properly -- appearantly it does not understand .PHONY directives). If -you're using ksh or bash, use this command to build: - - PATH=/usr/ccs/bin:$PATH make - -When using Expat with a project using autoconf for configuration, you -can use the probing macro in conftools/expat.m4 to determine how to -include Expat. See the comments at the top of that file for more -information. - -A reference manual is available in the file doc/reference.html in this -distribution. - -The homepage for this project is http://www.libexpat.org/. There -are links there to connect you to the bug reports page. If you need -to report a bug when you don't have access to a browser, you may also -send a bug report by email to expat-bugs@mail.libexpat.org. - -Discussion related to the direction of future expat development takes -place on expat-discuss@mail.libexpat.org. Archives of this list and -other Expat-related lists may be found at: - - http://mail.libexpat.org/mailman/listinfo/ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/aclocal.m4 b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/aclocal.m4 deleted file mode 100644 index 6fe5ffd2..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/aclocal.m4 +++ /dev/null @@ -1,8460 +0,0 @@ -# generated automatically by aclocal 1.11.1 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, -# Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, -# Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -]) - -# serial 57 LT_INIT - - -# LT_PREREQ(VERSION) -# ------------------ -# Complain and exit if this libtool version is less that VERSION. -m4_defun([LT_PREREQ], -[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, - [m4_default([$3], - [m4_fatal([Libtool version $1 or higher is required], - 63)])], - [$2])]) - - -# _LT_CHECK_BUILDDIR -# ------------------ -# Complain if the absolute build directory name contains unusual characters -m4_defun([_LT_CHECK_BUILDDIR], -[case `pwd` in - *\ * | *\ *) - AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; -esac -]) - - -# LT_INIT([OPTIONS]) -# ------------------ -AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -])# LT_INIT - -# Old names: -AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) -AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PROG_LIBTOOL], []) -dnl AC_DEFUN([AM_PROG_LIBTOOL], []) - - -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -]) - - -# _LT_FILEUTILS_DEFAULTS -# ---------------------- -# It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. -m4_defun([_LT_FILEUTILS_DEFAULTS], -[: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} -])# _LT_FILEUTILS_DEFAULTS - - -# _LT_SETUP -# --------- -m4_defun([_LT_SETUP], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl - -_LT_DECL([], [host_alias], [0], [The host system])dnl -_LT_DECL([], [host], [0])dnl -_LT_DECL([], [host_os], [0])dnl -dnl -_LT_DECL([], [build_alias], [0], [The build system])dnl -_LT_DECL([], [build], [0])dnl -_LT_DECL([], [build_os], [0])dnl -dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -test -z "$LN_S" && LN_S="ln -s" -_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl -dnl -AC_REQUIRE([LT_CMD_MAX_LEN])dnl -_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl -_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl -dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl -m4_require([_LT_CMD_RELOAD])dnl -m4_require([_LT_CHECK_MAGIC_METHOD])dnl -m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl -m4_require([_LT_CMD_OLD_ARCHIVE])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_WITH_SYSROOT])dnl - -_LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi -]) -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -_LT_CHECK_OBJDIR - -m4_require([_LT_TAG_COMPILER])dnl - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -_LT_CC_BASENAME([$compiler]) - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - _LT_PATH_MAGIC - fi - ;; -esac - -# Use C for the default configuration in the libtool script -LT_SUPPORTED_TAG([CC]) -_LT_LANG_C_CONFIG -_LT_LANG_DEFAULT_CONFIG -_LT_CONFIG_COMMANDS -])# _LT_SETUP - - -# _LT_PREPARE_SED_QUOTE_VARS -# -------------------------- -# Define a few sed substitution that help us do robust quoting. -m4_defun([_LT_PREPARE_SED_QUOTE_VARS], -[# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([["`\\]]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' -]) - -# _LT_PROG_LTMAIN -# --------------- -# Note that this code is called both from `configure', and `config.status' -# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, -# so we pass a copy along to make sure it has a sensible value anyway. -m4_defun([_LT_PROG_LTMAIN], -[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl -_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain="$ac_aux_dir/ltmain.sh" -])# _LT_PROG_LTMAIN - - - -# So that we can recreate a full libtool script including additional -# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' -# label. - - -# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) -# ---------------------------------------- -# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL_INIT], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_INIT], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_INIT]) - - -# _LT_CONFIG_LIBTOOL([COMMANDS]) -# ------------------------------ -# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) - - -# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) -# ----------------------------------------------------- -m4_defun([_LT_CONFIG_SAVE_COMMANDS], -[_LT_CONFIG_LIBTOOL([$1]) -_LT_CONFIG_LIBTOOL_INIT([$2]) -]) - - -# _LT_FORMAT_COMMENT([COMMENT]) -# ----------------------------- -# Add leading comment marks to the start of each line, and a trailing -# full-stop to the whole comment if one is not present already. -m4_define([_LT_FORMAT_COMMENT], -[m4_ifval([$1], [ -m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], - [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) -)]) - - - - - -# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) -# ------------------------------------------------------------------- -# CONFIGNAME is the name given to the value in the libtool script. -# VARNAME is the (base) name used in the configure script. -# VALUE may be 0, 1 or 2 for a computed quote escaped value based on -# VARNAME. Any other value will be used directly. -m4_define([_LT_DECL], -[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], - [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], - [m4_ifval([$1], [$1], [$2])]) - lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) - m4_ifval([$4], - [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) - lt_dict_add_subkey([lt_decl_dict], [$2], - [tagged?], [m4_ifval([$5], [yes], [no])])]) -]) - - -# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) -# -------------------------------------------------------- -m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) - - -# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_tag_varnames], -[_lt_decl_filter([tagged?], [yes], $@)]) - - -# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) -# --------------------------------------------------------- -m4_define([_lt_decl_filter], -[m4_case([$#], - [0], [m4_fatal([$0: too few arguments: $#])], - [1], [m4_fatal([$0: too few arguments: $#: $1])], - [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], - [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], - [lt_dict_filter([lt_decl_dict], $@)])[]dnl -]) - - -# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) -# -------------------------------------------------- -m4_define([lt_decl_quote_varnames], -[_lt_decl_filter([value], [1], $@)]) - - -# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_dquote_varnames], -[_lt_decl_filter([value], [2], $@)]) - - -# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_varnames_tagged], -[m4_assert([$# <= 2])dnl -_$0(m4_quote(m4_default([$1], [[, ]])), - m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), - m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) -m4_define([_lt_decl_varnames_tagged], -[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) - - -# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_all_varnames], -[_$0(m4_quote(m4_default([$1], [[, ]])), - m4_if([$2], [], - m4_quote(lt_decl_varnames), - m4_quote(m4_shift($@))))[]dnl -]) -m4_define([_lt_decl_all_varnames], -[lt_join($@, lt_decl_varnames_tagged([$1], - lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl -]) - - -# _LT_CONFIG_STATUS_DECLARE([VARNAME]) -# ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME -# must have a single quote delimited value for this to work. -m4_define([_LT_CONFIG_STATUS_DECLARE], -[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) - - -# _LT_CONFIG_STATUS_DECLARATIONS -# ------------------------------ -# We delimit libtool config variables with single quotes, so when -# we write them to config.status, we have to be sure to quote all -# embedded single quotes properly. In configure, this macro expands -# each variable declared with _LT_DECL (and _LT_TAGDECL) into: -# -# <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`' -m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], -[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), - [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAGS -# ---------------- -# Output comment and list of tags supported by the script -m4_defun([_LT_LIBTOOL_TAGS], -[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl -]) - - -# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) -# ----------------------------------- -# Extract the dictionary values for VARNAME (optionally with TAG) and -# expand to a commented shell variable setting: -# -# # Some comment about what VAR is for. -# visible_name=$lt_internal_name -m4_define([_LT_LIBTOOL_DECLARE], -[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], - [description])))[]dnl -m4_pushdef([_libtool_name], - m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl -m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), - [0], [_libtool_name=[$]$1], - [1], [_libtool_name=$lt_[]$1], - [2], [_libtool_name=$lt_[]$1], - [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl -m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl -]) - - -# _LT_LIBTOOL_CONFIG_VARS -# ----------------------- -# Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' -# script. Tagged libtool config variables (even for the LIBTOOL CONFIG -# section) are produced by _LT_LIBTOOL_TAG_VARS. -m4_defun([_LT_LIBTOOL_CONFIG_VARS], -[m4_foreach([_lt_var], - m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAG_VARS(TAG) -# ------------------------- -m4_define([_LT_LIBTOOL_TAG_VARS], -[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) - - -# _LT_TAGVAR(VARNAME, [TAGNAME]) -# ------------------------------ -m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) - - -# _LT_CONFIG_COMMANDS -# ------------------- -# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of -# variables for single and double quote escaping we saved from calls -# to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated -# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. -m4_defun([_LT_CONFIG_COMMANDS], -[AC_PROVIDE_IFELSE([LT_OUTPUT], - dnl If the libtool generation code has been placed in $CONFIG_LT, - dnl instead of duplicating it all over again into config.status, - dnl then we will have config.status run $CONFIG_LT later, so it - dnl needs to know what name is stored there: - [AC_CONFIG_COMMANDS([libtool], - [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], - dnl If the libtool generation code is destined for config.status, - dnl expand the accumulated commands and init code now: - [AC_CONFIG_COMMANDS([libtool], - [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) -])#_LT_CONFIG_COMMANDS - - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], -[ - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -_LT_CONFIG_STATUS_DECLARATIONS -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$[]1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_quote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_dquote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -_LT_OUTPUT_LIBTOOL_INIT -]) - -# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) -# ------------------------------------ -# Generate a child script FILE with all initialization necessary to -# reuse the environment learned by the parent script, and make the -# file executable. If COMMENT is supplied, it is inserted after the -# `#!' sequence but before initialization text begins. After this -# macro, additional text can be appended to FILE to form the body of -# the child script. The macro ends with non-zero status if the -# file could not be fully written (such as if the disk is full). -m4_ifdef([AS_INIT_GENERATED], -[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], -[m4_defun([_LT_GENERATED_FILE_INIT], -[m4_require([AS_PREPARE])]dnl -[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl -[lt_write_fail=0 -cat >$1 <<_ASEOF || lt_write_fail=1 -#! $SHELL -# Generated by $as_me. -$2 -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$1 <<\_ASEOF || lt_write_fail=1 -AS_SHELL_SANITIZE -_AS_PREPARE -exec AS_MESSAGE_FD>&1 -_ASEOF -test $lt_write_fail = 0 && chmod +x $1[]dnl -m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT - -# LT_OUTPUT -# --------- -# This macro allows early generation of the libtool script (before -# AC_OUTPUT is called), incase it is used in configure for compilation -# tests. -AC_DEFUN([LT_OUTPUT], -[: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to <bug-libtool@gnu.org>." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2010 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -])# LT_OUTPUT - - -# _LT_CONFIG(TAG) -# --------------- -# If TAG is the built-in tag, create an initial libtool script with a -# default configuration from the untagged config vars. Otherwise add code -# to config.status for appending the configuration named by TAG from the -# matching tagged config vars. -m4_defun([_LT_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_CONFIG_SAVE_COMMANDS([ - m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl - m4_if(_LT_TAG, [C], [ - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -_LT_COPYING -_LT_LIBTOOL_TAGS - -# ### BEGIN LIBTOOL CONFIG -_LT_LIBTOOL_CONFIG_VARS -_LT_LIBTOOL_TAG_VARS -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - _LT_PROG_LTMAIN - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - _LT_PROG_REPLACE_SHELLFNS - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -], -[cat <<_LT_EOF >> "$ofile" - -dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded -dnl in a comment (ie after a #). -# ### BEGIN LIBTOOL TAG CONFIG: $1 -_LT_LIBTOOL_TAG_VARS(_LT_TAG) -# ### END LIBTOOL TAG CONFIG: $1 -_LT_EOF -])dnl /m4_if -], -[m4_if([$1], [], [ - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile'], []) -])dnl /_LT_CONFIG_SAVE_COMMANDS -])# _LT_CONFIG - - -# LT_SUPPORTED_TAG(TAG) -# --------------------- -# Trace this macro to discover what tags are supported by the libtool -# --tag option, using: -# autoconf --trace 'LT_SUPPORTED_TAG:$1' -AC_DEFUN([LT_SUPPORTED_TAG], []) - - -# C support is built-in for now -m4_define([_LT_LANG_C_enabled], []) -m4_define([_LT_TAGS], []) - - -# LT_LANG(LANG) -# ------------- -# Enable libtool support for the given language if not already enabled. -AC_DEFUN([LT_LANG], -[AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -])# LT_LANG - - -# _LT_LANG(LANGNAME) -# ------------------ -m4_defun([_LT_LANG], -[m4_ifdef([_LT_LANG_]$1[_enabled], [], - [LT_SUPPORTED_TAG([$1])dnl - m4_append([_LT_TAGS], [$1 ])dnl - m4_define([_LT_LANG_]$1[_enabled], [])dnl - _LT_LANG_$1_CONFIG($1)])dnl -])# _LT_LANG - - -# _LT_LANG_DEFAULT_CONFIG -# ----------------------- -m4_defun([_LT_LANG_DEFAULT_CONFIG], -[AC_PROVIDE_IFELSE([AC_PROG_CXX], - [LT_LANG(CXX)], - [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) - -AC_PROVIDE_IFELSE([AC_PROG_F77], - [LT_LANG(F77)], - [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) - -AC_PROVIDE_IFELSE([AC_PROG_FC], - [LT_LANG(FC)], - [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) - -dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal -dnl pulling things in needlessly. -AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([LT_PROG_GCJ], - [LT_LANG(GCJ)], - [m4_ifdef([AC_PROG_GCJ], - [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([A][M_PROG_GCJ], - [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([LT_PROG_GCJ], - [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) - -AC_PROVIDE_IFELSE([LT_PROG_RC], - [LT_LANG(RC)], - [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) -])# _LT_LANG_DEFAULT_CONFIG - -# Obsolete macros: -AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_CXX], []) -dnl AC_DEFUN([AC_LIBTOOL_F77], []) -dnl AC_DEFUN([AC_LIBTOOL_FC], []) -dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) -dnl AC_DEFUN([AC_LIBTOOL_RC], []) - - -# _LT_TAG_COMPILER -# ---------------- -m4_defun([_LT_TAG_COMPILER], -[AC_REQUIRE([AC_PROG_CC])dnl - -_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl -_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl -_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl -_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC -])# _LT_TAG_COMPILER - - -# _LT_COMPILER_BOILERPLATE -# ------------------------ -# Check for compiler boilerplate output or warnings with -# the simple compiler test code. -m4_defun([_LT_COMPILER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* -])# _LT_COMPILER_BOILERPLATE - - -# _LT_LINKER_BOILERPLATE -# ---------------------- -# Check for linker boilerplate output or warnings with -# the simple link test code. -m4_defun([_LT_LINKER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* -])# _LT_LINKER_BOILERPLATE - -# _LT_REQUIRED_DARWIN_CHECKS -# ------------------------- -m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ - case $host_os in - rhapsody* | darwin*) - AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) - AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) - AC_CHECK_TOOL([LIPO], [lipo], [:]) - AC_CHECK_TOOL([OTOOL], [otool], [:]) - AC_CHECK_TOOL([OTOOL64], [otool64], [:]) - _LT_DECL([], [DSYMUTIL], [1], - [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) - _LT_DECL([], [NMEDIT], [1], - [Tool to change global to local symbols on Mac OS X]) - _LT_DECL([], [LIPO], [1], - [Tool to manipulate fat objects and archives on Mac OS X]) - _LT_DECL([], [OTOOL], [1], - [ldd/readelf like tool for Mach-O binaries on Mac OS X]) - _LT_DECL([], [OTOOL64], [1], - [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) - - AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], - [lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi]) - AC_CACHE_CHECK([for -exported_symbols_list linker flag], - [lt_cv_ld_exported_symbols_list], - [lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [lt_cv_ld_exported_symbols_list=yes], - [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" - ]) - AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], - [lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD - echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD - $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - ]) - case $host_os in - rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac -]) - - -# _LT_DARWIN_LINKER_FEATURES -# -------------------------- -# Checks for linker and compiler features on darwin -m4_defun([_LT_DARWIN_LINKER_FEATURES], -[ - m4_require([_LT_REQUIRED_DARWIN_CHECKS]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_automatic, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='' - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi -],[]) - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi -]) - -# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) -# ---------------------------------- -# Links a minimal program and checks the executable -# for the system default hardcoded library path. In most cases, -# this is /usr/lib:/lib, but when the MPI compilers are used -# the location of the communication and MPI libs are included too. -# If we don't find anything, use the default library path according -# to the aix ld manual. -# Store the results from the different compilers for each TAGNAME. -# Allow to override them for all tags through lt_cv_aix_libpath. -m4_defun([_LT_SYS_MODULE_PATH_AIX], -[m4_require([_LT_DECL_SED])dnl -if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], - [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ - lt_aix_libpath_sed='[ - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }]' - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi],[]) - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" - fi - ]) - aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) -fi -])# _LT_SYS_MODULE_PATH_AIX - - -# _LT_SHELL_INIT(ARG) -# ------------------- -m4_define([_LT_SHELL_INIT], -[m4_divert_text([M4SH-INIT], [$1 -])])# _LT_SHELL_INIT - - - -# _LT_PROG_ECHO_BACKSLASH -# ----------------------- -# Find how we can fake an echo command that does not interpret backslash. -# In particular, with Autoconf 2.60 or later we add some code to the start -# of the generated configure script which will find a shell with a builtin -# printf (which we can use as an echo command). -m4_defun([_LT_PROG_ECHO_BACKSLASH], -[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -AC_MSG_CHECKING([how to print strings]) -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$[]1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -case "$ECHO" in - printf*) AC_MSG_RESULT([printf]) ;; - print*) AC_MSG_RESULT([print -r]) ;; - *) AC_MSG_RESULT([cat]) ;; -esac - -m4_ifdef([_AS_DETECT_SUGGESTED], -[_AS_DETECT_SUGGESTED([ - test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test "X`printf %s $ECHO`" = "X$ECHO" \ - || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) - -_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) -_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) -])# _LT_PROG_ECHO_BACKSLASH - - -# _LT_WITH_SYSROOT -# ---------------- -AC_DEFUN([_LT_WITH_SYSROOT], -[AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([${with_sysroot}]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) - -# _LT_ENABLE_LOCK -# --------------- -m4_defun([_LT_ENABLE_LOCK], -[AC_ARG_ENABLE([libtool-lock], - [AS_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_LANG_PUSH(C) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) - AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -sparc*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" -])# _LT_ENABLE_LOCK - - -# _LT_PROG_AR -# ----------- -m4_defun([_LT_PROG_AR], -[AC_CHECK_TOOLS(AR, [ar], false) -: ${AR=ar} -: ${AR_FLAGS=cru} -_LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) - -AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], - [lt_cv_ar_at_file=no - AC_COMPILE_IFELSE([AC_LANG_PROGRAM], - [echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - ]) - ]) - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi -_LT_DECL([], [archiver_list_spec], [1], - [How to feed a file listing to the archiver]) -])# _LT_PROG_AR - - -# _LT_CMD_OLD_ARCHIVE -# ------------------- -m4_defun([_LT_CMD_OLD_ARCHIVE], -[_LT_PROG_AR - -AC_CHECK_TOOL(STRIP, strip, :) -test -z "$STRIP" && STRIP=: -_LT_DECL([], [STRIP], [1], [A symbol stripping program]) - -AC_CHECK_TOOL(RANLIB, ranlib, :) -test -z "$RANLIB" && RANLIB=: -_LT_DECL([], [RANLIB], [1], - [Commands used to install an old-style archive]) - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac -_LT_DECL([], [old_postinstall_cmds], [2]) -_LT_DECL([], [old_postuninstall_cmds], [2]) -_LT_TAGDECL([], [old_archive_cmds], [2], - [Commands used to build an old-style archive]) -_LT_DECL([], [lock_old_archive_extraction], [0], - [Whether to use a lock for old archive extraction]) -])# _LT_CMD_OLD_ARCHIVE - - -# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------------------- -# Check whether the given compiler option works -AC_DEFUN([_LT_COMPILER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - fi - $RM conftest* -]) - -if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) -else - m4_if([$6], , :, [$6]) -fi -])# _LT_COMPILER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) - - -# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------- -# Check whether the given linker option works -AC_DEFUN([_LT_LINKER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl -AC_CACHE_CHECK([$1], [$2], - [$2=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $3" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - $2=yes - fi - else - $2=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" -]) - -if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) -else - m4_if([$5], , :, [$5]) -fi -])# _LT_LINKER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) - - -# LT_CMD_MAX_LEN -#--------------- -AC_DEFUN([LT_CMD_MAX_LEN], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments -AC_MSG_CHECKING([the maximum length of command line arguments]) -AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac -]) -if test -n $lt_cv_sys_max_cmd_len ; then - AC_MSG_RESULT($lt_cv_sys_max_cmd_len) -else - AC_MSG_RESULT(none) -fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -])# LT_CMD_MAX_LEN - -# Old name: -AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) - - -# _LT_HEADER_DLFCN -# ---------------- -m4_defun([_LT_HEADER_DLFCN], -[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl -])# _LT_HEADER_DLFCN - - -# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ---------------------------------------------------------------- -m4_defun([_LT_TRY_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test "$cross_compiling" = yes; then : - [$4] -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -[#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -}] -_LT_EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) $1 ;; - x$lt_dlneed_uscore) $2 ;; - x$lt_dlunknown|x*) $3 ;; - esac - else : - # compilation failed - $3 - fi -fi -rm -fr conftest* -])# _LT_TRY_DLOPEN_SELF - - -# LT_SYS_DLOPEN_SELF -# ------------------ -AC_DEFUN([LT_SYS_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ]) - ;; - - *) - AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], - [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], - [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], - [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], - [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], - [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) - ]) - ]) - ]) - ]) - ]) - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - AC_CACHE_CHECK([whether a program can dlopen itself], - lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, - lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) - ]) - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( - lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, - lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) - ]) - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -])# LT_SYS_DLOPEN_SELF - -# Old name: -AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) - - -# _LT_COMPILER_C_O([TAGNAME]) -# --------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler. -# This macro does not hard code the compiler like AC_PROG_CC_C_O. -m4_defun([_LT_COMPILER_C_O], -[m4_require([_LT_DECL_SED])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - fi - fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* -]) -_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], - [Does compiler simultaneously support -c and -o options?]) -])# _LT_COMPILER_C_O - - -# _LT_COMPILER_FILE_LOCKS([TAGNAME]) -# ---------------------------------- -# Check to see if we can do hard links to lock some files if needed -m4_defun([_LT_COMPILER_FILE_LOCKS], -[m4_require([_LT_ENABLE_LOCK])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_COMPILER_C_O([$1]) - -hard_links="nottested" -if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - AC_MSG_CHECKING([if we can lock with hard links]) - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) - need_locks=warn - fi -else - need_locks=no -fi -_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) -])# _LT_COMPILER_FILE_LOCKS - - -# _LT_CHECK_OBJDIR -# ---------------- -m4_defun([_LT_CHECK_OBJDIR], -[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], -[rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null]) -objdir=$lt_cv_objdir -_LT_DECL([], [objdir], [0], - [The name of the directory that contains temporary libtool files])dnl -m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) -])# _LT_CHECK_OBJDIR - - -# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) -# -------------------------------------- -# Check hardcoding attributes. -m4_defun([_LT_LINKER_HARDCODE_LIBPATH], -[AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || - test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then - # Linking always hardcodes the temporary library directory. - _LT_TAGVAR(hardcode_action, $1)=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_TAGVAR(hardcode_action, $1)=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - _LT_TAGVAR(hardcode_action, $1)=unsupported -fi -AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) - -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi -_LT_TAGDECL([], [hardcode_action], [0], - [How to hardcode a shared library path into an executable]) -])# _LT_LINKER_HARDCODE_LIBPATH - - -# _LT_CMD_STRIPLIB -# ---------------- -m4_defun([_LT_CMD_STRIPLIB], -[m4_require([_LT_DECL_EGREP]) -striplib= -old_striplib= -AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - AC_MSG_RESULT([yes]) -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) - ;; - esac -fi -_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) -_LT_DECL([], [striplib], [1]) -])# _LT_CMD_STRIPLIB - - -# _LT_SYS_DYNAMIC_LINKER([TAG]) -# ----------------------------- -# PORTME Fill in your ld.so characteristics -m4_defun([_LT_SYS_DYNAMIC_LINKER], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_OBJDUMP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -AC_MSG_CHECKING([dynamic linker characteristics]) -m4_if([$1], - [], [ -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[[lt_foo]]++; } - if (lt_freq[[lt_foo]] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi]) -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[[4-9]]*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[[01]] | aix4.[[01]].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib<name>.so - # instead of lib<name>.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[[45]]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[[123]]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[[01]]* | freebsdelf3.[[01]]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ - freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[[3-9]]*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], - [lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ - LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], - [lt_cv_shlibpath_overrides_runpath=yes])]) - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - ]) - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - -_LT_DECL([], [variables_saved_for_relink], [1], - [Variables whose values should be saved in libtool wrapper scripts and - restored at link time]) -_LT_DECL([], [need_lib_prefix], [0], - [Do we need the "lib" prefix for modules?]) -_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) -_LT_DECL([], [version_type], [0], [Library versioning type]) -_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) -_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) -_LT_DECL([], [shlibpath_overrides_runpath], [0], - [Is shlibpath searched before the hard-coded library search path?]) -_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) -_LT_DECL([], [library_names_spec], [1], - [[List of archive names. First name is the real one, the rest are links. - The last name is the one that the linker finds with -lNAME]]) -_LT_DECL([], [soname_spec], [1], - [[The coded name of the library, if different from the real name]]) -_LT_DECL([], [install_override_mode], [1], - [Permission mode override for installation of shared libraries]) -_LT_DECL([], [postinstall_cmds], [2], - [Command to use after installation of a shared archive]) -_LT_DECL([], [postuninstall_cmds], [2], - [Command to use after uninstallation of a shared archive]) -_LT_DECL([], [finish_cmds], [2], - [Commands used to finish a libtool library installation in a directory]) -_LT_DECL([], [finish_eval], [1], - [[As "finish_cmds", except a single script fragment to be evaled but - not shown]]) -_LT_DECL([], [hardcode_into_libs], [0], - [Whether we should hardcode library paths into libraries]) -_LT_DECL([], [sys_lib_search_path_spec], [2], - [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) -])# _LT_SYS_DYNAMIC_LINKER - - -# _LT_PATH_TOOL_PREFIX(TOOL) -# -------------------------- -# find a file program which can recognize shared library -AC_DEFUN([_LT_PATH_TOOL_PREFIX], -[m4_require([_LT_DECL_EGREP])dnl -AC_MSG_CHECKING([for $1]) -AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, -[case $MAGIC_CMD in -[[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -dnl $ac_dummy forces splitting on constant user-supplied paths. -dnl POSIX.2 word splitting is done only on the output of word expansions, -dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - AC_MSG_RESULT($MAGIC_CMD) -else - AC_MSG_RESULT(no) -fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -])# _LT_PATH_TOOL_PREFIX - -# Old name: -AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) - - -# _LT_PATH_MAGIC -# -------------- -# find a file program which can recognize a shared library -m4_defun([_LT_PATH_MAGIC], -[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) - else - MAGIC_CMD=: - fi -fi -])# _LT_PATH_MAGIC - - -# LT_PATH_LD -# ---------- -# find the pathname to the GNU or non-GNU linker -AC_DEFUN([LT_PATH_LD], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], - [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by $CC]) - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [[\\/]]* | ?:[[\\/]]*) - re_direlt='/[[^/]][[^/]]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(lt_cv_path_LD, -[if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in - *GNU* | *'with BFD'*) - test "$with_gnu_ld" != no && break - ;; - *) - test "$with_gnu_ld" != yes && break - ;; - esac - fi - done - IFS="$lt_save_ifs" -else - lt_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$lt_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -_LT_PATH_LD_GNU -AC_SUBST([LD]) - -_LT_TAGDECL([], [LD], [1], [The linker used to build libraries]) -])# LT_PATH_LD - -# Old names: -AU_ALIAS([AM_PROG_LD], [LT_PATH_LD]) -AU_ALIAS([AC_PROG_LD], [LT_PATH_LD]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_LD], []) -dnl AC_DEFUN([AC_PROG_LD], []) - - -# _LT_PATH_LD_GNU -#- -------------- -m4_defun([_LT_PATH_LD_GNU], -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 </dev/null` in -*GNU* | *'with BFD'*) - lt_cv_prog_gnu_ld=yes - ;; -*) - lt_cv_prog_gnu_ld=no - ;; -esac]) -with_gnu_ld=$lt_cv_prog_gnu_ld -])# _LT_PATH_LD_GNU - - -# _LT_CMD_RELOAD -# -------------- -# find reload flag for linker -# -- PORTME Some linkers may need a different reload flag. -m4_defun([_LT_CMD_RELOAD], -[AC_CACHE_CHECK([for $LD option to reload object files], - lt_cv_ld_reload_flag, - [lt_cv_ld_reload_flag='-r']) -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac -_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl -_LT_TAGDECL([], [reload_cmds], [2])dnl -])# _LT_CMD_RELOAD - - -# _LT_CHECK_MAGIC_METHOD -# ---------------------- -# how to check for library dependencies -# -- PORTME fill in with the dynamic library characteristics -m4_defun([_LT_CHECK_MAGIC_METHOD], -[m4_require([_LT_DECL_EGREP]) -m4_require([_LT_DECL_OBJDUMP]) -AC_CACHE_CHECK([how to recognize dependent libraries], -lt_cv_deplibs_check_method, -[lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[[4-9]]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[[45]]*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[[3-9]]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac -]) - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - -_LT_DECL([], [deplibs_check_method], [1], - [Method to check whether dependent libraries are shared objects]) -_LT_DECL([], [file_magic_cmd], [1], - [Command to use when deplibs_check_method = "file_magic"]) -_LT_DECL([], [file_magic_glob], [1], - [How to find potential files when deplibs_check_method = "file_magic"]) -_LT_DECL([], [want_nocaseglob], [1], - [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) -])# _LT_CHECK_MAGIC_METHOD - - -# LT_PATH_NM -# ---------- -# find the pathname to a BSD- or MS-compatible name lister -AC_DEFUN([LT_PATH_NM], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -])# LT_PATH_NM - -# Old names: -AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) -AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_NM], []) -dnl AC_DEFUN([AC_PROG_NM], []) - -# _LT_CHECK_SHAREDLIB_FROM_LINKLIB -# -------------------------------- -# how to determine the name of the shared library -# associated with a specific link library. -# -- PORTME fill in with the dynamic library characteristics -m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], -[m4_require([_LT_DECL_EGREP]) -m4_require([_LT_DECL_OBJDUMP]) -m4_require([_LT_DECL_DLLTOOL]) -AC_CACHE_CHECK([how to associate runtime and link libraries], -lt_cv_sharedlib_from_linklib_cmd, -[lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac -]) -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - -_LT_DECL([], [sharedlib_from_linklib_cmd], [1], - [Command to associate shared and link libraries]) -])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB - - -# _LT_PATH_MANIFEST_TOOL -# ---------------------- -# locate the manifest tool -m4_defun([_LT_PATH_MANIFEST_TOOL], -[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], - [lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&AS_MESSAGE_LOG_FD - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest*]) -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi -_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl -])# _LT_PATH_MANIFEST_TOOL - - -# LT_LIB_M -# -------- -# check for math library -AC_DEFUN([LT_LIB_M], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) - # These system don't have libm, or don't need it - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, cos, LIBM="-lm") - ;; -esac -AC_SUBST([LIBM]) -])# LT_LIB_M - -# Old name: -AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_CHECK_LIBM], []) - - -# _LT_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------- -m4_defun([_LT_COMPILER_NO_RTTI], -[m4_require([_LT_TAG_COMPILER])dnl - -_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; - *) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; - esac - - _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], - lt_cv_prog_compiler_rtti_exceptions, - [-fno-rtti -fno-exceptions], [], - [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -fi -_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], - [Compiler flag to turn off builtin functions]) -])# _LT_COMPILER_NO_RTTI - - -# _LT_CMD_GLOBAL_SYMBOLS -# ---------------------- -m4_defun([_LT_CMD_GLOBAL_SYMBOLS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([LT_PATH_NM])dnl -AC_REQUIRE([LT_PATH_LD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_TAG_COMPILER])dnl - -# Check for command to grab the raw symbol name followed by C symbol from nm. -AC_MSG_CHECKING([command to parse $NM output from $compiler object]) -AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], -[ -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[[BCDEGRST]]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[[BCDT]]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[[ABCDGISTW]]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[[ABCDEGRST]]' - fi - ;; -irix* | nonstopux*) - symcode='[[BCDEGRST]]' - ;; -osf*) - symcode='[[BCDEGQRST]]' - ;; -solaris*) - symcode='[[BDRT]]' - ;; -sco3.2v5*) - symcode='[[DT]]' - ;; -sysv4.2uw2*) - symcode='[[DT]]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[[ABDT]]' - ;; -sysv4) - symcode='[[DFNSTU]]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[[ABCDGIRSTW]]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK ['"\ -" {last_section=section; section=\$ 3};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx]" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if AC_TRY_EVAL(ac_compile); then - # Now try to grab the symbols. - nlist=conftest.nm - if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[[]] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD - fi - else - echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done -]) -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - AC_MSG_RESULT(failed) -else - AC_MSG_RESULT(ok) -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - -_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], - [Take the output of nm and produce a listing of raw symbols and C names]) -_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], - [Transform the output of nm in a proper C declaration]) -_LT_DECL([global_symbol_to_c_name_address], - [lt_cv_sys_global_symbol_to_c_name_address], [1], - [Transform the output of nm in a C name address pair]) -_LT_DECL([global_symbol_to_c_name_address_lib_prefix], - [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], - [Transform the output of nm in a C name address pair when lib prefix is needed]) -_LT_DECL([], [nm_file_list_spec], [1], - [Specify filename containing input files for $NM]) -]) # _LT_CMD_GLOBAL_SYMBOLS - - -# _LT_COMPILER_PIC([TAGNAME]) -# --------------------------- -m4_defun([_LT_COMPILER_PIC], -[m4_require([_LT_TAG_COMPILER])dnl -_LT_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_TAGVAR(lt_prog_compiler_static, $1)= - -m4_if([$1], [CXX], [ - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - else - case $host_os in - aix[[4-9]]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - dgux*) - case $cc_basename in - ec++*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - fi - ;; - aCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - cxx*) - # Digital/Compaq C++ - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - lcc*) - # Lucid - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -], -[ - if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - ;; - - interix[[3-9]]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic - fi - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - hpux9* | hpux10* | hpux11*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # PIC (with -KPIC) is the default. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' - _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' - ;; - nagfor*) - # NAG Fortran compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - ccc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All Alpha code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ F* | *Sun*Fortran*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='' - ;; - *Sun\ C*) - # Sun C 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - ;; - esac - ;; - esac - ;; - - newsos6) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - # All OSF/1 code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - rdos*) - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - - solaris*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; - *) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; - esac - ;; - - sunos4*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - unicos*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - - uts4*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no - ;; - esac - fi -]) -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" - ;; -esac - -AC_CACHE_CHECK([for $compiler option to produce PIC], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) -_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], - [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], - [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in - "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; - esac], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -fi -_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], - [Additional compiler flags for building library objects]) - -_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], - [How to pass a linker flag through the compiler]) -# -# Check to make sure the static flag actually works. -# -wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" -_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), - $lt_tmp_static_flag, - [], - [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) -_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], - [Compiler flag to prevent dynamic linking]) -])# _LT_COMPILER_PIC - - -# _LT_LINKER_SHLIBS([TAGNAME]) -# ---------------------------- -# See if the linker supports building shared libraries. -m4_defun([_LT_LINKER_SHLIBS], -[AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_TAG_COMPILER])dnl -AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -m4_if([$1], [CXX], [ - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - case $host_os in - aix[[4-9]]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -], [ - runpath_var= - _LT_TAGVAR(allow_undefined_flag, $1)= - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(archive_cmds, $1)= - _LT_TAGVAR(archive_expsym_cmds, $1)= - _LT_TAGVAR(compiler_needs_object, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(hardcode_automatic, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= - _LT_TAGVAR(hardcode_libdir_separator, $1)= - _LT_TAGVAR(hardcode_minus_L, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(inherit_rpath, $1)=no - _LT_TAGVAR(link_all_deplibs, $1)=unknown - _LT_TAGVAR(module_cmds, $1)= - _LT_TAGVAR(module_expsym_cmds, $1)= - _LT_TAGVAR(old_archive_from_new_cmds, $1)= - _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_TAGVAR(thread_safe_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - _LT_TAGVAR(include_expsyms, $1)= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. -dnl Note also adjust exclude_expsyms for C++ above. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; - esac - - _LT_TAGVAR(ld_shlibs, $1)=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; - *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[[3-9]]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - _LT_TAGVAR(whole_archive_flag_spec, $1)= - tmp_sharedflag='--shared' ;; - xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' - _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - sunos4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then - runpath_var= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - _LT_TAGVAR(hardcode_direct, $1)=unsupported - fi - ;; - - aix[[4-9]]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - _LT_TAGVAR(link_all_deplibs, $1)=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - ;; - - bsdi[[45]]*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - esac - ;; - - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - freebsd1*) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - hpux9*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - m4_if($1, [], [ - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - _LT_LINKER_OPTION([if $CC understands -b], - _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], - [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) - ;; - esac - fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], - [lt_cv_irix_exported_symbol], - [save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - AC_LINK_IFELSE( - [AC_LANG_SOURCE( - [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], - [C++], [[int foo (void) { return 0; }]], - [Fortran 77], [[ - subroutine foo - end]], - [Fortran], [[ - subroutine foo - end]])])], - [lt_cv_irix_exported_symbol=yes], - [lt_cv_irix_exported_symbol=no]) - LDFLAGS="$save_LDFLAGS"]) - if test "$lt_cv_irix_exported_symbol" = yes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - newsos6) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac - fi - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - os2*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - ;; - - solaris*) - _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - fi - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4) - case $host_vendor in - sni) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_TAGVAR(hardcode_direct, $1)=no - ;; - motorola) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - sysv4.3*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - _LT_TAGVAR(ld_shlibs, $1)=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *) - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' - ;; - esac - fi - fi -]) -AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld - -_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl -_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl -_LT_DECL([], [extract_expsyms_cmds], [2], - [The commands to extract the exported symbol list from a shared archive]) - -# -# Do we need to explicitly link libc? -# -case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in -x|xyes) - # Assume -lc should be added - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_TAGVAR(archive_cmds, $1) in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - AC_CACHE_CHECK([whether -lc should be explicitly linked in], - [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), - [$RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) - _LT_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) - then - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no - else - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - ]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) - ;; - esac - fi - ;; -esac - -_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], - [Whether or not to add -lc for building shared libraries]) -_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], - [enable_shared_with_static_runtimes], [0], - [Whether or not to disallow shared libs when runtime libs are static]) -_LT_TAGDECL([], [export_dynamic_flag_spec], [1], - [Compiler flag to allow reflexive dlopens]) -_LT_TAGDECL([], [whole_archive_flag_spec], [1], - [Compiler flag to generate shared objects directly from archives]) -_LT_TAGDECL([], [compiler_needs_object], [1], - [Whether the compiler copes with passing no objects directly]) -_LT_TAGDECL([], [old_archive_from_new_cmds], [2], - [Create an old-style archive from a shared archive]) -_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], - [Create a temporary old-style archive to link instead of a shared archive]) -_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) -_LT_TAGDECL([], [archive_expsym_cmds], [2]) -_LT_TAGDECL([], [module_cmds], [2], - [Commands used to build a loadable module if different from building - a shared archive.]) -_LT_TAGDECL([], [module_expsym_cmds], [2]) -_LT_TAGDECL([], [with_gnu_ld], [1], - [Whether we are building with GNU ld or not]) -_LT_TAGDECL([], [allow_undefined_flag], [1], - [Flag that allows shared libraries with undefined symbols to be built]) -_LT_TAGDECL([], [no_undefined_flag], [1], - [Flag that enforces no undefined symbols]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], - [Flag to hardcode $libdir into a binary during linking. - This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], - [[If ld is used when linking, flag to hardcode $libdir into a binary - during linking. This must work even if $libdir does not exist]]) -_LT_TAGDECL([], [hardcode_libdir_separator], [1], - [Whether we need a single "-rpath" flag with a separated argument]) -_LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary]) -_LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the - library is relocated]) -_LT_TAGDECL([], [hardcode_minus_L], [0], - [Set to "yes" if using the -LDIR flag during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_shlibpath_var], [0], - [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_automatic], [0], - [Set to "yes" if building a shared library automatically hardcodes DIR - into the library and all subsequent libraries and executables linked - against it]) -_LT_TAGDECL([], [inherit_rpath], [0], - [Set to yes if linker adds runtime paths of dependent libraries - to runtime path list]) -_LT_TAGDECL([], [link_all_deplibs], [0], - [Whether libtool must link a program against all its dependency libraries]) -_LT_TAGDECL([], [always_export_symbols], [0], - [Set to "yes" if exported symbols are required]) -_LT_TAGDECL([], [export_symbols_cmds], [2], - [The commands to list exported symbols]) -_LT_TAGDECL([], [exclude_expsyms], [1], - [Symbols that should not be listed in the preloaded symbols]) -_LT_TAGDECL([], [include_expsyms], [1], - [Symbols that must always be exported]) -_LT_TAGDECL([], [prelink_cmds], [2], - [Commands necessary for linking programs (against libraries) with templates]) -_LT_TAGDECL([], [postlink_cmds], [2], - [Commands necessary for finishing linking programs]) -_LT_TAGDECL([], [file_list_spec], [1], - [Specify filename containing input files]) -dnl FIXME: Not yet implemented -dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], -dnl [Compiler flag to generate thread safe objects]) -])# _LT_LINKER_SHLIBS - - -# _LT_LANG_C_CONFIG([TAG]) -# ------------------------ -# Ensure that the configuration variables for a C compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_C_CONFIG], -[m4_require([_LT_DECL_EGREP])dnl -lt_save_CC="$CC" -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - -_LT_TAG_COMPILER -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - LT_SYS_DLOPEN_SELF - _LT_CMD_STRIPLIB - - # Report which library types will actually be built - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_CONFIG($1) -fi -AC_LANG_POP -CC="$lt_save_CC" -])# _LT_LANG_C_CONFIG - - -# _LT_LANG_CXX_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a C++ compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_CXX_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -else - _lt_caught_CXX_error=yes -fi - -AC_LANG_PUSH(C++) -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(compiler_needs_object, $1)=no -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - else - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - LT_PATH_LD - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) - _LT_TAGVAR(ld_shlibs, $1)=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aix[[4-9]]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - freebsd[[12]]*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - freebsd-elf*) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - gnu*) - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) - _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - case $host in - osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - ;; - *) - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(archive_cmds_need_lc,$1)=yes - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ - '"$_LT_TAGVAR(old_archive_cmds, $1)" - _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ - '"$_LT_TAGVAR(reload_cmds, $1)" - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - - AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -AC_LANG_POP -])# _LT_LANG_CXX_CONFIG - - -# _LT_FUNC_STRIPNAME_CNF -# ---------------------- -# func_stripname_cnf prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# -# This function is identical to the (non-XSI) version of func_stripname, -# except this one can be used by m4 code that may be executed by configure, -# rather than the libtool script. -m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl -AC_REQUIRE([_LT_DECL_SED]) -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf -])# _LT_FUNC_STRIPNAME_CNF - -# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) -# --------------------------------- -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -m4_defun([_LT_SYS_HIDDEN_LIBDEPS], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl -# Dependencies to place before and after the object being linked: -_LT_TAGVAR(predep_objects, $1)= -_LT_TAGVAR(postdep_objects, $1)= -_LT_TAGVAR(predeps, $1)= -_LT_TAGVAR(postdeps, $1)= -_LT_TAGVAR(compiler_lib_search_path, $1)= - -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF -int a; -void foo (void) { a = 0; } -_LT_EOF -], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF -], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer*4 a - a=0 - return - end -_LT_EOF -], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer a - a=0 - return - end -_LT_EOF -], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF -public class foo { - private int a; - public void bar (void) { - a = 0; - } -}; -_LT_EOF -]) - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -esac - -dnl Parse the compiler output and extract the necessary -dnl objects, libraries and library flags. -if AC_TRY_EVAL(ac_compile); then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" - else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" - else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" - else - _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" - fi - else - if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" - else - _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling $1 test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -m4_if([$1], [CXX], -[case $host_os in -interix[[3-9]]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - _LT_TAGVAR(predep_objects,$1)= - _LT_TAGVAR(postdep_objects,$1)= - _LT_TAGVAR(postdeps,$1)= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac -]) - -case " $_LT_TAGVAR(postdeps, $1) " in -*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; -esac - _LT_TAGVAR(compiler_lib_search_dirs, $1)= -if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi -_LT_TAGDECL([], [compiler_lib_search_dirs], [1], - [The directories searched by this compiler when creating a shared library]) -_LT_TAGDECL([], [predep_objects], [1], - [Dependencies to place before and after the objects being linked to - create a shared library]) -_LT_TAGDECL([], [postdep_objects], [1]) -_LT_TAGDECL([], [predeps], [1]) -_LT_TAGDECL([], [postdeps], [1]) -_LT_TAGDECL([], [compiler_lib_search_path], [1], - [The library search path used internally by the compiler when linking - a shared library]) -])# _LT_SYS_HIDDEN_LIBDEPS - - -# _LT_LANG_F77_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a Fortran 77 compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_F77_CONFIG], -[AC_LANG_PUSH(Fortran 77) -if test -z "$F77" || test "X$F77" = "Xno"; then - _lt_disable_F77=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the F77 compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${F77-"f77"} - CFLAGS=$FFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - GCC=$G77 - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$G77" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC="$lt_save_CC" - CFLAGS="$lt_save_CFLAGS" -fi # test "$_lt_disable_F77" != yes - -AC_LANG_POP -])# _LT_LANG_F77_CONFIG - - -# _LT_LANG_FC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for a Fortran compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_FC_CONFIG], -[AC_LANG_PUSH(Fortran) - -if test -z "$FC" || test "X$FC" = "Xno"; then - _lt_disable_FC=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for fc test sources. -ac_ext=${ac_fc_srcext-f} - -# Object file extension for compiled fc test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the FC compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${FC-"f95"} - CFLAGS=$FCFLAGS - compiler=$CC - GCC=$ac_cv_fc_compiler_gnu - - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS -fi # test "$_lt_disable_FC" != yes - -AC_LANG_POP -])# _LT_LANG_FC_CONFIG - - -# _LT_LANG_GCJ_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Java Compiler compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GCJ_CONFIG], -[AC_REQUIRE([LT_PROG_GCJ])dnl -AC_LANG_SAVE - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GCJ-"gcj"} -CFLAGS=$GCJFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GCJ_CONFIG - - -# _LT_LANG_RC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for the Windows resource compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_RC_CONFIG], -[AC_REQUIRE([LT_PROG_RC])dnl -AC_LANG_SAVE - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' - -# Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC= -CC=${RC-"windres"} -CFLAGS= -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) -_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - -if test -n "$compiler"; then - : - _LT_CONFIG($1) -fi - -GCC=$lt_save_GCC -AC_LANG_RESTORE -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_RC_CONFIG - - -# LT_PROG_GCJ -# ----------- -AC_DEFUN([LT_PROG_GCJ], -[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_GCJ], []) - - -# LT_PROG_RC -# ---------- -AC_DEFUN([LT_PROG_RC], -[AC_CHECK_TOOL(RC, windres,) -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_RC], []) - - -# _LT_DECL_EGREP -# -------------- -# If we don't have a new enough Autoconf to choose the best grep -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_EGREP], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_REQUIRE([AC_PROG_FGREP])dnl -test -z "$GREP" && GREP=grep -_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) -_LT_DECL([], [EGREP], [1], [An ERE matcher]) -_LT_DECL([], [FGREP], [1], [A literal string matcher]) -dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too -AC_SUBST([GREP]) -]) - - -# _LT_DECL_OBJDUMP -# -------------- -# If we don't have a new enough Autoconf to choose the best objdump -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_OBJDUMP], -[AC_CHECK_TOOL(OBJDUMP, objdump, false) -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) -AC_SUBST([OBJDUMP]) -]) - -# _LT_DECL_DLLTOOL -# ---------------- -# Ensure DLLTOOL variable is set. -m4_defun([_LT_DECL_DLLTOOL], -[AC_CHECK_TOOL(DLLTOOL, dlltool, false) -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) -AC_SUBST([DLLTOOL]) -]) - -# _LT_DECL_SED -# ------------ -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -m4_defun([_LT_DECL_SED], -[AC_PROG_SED -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" -_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) -_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], - [Sed that helps us avoid accidentally triggering echo(1) options like -n]) -])# _LT_DECL_SED - -m4_ifndef([AC_PROG_SED], [ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_SED. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # - -m4_defun([AC_PROG_SED], -[AC_MSG_CHECKING([for a sed that does not truncate output]) -AC_CACHE_VAL(lt_cv_path_SED, -[# Loop through the user's path and test for sed and gsed. -# Then use that list of sed's as ones to test for truncation. -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for lt_ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then - lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" - fi - done - done -done -IFS=$as_save_IFS -lt_ac_max=0 -lt_ac_count=0 -# Add /usr/xpg4/bin/sed as it is typically found on Solaris -# along with /bin/sed that truncates output. -for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue - cat /dev/null > conftest.in - lt_ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >conftest.in - # Check for GNU sed and select it if it is found. - if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then - lt_cv_path_SED=$lt_ac_sed - break - fi - while true; do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo >>conftest.nl - $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break - cmp -s conftest.out conftest.nl || break - # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break - lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then - lt_ac_max=$lt_ac_count - lt_cv_path_SED=$lt_ac_sed - fi - done -done -]) -SED=$lt_cv_path_SED -AC_SUBST([SED]) -AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_SED], []) - - -# _LT_CHECK_SHELL_FEATURES -# ------------------------ -# Find out whether the shell is Bourne or XSI compatible, -# or has some other useful features. -m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi -_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac -_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl -_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl -])# _LT_CHECK_SHELL_FEATURES - - -# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) -# ------------------------------------------------------ -# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and -# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. -m4_defun([_LT_PROG_FUNCTION_REPLACE], -[dnl { -sed -e '/^$1 ()$/,/^} # $1 /c\ -$1 ()\ -{\ -m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) -} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: -]) - - -# _LT_PROG_REPLACE_SHELLFNS -# ------------------------- -# Replace existing portable implementations of several shell functions with -# equivalent extended shell implementations where those features are available.. -m4_defun([_LT_PROG_REPLACE_SHELLFNS], -[if test x"$xsi_shell" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl - func_split_long_opt_name=${1%%=*} - func_split_long_opt_arg=${1#*=}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) - - _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) - - _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) - - _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) -fi - -if test x"$lt_shell_append" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) - - _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl - func_quote_for_eval "${2}" -dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ - eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) -fi -]) - -# _LT_PATH_CONVERSION_FUNCTIONS -# ----------------------------- -# Determine which file name conversion functions should be used by -# func_to_host_file (and, implicitly, by func_to_host_path). These are needed -# for certain cross-compile configurations and native mingw. -m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_MSG_CHECKING([how to convert $build file names to $host format]) -AC_CACHE_VAL(lt_cv_to_host_file_cmd, -[case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac -]) -to_host_file_cmd=$lt_cv_to_host_file_cmd -AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) -_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], - [0], [convert $build file names to $host format])dnl - -AC_MSG_CHECKING([how to convert $build file names to toolchain format]) -AC_CACHE_VAL(lt_cv_to_tool_file_cmd, -[#assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac -]) -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) -_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], - [0], [convert $build files to toolchain format])dnl -])# _LT_PATH_CONVERSION_FUNCTIONS - -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 7 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [1], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' -# LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [pic_mode="$withval"], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) - -# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltsugar.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) - - -# lt_join(SEP, ARG1, [ARG2...]) -# ----------------------------- -# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their -# associated separator. -# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier -# versions in m4sugar had bugs. -m4_define([lt_join], -[m4_if([$#], [1], [], - [$#], [2], [[$2]], - [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) -m4_define([_lt_join], -[m4_if([$#$2], [2], [], - [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) - - -# lt_car(LIST) -# lt_cdr(LIST) -# ------------ -# Manipulate m4 lists. -# These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. -m4_define([lt_car], [[$1]]) -m4_define([lt_cdr], -[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], - [$#], 1, [], - [m4_dquote(m4_shift($@))])]) -m4_define([lt_unquote], $1) - - -# lt_append(MACRO-NAME, STRING, [SEPARATOR]) -# ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. -# Note that neither SEPARATOR nor STRING are expanded; they are appended -# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). -# No SEPARATOR is output if MACRO-NAME was previously undefined (different -# than defined and empty). -# -# This macro is needed until we can rely on Autoconf 2.62, since earlier -# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. -m4_define([lt_append], -[m4_define([$1], - m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) - - - -# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) -# ---------------------------------------------------------- -# Produce a SEP delimited list of all paired combinations of elements of -# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list -# has the form PREFIXmINFIXSUFFIXn. -# Needed until we can rely on m4_combine added in Autoconf 2.62. -m4_define([lt_combine], -[m4_if(m4_eval([$# > 3]), [1], - [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl -[[m4_foreach([_Lt_prefix], [$2], - [m4_foreach([_Lt_suffix], - ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, - [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) - - -# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) -# ----------------------------------------------------------------------- -# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited -# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. -m4_define([lt_if_append_uniq], -[m4_ifdef([$1], - [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], - [lt_append([$1], [$2], [$3])$4], - [$5])], - [lt_append([$1], [$2], [$3])$4])]) - - -# lt_dict_add(DICT, KEY, VALUE) -# ----------------------------- -m4_define([lt_dict_add], -[m4_define([$1($2)], [$3])]) - - -# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) -# -------------------------------------------- -m4_define([lt_dict_add_subkey], -[m4_define([$1($2:$3)], [$4])]) - - -# lt_dict_fetch(DICT, KEY, [SUBKEY]) -# ---------------------------------- -m4_define([lt_dict_fetch], -[m4_ifval([$3], - m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), - m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) - - -# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) -# ----------------------------------------------------------------- -m4_define([lt_if_dict_fetch], -[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], - [$5], - [$6])]) - - -# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) -# -------------------------------------------------------------- -m4_define([lt_dict_filter], -[m4_if([$5], [], [], - [lt_join(m4_quote(m4_default([$4], [[, ]])), - lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), - [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl -]) - -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# @configure_input@ - -# serial 3293 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.4]) -m4_define([LT_PACKAGE_REVISION], [1.3293]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4' -macro_revision='1.3293' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) - -# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004. -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 5 lt~obsolete.m4 - -# These exist entirely to fool aclocal when bootstrapping libtool. -# -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) -# which have later been changed to m4_define as they aren't part of the -# exported API, or moved to Autoconf or Automake where they belong. -# -# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN -# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us -# using a macro with the same name in our local m4/libtool.m4 it'll -# pull the old libtool.m4 in (it doesn't see our shiny new m4_define -# and doesn't know about Autoconf macros at all.) -# -# So we provide this file, which has a silly filename so it's always -# included after everything else. This provides aclocal with the -# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything -# because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. -# -# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. -# Yes, that means every name once taken will need to remain here until -# we give up compatibility with versions before 1.7, at which point -# we need to keep only those names which we still refer to. - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) - -m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) -m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) -m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) -m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) -m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) -m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) -m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) -m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) -m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) -m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) -m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) -m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) -m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) -m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) -m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) -m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) -m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) -m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) -m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) -m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) -m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) -m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) -m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) -m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) -m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) -m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) -m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) -m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) -m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) -m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) -m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) -m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) -m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) -m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) -m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) -m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) -m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) -m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) -m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) -m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) -m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) -m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) -m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) -m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) -m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) -m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) -m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) -m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) -m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure deleted file mode 100644 index 247d0ef2..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure +++ /dev/null @@ -1,18632 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for expat 2.1.0. -# -# Report bugs to <expat-bugs@libexpat.org>. -# -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -# Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - # Preserve -v and -x to the replacement shell. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; - esac - exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: expat-bugs@libexpat.org about your system, including -$0: any error possibly output before this message. Then -$0: install a modern shell, or manually run the script -$0: under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 </dev/null -exec 6>&1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='expat' -PACKAGE_TARNAME='expat' -PACKAGE_VERSION='2.1.0' -PACKAGE_STRING='expat 2.1.0' -PACKAGE_BUGREPORT='expat-bugs@libexpat.org' -PACKAGE_URL='' - -ac_unique_file="Makefile.in" -# Factoring default headers for most tests. -ac_includes_default="\ -#include <stdio.h> -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -# include <sys/stat.h> -#endif -#ifdef STDC_HEADERS -# include <stdlib.h> -# include <stddef.h> -#else -# ifdef HAVE_STDLIB_H -# include <stdlib.h> -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include <memory.h> -# endif -# include <string.h> -#endif -#ifdef HAVE_STRINGS_H -# include <strings.h> -#endif -#ifdef HAVE_INTTYPES_H -# include <inttypes.h> -#endif -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif" - -ac_header_list= -ac_subst_vars='LTLIBOBJS -LIBOBJS -FILEMAP -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -CXXCPP -ac_ct_CXX -CXXFLAGS -CXX -LIBAGE -LIBREVISION -LIBCURRENT -CPP -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -AWK -RANLIB -STRIP -ac_ct_AR -AR -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -EGREP -GREP -SED -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -LIBTOOL -OBJDUMP -DLLTOOL -AS -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_shared -enable_static -with_pic -enable_fast_install -with_gnu_ld -with_sysroot -enable_libtool_lock -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP -CXX -CXXFLAGS -CCC -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used" >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures expat 2.1.0 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/expat] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of expat 2.1.0:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-shared[=PKGS] build shared libraries [default=yes] - --enable-static[=PKGS] build static libraries [default=yes] - --enable-fast-install[=PKGS] - optimize for fast installation [default=yes] - --disable-libtool-lock avoid locking (might break parallel builds) - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic try to use only PIC/non-PIC objects [default=use - both] - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a - nonstandard directory <lib dir> - LIBS libraries to pass to the linker, e.g. -l<library> - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if - you have headers in a nonstandard directory <include dir> - CPP C preprocessor - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to <expat-bugs@libexpat.org>. -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -expat configure 2.1.0 -generated by GNU Autoconf 2.68 - -Copyright (C) 2010 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case <limits.h> declares $2. - For example, HP-UX 11i <limits.h> declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - <limits.h> exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_cxx_try_cpp LINENO -# ------------------------ -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_cpp - -# ac_fn_cxx_try_link LINENO -# ------------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_link - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## -------------------------------------- ## -## Report this to expat-bugs@libexpat.org ## -## -------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by expat $as_me 2.1.0, which was -generated by GNU Autoconf 2.68. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -as_fn_append ac_header_list " stdlib.h" -as_fn_append ac_header_list " unistd.h" -as_fn_append ac_header_list " sys/param.h" -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - - -ac_aux_dir= -for ac_dir in conftools "$srcdir"/conftools; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in conftools \"$srcdir\"/conftools" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - - - - - -LIBCURRENT=7 -LIBREVISION=0 -LIBAGE=6 - -ac_config_headers="$ac_config_headers expat_config.h" - - - - - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. -set dummy ${ac_tool_prefix}as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AS="${ac_tool_prefix}as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AS=$ac_cv_prog_AS -if test -n "$AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 -$as_echo "$AS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_AS"; then - ac_ct_AS=$AS - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AS"; then - ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_AS="as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AS=$ac_cv_prog_ac_ct_AS -if test -n "$ac_ct_AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 -$as_echo "$ac_ct_AS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_AS" = x; then - AS="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AS=$ac_ct_AS - fi -else - AS="$ac_cv_prog_AS" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - - ;; -esac - -test -z "$AS" && AS=as - - - - - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4' -macro_revision='1.3293' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdio.h> -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdarg.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in - *GNU* | *'with BFD'*) - test "$with_gnu_ld" != no && break - ;; - *) - test "$with_gnu_ld" != yes && break - ;; - esac - fi - done - IFS="$lt_save_ifs" -else - lt_cv_path_LD="$LD" # Let the user override the test with a path. -fi -fi - -LD="$lt_cv_path_LD" -if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 </dev/null` in -*GNU* | *'with BFD'*) - lt_cv_prog_gnu_ld=yes - ;; -*) - lt_cv_prog_gnu_ld=no - ;; -esac -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring="ABCD" - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n $lt_cv_sys_max_cmd_len ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -# Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -sparc*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then - _lt_dar_single_mod='$single_module' - fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <float.h> - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <string.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ctype.h> -#include <stdlib.h> -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - - -# Set options - - - - enable_dlopen=no - - - - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -# Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; pic_mode="$withval" -else - pic_mode=default -fi - - -test -z "$pic_mode" && pic_mode=default - - - - - - - - # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC="$CC" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - lt_prog_compiler_pic='-Xcompiler -fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ F* | *Sun*Fortran*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test x"$lt_cv_prog_compiler_static_works" = xyes; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) - with_gnu_ld=yes - ;; - openbsd*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld='-rpath $libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = no; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='${wl}-f,' - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - link_all_deplibs=no - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' ${wl}-bernotok' - allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - freebsd1*) - ld_shlibs=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='${wl}-E' - ;; - - hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld='+b $libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='${wl}-z,text' - allow_undefined_flag='${wl}-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test "$ld_shlibs" = no && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test "$GCC" = yes; then - case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib<name>.so - # instead of lib<name>.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test "X$hardcode_automatic" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test "x$lt_cv_dlopen_self" = xyes; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisbility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - - - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdarg.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf - - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -else - _lt_caught_CXX_error=yes -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_flag_spec_ld_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in - *GNU* | *'with BFD'*) - test "$with_gnu_ld" != no && break - ;; - *) - test "$with_gnu_ld" != yes && break - ;; - esac - fi - done - IFS="$lt_save_ifs" -else - lt_cv_path_LD="$LD" # Let the user override the test with a path. -fi -fi - -LD="$lt_cv_path_LD" -if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 </dev/null` in -*GNU* | *'with BFD'*) - lt_cv_prog_gnu_ld=yes - ;; -*) - lt_cv_prog_gnu_ld=no - ;; -esac -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - export_dynamic_flag_spec_CXX='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath__CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath__CXX -fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - - - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - if test "$lt_cv_apple_cc_single_mod" != "yes"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi - - else - ld_shlibs_CXX=no - fi - - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - freebsd[12]*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - - gnu*) - ;; - - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object_CXX=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='${wl}-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='${wl}-z,text' - allow_undefined_flag_CXX='${wl}-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - GCC_CXX="$GXX" - LD_CXX="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF - - -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -esac - -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - postdeps_CXX='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } - -if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then - : -else - lt_prog_compiler_static_CXX= -fi - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs_CXX=no - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -$as_echo "$ld_shlibs_CXX" >&6; } -test "$ld_shlibs_CXX" = no && can_build_shared=no - -with_gnu_ld_CXX=$with_gnu_ld - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix[4-9]*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib<name>.so - # instead of lib<name>.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd*) - version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test "$dynamic_linker" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existent directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -$as_echo "$hardcode_action_CXX" >&6; } - -if test "$hardcode_action_CXX" = relink || - test "$inherit_rpath_CXX" = yes; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -if test "$GCC" = yes ; then - OLDCFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wstrict-prototypes" - CFLAGS="$OLDCFLAGS -fexceptions" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -fexceptions" >&5 -$as_echo_n "checking whether $CC accepts -fexceptions... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; }; CFLAGS="$OLDCFLAGS" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - CXXFLAGS=`echo "$CFLAGS" | sed 's/ -Wmissing-prototypes -Wstrict-prototypes//'` -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <float.h> - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <string.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ctype.h> -#include <stdlib.h> -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_bigendian=unknown -# See if sys/param.h defines the BYTE_ORDER macro. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <sys/types.h> -#include <sys/param.h> -int -main () -{ - -#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros -#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to BIG_ENDIAN or not. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <sys/types.h> -#include <sys/param.h> -int -main () -{ - -#if BYTE_ORDER != BIG_ENDIAN - not big endian -#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -if test $ac_cv_c_bigendian = unknown; then -if test "$cross_compiling" = yes; then : - echo $ac_n "cross-compiling... " 2>&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -main () { - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long l; - char c[sizeof (long)]; - } u; - u.l = 1; - exit (u.c[sizeof (long) - 1] == 1); -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } -if test $ac_cv_c_bigendian = unknown; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking to probe for byte ordering" >&5 -$as_echo_n "checking to probe for byte ordering... " >&6; } - -cat >conftest.c <<EOF -short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; -short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; -void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; } -short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; -short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; -void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; } -int main() { _ascii (); _ebcdic (); return 0; } -EOF - if test -f conftest.c ; then - if ${CC-cc} -c conftest.c -o conftest.o && test -f conftest.o ; then - if test `grep -l BIGenDianSyS conftest.o` ; then - echo $ac_n ' big endian probe OK, ' 1>&6 - ac_cv_c_bigendian=yes - fi - if test `grep -l LiTTleEnDian conftest.o` ; then - echo $ac_n ' little endian probe OK, ' 1>&6 - if test $ac_cv_c_bigendian = yes ; then - ac_cv_c_bigendian=unknown; - else - ac_cv_c_bigendian=no - fi - fi - echo $ac_n 'guessing bigendian ... ' >&6 - fi - fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } -fi -if test $ac_cv_c_bigendian = yes; then - -$as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h - - BYTEORDER=4321 -else - BYTEORDER=1234 -fi - -cat >>confdefs.h <<_ACEOF -#define BYTEORDER $BYTEORDER -_ACEOF - -if test $ac_cv_c_bigendian = unknown; then - as_fn_error please pre-set ac_cv_c_bigendian "unknown endianess - sorry" "$LINENO" 5 -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset cs; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "#define const /**/" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF - -fi - -for ac_func in memmove bcopy -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -for ac_header in fcntl.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define off_t long int -_ACEOF - -fi - - - - - for ac_header in $ac_header_list -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - - - - - -for ac_func in getpagesize -do : - ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" -if test "x$ac_cv_func_getpagesize" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETPAGESIZE 1 -_ACEOF - -fi -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 -$as_echo_n "checking for working mmap... " >&6; } -if ${ac_cv_func_mmap_fixed_mapped+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_mmap_fixed_mapped=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -/* malloc might have been renamed as rpl_malloc. */ -#undef malloc - -/* Thanks to Mike Haertel and Jim Avera for this test. - Here is a matrix of mmap possibilities: - mmap private not fixed - mmap private fixed at somewhere currently unmapped - mmap private fixed at somewhere already mapped - mmap shared not fixed - mmap shared fixed at somewhere currently unmapped - mmap shared fixed at somewhere already mapped - For private mappings, we should verify that changes cannot be read() - back from the file, nor mmap's back from the file at a different - address. (There have been systems where private was not correctly - implemented like the infamous i386 svr4.0, and systems where the - VM page cache was not coherent with the file system buffer cache - like early versions of FreeBSD and possibly contemporary NetBSD.) - For shared mappings, we should conversely verify that changes get - propagated back to all the places they're supposed to be. - - Grep wants private fixed already mapped. - The main things grep needs to know about mmap are: - * does it exist and is it safe to write into the mmap'd area - * how to use it (BSD variants) */ - -#include <fcntl.h> -#include <sys/mman.h> - -#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H -char *malloc (); -#endif - -/* This mess was copied from the GNU getpagesize.h. */ -#ifndef HAVE_GETPAGESIZE -# ifdef _SC_PAGESIZE -# define getpagesize() sysconf(_SC_PAGESIZE) -# else /* no _SC_PAGESIZE */ -# ifdef HAVE_SYS_PARAM_H -# include <sys/param.h> -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else /* no EXEC_PAGESIZE */ -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif /* no CLSIZE */ -# else /* no NBPG */ -# ifdef NBPC -# define getpagesize() NBPC -# else /* no NBPC */ -# ifdef PAGESIZE -# define getpagesize() PAGESIZE -# endif /* PAGESIZE */ -# endif /* no NBPC */ -# endif /* no NBPG */ -# endif /* no EXEC_PAGESIZE */ -# else /* no HAVE_SYS_PARAM_H */ -# define getpagesize() 8192 /* punt totally */ -# endif /* no HAVE_SYS_PARAM_H */ -# endif /* no _SC_PAGESIZE */ - -#endif /* no HAVE_GETPAGESIZE */ - -int -main () -{ - char *data, *data2, *data3; - const char *cdata2; - int i, pagesize; - int fd, fd2; - - pagesize = getpagesize (); - - /* First, make a file with some known garbage in it. */ - data = (char *) malloc (pagesize); - if (!data) - return 1; - for (i = 0; i < pagesize; ++i) - *(data + i) = rand (); - umask (0); - fd = creat ("conftest.mmap", 0600); - if (fd < 0) - return 2; - if (write (fd, data, pagesize) != pagesize) - return 3; - close (fd); - - /* Next, check that the tail of a page is zero-filled. File must have - non-zero length, otherwise we risk SIGBUS for entire page. */ - fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); - if (fd2 < 0) - return 4; - cdata2 = ""; - if (write (fd2, cdata2, 1) != 1) - return 5; - data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); - if (data2 == MAP_FAILED) - return 6; - for (i = 0; i < pagesize; ++i) - if (*(data2 + i)) - return 7; - close (fd2); - if (munmap (data2, pagesize)) - return 8; - - /* Next, try to mmap the file at a fixed address which already has - something else allocated at it. If we can, also make sure that - we see the same garbage. */ - fd = open ("conftest.mmap", O_RDWR); - if (fd < 0) - return 9; - if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED, fd, 0L)) - return 10; - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data2 + i)) - return 11; - - /* Finally, make sure that changes to the mapped area do not - percolate back to the file as seen by read(). (This is a bug on - some variants of i386 svr4.0.) */ - for (i = 0; i < pagesize; ++i) - *(data2 + i) = *(data2 + i) + 1; - data3 = (char *) malloc (pagesize); - if (!data3) - return 12; - if (read (fd, data3, pagesize) != pagesize) - return 13; - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data3 + i)) - return 14; - close (fd); - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_mmap_fixed_mapped=yes -else - ac_cv_func_mmap_fixed_mapped=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 -$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } -if test $ac_cv_func_mmap_fixed_mapped = yes; then - -$as_echo "#define HAVE_MMAP 1" >>confdefs.h - -fi -rm -f conftest.mmap conftest.txt - - -if test "$ac_cv_func_mmap_fixed_mapped" = "yes"; then - FILEMAP=unixfilemap -else - FILEMAP=readfilemap -fi - - - -# AC_CPP_FUNC -# ------------------ # -# Checks to see if ANSI C99 CPP variable __func__ works. -# If not, perhaps __FUNCTION__ works instead. -# If not, we'll just define __func__ to "". -# AC_CPP_FUNC - - case $ac_cv_prog_cc_stdc in #( - no) : - ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( - *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 -$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } -if ${ac_cv_prog_cc_c99+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c99=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdarg.h> -#include <stdbool.h> -#include <stdlib.h> -#include <wchar.h> -#include <stdio.h> - -// Check varargs macros. These examples are taken from C99 6.10.3.5. -#define debug(...) fprintf (stderr, __VA_ARGS__) -#define showlist(...) puts (#__VA_ARGS__) -#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) -static void -test_varargs_macros (void) -{ - int x = 1234; - int y = 5678; - debug ("Flag"); - debug ("X = %d\n", x); - showlist (The first, second, and third items.); - report (x>y, "x is %d but y is %d", x, y); -} - -// Check long long types. -#define BIG64 18446744073709551615ull -#define BIG32 4294967295ul -#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) -#if !BIG_OK - your preprocessor is broken; -#endif -#if BIG_OK -#else - your preprocessor is broken; -#endif -static long long int bignum = -9223372036854775807LL; -static unsigned long long int ubignum = BIG64; - -struct incomplete_array -{ - int datasize; - double data[]; -}; - -struct named_init { - int number; - const wchar_t *name; - double average; -}; - -typedef const char *ccp; - -static inline int -test_restrict (ccp restrict text) -{ - // See if C++-style comments work. - // Iterate through items via the restricted pointer. - // Also check for declarations in for loops. - for (unsigned int i = 0; *(text+i) != '\0'; ++i) - continue; - return 0; -} - -// Check varargs and va_copy. -static void -test_varargs (const char *format, ...) -{ - va_list args; - va_start (args, format); - va_list args_copy; - va_copy (args_copy, args); - - const char *str; - int number; - float fnumber; - - while (*format) - { - switch (*format++) - { - case 's': // string - str = va_arg (args_copy, const char *); - break; - case 'd': // int - number = va_arg (args_copy, int); - break; - case 'f': // float - fnumber = va_arg (args_copy, double); - break; - default: - break; - } - } - va_end (args_copy); - va_end (args); -} - -int -main () -{ - - // Check bool. - _Bool success = false; - - // Check restrict. - if (test_restrict ("String literal") == 0) - success = true; - char *restrict newvar = "Another string"; - - // Check varargs. - test_varargs ("s, d' f .", "string", 65, 34.234); - test_varargs_macros (); - - // Check flexible array members. - struct incomplete_array *ia = - malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); - ia->datasize = 10; - for (int i = 0; i < ia->datasize; ++i) - ia->data[i] = i * 1.234; - - // Check named initializers. - struct named_init ni = { - .number = 34, - .name = L"Test wide string", - .average = 543.34343, - }; - - ni.number = 58; - - int dynamic_array[ni.number]; - dynamic_array[ni.number - 1] = 543; - - // work around unused variable warnings - return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' - || dynamic_array[ni.number - 1] != 543); - - ; - return 0; -} -_ACEOF -for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c99=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c99" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c99" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c99" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 -$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c99" != xno; then : - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdarg.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 -else - ac_cv_prog_cc_stdc=no -fi - -fi - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 -$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } - if ${ac_cv_prog_cc_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -fi - - case $ac_cv_prog_cc_stdc in #( - no) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; #( - '') : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; #( - *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 -$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C99-conforming __func__" >&5 -$as_echo_n "checking for an ANSI C99-conforming __func__... " >&6; } -if ${ac_cv_cpp_func+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -char *foo = __func__; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_cpp_func=yes -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -char *foo = __FUNCTION__; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_cpp_func=__FUNCTION__ -else - ac_cv_cpp_func=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_func" >&5 -$as_echo "$ac_cv_cpp_func" >&6; } -if test $ac_cv_cpp_func = __FUNCTION__; then - -$as_echo "#define __func__ __FUNCTION__" >>confdefs.h - -elif test $ac_cv_cpp_func = no; then - -$as_echo "#define __func__ \"\"" >>confdefs.h - -fi - - - - -$as_echo "#define XML_NS 1" >>confdefs.h - - -$as_echo "#define XML_DTD 1" >>confdefs.h - - -$as_echo "#define XML_CONTEXT_BYTES 1024" >>confdefs.h - - -ac_config_files="$ac_config_files Makefile expat.pc" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by expat $as_me 2.1.0, which was -generated by GNU Autoconf 2.68. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to <expat-bugs@libexpat.org>." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -expat config.status 2.1.0 -configured by $0, generated by GNU Autoconf 2.68, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2010 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' -predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' -postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' -predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' -postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' -LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' -reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' -reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' -GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' -with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' -inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' -link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' -always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' -exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' -prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' -file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' -hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' -predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' -postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' -predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' -postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' -compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in AS \ -DLLTOOL \ -OBJDUMP \ -SHELL \ -ECHO \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_flag_spec_ld \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib \ -compiler_lib_search_dirs \ -predep_objects \ -postdep_objects \ -predeps \ -postdeps \ -compiler_lib_search_path \ -LD_CXX \ -reload_flag_CXX \ -compiler_CXX \ -lt_prog_compiler_no_builtin_flag_CXX \ -lt_prog_compiler_pic_CXX \ -lt_prog_compiler_wl_CXX \ -lt_prog_compiler_static_CXX \ -lt_cv_prog_compiler_c_o_CXX \ -export_dynamic_flag_spec_CXX \ -whole_archive_flag_spec_CXX \ -compiler_needs_object_CXX \ -with_gnu_ld_CXX \ -allow_undefined_flag_CXX \ -no_undefined_flag_CXX \ -hardcode_libdir_flag_spec_CXX \ -hardcode_libdir_flag_spec_ld_CXX \ -hardcode_libdir_separator_CXX \ -exclude_expsyms_CXX \ -include_expsyms_CXX \ -file_list_spec_CXX \ -compiler_lib_search_dirs_CXX \ -predep_objects_CXX \ -postdep_objects_CXX \ -predeps_CXX \ -postdeps_CXX \ -compiler_lib_search_path_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec \ -reload_cmds_CXX \ -old_archive_cmds_CXX \ -old_archive_from_new_cmds_CXX \ -old_archive_from_expsyms_cmds_CXX \ -archive_cmds_CXX \ -archive_expsym_cmds_CXX \ -module_cmds_CXX \ -module_expsym_cmds_CXX \ -export_symbols_cmds_CXX \ -prelink_cmds_CXX \ -postlink_cmds_CXX; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "expat_config.h") CONFIG_HEADERS="$CONFIG_HEADERS expat_config.h" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "expat.pc") CONFIG_FILES="$CONFIG_FILES expat.pc" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' <conf$$subs.awk | sed ' -/^[^""]/{ - N - s/\n// -} -' >>$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' <confdefs.h | sed ' -s/'"$ac_delim"'/"\\\ -"/g' >>$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, -# Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="CXX " - -# ### BEGIN LIBTOOL CONFIG - -# Assembler program. -AS=$lt_AS - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Object dumper program. -OBJDUMP=$lt_OBJDUMP - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# If ld is used when linking, flag to hardcode \$libdir into a binary -# during linking. This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# If ld is used when linking, flag to hardcode \$libdir into a binary -# during linking. This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - - -abs_srcdir="`cd $srcdir && pwd`" -abs_builddir="`pwd`" -if test "$abs_srcdir" != "$abs_builddir"; then - make mkdir-init -fi diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure.in b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure.in deleted file mode 100644 index 7e968c46..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/configure.in +++ /dev/null @@ -1,155 +0,0 @@ -dnl configuration script for expat -dnl Process this file with autoconf to produce a configure script. -dnl -dnl Copyright 2000 Clark Cooper -dnl -dnl This file is part of EXPAT. -dnl -dnl EXPAT is free software; you can redistribute it and/or modify it -dnl under the terms of the License (based on the MIT/X license) contained -dnl in the file COPYING that comes with this distribution. -dnl - -dnl Ensure that Expat is configured with autoconf 2.58 or newer -AC_PREREQ(2.58) - -dnl Get the version number of Expat, using m4's esyscmd() command to run -dnl the command at m4-generation time. This allows us to create an m4 -dnl symbol holding the correct version number. AC_INIT() requires the -dnl version number at m4-time, rather than when ./configure is run, so -dnl all this must happen as part of m4, not as part of the shell code -dnl contained in ./configure. -dnl -dnl NOTE: esyscmd() is a GNU M4 extension. Thus, we wrap it in an appropriate -dnl test. I believe this test will work, but I don't have a place with non- -dnl GNU M4 to test it right now. -define([expat_version], ifdef([__gnu__], - [esyscmd(conftools/get-version.sh lib/expat.h)], - [2.1.x])) -AC_INIT(expat, expat_version, expat-bugs@libexpat.org) -undefine([expat_version]) - -AC_CONFIG_SRCDIR(Makefile.in) -AC_CONFIG_AUX_DIR(conftools) -AC_CONFIG_MACRO_DIR([m4]) - - -dnl -dnl Increment LIBREVISION if source code has changed at all -dnl -dnl If the API has changed, increment LIBCURRENT and set LIBREVISION to 0 -dnl -dnl If the API changes compatibly (i.e. simply adding a new function -dnl without changing or removing earlier interfaces), then increment LIBAGE. -dnl -dnl If the API changes incompatibly set LIBAGE back to 0 -dnl - -LIBCURRENT=7 -LIBREVISION=0 -LIBAGE=6 - -AC_CONFIG_HEADER(expat_config.h) - -sinclude(conftools/ac_c_bigendian_cross.m4) - -AC_LIBTOOL_WIN32_DLL -AC_PROG_LIBTOOL - -AC_SUBST(LIBCURRENT) -AC_SUBST(LIBREVISION) -AC_SUBST(LIBAGE) - -dnl Checks for programs. -AC_PROG_CC -AC_PROG_CXX -AC_PROG_INSTALL - -if test "$GCC" = yes ; then - dnl - dnl Be careful about adding the -fexceptions option; some versions of - dnl GCC don't support it and it causes extra warnings that are only - dnl distracting; avoid. - dnl - OLDCFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wstrict-prototypes" - CFLAGS="$OLDCFLAGS -fexceptions" - AC_MSG_CHECKING(whether $CC accepts -fexceptions) - AC_TRY_LINK( , , - AC_MSG_RESULT(yes), - AC_MSG_RESULT(no); CFLAGS="$OLDCFLAGS") - CXXFLAGS=`echo "$CFLAGS" | sed 's/ -Wmissing-prototypes -Wstrict-prototypes//'` -fi - -dnl Checks for header files. -AC_HEADER_STDC - -dnl Checks for typedefs, structures, and compiler characteristics. - -dnl Note: Avoid using AC_C_BIGENDIAN because it does not -dnl work in a cross compile. -AC_C_BIGENDIAN_CROSS - -AC_C_CONST -AC_TYPE_SIZE_T -AC_CHECK_FUNCS(memmove bcopy) - -dnl Only needed for xmlwf: -AC_CHECK_HEADERS(fcntl.h unistd.h) -AC_TYPE_OFF_T -AC_FUNC_MMAP - -if test "$ac_cv_func_mmap_fixed_mapped" = "yes"; then - FILEMAP=unixfilemap -else - FILEMAP=readfilemap -fi -AC_SUBST(FILEMAP) - -dnl Needed for the test support code; this was found at -dnl http://lists.gnu.org/archive/html/bug-autoconf/2002-07/msg00028.html - -# AC_CPP_FUNC -# ------------------ # -# Checks to see if ANSI C99 CPP variable __func__ works. -# If not, perhaps __FUNCTION__ works instead. -# If not, we'll just define __func__ to "". -AC_DEFUN([AC_CPP_FUNC], -[AC_REQUIRE([AC_PROG_CC_STDC])dnl -AC_CACHE_CHECK([for an ANSI C99-conforming __func__], ac_cv_cpp_func, -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], -[[char *foo = __func__;]])], - [ac_cv_cpp_func=yes], - [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], -[[char *foo = __FUNCTION__;]])], - [ac_cv_cpp_func=__FUNCTION__], - [ac_cv_cpp_func=no])])]) -if test $ac_cv_cpp_func = __FUNCTION__; then - AC_DEFINE(__func__,__FUNCTION__, - [Define to __FUNCTION__ or "" if `__func__' does not conform to -ANSI C.]) -elif test $ac_cv_cpp_func = no; then - AC_DEFINE(__func__,"", - [Define to __FUNCTION__ or "" if `__func__' does not conform to -ANSI C.]) -fi -])# AC_CPP_FUNC - -AC_CPP_FUNC - - -dnl Some basic configuration: -AC_DEFINE([XML_NS], 1, - [Define to make XML Namespaces functionality available.]) -AC_DEFINE([XML_DTD], 1, - [Define to make parameter entity parsing functionality available.]) -AC_DEFINE([XML_CONTEXT_BYTES], 1024, - [Define to specify how much context to retain around the current parse point.]) - -AC_CONFIG_FILES([Makefile expat.pc]) -AC_OUTPUT - -abs_srcdir="`cd $srcdir && pwd`" -abs_builddir="`pwd`" -if test "$abs_srcdir" != "$abs_builddir"; then - make mkdir-init -fi diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/PrintPath b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/PrintPath deleted file mode 100644 index e8559a3d..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/PrintPath +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/sh -# Look for program[s] somewhere in $PATH. -# -# Options: -# -s -# Do not print out full pathname. (silent) -# -pPATHNAME -# Look in PATHNAME instead of $PATH -# -# Usage: -# PrintPath [-s] [-pPATHNAME] program [program ...] -# -# Initially written by Jim Jagielski for the Apache configuration mechanism -# (with kudos to Kernighan/Pike) -# -# This script falls under the Apache License. -# See http://www.apache.org/licenses/LICENSE - -## -# Some "constants" -## -pathname=$PATH -echo="yes" - -## -# Find out what OS we are running for later on -## -os=`(uname) 2>/dev/null` - -## -# Parse command line -## -for args in $* -do - case $args in - -s ) echo="no" ;; - -p* ) pathname="`echo $args | sed 's/^..//'`" ;; - * ) programs="$programs $args" ;; - esac -done - -## -# Now we make the adjustments required for OS/2 and everyone -# else :) -# -# First of all, all OS/2 programs have the '.exe' extension. -# Next, we adjust PATH (or what was given to us as PATH) to -# be whitespace separated directories. -# Finally, we try to determine the best flag to use for -# test/[] to look for an executable file. OS/2 just has '-r' -# but with other OSs, we do some funny stuff to check to see -# if test/[] knows about -x, which is the preferred flag. -## - -if [ "x$os" = "xOS/2" ] -then - ext=".exe" - pathname=`echo -E $pathname | - sed 's/^;/.;/ - s/;;/;.;/g - s/;$/;./ - s/;/ /g - s/\\\\/\\//g' ` - test_exec_flag="-r" -else - ext="" # No default extensions - pathname=`echo $pathname | - sed 's/^:/.:/ - s/::/:.:/g - s/:$/:./ - s/:/ /g' ` - # Here is how we test to see if test/[] can handle -x - testfile="pp.t.$$" - - cat > $testfile <<ENDTEST -#!/bin/sh -if [ -x / ] || [ -x /bin ] || [ -x /bin/ls ]; then - exit 0 -fi -exit 1 -ENDTEST - - if `/bin/sh $testfile 2>/dev/null`; then - test_exec_flag="-x" - else - test_exec_flag="-r" - fi - rm -f $testfile -fi - -for program in $programs -do - for path in $pathname - do - if [ $test_exec_flag $path/${program}${ext} ] && \ - [ ! -d $path/${program}${ext} ]; then - if [ "x$echo" = "xyes" ]; then - echo $path/${program}${ext} - fi - exit 0 - fi - -# Next try without extension (if one was used above) - if [ "x$ext" != "x" ]; then - if [ $test_exec_flag $path/${program} ] && \ - [ ! -d $path/${program} ]; then - if [ "x$echo" = "xyes" ]; then - echo $path/${program} - fi - exit 0 - fi - fi - done -done -exit 1 - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ac_c_bigendian_cross.m4 b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ac_c_bigendian_cross.m4 deleted file mode 100644 index 67577364..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ac_c_bigendian_cross.m4 +++ /dev/null @@ -1,81 +0,0 @@ -dnl @synopsis AC_C_BIGENDIAN_CROSS -dnl -dnl Check endianess even when crosscompiling -dnl (partially based on the original AC_C_BIGENDIAN). -dnl -dnl The implementation will create a binary, and instead of running -dnl the binary it will be grep'ed for some symbols that will look -dnl different for different endianess of the binary. -dnl -dnl @version $Id: ac_c_bigendian_cross.m4,v 1.1 2012/06/15 13:38:48 dromagod Exp $ -dnl @author Guido Draheim <guidod@gmx.de> -dnl -AC_DEFUN([AC_C_BIGENDIAN_CROSS], -[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian, -[ac_cv_c_bigendian=unknown -# See if sys/param.h defines the BYTE_ORDER macro. -AC_TRY_COMPILE([#include <sys/types.h> -#include <sys/param.h>], [ -#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros -#endif], [# It does; now see whether it defined to BIG_ENDIAN or not. -AC_TRY_COMPILE([#include <sys/types.h> -#include <sys/param.h>], [ -#if BYTE_ORDER != BIG_ENDIAN - not big endian -#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)]) -if test $ac_cv_c_bigendian = unknown; then -AC_TRY_RUN([main () { - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long l; - char c[sizeof (long)]; - } u; - u.l = 1; - exit (u.c[sizeof (long) - 1] == 1); -}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes, -[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ]) -fi]) -if test $ac_cv_c_bigendian = unknown; then -AC_MSG_CHECKING(to probe for byte ordering) -[ -cat >conftest.c <<EOF -short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; -short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; -void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; } -short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; -short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; -void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; } -int main() { _ascii (); _ebcdic (); return 0; } -EOF -] if test -f conftest.c ; then - if ${CC-cc} -c conftest.c -o conftest.o && test -f conftest.o ; then - if test `grep -l BIGenDianSyS conftest.o` ; then - echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG - ac_cv_c_bigendian=yes - fi - if test `grep -l LiTTleEnDian conftest.o` ; then - echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG - if test $ac_cv_c_bigendian = yes ; then - ac_cv_c_bigendian=unknown; - else - ac_cv_c_bigendian=no - fi - fi - echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG - fi - fi -AC_MSG_RESULT($ac_cv_c_bigendian) -fi -if test $ac_cv_c_bigendian = yes; then - AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian]) - BYTEORDER=4321 -else - BYTEORDER=1234 -fi -AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN]) -if test $ac_cv_c_bigendian = unknown; then - AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian) -fi -]) diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.guess b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.guess deleted file mode 100644 index 40eaed48..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.guess +++ /dev/null @@ -1,1517 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011 Free Software Foundation, Inc. - -timestamp='2011-05-11' - -# This file 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 of the License, 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to <config-patches@gnu.org> and include a ChangeLog -# entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to <config-patches@gnu.org>." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free -Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include <stdio.h> /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include <sys/systemcfg.h> - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include <stdlib.h> - #include <unistd.h> - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include <unistd.h> - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-gnu - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - tile*:Linux:*:*) - echo ${UNAME_MACHINE}-tilera-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` - echo ${UNAME_MACHINE}-pc-isc$UNAME_REL - elif /bin/uname -X 2>/dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says <Richard.M.Bartel@ccMail.Census.GOV> - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes <hewes@openmarket.com>. - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c <<EOF -#ifdef _SEQUENT_ -# include <sys/types.h> -# include <sys/utsname.h> -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include <sys/param.h> - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include <sys/param.h> -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 <<EOF -$0: unable to guess system type - -This script, last modified $timestamp, has failed to recognize -the operating system you are using. It is advised that you -download the most up to date version of the config scripts from - - http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD -and - http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -If the version you run ($0) is already up to date, please -send the following data and any information you think might be -pertinent to <config-patches@gnu.org> in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.sub b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.sub deleted file mode 100644 index 30fdca81..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/config.sub +++ /dev/null @@ -1,1760 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011 Free Software Foundation, Inc. - -timestamp='2011-03-23' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file 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 of the License, 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to <config-patches@gnu.org>. Submit a context -# diff and a properly formatted GNU ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to <config-patches@gnu.org>." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free -Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 \ - | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | picochip) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile-* | tilegx-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze) - basic_machine=microblaze-xilinx - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - # This must be matched before tile*. - tilegx*) - basic_machine=tilegx-unknown - os=-linux-gnu - ;; - tile*) - basic_machine=tile-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux - ;; - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/expat.m4 b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/expat.m4 deleted file mode 100644 index 57e579b3..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/expat.m4 +++ /dev/null @@ -1,43 +0,0 @@ -dnl Check if --with-expat[=PREFIX] is specified and -dnl Expat >= 1.95.0 is installed in the system. -dnl If yes, substitute EXPAT_CFLAGS, EXPAT_LIBS with regard to -dnl the specified PREFIX and set with_expat to PREFIX, or 'yes' if PREFIX -dnl has not been specified. Also HAVE_LIBEXPAT, HAVE_EXPAT_H are defined. -dnl If --with-expat has not been specified, set with_expat to 'no'. -dnl In addition, an Automake conditional EXPAT_INSTALLED is set accordingly. -dnl This is necessary to adapt a whole lot of packages that have expat -dnl bundled as a static library. -AC_DEFUN([AM_WITH_EXPAT], -[ AC_ARG_WITH(expat, - [ --with-expat=PREFIX Use system Expat library], - , with_expat=no) - - AM_CONDITIONAL(EXPAT_INSTALLED, test $with_expat != no) - - EXPAT_CFLAGS= - EXPAT_LIBS= - if test $with_expat != no; then - if test $with_expat != yes; then - EXPAT_CFLAGS="-I$with_expat/include" - EXPAT_LIBS="-L$with_expat/lib" - fi - AC_CHECK_LIB(expat, XML_ParserCreate, - [ EXPAT_LIBS="$EXPAT_LIBS -lexpat" - expat_found=yes ], - [ expat_found=no ], - "$EXPAT_LIBS") - if test $expat_found = no; then - AC_MSG_ERROR([Could not find the Expat library]) - fi - expat_save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $EXPAT_CFLAGS" - AC_CHECK_HEADERS(expat.h, , expat_found=no) - if test $expat_found = no; then - AC_MSG_ERROR([Could not find expat.h]) - fi - CFLAGS="$expat_save_CFLAGS" - fi - - AC_SUBST(EXPAT_CFLAGS) - AC_SUBST(EXPAT_LIBS) -]) diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/get-version.sh b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/get-version.sh deleted file mode 100644 index a70e0fb4..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/get-version.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -# -# USAGE: get-version.sh path/to/expat.h -# -# This script will print Expat's version number on stdout. For example: -# -# $ ./conftools/get-version.sh ./lib/expat.h -# 1.95.3 -# $ -# - -if test $# = 0; then - echo "ERROR: pathname for expat.h was not provided." - echo "" - echo "USAGE: $0 path/to/expat.h" - exit 1 -fi -if test $# != 1; then - echo "ERROR: too many arguments were provided." - echo "" - echo "USAGE: $0 path/to/expat.h" - exit 1 -fi - -hdr="$1" -if test ! -r "$hdr"; then - echo "ERROR: '$hdr' does not exist, or is not readable." - exit 1 -fi - -MAJOR_VERSION="`sed -n -e '/MAJOR_VERSION/s/[^0-9]*//gp' $hdr`" -MINOR_VERSION="`sed -n -e '/MINOR_VERSION/s/[^0-9]*//gp' $hdr`" -MICRO_VERSION="`sed -n -e '/MICRO_VERSION/s/[^0-9]*//gp' $hdr`" - -# Determine how to tell echo not to print the trailing \n. This is -# similar to Autoconf's @ECHO_C@ and @ECHO_N@; however, we don't -# generate this file via autoconf (in fact, get-version.sh is used -# to *create* ./configure), so we just do something similar inline. -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ;; - *c*,* ) ECHO_N=-n ECHO_C= ;; - *) ECHO_N= ECHO_C='\c' ;; -esac - -echo $ECHO_N "$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$ECHO_C" diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/install-sh b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/install-sh deleted file mode 100644 index 6781b987..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/install-sh +++ /dev/null @@ -1,520 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2009-04-28.21; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call `install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - trap '(exit $?); exit' 1 2 13 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - dst=$dst_arg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst;; - esac - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - -*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test -z "$d" && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ltmain.sh b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ltmain.sh deleted file mode 100644 index b4a3231c..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/ltmain.sh +++ /dev/null @@ -1,9642 +0,0 @@ - -# libtool (GNU libtool) 2.4 -# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool 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 of the License, or -# (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, -# or obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Usage: $progname [OPTION]... [MODE-ARG]... -# -# Provide generalized library-building support services. -# -# --config show all configuration variables -# --debug enable verbose shell tracing -# -n, --dry-run display commands without modifying any files -# --features display basic configuration information and exit -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --no-quiet, --no-silent -# print informational messages (default) -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print more informational messages than default -# --no-verbose don't print the extra informational messages -# --version print version information -# -h, --help, --help-all print short, long, or detailed help message -# -# MODE must be one of the following: -# -# clean remove files from the build directory -# compile compile a source file into a libtool object -# execute automatically set library path, then run a program -# finish complete the installation of libtool libraries -# install install libraries or executables -# link create a library or an executable -# uninstall remove libraries from an installed directory -# -# MODE-ARGS vary depending on the MODE. When passed as first option, -# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. -# Try `$progname --help --mode=MODE' for a more detailed description of MODE. -# -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: -# -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4 Debian-2.4-2ubuntu1 -# automake: $automake_version -# autoconf: $autoconf_version -# -# Report bugs to <bug-libtool@gnu.org>. -# GNU libtool home page: <http://www.gnu.org/software/libtool/>. -# General help using GNU software: <http://www.gnu.org/gethelp/>. - -PROGRAM=libtool -PACKAGE=libtool -VERSION="2.4 Debian-2.4-2ubuntu1" -TIMESTAMP="" -package_revision=1.3293 - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - -# NLS nuisances: We save the old values to restore during execute mode. -lt_user_locale= -lt_safe_locale= -for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test \"\${$lt_var+set}\" = set; then - save_$lt_var=\$$lt_var - $lt_var=C - export $lt_var - lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" - lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" - fi" -done -LC_ALL=C -LANGUAGE=C -export LANGUAGE LC_ALL - -$lt_unset CDPATH - - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" - - - -: ${CP="cp -f"} -test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} -: ${EGREP="/bin/grep -E"} -: ${FGREP="/bin/grep -F"} -: ${GREP="/bin/grep"} -: ${LN_S="ln -s"} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SED="/bin/sed"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} -: ${Xsed="$SED -e 1s/^X//"} - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -exit_status=$EXIT_SUCCESS - -# Make sure IFS has a sensible default -lt_nl=' -' -IFS=" $lt_nl" - -dirname="s,/[^/]*$,," -basename="s,^.*/,," - -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} # func_dirname may be replaced by extended shell implementation - - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "${1}" | $SED "$basename"` -} # func_basename may be replaced by extended shell implementation - - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` -} # func_dirname_and_basename may be replaced by extended shell implementation - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname may be replaced by extended shell implementation - - -# These SED scripts presuppose an absolute path with a trailing slash. -pathcar='s,^/\([^/]*\).*$,\1,' -pathcdr='s,^/[^/]*,,' -removedotparts=':dotsl - s@/\./@/@g - t dotsl - s,/\.$,/,' -collapseslashes='s@/\{1,\}@/@g' -finalslash='s,/*$,/,' - -# func_normal_abspath PATH -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -# value returned in "$func_normal_abspath_result" -func_normal_abspath () -{ - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` - while :; do - # Processed it all yet? - if test "$func_normal_abspath_tpath" = / ; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result" ; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} - -# func_relative_path SRCDIR DSTDIR -# generates a relative path from SRCDIR to DSTDIR, with a trailing -# slash if non-empty, suitable for immediately appending a filename -# without needing to append a separator. -# value returned in "$func_relative_path_result" -func_relative_path () -{ - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=${func_dirname_result} - if test "x$func_relative_path_tlibdir" = x ; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done - - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test "x$func_stripname_result" != x ; then - func_relative_path_result=${func_relative_path_result}/${func_stripname_result} - fi - - # Normalisation. If bindir is libdir, return empty string, - # else relative path ending with a slash; either way, target - # file name can be directly appended. - if test ! -z "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result/" - func_relative_path_result=$func_stripname_result - fi -} - -# The name of this program: -func_dirname_and_basename "$progpath" -progname=$func_basename_result - -# Make sure we have an absolute path for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=$func_dirname_result - progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" - ;; - *) - save_IFS="$IFS" - IFS=: - for progdir in $PATH; do - IFS="$save_IFS" - test -x "$progdir/$progname" && break - done - IFS="$save_IFS" - test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed="${SED}"' -e 1s/^X//' -sed_quote_subst='s/\([`"$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' - -# Sed substitution that converts a w32 file name or path -# which contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-`\' parameter expansions in output of double_quote_subst that were -# `\'-ed in input to the same. If an odd number of `\' preceded a '$' -# in input to double_quote_subst, that '$' was protected from expansion. -# Since each input `\' is now two `\'s, look for any number of runs of -# four `\'s followed by two `\'s and then a '$'. `\' that '$'. -bs='\\' -bs2='\\\\' -bs4='\\\\\\\\' -dollar='\$' -sed_double_backslash="\ - s/$bs4/&\\ -/g - s/^$bs2$dollar/$bs&/ - s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g - s/\n//g" - -# Standard options: -opt_dry_run=false -opt_help=false -opt_quiet=false -opt_verbose=false -opt_warning=: - -# func_echo arg... -# Echo program name prefixed message, along with the current mode -# name if it has been set yet. -func_echo () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -} - -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -# func_error arg... -# Echo program name prefixed message to standard error. -func_error () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -} - -# func_warning arg... -# Echo program name prefixed warning message to standard error. -func_warning () -{ - $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : -} - -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - -# func_fatal_help arg... -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - func_error ${1+"$@"} - func_fatal_error "$help" -} -help="Try \`$progname --help' for more information." ## default - - -# func_grep expression filename -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_mkdir_p directory-path -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - my_directory_path="$1" - my_dir_list= - - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then - - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - my_dir_list="$my_directory_path:$my_dir_list" - - # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` - done - my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` - - save_mkdir_p_IFS="$IFS"; IFS=':' - for my_dir in $my_dir_list; do - IFS="$save_mkdir_p_IFS" - # mkdir can fail with a `File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$my_dir" 2>/dev/null || : - done - IFS="$save_mkdir_p_IFS" - - # Bail out if we (or some other process) failed to create a directory. - test -d "$my_directory_path" || \ - func_fatal_error "Failed to create \`$1'" - fi -} - - -# func_mktempdir [string] -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, STRING is the basename for that directory. -func_mktempdir () -{ - my_template="${TMPDIR-/tmp}/${1-$progname}" - - if test "$opt_dry_run" = ":"; then - # Return a directory name, but don't create it in dry-run mode - my_tmpdir="${my_template}-$$" - else - - # If mktemp works, use that first and foremost - my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` - - if test ! -d "$my_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" - - save_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$my_tmpdir" - umask $save_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$my_tmpdir" || \ - func_fatal_error "cannot create temporary directory \`$my_tmpdir'" - fi - - $ECHO "$my_tmpdir" -} - - -# func_quote_for_eval arg -# Aesthetically quote ARG to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -func_quote_for_eval () -{ - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; - *) - func_quote_for_eval_unquoted_result="$1" ;; - esac - - case $func_quote_for_eval_unquoted_result in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable - # expansion for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" - ;; - *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" - esac -} - - -# func_quote_for_expand arg -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "$1" | $SED \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; - esac - - case $my_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_arg="\"$my_arg\"" - ;; - esac - - func_quote_for_expand_result="$my_arg" -} - - -# func_show_eval cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$my_cmd" - my_status=$? - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - -# func_show_eval_locale cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$lt_user_locale - $my_cmd" - my_status=$? - eval "$lt_safe_locale" - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - -# func_tr_sh -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - - -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $opt_debug - - $SED -n '/(C)/!b go - :more - /\./!{ - N - s/\n# / / - b more - } - :go - /^# '$PROGRAM' (GNU /,/# warranty; / { - s/^# // - s/^# *$// - s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ - p - }' < "$progpath" - exit $? -} - -# func_usage -# Echo short help message to standard output and exit. -func_usage () -{ - $opt_debug - - $SED -n '/^# Usage:/,/^# *.*--help/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - echo - $ECHO "run \`$progname --help | more' for full usage" - exit $? -} - -# func_help [NOEXIT] -# Echo long help message to standard output and exit, -# unless 'noexit' is passed as argument. -func_help () -{ - $opt_debug - - $SED -n '/^# Usage:/,/# Report bugs to/ { - :print - s/^# // - s/^# *$// - s*\$progname*'$progname'* - s*\$host*'"$host"'* - s*\$SHELL*'"$SHELL"'* - s*\$LTCC*'"$LTCC"'* - s*\$LTCFLAGS*'"$LTCFLAGS"'* - s*\$LD*'"$LD"'* - s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ - p - d - } - /^# .* home page:/b print - /^# General help using/b print - ' < "$progpath" - ret=$? - if test -z "$1"; then - exit $ret - fi -} - -# func_missing_arg argname -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $opt_debug - - func_error "missing argument for $1." - exit_cmd=exit -} - - -# func_split_short_opt shortopt -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -func_split_short_opt () -{ - my_sed_short_opt='1s/^\(..\).*$/\1/;q' - my_sed_short_rest='1s/^..\(.*\)$/\1/;q' - - func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` - func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` -} # func_split_short_opt may be replaced by extended shell implementation - - -# func_split_long_opt longopt -# Set func_split_long_opt_name and func_split_long_opt_arg shell -# variables after splitting LONGOPT at the `=' sign. -func_split_long_opt () -{ - my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' - my_sed_long_arg='1s/^--[^=]*=//' - - func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` - func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` -} # func_split_long_opt may be replaced by extended shell implementation - -exit_cmd=: - - - - - -magic="%%%MAGIC variable%%%" -magic_exe="%%%MAGIC EXE variable%%%" - -# Global variables. -nonopt= -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" -extracted_archives= -extracted_serial=0 - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "${1}=\$${1}\${2}" -} # func_append may be replaced by extended shell implementation - -# func_append_quoted var value -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -func_append_quoted () -{ - func_quote_for_eval "${2}" - eval "${1}=\$${1}\\ \$func_quote_for_eval_result" -} # func_append_quoted may be replaced by extended shell implementation - - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "${@}"` -} # func_arith may be replaced by extended shell implementation - - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` -} # func_len may be replaced by extended shell implementation - - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` -} # func_lo2o may be replaced by extended shell implementation - - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` -} # func_xform may be replaced by extended shell implementation - - -# func_fatal_configuration arg... -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func_error ${1+"$@"} - func_error "See the $PACKAGE documentation for more information." - func_fatal_error "Fatal configuration error." -} - - -# func_config -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - -# func_features -# Display the features supported by this script. -func_features () -{ - echo "host: $host" - if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - - exit $? -} - -# func_enable_tag tagname -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname="$1" - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf="/$re_begincf/,/$re_endcf/p" - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# Shorthand for --mode=foo, only valid as the first argument -case $1 in -clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; -compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; -execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; -finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; -install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; -link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; -uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; -esac - - - -# Option defaults: -opt_debug=: -opt_dry_run=false -opt_config=false -opt_preserve_dup_deps=false -opt_features=false -opt_finish=false -opt_help=false -opt_help_all=false -opt_silent=: -opt_verbose=: -opt_silent=false -opt_verbose=false - - -# Parse options once, thoroughly. This comes as soon as possible in the -# script to make things like `--version' happen as quickly as we can. -{ - # this just eases exit handling - while test $# -gt 0; do - opt="$1" - shift - case $opt in - --debug|-x) opt_debug='set -x' - func_echo "enabling shell trace mode" - $opt_debug - ;; - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - --config) - opt_config=: -func_config - ;; - --dlopen|-dlopen) - optarg="$1" - opt_dlopen="${opt_dlopen+$opt_dlopen -}$optarg" - shift - ;; - --preserve-dup-deps) - opt_preserve_dup_deps=: - ;; - --features) - opt_features=: -func_features - ;; - --finish) - opt_finish=: -set dummy --mode finish ${1+"$@"}; shift - ;; - --help) - opt_help=: - ;; - --help-all) - opt_help_all=: -opt_help=': help-all' - ;; - --mode) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_mode="$optarg" -case $optarg in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; -esac - shift - ;; - --no-silent|--no-quiet) - opt_silent=false -func_append preserve_args " $opt" - ;; - --no-verbose) - opt_verbose=false -func_append preserve_args " $opt" - ;; - --silent|--quiet) - opt_silent=: -func_append preserve_args " $opt" - opt_verbose=false - ;; - --verbose|-v) - opt_verbose=: -func_append preserve_args " $opt" -opt_silent=false - ;; - --tag) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_tag="$optarg" -func_append preserve_args " $opt $optarg" -func_enable_tag "$optarg" - shift - ;; - - -\?|-h) func_usage ;; - --help) func_help ;; - --version) func_version ;; - - # Separate optargs to long options: - --*=*) - func_split_long_opt "$opt" - set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-n*|-v*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) break ;; - -*) func_fatal_help "unrecognized option \`$opt'" ;; - *) set dummy "$opt" ${1+"$@"}; shift; break ;; - esac - done - - # Validate options: - - # save first non-option argument - if test "$#" -gt 0; then - nonopt="$opt" - shift - fi - - # preserve --debug - test "$opt_debug" = : || func_append preserve_args " --debug" - - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - - $opt_help || { - # Sanity checks first: - func_check_version_match - - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" - fi - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test "$opt_mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$opt_mode' for more information." - } - - - # Bail if the options were screwed - $exit_cmd $EXIT_FAILURE -} - - - - -## ----------- ## -## Main. ## -## ----------- ## - -# func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if `file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case "$lalib_p_line" in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test "$lalib_p" = yes -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - func_lalib_p "$1" -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $opt_debug - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$save_ifs - eval cmd=\"$cmd\" - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE and FILE.exe exist: automatic-append-.exe -# behavior happens only for exec(3), not for open(2)! Also, sourcing -# `FILE.' does not work on cygwin managed mounts. -func_source () -{ - $opt_debug - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result - ;; - esac -} - -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case "$lt_sysroot:$1" in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result="=$func_stripname_result" - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - $opt_debug - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case "$@ " in - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' - else - write_lobj=none - fi - - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T <<EOF -# $write_libobj - a libtool object file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# Name of the PIC object. -pic_object=$write_lobj - -# Name of the non-PIC object -non_pic_object=$write_oldobj - -EOF - $MV "${write_libobj}T" "${write_libobj}" - } -} - - -################################################## -# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # -################################################## - -# func_convert_core_file_wine_to_w32 ARG -# Helper function used by file name conversion functions when $build is *nix, -# and $host is mingw, cygwin, or some other w32 environment. Relies on a -# correctly configured wine environment available, with the winepath program -# in $build's $PATH. -# -# ARG is the $build file name to be converted to w32 format. -# Result is available in $func_convert_core_file_wine_to_w32_result, and will -# be empty on error (or when ARG is empty) -func_convert_core_file_wine_to_w32 () -{ - $opt_debug - func_convert_core_file_wine_to_w32_result="$1" - if test -n "$1"; then - # Unfortunately, winepath does not exit with a non-zero error code, so we - # are forced to check the contents of stdout. On the other hand, if the - # command is not found, the shell will set an exit code of 127 and print - # *an error message* to stdout. So we must check for both error code of - # zero AND non-empty stdout, which explains the odd construction: - func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` - if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$lt_sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= - fi - fi -} -# end: func_convert_core_file_wine_to_w32 - - -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $opt_debug - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result="" - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result" ; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi - fi - done - IFS=$oldIFS - fi -} -# end: func_convert_core_path_wine_to_w32 - - -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $opt_debug - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" - fi -} -#end: func_cygpath - - -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $opt_debug - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $opt_debug - if test -z "$2" && test -n "$1" ; then - func_error "Could not determine host file name corresponding to" - func_error " \`$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result="$1" - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $opt_debug - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " \`$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result="$3" - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $opt_debug - case $4 in - $1 ) func_to_host_path_result="$3$func_to_host_path_result" - ;; - esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep - - -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via `$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. - - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $opt_debug - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $opt_debug - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 - ;; - *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result - ;; - esac -} -# end func_to_tool_file - - -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result="$1" -} -# end func_convert_file_noop - - -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result="$func_convert_core_msys_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 - - -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via `$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $opt_debug - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd="func_convert_path_${func_stripname_result}" - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $opt_debug - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result="$1" -} -# end func_convert_path_noop - - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_msys_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 - - -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - - -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 - - -# func_convert_path_msys_to_cygwin ARG -# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_path_msys_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_msys_to_cygwin - - -# func_convert_path_nix_to_cygwin ARG -# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a -# a wine environment, working winepath, and LT_CYGPATH set. Returns result in -# func_to_host_file_result. -func_convert_path_nix_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_nix_to_cygwin - - -# func_mode_compile arg... -func_mode_compile () -{ - $opt_debug - # Get the compilation command and the source file. - base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - pie_flag= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg="$arg" - arg_mode=normal - ;; - - target ) - libobj="$arg" - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - test -n "$libobj" && \ - func_fatal_error "you cannot specify \`-o' more than once" - arg_mode=target - continue - ;; - - -pie | -fpie | -fPIE) - func_append pie_flag " $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - func_append later " $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - func_append_quoted lastarg "$arg" - done - IFS="$save_ifs" - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result - - # Add the arguments to base_compile. - func_append base_compile " $lastarg" - continue - ;; - - *) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg="$srcfile" - srcfile="$arg" - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - func_append_quoted base_compile "$lastarg" - done # for arg - - case $arg_mode in - arg) - func_fatal_error "you must specify an argument for -Xcompile" - ;; - target) - func_fatal_error "you must specify a target with \`-o'" - ;; - *) - # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj="$func_basename_result" - } - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) - func_xform "$libobj" - libobj=$func_xform_result - ;; - esac - - case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; - *) - func_fatal_error "cannot determine name of library object from \`$libobj'" - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - continue - ;; - - -static) - build_libtool_libs=no - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname="$func_basename_result" - xdir="$func_dirname_result" - lobj=${xdir}$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - pic_mode=default - ;; - esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - $ECHO "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - func_append removelist " $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test "$pic_mode" != no; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - func_append command " -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test "$suppress_opt" = yes; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test "$compiler_c_o" = yes; then - func_append command " -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - func_append command "$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test "$need_locks" = warn && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { - test "$opt_mode" = compile && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $opt_mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - - compile) - $ECHO \ -"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to build PIC objects only - -prefer-non-pic try to build non-PIC objects only - -shared do not build a \`.o' file suitable for static linking - -static only build a \`.o' file suitable for static linking - -Wc,FLAG pass FLAG directly to the compiler - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - - execute) - $ECHO \ -"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - - finish) - $ECHO \ -"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - - install) - $ECHO \ -"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The following components of INSTALL-COMMAND are treated specially: - - -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -bindir BINDIR specify path to binaries directory (for systems where - libraries must be found in the PATH setting at runtime) - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -Wc,FLAG - -Xcompiler FLAG pass linker-specific FLAG directly to the compiler - -Wl,FLAG - -Xlinker FLAG pass linker-specific FLAG directly to the linker - -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - - uninstall) - $ECHO \ -"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - - *) - func_fatal_help "invalid operation mode \`$opt_mode'" - ;; - esac - - echo - $ECHO "Try \`$progname --help' for more information about other modes." -} - -# Now that we've collected a possible --mode arg, show help if necessary -if $opt_help; then - if test "$opt_help" = :; then - func_mode_help - else - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - func_mode_help - done - } | sed -n '1p; 2,$s/^Usage:/ or: /p' - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - echo - func_mode_help - done - } | - sed '1d - /^When reporting/,/^Report/{ - H - d - } - $x - /information about other modes/d - /more detailed .*MODE/d - s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' - fi - exit $? -fi - - -# func_mode_execute arg... -func_mode_execute () -{ - $opt_debug - # The first argument is the command name. - cmd="$nonopt" - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $opt_dlopen; do - test -f "$file" \ - || func_fatal_help "\`$file' is not a file" - - dir= - case $file in - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "\`$file' was not linked with \`-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir="$func_dirname_result" - - if test -f "$dir/$objdir/$dlname"; then - func_append dir "/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir="$func_dirname_result" - ;; - - *) - func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -* | *.la | *.lo ) ;; - *) - # Do a test to see if this is really a libtool program. - if func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file="$progdir/$program" - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_append_quoted args "$file" - done - - if test "X$opt_dry_run" = Xfalse; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # Now prepare to actually exec the command. - exec_cmd="\$cmd$args" - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - echo "export $shlibpath_var" - fi - $ECHO "$cmd$args" - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = execute && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $opt_debug - libs= - libdirs= - admincmds= - - for opt in "$nonopt" ${1+"$@"} - do - if test -d "$opt"; then - func_append libdirs " $opt" - - elif test -f "$opt"; then - if func_lalib_unsafe_p "$opt"; then - func_append libs " $opt" - else - func_warning "\`$opt' is not a valid libtool archive" - fi - - else - func_fatal_error "invalid argument \`$opt'" - fi - done - - if test -n "$libs"; then - if test -n "$lt_sysroot"; then - sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` - sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" - else - sysroot_cmd= - fi - - # Remove sysroot references - if $opt_dry_run; then - for lib in $libs; do - echo "removing references to $lt_sysroot and \`=' prefixes from $lib" - done - else - tmpdir=`func_mktempdir` - for lib in $libs; do - sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ - > $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_silent && exit $EXIT_SUCCESS - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $ECHO " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - echo - - echo "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" - echo "pages." - ;; - *) - echo "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - echo "----------------------------------------------------------------------" - fi - exit $EXIT_SUCCESS -} - -test "$opt_mode" = finish && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $opt_debug - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac; then - # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_for_eval "$arg" - func_append install_prog "$func_quote_for_eval_result" - install_shared_prog=$install_prog - case " $install_prog " in - *[\\\ /]cp\ *) install_cp=: ;; - *) install_cp=false ;; - esac - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - no_mode=: - for arg - do - arg2= - if test -n "$dest"; then - func_append files " $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) - if $install_cp; then :; else - prev=$arg - fi - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - if test "x$prev" = x-m && test -n "$install_override_mode"; then - arg2=$install_override_mode - no_mode=false - fi - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" - if test -n "$arg2"; then - func_quote_for_eval "$arg2" - fi - func_append install_shared_prog " $func_quote_for_eval_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the \`$prev' option requires an argument" - - if test -n "$install_override_mode" && $no_mode; then - if $install_cp; then :; else - func_quote_for_eval "$install_override_mode" - func_append install_shared_prog " -m $func_quote_for_eval_result" - fi - fi - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "\`$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "\`$destdir' must be an absolute directory name" - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - func_append staticlibs " $file" - ;; - - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir="$func_dirname_result" - func_append dir "$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking \`$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname="$1" - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme="$stripme" - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme="" - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_eval "$striplib $destdir/$realname" 'exit $?' - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name="$func_basename_result" - instname="$dir/$name"i - func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && func_append staticlibs " $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - $opt_dry_run || { - if test "$finalize" = yes; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_silent || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink \`$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file="$outputname" - else - func_warning "cannot relink \`$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name="$func_basename_result" - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = install && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $opt_debug - my_outputname="$1" - my_originator="$2" - my_pic_p="${3-no}" - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) -#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" -#endif - -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $opt_dry_run || { - $RM $export_symbols - eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" - func_basename "$dlprefile" - name="$func_basename_result" - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename="" - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname" ; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename="$func_basename_result" - else - # no lafile. user explicitly requested -dlpreopen <import library>. - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename" ; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac - done - - $opt_dry_run || { - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $MV "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if $GREP -v "^: " < "$nlist" | - if sort -k 3 </dev/null >/dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - $GREP -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - echo >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - echo >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - if test "X$my_pic_p" != Xno; then - pic_flag_for_symtable=" $pic_flag" - fi - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' - - # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` - fi -} - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -# Despite the name, also deal with 64 bit binaries. -func_win32_libid () -{ - $opt_debug - win32_libid_type="unknown" - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $SED -n -e ' - 1,100{ - / I /{ - s,.*,import, - p - q - } - }'` - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $ECHO "$win32_libid_type" -} - -# func_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $opt_debug - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $opt_debug - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive which possess that section. Heuristic: eliminate - # all those which have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $opt_debug - if func_cygming_gnu_implib_p "$1" ; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1" ; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result="" - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $opt_debug - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - if test "$lock_old_archive_extraction" = yes; then - lockfile=$f_ex_an_ar_oldlib.lock - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - fi - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ - 'stat=$?; rm -f "$lockfile"; exit $stat' - if test "$lock_old_archive_extraction" = yes; then - $opt_dry_run || rm -f "$lockfile" - fi - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $opt_debug - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - func_basename "$my_xlib" - my_xlib="$func_basename_result" - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" - $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" - cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" - func_extract_an_archive "`pwd`" "${darwin_base_archive}" - cd "$darwin_curdir" - $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" - done # $darwin_arches - ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` - done - - func_extract_archives_result="$my_oldobjs" -} - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=${1-no} - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variables: - generated_by_libtool_version='$macro_version' - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$ECHO are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - file=\"\$0\"" - - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` - $ECHO "\ - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - ECHO=\"$qECHO\" - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ which is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options which match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's $0 value, followed by "$@". -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=\$0 - shift - for lt_opt - do - case \"\$lt_opt\" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` - test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. - lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` - cat \"\$lt_dump_D/\$lt_dump_F\" - exit 0 - ;; - --lt-*) - \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n \"\$lt_option_debug\"; then - echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" - lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from \$@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done - func_exec_program_core \${1+\"\$@\"} -} - - # Parse options - func_parse_lt_options \"\$0\" \${1+\"\$@\"} - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $ECHO "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $MKDIR \"\$progdir\" - else - $RM \"\$progdir/\$file\" - fi" - - $ECHO "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $ECHO \"\$relink_command_output\" >&2 - $RM \"\$progdir/\$file\" - exit 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` - - export $shlibpath_var -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - func_exec_program \${1+\"\$@\"} - fi - else - # The program doesn't exist. - \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 - \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" -} - - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat <<EOF - -/* $cwrappersource - temporary wrapper executable for $objdir/$outputname - Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION - - The $output program cannot be directly executed until all the libtool - libraries that it depends on are installed. - - This wrapper executable should never be moved out of the build directory. - If it is, it will not operate correctly. -*/ -EOF - cat <<"EOF" -#ifdef _MSC_VER -# define _CRT_SECURE_NO_DEPRECATE 1 -#endif -#include <stdio.h> -#include <stdlib.h> -#ifdef _MSC_VER -# include <direct.h> -# include <process.h> -# include <io.h> -#else -# include <unistd.h> -# include <stdint.h> -# ifdef __CYGWIN__ -# include <io.h> -# endif -#endif -#include <malloc.h> -#include <stdarg.h> -#include <assert.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/stat.h> - -/* declarations of non-ANSI functions */ -#if defined(__MINGW32__) -# ifdef __STRICT_ANSI__ -int _putenv (const char *); -# endif -#elif defined(__CYGWIN__) -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -/* #elif defined (other platforms) ... */ -#endif - -/* portability defines, excluding path handling macros */ -#if defined(_MSC_VER) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -# define S_IXUSR _S_IEXEC -# ifndef _INTPTR_T_DEFINED -# define _INTPTR_T_DEFINED -# define intptr_t int -# endif -#elif defined(__MINGW32__) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -#elif defined(__CYGWIN__) -# define HAVE_SETENV -# define FOPEN_WB "wb" -/* #elif defined (other platforms) ... */ -#endif - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -/* path handling portability macros */ -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) -# define HAVE_DOS_BASED_FILE_SYSTEM -# define FOPEN_WB "wb" -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -#if defined(LT_DEBUGWRAPPER) -static int lt_debug = 1; -#else -static int lt_debug = 0; -#endif - -const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *file, int line, const char *fmt, ...); -void lt_fatal (const char *file, int line, const char *message, ...); -static const char *nonnull (const char *s); -static const char *nonempty (const char *s); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); -char **prepare_spawn (char **argv); -void lt_dump_script (FILE *f); -EOF - - cat <<EOF -volatile const char * MAGIC_EXE = "$magic_exe"; -const char * LIB_PATH_VARNAME = "$shlibpath_var"; -EOF - - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - func_to_host_path "$temp_rpath" - cat <<EOF -const char * LIB_PATH_VALUE = "$func_to_host_path_result"; -EOF - else - cat <<"EOF" -const char * LIB_PATH_VALUE = ""; -EOF - fi - - if test -n "$dllsearchpath"; then - func_to_host_path "$dllsearchpath:" - cat <<EOF -const char * EXE_PATH_VARNAME = "PATH"; -const char * EXE_PATH_VALUE = "$func_to_host_path_result"; -EOF - else - cat <<"EOF" -const char * EXE_PATH_VARNAME = ""; -const char * EXE_PATH_VALUE = ""; -EOF - fi - - if test "$fast_install" = yes; then - cat <<EOF -const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ -EOF - else - cat <<EOF -const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ -EOF - fi - - - cat <<"EOF" - -#define LTWRAPPER_OPTION_PREFIX "--lt-" - -static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; -static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; -static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; - -int -main (int argc, char *argv[]) -{ - char **newargz; - int newargc; - char *tmp_pathspec; - char *actual_cwrapper_path; - char *actual_cwrapper_name; - char *target_name; - char *lt_argv_zero; - intptr_t rval = 127; - - int i; - - program_name = (char *) xstrdup (base_name (argv[0])); - newargz = XMALLOC (char *, argc + 1); - - /* very simple arg parsing; don't want to rely on getopt - * also, copy all non cwrapper options to newargz, except - * argz[0], which is handled differently - */ - newargc=0; - for (i = 1; i < argc; i++) - { - if (strcmp (argv[i], dumpscript_opt) == 0) - { -EOF - case "$host" in - *mingw* | *cygwin* ) - # make stdout use "unix" line endings - echo " setmode(1,_O_BINARY);" - ;; - esac - - cat <<"EOF" - lt_dump_script (stdout); - return 0; - } - if (strcmp (argv[i], debug_opt) == 0) - { - lt_debug = 1; - continue; - } - if (strcmp (argv[i], ltwrapper_option_prefix) == 0) - { - /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX - namespace, but it is not one of the ones we know about and - have already dealt with, above (inluding dump-script), then - report an error. Otherwise, targets might begin to believe - they are allowed to use options in the LTWRAPPER_OPTION_PREFIX - namespace. The first time any user complains about this, we'll - need to make LTWRAPPER_OPTION_PREFIX a configure-time option - or a configure.ac-settable value. - */ - lt_fatal (__FILE__, __LINE__, - "unrecognized %s option: '%s'", - ltwrapper_option_prefix, argv[i]); - } - /* otherwise ... */ - newargz[++newargc] = xstrdup (argv[i]); - } - newargz[++newargc] = NULL; - -EOF - cat <<EOF - /* The GNU banner must be the first non-error debug message */ - lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n"); -EOF - cat <<"EOF" - lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); - lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); - - tmp_pathspec = find_executable (argv[0]); - if (tmp_pathspec == NULL) - lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]); - lt_debugprintf (__FILE__, __LINE__, - "(main) found exe (before symlink chase) at: %s\n", - tmp_pathspec); - - actual_cwrapper_path = chase_symlinks (tmp_pathspec); - lt_debugprintf (__FILE__, __LINE__, - "(main) found exe (after symlink chase) at: %s\n", - actual_cwrapper_path); - XFREE (tmp_pathspec); - - actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path)); - strendzap (actual_cwrapper_path, actual_cwrapper_name); - - /* wrapper name transforms */ - strendzap (actual_cwrapper_name, ".exe"); - tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); - XFREE (actual_cwrapper_name); - actual_cwrapper_name = tmp_pathspec; - tmp_pathspec = 0; - - /* target_name transforms -- use actual target program name; might have lt- prefix */ - target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); - strendzap (target_name, ".exe"); - tmp_pathspec = lt_extend_str (target_name, ".exe", 1); - XFREE (target_name); - target_name = tmp_pathspec; - tmp_pathspec = 0; - - lt_debugprintf (__FILE__, __LINE__, - "(main) libtool target name: %s\n", - target_name); -EOF - - cat <<EOF - newargz[0] = - XMALLOC (char, (strlen (actual_cwrapper_path) + - strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); - strcpy (newargz[0], actual_cwrapper_path); - strcat (newargz[0], "$objdir"); - strcat (newargz[0], "/"); -EOF - - cat <<"EOF" - /* stop here, and copy so we don't have to do this twice */ - tmp_pathspec = xstrdup (newargz[0]); - - /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ - strcat (newargz[0], actual_cwrapper_name); - - /* DO want the lt- prefix here if it exists, so use target_name */ - lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); - XFREE (tmp_pathspec); - tmp_pathspec = NULL; -EOF - - case $host_os in - mingw*) - cat <<"EOF" - { - char* p; - while ((p = strchr (newargz[0], '\\')) != NULL) - { - *p = '/'; - } - while ((p = strchr (lt_argv_zero, '\\')) != NULL) - { - *p = '/'; - } - } -EOF - ;; - esac - - cat <<"EOF" - XFREE (target_name); - XFREE (actual_cwrapper_path); - XFREE (actual_cwrapper_name); - - lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ - lt_setenv ("DUALCASE", "1"); /* for MSK sh */ - /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must - be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath) - because on Windows, both *_VARNAMEs are PATH but uninstalled - libraries must come first. */ - lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); - lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); - - lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", - nonnull (lt_argv_zero)); - for (i = 0; i < newargc; i++) - { - lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", - i, nonnull (newargz[i])); - } - -EOF - - case $host_os in - mingw*) - cat <<"EOF" - /* execv doesn't actually work on mingw as expected on unix */ - newargz = prepare_spawn (newargz); - rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); - if (rval == -1) - { - /* failed to start process */ - lt_debugprintf (__FILE__, __LINE__, - "(main) failed to launch target \"%s\": %s\n", - lt_argv_zero, nonnull (strerror (errno))); - return 127; - } - return rval; -EOF - ;; - *) - cat <<"EOF" - execv (lt_argv_zero, newargz); - return rval; /* =127, but avoids unused variable warning */ -EOF - ;; - esac - - cat <<"EOF" -} - -void * -xmalloc (size_t num) -{ - void *p = (void *) malloc (num); - if (!p) - lt_fatal (__FILE__, __LINE__, "memory exhausted"); - - return p; -} - -char * -xstrdup (const char *string) -{ - return string ? strcpy ((char *) xmalloc (strlen (string) + 1), - string) : NULL; -} - -const char * -base_name (const char *name) -{ - const char *base; - -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - /* Skip over the disk name in MSDOS pathnames. */ - if (isalpha ((unsigned char) name[0]) && name[1] == ':') - name += 2; -#endif - - for (base = name; *name; name++) - if (IS_DIR_SEPARATOR (*name)) - base = name + 1; - return base; -} - -int -check_executable (const char *path) -{ - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if ((stat (path, &st) >= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -char * -find_executable (const char *wrapper) -{ - int has_slash = 0; - const char *p; - const char *p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - int tmp_len; - char *concat_name; - - lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", - nonempty (wrapper)); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char *path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char *q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR (*q)) - break; - p_len = q - p; - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = - XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = - XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - return NULL; -} - -char * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - lt_debugprintf (__FILE__, __LINE__, - "checking path component for symlinks: %s\n", - tmp_pathspec); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - lt_fatal (__FILE__, __LINE__, - "error accessing file \"%s\": %s", - tmp_pathspec, nonnull (strerror (errno))); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal (__FILE__, __LINE__, - "could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -char * -strendzap (char *str, const char *pat) -{ - size_t len, patlen; - - assert (str != NULL); - assert (pat != NULL); - - len = strlen (str); - patlen = strlen (pat); - - if (patlen <= len) - { - str += len - patlen; - if (strcmp (str, pat) == 0) - *str = '\0'; - } - return str; -} - -void -lt_debugprintf (const char *file, int line, const char *fmt, ...) -{ - va_list args; - if (lt_debug) - { - (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); - } -} - -static void -lt_error_core (int exit_status, const char *file, - int line, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *file, int line, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); - va_end (ap); -} - -static const char * -nonnull (const char *s) -{ - return s ? s : "(null)"; -} - -static const char * -nonempty (const char *s) -{ - return (s && !*s) ? "(empty)" : nonnull (s); -} - -void -lt_setenv (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_setenv) setting '%s' to '%s'\n", - nonnull (name), nonnull (value)); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - int len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - int orig_value_len = strlen (orig_value); - int add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - int len = strlen (new_value); - while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[len-1] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -EOF - case $host_os in - mingw*) - cat <<"EOF" - -/* Prepares an argument vector before calling spawn(). - Note that spawn() does not by itself call the command interpreter - (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : - ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&v); - v.dwPlatformId == VER_PLATFORM_WIN32_NT; - }) ? "cmd.exe" : "command.com"). - Instead it simply concatenates the arguments, separated by ' ', and calls - CreateProcess(). We must quote the arguments since Win32 CreateProcess() - interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a - special way: - - Space and tab are interpreted as delimiters. They are not treated as - delimiters if they are surrounded by double quotes: "...". - - Unescaped double quotes are removed from the input. Their only effect is - that within double quotes, space and tab are treated like normal - characters. - - Backslashes not followed by double quotes are not special. - - But 2*n+1 backslashes followed by a double quote become - n backslashes followed by a double quote (n >= 0): - \" -> " - \\\" -> \" - \\\\\" -> \\" - */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -char ** -prepare_spawn (char **argv) -{ - size_t argc; - char **new_argv; - size_t i; - - /* Count number of arguments. */ - for (argc = 0; argv[argc] != NULL; argc++) - ; - - /* Allocate new argument vector. */ - new_argv = XMALLOC (char *, argc + 1); - - /* Put quoted arguments into the new argument vector. */ - for (i = 0; i < argc; i++) - { - const char *string = argv[i]; - - if (string[0] == '\0') - new_argv[i] = xstrdup ("\"\""); - else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) - { - int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); - size_t length; - unsigned int backslashes; - const char *s; - char *quoted_string; - char *p; - - length = 0; - backslashes = 0; - if (quote_around) - length++; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - length += backslashes + 1; - length++; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - length += backslashes + 1; - - quoted_string = XMALLOC (char, length + 1); - - p = quoted_string; - backslashes = 0; - if (quote_around) - *p++ = '"'; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - { - unsigned int j; - for (j = backslashes + 1; j > 0; j--) - *p++ = '\\'; - } - *p++ = c; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - { - unsigned int j; - for (j = backslashes; j > 0; j--) - *p++ = '\\'; - *p++ = '"'; - } - *p = '\0'; - - new_argv[i] = quoted_string; - } - else - new_argv[i] = (char *) string; - } - new_argv[argc] = NULL; - - return new_argv; -} -EOF - ;; - esac - - cat <<"EOF" -void lt_dump_script (FILE* f) -{ -EOF - func_emit_wrapper yes | - $SED -e 's/\([\\"]\)/\\\1/g' \ - -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' - - cat <<"EOF" -} -EOF -} -# end: func_emit_cwrapperexe_src - -# func_win32_import_lib_p ARG -# True if ARG is an import lib, as indicated by $file_magic_cmd -func_win32_import_lib_p () -{ - $opt_debug - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $opt_debug - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - bindir= - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module="${wl}-single_module" - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg="$1" - shift - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - bindir) - bindir="$arg" - prev= - continue - ;; - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" - preload=yes - fi - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - func_append dlfiles " $arg" - else - func_append dlprefiles " $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) func_append deplibs " $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# func_append moreargs " $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file \`$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - precious_regex) - precious_files_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) func_append rpath " $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) func_append xrpath " $arg" ;; - esac - fi - prev= - continue - ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - weak) - func_append weak_libs " $arg" - prev= - continue - ;; - xcclinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg="$arg" - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -bindir) - prev=bindir - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname "-L" '' "$arg" - if test -z "$func_stripname_result"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between \`-L' and \`$1'" - else - func_fatal_error "need path for \`-L' option" - fi - fi - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "* | *" $arg "*) - # Will only happen for absolute or sysroot arguments - ;; - *) - # Preserve sysroot, but never include relative directories - case $dir in - [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; - *) func_append deplibs " -L$dir" ;; - esac - func_append lib_search_path " $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) func_append dllsearchpath ":$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - func_append deplibs " System.ltframework" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test "X$arg" = "X-lc" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test "X$arg" = "X-lc" && continue - ;; - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - func_append deplibs " $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - continue - ;; - - -multi_module) - single_module="${wl}-multi_module" - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "\`-no-install' is ignored for $host" - func_warning "assuming \`-no-fast-install' instead" - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - =*) - func_stripname '=' '' "$dir" - dir=$lt_sysroot$func_stripname_result - ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $func_quote_for_eval_result" - func_append compiler_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $wl$func_quote_for_eval_result" - func_append compiler_flags " $wl$func_quote_for_eval_result" - func_append linker_flags " $func_quote_for_eval_result" - done - IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - # Flags to be passed through unchanged, with rationale: - # -64, -mips[0-9] enable 64-bit mode for the SGI compiler - # -r[0-9][0-9]* specify processor for the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler - # +DA*, +DD* enable 64-bit mode for the HP compiler - # -q* compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* architecture-specific flags for GCC - # -F/path path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* profiling flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-flto*|-fwhopr*|-fuse-linker-plugin) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append compiler_flags " $arg" - continue - ;; - - # Some other compiler flag. - -* | +*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - *.$objext) - # A standard object. - func_append objs " $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - ;; - - *.$libext) - # An archive. - func_append deplibs " $arg" - func_append old_deplibs " $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - func_resolve_sysroot "$arg" - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - func_append dlprefiles " $func_resolve_sysroot_result" - prev= - else - func_append deplibs " $func_resolve_sysroot_result" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname="$func_basename_result" - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" - func_to_tool_file "$output_objdir/" - tool_output_objdir=$func_to_tool_file_result - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if $opt_preserve_dup_deps ; then - case "$libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append libs " $deplib" - done - - if test "$linkmode" = lib; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if $opt_duplicate_compiler_generated_deps; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; - esac - func_append pre_post_deps " $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - - for pass in $passes; do - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test "$linkmode,$pass" = "lib,link"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs="$tmp_deplibs" - fi - - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" - deplibs= - fi - if test "$linkmode" = prog; then - case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; - link) - libs="$deplibs %DEPLIBS%" - test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" - ;; - esac - fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - func_resolve_sysroot "$lib" - case $lib in - *.la) func_source "$func_resolve_sysroot_result" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - func_basename "$deplib" - deplib_base=$func_basename_result - case " $weak_libs " in - *" $deplib_base "*) ;; - *) func_append deplibs " $deplib" ;; - esac - done - done - libs="$dlprefiles" - fi - if test "$pass" = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi - - for deplib in $libs; do - lib= - found=no - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append compiler_flags " $deplib" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test "$linkmode" = lib; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib="$searchdir/lib${name}${search_ext}" - if test -f "$lib"; then - if test "$search_ext" = ".la"; then - found=yes - else - found=no - fi - break 2 - fi - done - done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - else # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $deplib "*) - if func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - for l in $old_library $library_names; do - ll="$l" - done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - fi - ;; # -l - *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - prog) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - if test "$pass" = scan; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - *) - func_warning "\`-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - func_stripname '-R' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) - func_resolve_sysroot "$deplib" - lib=$func_resolve_sysroot_result - ;; - *.$libext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=yes - fi - ;; - pass_all) - valid_a_lib=yes - ;; - esac - if test "$valid_a_lib" != yes; then - echo - $ECHO "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not use here." - else - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - ;; - esac - continue - ;; - prog) - if test "$pass" != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - func_append newdlprefiles " $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append newdlfiles " $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - - if test "$found" = yes || test -f "$lib"; then : - else - func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" - fi - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "\`$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir="$func_dirname_result" - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" - fi - - if test "$pass" = conv; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - # It is a libtool convenience library, so add in its objects. - func_append convenience " $ladir/$objdir/$old_library" - func_append old_convenience " $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done - elif test "$linkmode" != prog && test "$linkmode" != lib; then - func_fatal_error "\`$lib' is not a convenience library" - fi - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - if test -n "$old_library" && - { test "$prefer_static_libs" = yes || - test "$prefer_static_libs,$installed" = "built,no"; }; then - linklib=$old_library - else - for l in $old_library $library_names; do - linklib="$l" - done - fi - if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for \`$lib'" - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - func_fatal_error "cannot -dlopen a convenience library: \`$lib'" - fi - if test -z "$dlname" || - test "$dlopen_support" != yes || - test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - func_append dlprefiles " $lib $dependency_libs" - else - func_append newdlfiles " $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of \`$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir="$ladir" - fi - ;; - esac - func_basename "$lib" - laname="$func_basename_result" - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library \`$lib' was moved." - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$lt_sysroot$libdir" - absdir="$lt_sysroot$libdir" - fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir="$ladir" - absdir="$abs_ladir" - # Remove this search path later - func_append notinst_path " $abs_ladir" - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - func_append notinst_path " $abs_ladir" - fi - fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir" && test "$linkmode" = prog; then - func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" - fi - case "$host" in - # special handling for platforms with PE-DLLs. - *cygwin* | *mingw* | *cegcc* ) - # Linker will automatically link against shared library if both - # static and shared are present. Therefore, ensure we extract - # symbols from the import library if a shared library is present - # (otherwise, the dlopen module name will be incorrect). We do - # this by putting the import library name into $newdlprefiles. - # We recover the dlopen module name by 'saving' the la file - # name in a special purpose variable, and (later) extracting the - # dlname from the la file. - if test -n "$dlname"; then - func_tr_sh "$dir/$linklib" - eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" - func_append newdlprefiles " $dir/$linklib" - else - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - fi - ;; - * ) - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - func_append newdlprefiles " $dir/$dlname" - else - func_append newdlprefiles " $dir/$linklib" - fi - ;; - esac - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test "$linkmode" = lib; then - deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test "$linkmode" = prog && test "$pass" != link; then - func_append newlib_search_path " $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - esac - # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { { test "$prefer_static_libs" = no || - test "$prefer_static_libs,$installed" = "built,yes"; } || - test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath:" in - *"$absdir:"*) ;; - *) func_append temp_rpath "$absdir:" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test "$use_static_libs" = built && test "$installed" = yes; then - use_static_libs=no - fi - if test -n "$library_names" && - { test "$use_static_libs" = no || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test "$installed" = no; then - func_append notinst_deplibs " $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" - break - fi - done - if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then - echo - if test "$linkmode" = prog; then - $ECHO "*** Warning: Linking the executable $output against the loadable module" - else - $ECHO "*** Warning: Linking the shared library $output against the loadable module" - fi - $ECHO "*** $linklib is not portable!" - fi - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - shift - realname="$1" - shift - libname=`eval "\\$ECHO \"$libname_spec\""` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname="$dlname" - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw* | *cegcc*) - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - func_basename "$soroot" - soname="$func_basename_result" - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from \`$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for \`$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test "$linkmode" = prog || test "$opt_mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" - case $host in - *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; - *-*-sysv4*uw2*) add_dir="-L$dir" ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir="-L$dir" ;; - *-*-darwin* ) - # if the lib is a (non-dlopened) module then we can not - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then - if test "X$dlopenmodule" != "X$lib"; then - $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then - echo - echo "*** And there doesn't seem to be a static archive available" - echo "*** The link will probably fail, sorry" - else - add="$dir/$old_library" - fi - elif test -n "$old_library"; then - add="$dir/$old_library" - fi - fi - esac - elif test "$hardcode_minus_L" = no; then - case $host in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$dir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - func_fatal_configuration "unsupported hardcode properties" - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) func_append compile_shlibpath "$add_shlibpath:" ;; - esac - fi - if test "$linkmode" = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && - test "$hardcode_minus_L" != yes && - test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - fi - fi - fi - - if test "$linkmode" = prog || test "$opt_mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - add="-l$name" - elif test "$hardcode_automatic" = yes; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" - else - add="$libdir/$linklib" - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - fi - - if test "$linkmode" = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test "$linkmode" = prog; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - $ECHO "*** Warning: This system can not link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test "$linkmode" = lib; then - if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || - test "$build_old_libs" = yes || - test "$link_static" = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) func_append xrpath " $temp_xrpath";; - esac;; - *) func_append temp_deplibs " $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - func_append newlib_search_path " $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result";; - *) func_resolve_sysroot "$deplib" ;; - esac - if $opt_preserve_dup_deps ; then - case "$tmp_libs " in - *" $func_resolve_sysroot_result "*) - func_append specialdeplibs " $func_resolve_sysroot_result" ;; - esac - fi - func_append tmp_libs " $func_resolve_sysroot_result" - done - - if test "$link_all_deplibs" != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - path= - case $deplib in - -L*) path="$deplib" ;; - *.la) - func_resolve_sysroot "$deplib" - deplib=$func_resolve_sysroot_result - func_dirname "$deplib" "" "." - dir=$func_dirname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of \`$dir'" - absdir="$dir" - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names" ; then - for tmp in $deplibrary_names ; do - depdepl=$tmp - done - if test -f "$absdir/$objdir/$depdepl" ; then - depdepl="$absdir/$objdir/$depdepl" - darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" - path= - fi - fi - ;; - *) - path="-L$absdir/$objdir" - ;; - esac - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" - - path="-L$absdir" - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) func_append lib_search_path " $dir" ;; - esac - done - newlib_search_path= - fi - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) func_append tmp_libs " $deplib" ;; - esac - ;; - *) func_append tmp_libs " $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs ; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i="" - ;; - esac - if test -n "$i" ; then - func_append tmp_libs " $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" - fi - if test "$linkmode" = prog || test "$linkmode" = lib; then - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "\`-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - func_append objs "$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" - - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" - else - echo - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - func_append libobjs " $objs" - fi - fi - - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test "$#" -gt 1 && \ - func_warning "ignoring multiple \`-rpath's for a libtool library" - - install_libdir="$1" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - shift - IFS="$save_ifs" - - test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major="$1" - number_minor="$2" - number_revision="$3" - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # which has an extra 1 added just for fun - # - case $version_type in - darwin|linux|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|qnx|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age="$number_minor" - revision="$number_minor" - lt_irix_increment=no - ;; - *) - func_fatal_configuration "$modename: unknown library version type \`$version_type'" - ;; - esac - ;; - no) - current="$1" - revision="$2" - age="$3" - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "CURRENT \`$current' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "REVISION \`$revision' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "AGE \`$age' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE \`$age' is greater than the current interface number \`$current'" - func_fatal_error "\`$vinfo' is not valid version information" - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current" - ;; - - irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring="$verstring_prefix$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test "$loop" -ne 0; do - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) - func_arith $current - $age - major=.$func_arith_result - versuffix="$major.$age.$revision" - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test "$loop" -ne 0; do - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - func_append verstring ":${current}.0" - ;; - - qnx) - major=".$current" - versuffix=".$current" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - func_arith $current - $age - major=$func_arith_result - versuffix="-$major" - ;; - - *) - func_fatal_configuration "unknown library version type \`$version_type'" - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring="0.0" - ;; - esac - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - func_warning "undefined symbols not allowed in $host shared libraries" - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - - fi - - func_generate_dlsyms "$libname" "$libname" "yes" - func_append libobjs " $symfileobj" - test "X$libobjs" = "X " && libobjs= - - if test "$opt_mode" != relink; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$ECHO "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext | *.gcno) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - if test "X$precious_files_regex" != "X"; then - if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - func_append removelist " $p" - ;; - *) ;; - esac - done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - func_append oldlibs " $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` - # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` - # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` - #done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - func_replace_sysroot "$libdir" - func_append temp_xrpath " -R$func_replace_sysroot_result" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) func_append dlfiles " $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) func_append dlprefiles " $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - func_append deplibs " System.ltframework" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then - func_append deplibs " -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $opt_dry_run || $RM conftest.c - cat > conftest.c <<EOF - int main() { return 0; } -EOF - $opt_dry_run || $RM conftest - if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then - ldd_output=`ldd conftest` - for i in $deplibs; do - case $i in - -l*) - func_stripname -l '' "$i" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $i "*) - func_append newdeplibs " $i" - i="" - ;; - esac - fi - if test -n "$i" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` - set dummy $deplib_matches; shift - deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - func_append newdeplibs " $i" - else - droppeddeps=yes - echo - $ECHO "*** Warning: dynamic linker does not accept needed library $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which I believe you do not have" - echo "*** because a test_compile did reveal that the linker did not use it for" - echo "*** its dynamic dependency list that programs get resolved with at runtime." - fi - fi - ;; - *) - func_append newdeplibs " $i" - ;; - esac - done - else - # Error occurred in the first compile. Let's try to salvage - # the situation: Compile a separate program for each library. - for i in $deplibs; do - case $i in - -l*) - func_stripname -l '' "$i" - name=$func_stripname_result - $opt_dry_run || $RM conftest - if $LTCC $LTCFLAGS -o conftest conftest.c $i; then - ldd_output=`ldd conftest` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $i "*) - func_append newdeplibs " $i" - i="" - ;; - esac - fi - if test -n "$i" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` - set dummy $deplib_matches; shift - deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then - func_append newdeplibs " $i" - else - droppeddeps=yes - echo - $ECHO "*** Warning: dynamic linker does not accept needed library $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because a test_compile did reveal that the linker did not use this one" - echo "*** as a dynamic dependency that programs can get resolved with at runtime." - fi - fi - else - droppeddeps=yes - echo - $ECHO "*** Warning! Library $i is needed by this library but I was not able to" - echo "*** make it link in! You will probably need to install it or some" - echo "*** library that it depends on before this library will be fully" - echo "*** functional. Installing it before continuing would be even better." - fi - ;; - *) - func_append newdeplibs " $i" - ;; - esac - done - fi - ;; - file_magic*) - set dummy $deplibs_check_method; shift - file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - if test -n "$file_magic_glob"; then - libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` - else - libnameglob=$libname - fi - test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - if test "$want_nocaseglob" = yes; then - shopt -s nocaseglob - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null | - $GREP " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for file magic test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a file magic. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test - if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ - $EGREP "$match_pattern_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a regex pattern. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` - done - fi - case $tmp_deplibs in - *[!\ \ ]*) - echo - if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - ;; - esac - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - - if test "$allow_undefined" = no; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - deplibs="$new_libs" - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - if test "$hardcode_into_libs" = yes; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$opt_mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_apped perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - if test -n "$hardcode_libdir_flag_spec_ld"; then - eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" - else - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - shift - realname="$1" - shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib="$output_objdir/$realname" - linknames= - for link - do - func_append linknames " $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols="$output_objdir/$libname.uexp" - func_append delfiles " $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols="$export_symbols" - export_symbols= - always_export_symbols=yes - fi - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' - for cmd1 in $cmds; do - IFS="$save_ifs" - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test "$try_normal_branch" = yes \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=${output_objdir}/${output_la}.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" - func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS="$save_ifs" - if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - func_append tmp_deplibs " $test_deplib" - ;; - esac - done - deplibs="$tmp_deplibs" - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test "$compiler_needs_object" = yes && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test "X$skipped_export" != "X:" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - func_basename "$output" - output_la=$func_basename_result - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - last_robj= - k=1 - - if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then - output=${output_objdir}/${output_la}.lnkscript - func_verbose "creating GNU ld script: $output" - echo 'INPUT (' > $output - for obj in $save_libobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then - output=${output_objdir}/${output_la}.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test "$compiler_needs_object" = yes; then - firstobj="$1 " - shift - fi - for obj - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test "X$objlist" = X || - test "$len" -lt "$max_cmd_len"; then - func_append objlist " $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - reload_objs=$objlist - eval concat_cmds=\"$reload_cmds\" - else - # All subsequent reloadable object files will link in - # the last one created. - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext - objlist=" $obj" - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\${concat_cmds}$reload_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" - fi - func_append delfiles " $output" - - else - output= - fi - - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - fi - - test -n "$save_libobjs" && - func_verbose "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - if ${skipped_export-false}; then - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - fi - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - func_show_eval '${RM}r "$gentop"' - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "\`-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object \`$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $opt_dry_run || $RM $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec and hope we can get by with - # turning comma into space.. - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` - else - gentop="$output_objdir/${obj}x" - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # If we're not building shared, we need to use non_pic_objs - test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "\`-release' is ignored for programs" - - test "$preload" = yes \ - && test "$dlopen_support" = unknown \ - && test "$dlopen_self" = unknown \ - && test "$dlopen_self_static" = unknown && \ - func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test "$tagname" = CXX ; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - func_append compile_command " ${wl}-bind_at_load" - func_append finalize_command " ${wl}-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - compile_deplibs="$new_libs" - - - func_append compile_command " $compile_deplibs" - func_append finalize_command " $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) func_append finalize_perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - fi - - func_generate_dlsyms "$outputname" "@PROGRAM@" "no" - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=yes - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=no - ;; - *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - esac - if test "$wrappers_required" = no; then - # Replace the output file specification. - compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' - fi - - exit $exit_status - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - func_append rpath "$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - exit $EXIT_SUCCESS - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "\`$output' will be relinked during installation" - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Now create the wrapper script. - func_verbose "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - fi - - # Only actually do things if not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - cwrappersource="$output_path/$objdir/lt-$output_name.c" - cwrapper="$output_path/$output_name.exe" - $RM $cwrappersource $cwrapper - trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host" ; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save $symfileobj" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$old_deplibs $non_pic_objects" - if test "$preload" = yes && test -f "$symfileobj"; then - func_append oldobjs " $symfileobj" - fi - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $addlibs - func_append oldobjs " $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - cmds=$old_archive_from_new_cmds - else - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" - fi - - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - echo "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase="$func_basename_result" - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" - ;; - *) func_append oldobjs " $obj" ;; - esac - done - fi - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - oldobjs= - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" - objlist= - len=$len0 - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test "X$oldobjs" = "X" ; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - func_verbose "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` - if test "$hardcode_automatic" = yes ; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - func_basename "$deplib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" - ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" - ;; - *) func_append newdependency_libs " $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" - ;; - *) func_append newdlfiles " $lib" ;; - esac - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" - ;; - esac - done - dlprefiles="$newdlprefiles" - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlfiles " $abs" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlprefiles " $abs" - done - dlprefiles="$newdlprefiles" - fi - $RM $output - # place dlname in correct position for cygwin - # In fact, it would be nice if we could use this code for all target - # systems that can't hard-code library paths into their executables - # and that have no shared library path variable independent of PATH, - # but it turns out we can't easily determine that from inspecting - # libtool variables, so we have to hard-code the OSs to which it - # applies here; at the moment, that means platforms that use the PE - # object format with DLL files. See the long comment at the top of - # tests/bindir.at for full details. - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) - # If a -bindir argument was supplied, place the dll there. - if test "x$bindir" != x ; - then - func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result$dlname - else - # Otherwise fall back on heuristic. - tdlname=../bin/$dlname - fi - ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then - $ECHO >> $output "\ -relink_command=\"$relink_command\"" - fi - done - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -{ test "$opt_mode" = link || test "$opt_mode" = relink; } && - func_mode_link ${1+"$@"} - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $opt_debug - RM="$nonopt" - files= - rmforce= - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case $arg in - -f) func_append RM " $arg"; rmforce=yes ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; - esac - done - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - for file in $files; do - func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - odir="$objdir" - else - odir="$dir/$objdir" - fi - func_basename "$file" - name="$func_basename_result" - test "$opt_mode" = uninstall && odir="$dir" - - # Remember odir for removal later, being careful to avoid duplicates - if test "$opt_mode" = clean; then - case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if { test -L "$file"; } >/dev/null 2>&1 || - { test -h "$file"; } >/dev/null 2>&1 || - test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif test "$rmforce" = yes; then - continue - fi - - rmfiles="$file" - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if func_lalib_p "$file"; then - func_source $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - func_append rmfiles " $odir/$n" - done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" - - case "$opt_mode" in - clean) - case " $library_names " in - *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; - esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" && - test "$pic_object" != none; then - func_append rmfiles " $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && - test "$non_pic_object" != none; then - func_append rmfiles " $dir/$non_pic_object" - fi - fi - ;; - - *) - if test "$opt_mode" = clean ; then - noexename=$name - case $file in - *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $file with .exe has already been added to rmfiles, - # add $file without .exe - func_append rmfiles " $file" - ;; - esac - # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" - fi - if test "X$noexename" != "X$name" ; then - func_append rmfiles " $odir/lt-${noexename}.c" - fi - fi - fi - ;; - esac - func_show_eval "$RM $rmfiles" 'exit_status=1' - done - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && - func_mode_uninstall ${1+"$@"} - -test -z "$opt_mode" && { - help="$generic_help" - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$opt_mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: -# vi:sw=2 - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/mkinstalldirs b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/mkinstalldirs deleted file mode 100644 index 879e5292..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/conftools/mkinstalldirs +++ /dev/null @@ -1,40 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1993-05-16 -# Public domain - -# $Id: mkinstalldirs,v 1.1 2012/06/15 13:38:49 dromagod Exp $ - -errstatus=0 - -for file -do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d - do - pathcomp="$pathcomp$d" - case "$pathcomp" in - -* ) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - fi - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# mkinstalldirs ends here diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/expat.png b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/expat.png deleted file mode 100644 index 5bc0726cfd8508d0aa53cf53486b0330780b5f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmV+e1pNDnP)<h;3K|Lk000e1NJLTq006!K002e^00000SKe_o00004XF*Lt006O% z3;baP00009a7bBm000XT000XT0n*)m`~Uy|2XskIMF-La2>=T+4e4Js00002VoOIv z0RM-N%)bBt1B6LLK~!ko?U>t@>mUq8)d+=9h#H{~3Q;2}M1^oacv#|LJI>6kWL^9- zPA0}%;&3E@^wk$^{EffyH~z-o_#1!YZ~TqF@i+dTUID;=F}?$c-;2)xAis?t0001j zNt%-%z{k7Vc?VxI{*k8u0Q6v>*t5c2?Yt$PXw%PjDsGSBpo5^>+Idg=&ZOT1xQ8it zs-5@nP5R^goLSTX|Gswa;GZ!0BmMHiOV9CN(9ShJdpvizl70_>=|}LJc3hA*@uO2z zLWqbY!`nd;DbHjK5iuo30Ps=$p3nn;LpsB6(+B{8pW{n(01aP?QUJX4<{6R$U_JW) z<qv?Xu;l6pB~*grqES2fW&8|ZYFUzl$x)7o`r3usGcy%IAj%<gOSDH+{8M~v3Cr&S zA7963Z{V}aov51<WX-5g9lncgal5k4gB-IMR`~k9P`D^B;nVP#gDOdHJB8TS-iEIh zcT6dzK&D(Qv`_Y9pT-;bWzt;i9bOK(tZLVRACeNVG2p1uJ>X;SU{%D(ckm??#nEW+ z3XW&yX|=z!mNR^r^i4H@$tv#fdGSjnZ?aNtwTnA^*7%yJESEWc9BQ!gKqH75e#s<H zn@dkbM4{v1VeOJe>hWuW7Wm8RR|3FG{7K8MEuu4u<fhI&#g~8pF31{RPI~Te4<E*2 zO|!_`py-s<tnssB#`=~i{#-lCg3j?5J|#<h25?f$GoIqhQSjFIEA2!-PwWsYPkqX! z*S7pr1yofxS-NZrSXYV<{DpQ_3wP@KGoSL4w!BJbFi+!6P@ZHpfy=Tr)6U$<Ppj?_ zZZPT?TXU~#mo8geT}dq;UgD41IW1c2o~LUY#Hb?)HwTYn?b1y{i<=I2jVpXH<>R_# zIO{m=qZz|-nH=gjrMh+%n?(}|gI&XArp#V9+VyqWuwC@~LFu(Nx`=H{PAXZfYFBIY zQ3qA-5y2@Xwk09?Ct)b{@%e5`!m-=JzG#W*bQEdEk6k^Jw%aL2m93!;i=%cfH!C;x zy3t|V1A<YaGkvB?e{r5Nd2MfYH2V3j3=^8KblORmTg6vT8ia_r-6z(=Q@)IG=FjHw z60H75{kGFix^dj_8%MN5PkR4gmS244gYd(HQ@RhrcMpz8KL`Jbc0LH75MMv0`ylZ= xxi<dB|0w)Fyf*&E-}oDU<8S<pzw!SE{C^g%-Q{+dOhW(w002ovPDHLkV1gDS?lb@Z diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/reference.html b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/reference.html deleted file mode 100644 index 8811a339..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/reference.html +++ /dev/null @@ -1,2390 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html> -<head> -<!-- Copyright 1999,2000 Clark Cooper <coopercc@netheaven.com> - All rights reserved. - This is free software. You may distribute or modify according to - the terms of the MIT/X License --> - <title>Expat XML Parser</title> - <meta name="author" content="Clark Cooper, coopercc@netheaven.com" /> - <meta http-equiv="Content-Style-Type" content="text/css" /> - <link href="style.css" rel="stylesheet" type="text/css" /> -</head> -<body> - <table cellspacing="0" cellpadding="0" width="100%"> - <tr> - <td class="corner"><img src="expat.png" alt="(Expat logo)" /></td> - <td class="banner"><h1>The Expat XML Parser</h1></td> - </tr> - <tr> - <td class="releaseno">Release 2.0.1</td> - <td></td> - </tr> - </table> -<div class="content"> - -<p>Expat is a library, written in C, for parsing XML documents. It's -the underlying XML parser for the open source Mozilla project, Perl's -<code>XML::Parser</code>, Python's <code>xml.parsers.expat</code>, and -other open-source XML parsers.</p> - -<p>This library is the creation of James Clark, who's also given us -groff (an nroff look-alike), Jade (an implemention of ISO's DSSSL -stylesheet language for SGML), XP (a Java XML parser package), XT (a -Java XSL engine). James was also the technical lead on the XML -Working Group at W3C that produced the XML specification.</p> - -<p>This is free software, licensed under the <a -href="../COPYING">MIT/X Consortium license</a>. You may download it -from <a href="http://www.libexpat.org/">the Expat home page</a>. -</p> - -<p>The bulk of this document was originally commissioned as an article -by <a href="http://www.xml.com/">XML.com</a>. They graciously allowed -Clark Cooper to retain copyright and to distribute it with Expat. -This version has been substantially extended to include documentation -on features which have been added since the original article was -published, and additional information on using the original -interface.</p> - -<hr /> -<h2>Table of Contents</h2> -<ul> - <li><a href="#overview">Overview</a></li> - <li><a href="#building">Building and Installing</a></li> - <li><a href="#using">Using Expat</a></li> - <li><a href="#reference">Reference</a> - <ul> - <li><a href="#creation">Parser Creation Functions</a> - <ul> - <li><a href="#XML_ParserCreate">XML_ParserCreate</a></li> - <li><a href="#XML_ParserCreateNS">XML_ParserCreateNS</a></li> - <li><a href="#XML_ParserCreate_MM">XML_ParserCreate_MM</a></li> - <li><a href="#XML_ExternalEntityParserCreate">XML_ExternalEntityParserCreate</a></li> - <li><a href="#XML_ParserFree">XML_ParserFree</a></li> - <li><a href="#XML_ParserReset">XML_ParserReset</a></li> - </ul> - </li> - <li><a href="#parsing">Parsing Functions</a> - <ul> - <li><a href="#XML_Parse">XML_Parse</a></li> - <li><a href="#XML_ParseBuffer">XML_ParseBuffer</a></li> - <li><a href="#XML_GetBuffer">XML_GetBuffer</a></li> - <li><a href="#XML_StopParser">XML_StopParser</a></li> - <li><a href="#XML_ResumeParser">XML_ResumeParser</a></li> - <li><a href="#XML_GetParsingStatus">XML_GetParsingStatus</a></li> - </ul> - </li> - <li><a href="#setting">Handler Setting Functions</a> - <ul> - <li><a href="#XML_SetStartElementHandler">XML_SetStartElementHandler</a></li> - <li><a href="#XML_SetEndElementHandler">XML_SetEndElementHandler</a></li> - <li><a href="#XML_SetElementHandler">XML_SetElementHandler</a></li> - <li><a href="#XML_SetCharacterDataHandler">XML_SetCharacterDataHandler</a></li> - <li><a href="#XML_SetProcessingInstructionHandler">XML_SetProcessingInstructionHandler</a></li> - <li><a href="#XML_SetCommentHandler">XML_SetCommentHandler</a></li> - <li><a href="#XML_SetStartCdataSectionHandler">XML_SetStartCdataSectionHandler</a></li> - <li><a href="#XML_SetEndCdataSectionHandler">XML_SetEndCdataSectionHandler</a></li> - <li><a href="#XML_SetCdataSectionHandler">XML_SetCdataSectionHandler</a></li> - <li><a href="#XML_SetDefaultHandler">XML_SetDefaultHandler</a></li> - <li><a href="#XML_SetDefaultHandlerExpand">XML_SetDefaultHandlerExpand</a></li> - <li><a href="#XML_SetExternalEntityRefHandler">XML_SetExternalEntityRefHandler</a></li> - <li><a href="#XML_SetExternalEntityRefHandlerArg">XML_SetExternalEntityRefHandlerArg</a></li> - <li><a href="#XML_SetSkippedEntityHandler">XML_SetSkippedEntityHandler</a></li> - <li><a href="#XML_SetUnknownEncodingHandler">XML_SetUnknownEncodingHandler</a></li> - <li><a href="#XML_SetStartNamespaceDeclHandler">XML_SetStartNamespaceDeclHandler</a></li> - <li><a href="#XML_SetEndNamespaceDeclHandler">XML_SetEndNamespaceDeclHandler</a></li> - <li><a href="#XML_SetNamespaceDeclHandler">XML_SetNamespaceDeclHandler</a></li> - <li><a href="#XML_SetXmlDeclHandler">XML_SetXmlDeclHandler</a></li> - <li><a href="#XML_SetStartDoctypeDeclHandler">XML_SetStartDoctypeDeclHandler</a></li> - <li><a href="#XML_SetEndDoctypeDeclHandler">XML_SetEndDoctypeDeclHandler</a></li> - <li><a href="#XML_SetDoctypeDeclHandler">XML_SetDoctypeDeclHandler</a></li> - <li><a href="#XML_SetElementDeclHandler">XML_SetElementDeclHandler</a></li> - <li><a href="#XML_SetAttlistDeclHandler">XML_SetAttlistDeclHandler</a></li> - <li><a href="#XML_SetEntityDeclHandler">XML_SetEntityDeclHandler</a></li> - <li><a href="#XML_SetUnparsedEntityDeclHandler">XML_SetUnparsedEntityDeclHandler</a></li> - <li><a href="#XML_SetNotationDeclHandler">XML_SetNotationDeclHandler</a></li> - <li><a href="#XML_SetNotStandaloneHandler">XML_SetNotStandaloneHandler</a></li> - </ul> - </li> - <li><a href="#position">Parse Position and Error Reporting Functions</a> - <ul> - <li><a href="#XML_GetErrorCode">XML_GetErrorCode</a></li> - <li><a href="#XML_ErrorString">XML_ErrorString</a></li> - <li><a href="#XML_GetCurrentByteIndex">XML_GetCurrentByteIndex</a></li> - <li><a href="#XML_GetCurrentLineNumber">XML_GetCurrentLineNumber</a></li> - <li><a href="#XML_GetCurrentColumnNumber">XML_GetCurrentColumnNumber</a></li> - <li><a href="#XML_GetCurrentByteCount">XML_GetCurrentByteCount</a></li> - <li><a href="#XML_GetInputContext">XML_GetInputContext</a></li> - </ul> - </li> - <li><a href="#miscellaneous">Miscellaneous Functions</a> - <ul> - <li><a href="#XML_SetUserData">XML_SetUserData</a></li> - <li><a href="#XML_GetUserData">XML_GetUserData</a></li> - <li><a href="#XML_UseParserAsHandlerArg">XML_UseParserAsHandlerArg</a></li> - <li><a href="#XML_SetBase">XML_SetBase</a></li> - <li><a href="#XML_GetBase">XML_GetBase</a></li> - <li><a href="#XML_GetSpecifiedAttributeCount">XML_GetSpecifiedAttributeCount</a></li> - <li><a href="#XML_GetIdAttributeIndex">XML_GetIdAttributeIndex</a></li> - <li><a href="#XML_GetAttributeInfo">XML_GetAttributeInfo</a></li> - <li><a href="#XML_SetEncoding">XML_SetEncoding</a></li> - <li><a href="#XML_SetParamEntityParsing">XML_SetParamEntityParsing</a></li> - <li><a href="#XML_SetHashSalt">XML_SetHashSalt</a></li> - <li><a href="#XML_UseForeignDTD">XML_UseForeignDTD</a></li> - <li><a href="#XML_SetReturnNSTriplet">XML_SetReturnNSTriplet</a></li> - <li><a href="#XML_DefaultCurrent">XML_DefaultCurrent</a></li> - <li><a href="#XML_ExpatVersion">XML_ExpatVersion</a></li> - <li><a href="#XML_ExpatVersionInfo">XML_ExpatVersionInfo</a></li> - <li><a href="#XML_GetFeatureList">XML_GetFeatureList</a></li> - <li><a href="#XML_FreeContentModel">XML_FreeContentModel</a></li> - <li><a href="#XML_MemMalloc">XML_MemMalloc</a></li> - <li><a href="#XML_MemRealloc">XML_MemRealloc</a></li> - <li><a href="#XML_MemFree">XML_MemFree</a></li> - </ul> - </li> - </ul> - </li> -</ul> - -<hr /> -<h2><a name="overview">Overview</a></h2> - -<p>Expat is a stream-oriented parser. You register callback (or -handler) functions with the parser and then start feeding it the -document. As the parser recognizes parts of the document, it will -call the appropriate handler for that part (if you've registered one.) -The document is fed to the parser in pieces, so you can start parsing -before you have all the document. This also allows you to parse really -huge documents that won't fit into memory.</p> - -<p>Expat can be intimidating due to the many kinds of handlers and -options you can set. But you only need to learn four functions in -order to do 90% of what you'll want to do with it:</p> - -<dl> - -<dt><code><a href= "#XML_ParserCreate" - >XML_ParserCreate</a></code></dt> - <dd>Create a new parser object.</dd> - -<dt><code><a href= "#XML_SetElementHandler" - >XML_SetElementHandler</a></code></dt> - <dd>Set handlers for start and end tags.</dd> - -<dt><code><a href= "#XML_SetCharacterDataHandler" - >XML_SetCharacterDataHandler</a></code></dt> - <dd>Set handler for text.</dd> - -<dt><code><a href= "#XML_Parse" - >XML_Parse</a></code></dt> - <dd>Pass a buffer full of document to the parser</dd> -</dl> - -<p>These functions and others are described in the <a -href="#reference">reference</a> part of this document. The reference -section also describes in detail the parameters passed to the -different types of handlers.</p> - -<p>Let's look at a very simple example program that only uses 3 of the -above functions (it doesn't need to set a character handler.) The -program <a href="../examples/outline.c">outline.c</a> prints an -element outline, indenting child elements to distinguish them from the -parent element that contains them. The start handler does all the -work. It prints two indenting spaces for every level of ancestor -elements, then it prints the element and attribute -information. Finally it increments the global <code>Depth</code> -variable.</p> - -<pre class="eg"> -int Depth; - -void XMLCALL -start(void *data, const char *el, const char **attr) { - int i; - - for (i = 0; i < Depth; i++) - printf(" "); - - printf("%s", el); - - for (i = 0; attr[i]; i += 2) { - printf(" %s='%s'", attr[i], attr[i + 1]); - } - - printf("\n"); - Depth++; -} /* End of start handler */ -</pre> - -<p>The end tag simply does the bookkeeping work of decrementing -<code>Depth</code>.</p> -<pre class="eg"> -void XMLCALL -end(void *data, const char *el) { - Depth--; -} /* End of end handler */ -</pre> - -<p>Note the <code>XMLCALL</code> annotation used for the callbacks. -This is used to ensure that the Expat and the callbacks are using the -same calling convention in case the compiler options used for Expat -itself and the client code are different. Expat tries not to care -what the default calling convention is, though it may require that it -be compiled with a default convention of "cdecl" on some platforms. -For code which uses Expat, however, the calling convention is -specified by the <code>XMLCALL</code> annotation on most platforms; -callbacks should be defined using this annotation.</p> - -<p>The <code>XMLCALL</code> annotation was added in Expat 1.95.7, but -existing working Expat applications don't need to add it (since they -are already using the "cdecl" calling convention, or they wouldn't be -working). The annotation is only needed if the default calling -convention may be something other than "cdecl". To use the annotation -safely with older versions of Expat, you can conditionally define it -<em>after</em> including Expat's header file:</p> - -<pre class="eg"> -#include <expat.h> - -#ifndef XMLCALL -#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) -#define XMLCALL __cdecl -#elif defined(__GNUC__) -#define XMLCALL __attribute__((cdecl)) -#else -#define XMLCALL -#endif -#endif -</pre> - -<p>After creating the parser, the main program just has the job of -shoveling the document to the parser so that it can do its work.</p> - -<hr /> -<h2><a name="building">Building and Installing Expat</a></h2> - -<p>The Expat distribution comes as a compressed (with GNU gzip) tar -file. You may download the latest version from <a href= -"http://sourceforge.net/projects/expat/" >Source Forge</a>. After -unpacking this, cd into the directory. Then follow either the Win32 -directions or Unix directions below.</p> - -<h3>Building under Win32</h3> - -<p>If you're using the GNU compiler under cygwin, follow the Unix -directions in the next section. Otherwise if you have Microsoft's -Developer Studio installed, then from Windows Explorer double-click on -"expat.dsp" in the lib directory and build and install in the usual -manner.</p> - -<p>Alternatively, you may download the Win32 binary package that -contains the "expat.h" include file and a pre-built DLL.</p> - -<h3>Building under Unix (or GNU)</h3> - -<p>First you'll need to run the configure shell script in order to -configure the Makefiles and headers for your system.</p> - -<p>If you're happy with all the defaults that configure picks for you, -and you have permission on your system to install into /usr/local, you -can install Expat with this sequence of commands:</p> - -<pre class="eg"> -./configure -make -make install -</pre> - -<p>There are some options that you can provide to this script, but the -only one we'll mention here is the <code>--prefix</code> option. You -can find out all the options available by running configure with just -the <code>--help</code> option.</p> - -<p>By default, the configure script sets things up so that the library -gets installed in <code>/usr/local/lib</code> and the associated -header file in <code>/usr/local/include</code>. But if you were to -give the option, <code>--prefix=/home/me/mystuff</code>, then the -library and header would get installed in -<code>/home/me/mystuff/lib</code> and -<code>/home/me/mystuff/include</code> respectively.</p> - -<h3>Configuring Expat Using the Pre-Processor</h3> - -<p>Expat's feature set can be configured using a small number of -pre-processor definitions. The definition of this symbols does not -affect the set of entry points for Expat, only the behavior of the API -and the definition of character types in the case of -<code>XML_UNICODE_WCHAR_T</code>. The symbols are:</p> - -<dl class="cpp-symbols"> -<dt>XML_DTD</dt> -<dd>Include support for using and reporting DTD-based content. If -this is defined, default attribute values from an external DTD subset -are reported and attribute value normalization occurs based on the -type of attributes defined in the external subset. Without -this, Expat has a smaller memory footprint and can be faster, but will -not load external entities or process conditional sections. This does -not affect the set of functions available in the API.</dd> - -<dt>XML_NS</dt> -<dd>When defined, support for the <cite><a href= -"http://www.w3.org/TR/REC-xml-names/" >Namespaces in XML</a></cite> -specification is included.</dd> - -<dt>XML_UNICODE</dt> -<dd>When defined, character data reported to the application is -encoded in UTF-16 using wide characters of the type -<code>XML_Char</code>. This is implied if -<code>XML_UNICODE_WCHAR_T</code> is defined.</dd> - -<dt>XML_UNICODE_WCHAR_T</dt> -<dd>If defined, causes the <code>XML_Char</code> character type to be -defined using the <code>wchar_t</code> type; otherwise, <code>unsigned -short</code> is used. Defining this implies -<code>XML_UNICODE</code>.</dd> - -<dt>XML_LARGE_SIZE</dt> -<dd>If defined, causes the <code>XML_Size</code> and <code>XML_Index</code> -integer types to be at least 64 bits in size. This is intended to support -processing of very large input streams, where the return values of -<code><a href="#XML_GetCurrentByteIndex" >XML_GetCurrentByteIndex</a></code>, -<code><a href="#XML_GetCurrentLineNumber" >XML_GetCurrentLineNumber</a></code> and -<code><a href="#XML_GetCurrentColumnNumber" >XML_GetCurrentColumnNumber</a></code> -could overflow. It may not be supported by all compilers, and is turned -off by default.</dd> - -<dt>XML_CONTEXT_BYTES</dt> -<dd>The number of input bytes of markup context which the parser will -ensure are available for reporting via <code><a href= -"#XML_GetInputContext" >XML_GetInputContext</a></code>. This is -normally set to 1024, and must be set to a positive interger. If this -is not defined, the input context will not be available and <code><a -href= "#XML_GetInputContext" >XML_GetInputContext</a></code> will -always report NULL. Without this, Expat has a smaller memory -footprint and can be faster.</dd> - -<dt>XML_STATIC</dt> -<dd>On Windows, this should be set if Expat is going to be linked -statically with the code that calls it; this is required to get all -the right MSVC magic annotations correct. This is ignored on other -platforms.</dd> - -<dt>XML_ATTR_INFO</dt> -<dd>If defined, makes the the additional function <code><a href= -"#XML_GetAttributeInfo" >XML_GetAttributeInfo</a></code> available -for reporting attribute byte offsets.</dd> -</dl> - -<hr /> -<h2><a name="using">Using Expat</a></h2> - -<h3>Compiling and Linking Against Expat</h3> - -<p>Unless you installed Expat in a location not expected by your -compiler and linker, all you have to do to use Expat in your programs -is to include the Expat header (<code>#include <expat.h></code>) -in your files that make calls to it and to tell the linker that it -needs to link against the Expat library. On Unix systems, this would -usually be done with the <code>-lexpat</code> argument. Otherwise, -you'll need to tell the compiler where to look for the Expat header -and the linker where to find the Expat library. You may also need to -take steps to tell the operating system where to find this library at -run time.</p> - -<p>On a Unix-based system, here's what a Makefile might look like when -Expat is installed in a standard location:</p> - -<pre class="eg"> -CC=cc -LDFLAGS= -LIBS= -lexpat -xmlapp: xmlapp.o - $(CC) $(LDFLAGS) -o xmlapp xmlapp.o $(LIBS) -</pre> - -<p>If you installed Expat in, say, <code>/home/me/mystuff</code>, then -the Makefile would look like this:</p> - -<pre class="eg"> -CC=cc -CFLAGS= -I/home/me/mystuff/include -LDFLAGS= -LIBS= -L/home/me/mystuff/lib -lexpat -xmlapp: xmlapp.o - $(CC) $(LDFLAGS) -o xmlapp xmlapp.o $(LIBS) -</pre> - -<p>You'd also have to set the environment variable -<code>LD_LIBRARY_PATH</code> to <code>/home/me/mystuff/lib</code> (or -to <code>${LD_LIBRARY_PATH}:/home/me/mystuff/lib</code> if -LD_LIBRARY_PATH already has some directories in it) in order to run -your application.</p> - -<h3>Expat Basics</h3> - -<p>As we saw in the example in the overview, the first step in parsing -an XML document with Expat is to create a parser object. There are <a -href="#creation">three functions</a> in the Expat API for creating a -parser object. However, only two of these (<code><a href= -"#XML_ParserCreate" >XML_ParserCreate</a></code> and <code><a href= -"#XML_ParserCreateNS" >XML_ParserCreateNS</a></code>) can be used for -constructing a parser for a top-level document. The object returned -by these functions is an opaque pointer (i.e. "expat.h" declares it as -void *) to data with further internal structure. In order to free the -memory associated with this object you must call <code><a href= -"#XML_ParserFree" >XML_ParserFree</a></code>. Note that if you have -provided any <a href="#userdata">user data</a> that gets stored in the -parser, then your application is responsible for freeing it prior to -calling <code>XML_ParserFree</code>.</p> - -<p>The objects returned by the parser creation functions are good for -parsing only one XML document or external parsed entity. If your -application needs to parse many XML documents, then it needs to create -a parser object for each one. The best way to deal with this is to -create a higher level object that contains all the default -initialization you want for your parser objects.</p> - -<p>Walking through a document hierarchy with a stream oriented parser -will require a good stack mechanism in order to keep track of current -context. For instance, to answer the simple question, "What element -does this text belong to?" requires a stack, since the parser may have -descended into other elements that are children of the current one and -has encountered this text on the way out.</p> - -<p>The things you're likely to want to keep on a stack are the -currently opened element and it's attributes. You push this -information onto the stack in the start handler and you pop it off in -the end handler.</p> - -<p>For some tasks, it is sufficient to just keep information on what -the depth of the stack is (or would be if you had one.) The outline -program shown above presents one example. Another such task would be -skipping over a complete element. When you see the start tag for the -element you want to skip, you set a skip flag and record the depth at -which the element started. When the end tag handler encounters the -same depth, the skipped element has ended and the flag may be -cleared. If you follow the convention that the root element starts at -1, then you can use the same variable for skip flag and skip -depth.</p> - -<pre class="eg"> -void -init_info(Parseinfo *info) { - info->skip = 0; - info->depth = 1; - /* Other initializations here */ -} /* End of init_info */ - -void XMLCALL -rawstart(void *data, const char *el, const char **attr) { - Parseinfo *inf = (Parseinfo *) data; - - if (! inf->skip) { - if (should_skip(inf, el, attr)) { - inf->skip = inf->depth; - } - else - start(inf, el, attr); /* This does rest of start handling */ - } - - inf->depth++; -} /* End of rawstart */ - -void XMLCALL -rawend(void *data, const char *el) { - Parseinfo *inf = (Parseinfo *) data; - - inf->depth--; - - if (! inf->skip) - end(inf, el); /* This does rest of end handling */ - - if (inf->skip == inf->depth) - inf->skip = 0; -} /* End rawend */ -</pre> - -<p>Notice in the above example the difference in how depth is -manipulated in the start and end handlers. The end tag handler should -be the mirror image of the start tag handler. This is necessary to -properly model containment. Since, in the start tag handler, we -incremented depth <em>after</em> the main body of start tag code, then -in the end handler, we need to manipulate it <em>before</em> the main -body. If we'd decided to increment it first thing in the start -handler, then we'd have had to decrement it last thing in the end -handler.</p> - -<h3 id="userdata">Communicating between handlers</h3> - -<p>In order to be able to pass information between different handlers -without using globals, you'll need to define a data structure to hold -the shared variables. You can then tell Expat (with the <code><a href= -"#XML_SetUserData" >XML_SetUserData</a></code> function) to pass a -pointer to this structure to the handlers. This is the first -argument received by most handlers. In the <a href="#reference" ->reference section</a>, an argument to a callback function is named -<code>userData</code> and have type <code>void *</code> if the user -data is passed; it will have the type <code>XML_Parser</code> if the -parser itself is passed. When the parser is passed, the user data may -be retrieved using <code><a href="#XML_GetUserData" ->XML_GetUserData</a></code>.</p> - -<p>One common case where multiple calls to a single handler may need -to communicate using an application data structure is the case when -content passed to the character data handler (set by <code><a href= -"#XML_SetCharacterDataHandler" ->XML_SetCharacterDataHandler</a></code>) needs to be accumulated. A -common first-time mistake with any of the event-oriented interfaces to -an XML parser is to expect all the text contained in an element to be -reported by a single call to the character data handler. Expat, like -many other XML parsers, reports such data as a sequence of calls; -there's no way to know when the end of the sequence is reached until a -different callback is made. A buffer referenced by the user data -structure proves both an effective and convenient place to accumulate -character data.</p> - -<!-- XXX example needed here --> - - -<h3>XML Version</h3> - -<p>Expat is an XML 1.0 parser, and as such never complains based on -the value of the <code>version</code> pseudo-attribute in the XML -declaration, if present.</p> - -<p>If an application needs to check the version number (to support -alternate processing), it should use the <code><a href= -"#XML_SetXmlDeclHandler" >XML_SetXmlDeclHandler</a></code> function to -set a handler that uses the information in the XML declaration to -determine what to do. This example shows how to check that only a -version number of <code>"1.0"</code> is accepted:</p> - -<pre class="eg"> -static int wrong_version; -static XML_Parser parser; - -static void XMLCALL -xmldecl_handler(void *userData, - const XML_Char *version, - const XML_Char *encoding, - int standalone) -{ - static const XML_Char Version_1_0[] = {'1', '.', '0', 0}; - - int i; - - for (i = 0; i < (sizeof(Version_1_0) / sizeof(Version_1_0[0])); ++i) { - if (version[i] != Version_1_0[i]) { - wrong_version = 1; - /* also clear all other handlers: */ - XML_SetCharacterDataHandler(parser, NULL); - ... - return; - } - } - ... -} -</pre> - -<h3>Namespace Processing</h3> - -<p>When the parser is created using the <code><a href= -"#XML_ParserCreateNS" >XML_ParserCreateNS</a></code>, function, Expat -performs namespace processing. Under namespace processing, Expat -consumes <code>xmlns</code> and <code>xmlns:...</code> attributes, -which declare namespaces for the scope of the element in which they -occur. This means that your start handler will not see these -attributes. Your application can still be informed of these -declarations by setting namespace declaration handlers with <a href= -"#XML_SetNamespaceDeclHandler" -><code>XML_SetNamespaceDeclHandler</code></a>.</p> - -<p>Element type and attribute names that belong to a given namespace -are passed to the appropriate handler in expanded form. By default -this expanded form is a concatenation of the namespace URI, the -separator character (which is the 2nd argument to <code><a href= -"#XML_ParserCreateNS" >XML_ParserCreateNS</a></code>), and the local -name (i.e. the part after the colon). Names with undeclared prefixes -are not well-formed when namespace processing is enabled, and will -trigger an error. Unprefixed attribute names are never expanded, -and unprefixed element names are only expanded when they are in the -scope of a default namespace.</p> - -<p>However if <code><a href= "#XML_SetReturnNSTriplet" ->XML_SetReturnNSTriplet</a></code> has been called with a non-zero -<code>do_nst</code> parameter, then the expanded form for names with -an explicit prefix is a concatenation of: URI, separator, local name, -separator, prefix.</p> - -<p>You can set handlers for the start of a namespace declaration and -for the end of a scope of a declaration with the <code><a href= -"#XML_SetNamespaceDeclHandler" >XML_SetNamespaceDeclHandler</a></code> -function. The StartNamespaceDeclHandler is called prior to the start -tag handler and the EndNamespaceDeclHandler is called after the -corresponding end tag that ends the namespace's scope. The namespace -start handler gets passed the prefix and URI for the namespace. For a -default namespace declaration (xmlns='...'), the prefix will be null. -The URI will be null for the case where the default namespace is being -unset. The namespace end handler just gets the prefix for the closing -scope.</p> - -<p>These handlers are called for each declaration. So if, for -instance, a start tag had three namespace declarations, then the -StartNamespaceDeclHandler would be called three times before the start -tag handler is called, once for each declaration.</p> - -<h3>Character Encodings</h3> - -<p>While XML is based on Unicode, and every XML processor is required -to recognized UTF-8 and UTF-16 (1 and 2 byte encodings of Unicode), -other encodings may be declared in XML documents or entities. For the -main document, an XML declaration may contain an encoding -declaration:</p> -<pre> -<?xml version="1.0" encoding="ISO-8859-2"?> -</pre> - -<p>External parsed entities may begin with a text declaration, which -looks like an XML declaration with just an encoding declaration:</p> -<pre> -<?xml encoding="Big5"?> -</pre> - -<p>With Expat, you may also specify an encoding at the time of -creating a parser. This is useful when the encoding information may -come from a source outside the document itself (like a higher level -protocol.)</p> - -<p><a name="builtin_encodings"></a>There are four built-in encodings -in Expat:</p> -<ul> -<li>UTF-8</li> -<li>UTF-16</li> -<li>ISO-8859-1</li> -<li>US-ASCII</li> -</ul> - -<p>Anything else discovered in an encoding declaration or in the -protocol encoding specified in the parser constructor, triggers a call -to the <code>UnknownEncodingHandler</code>. This handler gets passed -the encoding name and a pointer to an <code>XML_Encoding</code> data -structure. Your handler must fill in this structure and return -<code>XML_STATUS_OK</code> if it knows how to deal with the -encoding. Otherwise the handler should return -<code>XML_STATUS_ERROR</code>. The handler also gets passed a pointer -to an optional application data structure that you may indicate when -you set the handler.</p> - -<p>Expat places restrictions on character encodings that it can -support by filling in the <code>XML_Encoding</code> structure. -include file:</p> -<ol> -<li>Every ASCII character that can appear in a well-formed XML document -must be represented by a single byte, and that byte must correspond to -it's ASCII encoding (except for the characters $@\^'{}~)</li> -<li>Characters must be encoded in 4 bytes or less.</li> -<li>All characters encoded must have Unicode scalar values less than or -equal to 65535 (0xFFFF)<em>This does not apply to the built-in support -for UTF-16 and UTF-8</em></li> -<li>No character may be encoded by more that one distinct sequence of -bytes</li> -</ol> - -<p><code>XML_Encoding</code> contains an array of integers that -correspond to the 1st byte of an encoding sequence. If the value in -the array for a byte is zero or positive, then the byte is a single -byte encoding that encodes the Unicode scalar value contained in the -array. A -1 in this array indicates a malformed byte. If the value is --2, -3, or -4, then the byte is the beginning of a 2, 3, or 4 byte -sequence respectively. Multi-byte sequences are sent to the convert -function pointed at in the <code>XML_Encoding</code> structure. This -function should return the Unicode scalar value for the sequence or -1 -if the sequence is malformed.</p> - -<p>One pitfall that novice Expat users are likely to fall into is that -although Expat may accept input in various encodings, the strings that -it passes to the handlers are always encoded in UTF-8 or UTF-16 -(depending on how Expat was compiled). Your application is responsible -for any translation of these strings into other encodings.</p> - -<h3>Handling External Entity References</h3> - -<p>Expat does not read or parse external entities directly. Note that -any external DTD is a special case of an external entity. If you've -set no <code>ExternalEntityRefHandler</code>, then external entity -references are silently ignored. Otherwise, it calls your handler with -the information needed to read and parse the external entity.</p> - -<p>Your handler isn't actually responsible for parsing the entity, but -it is responsible for creating a subsidiary parser with <code><a href= -"#XML_ExternalEntityParserCreate" ->XML_ExternalEntityParserCreate</a></code> that will do the job. This -returns an instance of <code>XML_Parser</code> that has handlers and -other data structures initialized from the parent parser. You may then -use <code><a href= "#XML_Parse" >XML_Parse</a></code> or <code><a -href= "#XML_ParseBuffer">XML_ParseBuffer</a></code> calls against this -parser. Since external entities my refer to other external entities, -your handler should be prepared to be called recursively.</p> - -<h3>Parsing DTDs</h3> - -<p>In order to parse parameter entities, before starting the parse, -you must call <code><a href= "#XML_SetParamEntityParsing" ->XML_SetParamEntityParsing</a></code> with one of the following -arguments:</p> -<dl> -<dt><code>XML_PARAM_ENTITY_PARSING_NEVER</code></dt> -<dd>Don't parse parameter entities or the external subset</dd> -<dt><code>XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE</code></dt> -<dd>Parse parameter entites and the external subset unless -<code>standalone</code> was set to "yes" in the XML declaration.</dd> -<dt><code>XML_PARAM_ENTITY_PARSING_ALWAYS</code></dt> -<dd>Always parse parameter entities and the external subset</dd> -</dl> - -<p>In order to read an external DTD, you also have to set an external -entity reference handler as described above.</p> - -<h3 id="stop-resume">Temporarily Stopping Parsing</h3> - -<p>Expat 1.95.8 introduces a new feature: its now possible to stop -parsing temporarily from within a handler function, even if more data -has already been passed into the parser. Applications for this -include</p> - -<ul> - <li>Supporting the <a href= "http://www.w3.org/TR/xinclude/" - >XInclude</a> specification.</li> - - <li>Delaying further processing until additional information is - available from some other source.</li> - - <li>Adjusting processor load as task priorities shift within an - application.</li> - - <li>Stopping parsing completely (simply free or reset the parser - instead of resuming in the outer parsing loop). This can be useful - if a application-domain error is found in the XML being parsed or if - the result of the parse is determined not to be useful after - all.</li> -</ul> - -<p>To take advantage of this feature, the main parsing loop of an -application needs to support this specifically. It cannot be -supported with a parsing loop compatible with Expat 1.95.7 or -earlier (though existing loops will continue to work without -supporting the stop/resume feature).</p> - -<p>An application that uses this feature for a single parser will have -the rough structure (in pseudo-code):</p> - -<pre class="pseudocode"> -fd = open_input() -p = create_parser() - -if parse_xml(p, fd) { - /* suspended */ - - int suspended = 1; - - while (suspended) { - do_something_else() - if ready_to_resume() { - suspended = continue_parsing(p, fd); - } - } -} -</pre> - -<p>An application that may resume any of several parsers based on -input (either from the XML being parsed or some other source) will -certainly have more interesting control structures.</p> - -<p>This C function could be used for the <code>parse_xml</code> -function mentioned in the pseudo-code above:</p> - -<pre class="eg"> -#define BUFF_SIZE 10240 - -/* Parse a document from the open file descriptor 'fd' until the parse - is complete (the document has been completely parsed, or there's - been an error), or the parse is stopped. Return non-zero when - the parse is merely suspended. -*/ -int -parse_xml(XML_Parser p, int fd) -{ - for (;;) { - int last_chunk; - int bytes_read; - enum XML_Status status; - - void *buff = XML_GetBuffer(p, BUFF_SIZE); - if (buff == NULL) { - /* handle error... */ - return 0; - } - bytes_read = read(fd, buff, BUFF_SIZE); - if (bytes_read < 0) { - /* handle error... */ - return 0; - } - status = XML_ParseBuffer(p, bytes_read, bytes_read == 0); - switch (status) { - case XML_STATUS_ERROR: - /* handle error... */ - return 0; - case XML_STATUS_SUSPENDED: - return 1; - } - if (bytes_read == 0) - return 0; - } -} -</pre> - -<p>The corresponding <code>continue_parsing</code> function is -somewhat simpler, since it only need deal with the return code from -<code><a href= "#XML_ResumeParser">XML_ResumeParser</a></code>; it can -delegate the input handling to the <code>parse_xml</code> -function:</p> - -<pre class="eg"> -/* Continue parsing a document which had been suspended. The 'p' and - 'fd' arguments are the same as passed to parse_xml(). Return - non-zero when the parse is suspended. -*/ -int -continue_parsing(XML_Parser p, int fd) -{ - enum XML_Status status = XML_ResumeParser(p); - switch (status) { - case XML_STATUS_ERROR: - /* handle error... */ - return 0; - case XML_ERROR_NOT_SUSPENDED: - /* handle error... */ - return 0;. - case XML_STATUS_SUSPENDED: - return 1; - } - return parse_xml(p, fd); -} -</pre> - -<p>Now that we've seen what a mess the top-level parsing loop can -become, what have we gained? Very simply, we can now use the <code><a -href= "#XML_StopParser" >XML_StopParser</a></code> function to stop -parsing, without having to go to great lengths to avoid additional -processing that we're expecting to ignore. As a bonus, we get to stop -parsing <em>temporarily</em>, and come back to it when we're -ready.</p> - -<p>To stop parsing from a handler function, use the <code><a href= -"#XML_StopParser" >XML_StopParser</a></code> function. This function -takes two arguments; the parser being stopped and a flag indicating -whether the parse can be resumed in the future.</p> - -<!-- XXX really need more here --> - - -<hr /> -<!-- ================================================================ --> - -<h2><a name="reference">Expat Reference</a></h2> - -<h3><a name="creation">Parser Creation</a></h3> - -<pre class="fcndec" id="XML_ParserCreate"> -XML_Parser XMLCALL -XML_ParserCreate(const XML_Char *encoding); -</pre> -<div class="fcndef"> -Construct a new parser. If encoding is non-null, it specifies a -character encoding to use for the document. This overrides the document -encoding declaration. There are four built-in encodings: -<ul> -<li>US-ASCII</li> -<li>UTF-8</li> -<li>UTF-16</li> -<li>ISO-8859-1</li> -</ul> -Any other value will invoke a call to the UnknownEncodingHandler. -</div> - -<pre class="fcndec" id="XML_ParserCreateNS"> -XML_Parser XMLCALL -XML_ParserCreateNS(const XML_Char *encoding, - XML_Char sep); -</pre> -<div class="fcndef"> -Constructs a new parser that has namespace processing in effect. Namespace -expanded element names and attribute names are returned as a concatenation -of the namespace URI, <em>sep</em>, and the local part of the name. This -means that you should pick a character for <em>sep</em> that can't be part -of an URI. Since Expat does not check namespace URIs for conformance, the -only safe choice for a namespace separator is a character that is illegal -in XML. For instance, <code>'\xFF'</code> is not legal in UTF-8, and -<code>'\xFFFF'</code> is not legal in UTF-16. There is a special case when -<em>sep</em> is the null character <code>'\0'</code>: the namespace URI and -the local part will be concatenated without any separator - this is intended -to support RDF processors. It is a programming error to use the null separator -with <a href= "#XML_SetReturnNSTriplet">namespace triplets</a>.</div> - -<pre class="fcndec" id="XML_ParserCreate_MM"> -XML_Parser XMLCALL -XML_ParserCreate_MM(const XML_Char *encoding, - const XML_Memory_Handling_Suite *ms, - const XML_Char *sep); -</pre> -<pre class="signature"> -typedef struct { - void *(XMLCALL *malloc_fcn)(size_t size); - void *(XMLCALL *realloc_fcn)(void *ptr, size_t size); - void (XMLCALL *free_fcn)(void *ptr); -} XML_Memory_Handling_Suite; -</pre> -<div class="fcndef"> -<p>Construct a new parser using the suite of memory handling functions -specified in <code>ms</code>. If <code>ms</code> is NULL, then use the -standard set of memory management functions. If <code>sep</code> is -non NULL, then namespace processing is enabled in the created parser -and the character pointed at by sep is used as the separator between -the namespace URI and the local part of the name.</p> -</div> - -<pre class="fcndec" id="XML_ExternalEntityParserCreate"> -XML_Parser XMLCALL -XML_ExternalEntityParserCreate(XML_Parser p, - const XML_Char *context, - const XML_Char *encoding); -</pre> -<div class="fcndef"> -Construct a new <code>XML_Parser</code> object for parsing an external -general entity. Context is the context argument passed in a call to a -ExternalEntityRefHandler. Other state information such as handlers, -user data, namespace processing is inherited from the parser passed as -the 1st argument. So you shouldn't need to call any of the behavior -changing functions on this parser (unless you want it to act -differently than the parent parser). -</div> - -<pre class="fcndec" id="XML_ParserFree"> -void XMLCALL -XML_ParserFree(XML_Parser p); -</pre> -<div class="fcndef"> -Free memory used by the parser. Your application is responsible for -freeing any memory associated with <a href="#userdata">user data</a>. -</div> - -<pre class="fcndec" id="XML_ParserReset"> -XML_Bool XMLCALL -XML_ParserReset(XML_Parser p, - const XML_Char *encoding); -</pre> -<div class="fcndef"> -Clean up the memory structures maintained by the parser so that it may -be used again. After this has been called, <code>parser</code> is -ready to start parsing a new document. All handlers are cleared from -the parser, except for the unknownEncodingHandler. The parser's external -state is re-initialized except for the values of ns and ns_triplets. -This function may not be used on a parser created using <code><a href= -"#XML_ExternalEntityParserCreate" >XML_ExternalEntityParserCreate</a -></code>; it will return <code>XML_FALSE</code> in that case. Returns -<code>XML_TRUE</code> on success. Your application is responsible for -dealing with any memory associated with <a href="#userdata">user data</a>. -</div> - -<h3><a name="parsing">Parsing</a></h3> - -<p>To state the obvious: the three parsing functions <code><a href= -"#XML_Parse" >XML_Parse</a></code>, <code><a href= "#XML_ParseBuffer"> -XML_ParseBuffer</a></code> and <code><a href= "#XML_GetBuffer"> -XML_GetBuffer</a></code> must not be called from within a handler -unless they operate on a separate parser instance, that is, one that -did not call the handler. For example, it is OK to call the parsing -functions from within an <code>XML_ExternalEntityRefHandler</code>, -if they apply to the parser created by -<code><a href= "#XML_ExternalEntityParserCreate" ->XML_ExternalEntityParserCreate</a></code>.</p> - -<p>Note: the <code>len</code> argument passed to these functions -should be considerably less than the maximum value for an integer, -as it could create an integer overflow situation if the added -lengths of a buffer and the unprocessed portion of the previous buffer -exceed the maximum integer value. Input data at the end of a buffer -will remain unprocessed if it is part of an XML token for which the -end is not part of that buffer.</p> - -<pre class="fcndec" id="XML_Parse"> -enum XML_Status XMLCALL -XML_Parse(XML_Parser p, - const char *s, - int len, - int isFinal); -</pre> -<pre class="signature"> -enum XML_Status { - XML_STATUS_ERROR = 0, - XML_STATUS_OK = 1 -}; -</pre> -<div class="fcndef"> -Parse some more of the document. The string <code>s</code> is a buffer -containing part (or perhaps all) of the document. The number of bytes of s -that are part of the document is indicated by <code>len</code>. This means -that <code>s</code> doesn't have to be null terminated. It also means that -if <code>len</code> is larger than the number of bytes in the block of -memory that <code>s</code> points at, then a memory fault is likely. The -<code>isFinal</code> parameter informs the parser that this is the last -piece of the document. Frequently, the last piece is empty (i.e. -<code>len</code> is zero.) -If a parse error occurred, it returns <code>XML_STATUS_ERROR</code>. -Otherwise it returns <code>XML_STATUS_OK</code> value. -</div> - -<pre class="fcndec" id="XML_ParseBuffer"> -enum XML_Status XMLCALL -XML_ParseBuffer(XML_Parser p, - int len, - int isFinal); -</pre> -<div class="fcndef"> -This is just like <code><a href= "#XML_Parse" >XML_Parse</a></code>, -except in this case Expat provides the buffer. By obtaining the -buffer from Expat with the <code><a href= "#XML_GetBuffer" ->XML_GetBuffer</a></code> function, the application can avoid double -copying of the input. -</div> - -<pre class="fcndec" id="XML_GetBuffer"> -void * XMLCALL -XML_GetBuffer(XML_Parser p, - int len); -</pre> -<div class="fcndef"> -Obtain a buffer of size <code>len</code> to read a piece of the document -into. A NULL value is returned if Expat can't allocate enough memory for -this buffer. This has to be called prior to every call to -<code><a href= "#XML_ParseBuffer" >XML_ParseBuffer</a></code>. A -typical use would look like this: - -<pre class="eg"> -for (;;) { - int bytes_read; - void *buff = XML_GetBuffer(p, BUFF_SIZE); - if (buff == NULL) { - /* handle error */ - } - - bytes_read = read(docfd, buff, BUFF_SIZE); - if (bytes_read < 0) { - /* handle error */ - } - - if (! XML_ParseBuffer(p, bytes_read, bytes_read == 0)) { - /* handle parse error */ - } - - if (bytes_read == 0) - break; -} -</pre> -</div> - -<pre class="fcndec" id="XML_StopParser"> -enum XML_Status XMLCALL -XML_StopParser(XML_Parser p, - XML_Bool resumable); -</pre> -<div class="fcndef"> - -<p>Stops parsing, causing <code><a href= "#XML_Parse" ->XML_Parse</a></code> or <code><a href= "#XML_ParseBuffer" ->XML_ParseBuffer</a></code> to return. Must be called from within a -call-back handler, except when aborting (when <code>resumable</code> -is <code>XML_FALSE</code>) an already suspended parser. Some -call-backs may still follow because they would otherwise get -lost, including -<ul> - <li> the end element handler for empty elements when stopped in the - start element handler,</li> - <li> the end namespace declaration handler when stopped in the end - element handler,</li> - <li> the character data handler when stopped in the character data handler - while making multiple call-backs on a contiguous chunk of characters,</li> -</ul> -and possibly others.</p> - -<p>This can be called from most handlers, including DTD related -call-backs, except when parsing an external parameter entity and -<code>resumable</code> is <code>XML_TRUE</code>. Returns -<code>XML_STATUS_OK</code> when successful, -<code>XML_STATUS_ERROR</code> otherwise. The possible error codes -are:</p> -<dl> - <dt><code>XML_ERROR_SUSPENDED</code></dt> - <dd>when suspending an already suspended parser.</dd> - <dt><code>XML_ERROR_FINISHED</code></dt> - <dd>when the parser has already finished.</dd> - <dt><code>XML_ERROR_SUSPEND_PE</code></dt> - <dd>when suspending while parsing an external PE.</dd> -</dl> - -<p>Since the stop/resume feature requires application support in the -outer parsing loop, it is an error to call this function for a parser -not being handled appropriately; see <a href= "#stop-resume" ->Temporarily Stopping Parsing</a> for more information.</p> - -<p>When <code>resumable</code> is <code>XML_TRUE</code> then parsing -is <em>suspended</em>, that is, <code><a href= "#XML_Parse" ->XML_Parse</a></code> and <code><a href= "#XML_ParseBuffer" ->XML_ParseBuffer</a></code> return <code>XML_STATUS_SUSPENDED</code>. -Otherwise, parsing is <em>aborted</em>, that is, <code><a href= -"#XML_Parse" >XML_Parse</a></code> and <code><a href= -"#XML_ParseBuffer" >XML_ParseBuffer</a></code> return -<code>XML_STATUS_ERROR</code> with error code -<code>XML_ERROR_ABORTED</code>.</p> - -<p><strong>Note:</strong> -This will be applied to the current parser instance only, that is, if -there is a parent parser then it will continue parsing when the -external entity reference handler returns. It is up to the -implementation of that handler to call <code><a href= -"#XML_StopParser" >XML_StopParser</a></code> on the parent parser -(recursively), if one wants to stop parsing altogether.</p> - -<p>When suspended, parsing can be resumed by calling <code><a href= -"#XML_ResumeParser" >XML_ResumeParser</a></code>.</p> - -<p>New in Expat 1.95.8.</p> -</div> - -<pre class="fcndec" id="XML_ResumeParser"> -enum XML_Status XMLCALL -XML_ResumeParser(XML_Parser p); -</pre> -<div class="fcndef"> -<p>Resumes parsing after it has been suspended with <code><a href= -"#XML_StopParser" >XML_StopParser</a></code>. Must not be called from -within a handler call-back. Returns same status codes as <code><a -href= "#XML_Parse">XML_Parse</a></code> or <code><a href= -"#XML_ParseBuffer" >XML_ParseBuffer</a></code>. An additional error -code, <code>XML_ERROR_NOT_SUSPENDED</code>, will be returned if the -parser was not currently suspended.</p> - -<p><strong>Note:</strong> -This must be called on the most deeply nested child parser instance -first, and on its parent parser only after the child parser has -finished, to be applied recursively until the document entity's parser -is restarted. That is, the parent parser will not resume by itself -and it is up to the application to call <code><a href= -"#XML_ResumeParser" >XML_ResumeParser</a></code> on it at the -appropriate moment.</p> - -<p>New in Expat 1.95.8.</p> -</div> - -<pre class="fcndec" id="XML_GetParsingStatus"> -void XMLCALL -XML_GetParsingStatus(XML_Parser p, - XML_ParsingStatus *status); -</pre> -<pre class="signature"> -enum XML_Parsing { - XML_INITIALIZED, - XML_PARSING, - XML_FINISHED, - XML_SUSPENDED -}; - -typedef struct { - enum XML_Parsing parsing; - XML_Bool finalBuffer; -} XML_ParsingStatus; -</pre> -<div class="fcndef"> -<p>Returns status of parser with respect to being initialized, -parsing, finished, or suspended, and whether the final buffer is being -processed. The <code>status</code> parameter <em>must not</em> be -NULL.</p> - -<p>New in Expat 1.95.8.</p> -</div> - - -<h3><a name="setting">Handler Setting</a></h3> - -<p>Although handlers are typically set prior to parsing and left alone, an -application may choose to set or change the handler for a parsing event -while the parse is in progress. For instance, your application may choose -to ignore all text not descended from a <code>para</code> element. One -way it could do this is to set the character handler when a para start tag -is seen, and unset it for the corresponding end tag.</p> - -<p>A handler may be <em>unset</em> by providing a NULL pointer to the -appropriate handler setter. None of the handler setting functions have -a return value.</p> - -<p>Your handlers will be receiving strings in arrays of type -<code>XML_Char</code>. This type is conditionally defined in expat.h as -either <code>char</code>, <code>wchar_t</code> or <code>unsigned short</code>. -The former implies UTF-8 encoding, the latter two imply UTF-16 encoding. -Note that you'll receive them in this form independent of the original -encoding of the document.</p> - -<div class="handler"> -<pre class="setter" id="XML_SetStartElementHandler"> -void XMLCALL -XML_SetStartElementHandler(XML_Parser p, - XML_StartElementHandler start); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_StartElementHandler)(void *userData, - const XML_Char *name, - const XML_Char **atts); -</pre> -<p>Set handler for start (and empty) tags. Attributes are passed to the start -handler as a pointer to a vector of char pointers. Each attribute seen in -a start (or empty) tag occupies 2 consecutive places in this vector: the -attribute name followed by the attribute value. These pairs are terminated -by a null pointer.</p> -<p>Note that an empty tag generates a call to both start and end handlers -(in that order).</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetEndElementHandler"> -void XMLCALL -XML_SetEndElementHandler(XML_Parser p, - XML_EndElementHandler); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_EndElementHandler)(void *userData, - const XML_Char *name); -</pre> -<p>Set handler for end (and empty) tags. As noted above, an empty tag -generates a call to both start and end handlers.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetElementHandler"> -void XMLCALL -XML_SetElementHandler(XML_Parser p, - XML_StartElementHandler start, - XML_EndElementHandler end); -</pre> -<p>Set handlers for start and end tags with one call.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetCharacterDataHandler"> -void XMLCALL -XML_SetCharacterDataHandler(XML_Parser p, - XML_CharacterDataHandler charhndl) -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_CharacterDataHandler)(void *userData, - const XML_Char *s, - int len); -</pre> -<p>Set a text handler. The string your handler receives -is <em>NOT nul-terminated</em>. You have to use the length argument -to deal with the end of the string. A single block of contiguous text -free of markup may still result in a sequence of calls to this handler. -In other words, if you're searching for a pattern in the text, it may -be split across calls to this handler. Note: Setting this handler to NULL -may <em>NOT immediately</em> terminate call-backs if the parser is currently -processing such a single block of contiguous markup-free text, as the parser -will continue calling back until the end of the block is reached.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetProcessingInstructionHandler"> -void XMLCALL -XML_SetProcessingInstructionHandler(XML_Parser p, - XML_ProcessingInstructionHandler proc) -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_ProcessingInstructionHandler)(void *userData, - const XML_Char *target, - const XML_Char *data); - -</pre> -<p>Set a handler for processing instructions. The target is the first word -in the processing instruction. The data is the rest of the characters in -it after skipping all whitespace after the initial word.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetCommentHandler"> -void XMLCALL -XML_SetCommentHandler(XML_Parser p, - XML_CommentHandler cmnt) -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_CommentHandler)(void *userData, - const XML_Char *data); -</pre> -<p>Set a handler for comments. The data is all text inside the comment -delimiters.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetStartCdataSectionHandler"> -void XMLCALL -XML_SetStartCdataSectionHandler(XML_Parser p, - XML_StartCdataSectionHandler start); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_StartCdataSectionHandler)(void *userData); -</pre> -<p>Set a handler that gets called at the beginning of a CDATA section.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetEndCdataSectionHandler"> -void XMLCALL -XML_SetEndCdataSectionHandler(XML_Parser p, - XML_EndCdataSectionHandler end); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_EndCdataSectionHandler)(void *userData); -</pre> -<p>Set a handler that gets called at the end of a CDATA section.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetCdataSectionHandler"> -void XMLCALL -XML_SetCdataSectionHandler(XML_Parser p, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end) -</pre> -<p>Sets both CDATA section handlers with one call.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetDefaultHandler"> -void XMLCALL -XML_SetDefaultHandler(XML_Parser p, - XML_DefaultHandler hndl) -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_DefaultHandler)(void *userData, - const XML_Char *s, - int len); -</pre> - -<p>Sets a handler for any characters in the document which wouldn't -otherwise be handled. This includes both data for which no handlers -can be set (like some kinds of DTD declarations) and data which could -be reported but which currently has no handler set. The characters -are passed exactly as they were present in the XML document except -that they will be encoded in UTF-8 or UTF-16. Line boundaries are not -normalized. Note that a byte order mark character is not passed to the -default handler. There are no guarantees about how characters are -divided between calls to the default handler: for example, a comment -might be split between multiple calls. Setting the handler with -this call has the side effect of turning off expansion of references -to internally defined general entities. Instead these references are -passed to the default handler.</p> - -<p>See also <code><a -href="#XML_DefaultCurrent">XML_DefaultCurrent</a></code>.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetDefaultHandlerExpand"> -void XMLCALL -XML_SetDefaultHandlerExpand(XML_Parser p, - XML_DefaultHandler hndl) -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_DefaultHandler)(void *userData, - const XML_Char *s, - int len); -</pre> -<p>This sets a default handler, but doesn't inhibit the expansion of -internal entity references. The entity reference will not be passed -to the default handler.</p> - -<p>See also <code><a -href="#XML_DefaultCurrent">XML_DefaultCurrent</a></code>.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetExternalEntityRefHandler"> -void XMLCALL -XML_SetExternalEntityRefHandler(XML_Parser p, - XML_ExternalEntityRefHandler hndl) -</pre> -<pre class="signature"> -typedef int -(XMLCALL *XML_ExternalEntityRefHandler)(XML_Parser p, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); -</pre> -<p>Set an external entity reference handler. This handler is also -called for processing an external DTD subset if parameter entity parsing -is in effect. (See <a href="#XML_SetParamEntityParsing"> -<code>XML_SetParamEntityParsing</code></a>.)</p> - -<p>The <code>context</code> parameter specifies the parsing context in -the format expected by the <code>context</code> argument to <code><a -href="#XML_ExternalEntityParserCreate" ->XML_ExternalEntityParserCreate</a></code>. <code>code</code> is -valid only until the handler returns, so if the referenced entity is -to be parsed later, it must be copied. <code>context</code> is NULL -only when the entity is a parameter entity, which is how one can -differentiate between general and parameter entities.</p> - -<p>The <code>base</code> parameter is the base to use for relative -system identifiers. It is set by <code><a -href="#XML_SetBase">XML_SetBase</a></code> and may be NULL. The -<code>publicId</code> parameter is the public id given in the entity -declaration and may be NULL. <code>systemId</code> is the system -identifier specified in the entity declaration and is never NULL.</p> - -<p>There are a couple of ways in which this handler differs from -others. First, this handler returns a status indicator (an -integer). <code>XML_STATUS_OK</code> should be returned for successful -handling of the external entity reference. Returning -<code>XML_STATUS_ERROR</code> indicates failure, and causes the -calling parser to return an -<code>XML_ERROR_EXTERNAL_ENTITY_HANDLING</code> error.</p> - -<p>Second, instead of having the user data as its first argument, it -receives the parser that encountered the entity reference. This, along -with the context parameter, may be used as arguments to a call to -<code><a href= "#XML_ExternalEntityParserCreate" ->XML_ExternalEntityParserCreate</a></code>. Using the returned -parser, the body of the external entity can be recursively parsed.</p> - -<p>Since this handler may be called recursively, it should not be saving -information into global or static variables.</p> -</div> - -<pre class="fcndec" id="XML_SetExternalEntityRefHandlerArg"> -void XMLCALL -XML_SetExternalEntityRefHandlerArg(XML_Parser p, - void *arg) -</pre> -<div class="fcndef"> -<p>Set the argument passed to the ExternalEntityRefHandler. If -<code>arg</code> is not NULL, it is the new value passed to the -handler set using <code><a href="#XML_SetExternalEntityRefHandler" ->XML_SetExternalEntityRefHandler</a></code>; if <code>arg</code> is -NULL, the argument passed to the handler function will be the parser -object itself.</p> - -<p><strong>Note:</strong> -The type of <code>arg</code> and the type of the first argument to the -ExternalEntityRefHandler do not match. This function takes a -<code>void *</code> to be passed to the handler, while the handler -accepts an <code>XML_Parser</code>. This is a historical accident, -but will not be corrected before Expat 2.0 (at the earliest) to avoid -causing compiler warnings for code that's known to work with this -API. It is the responsibility of the application code to know the -actual type of the argument passed to the handler and to manage it -properly.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetSkippedEntityHandler"> -void XMLCALL -XML_SetSkippedEntityHandler(XML_Parser p, - XML_SkippedEntityHandler handler) -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_SkippedEntityHandler)(void *userData, - const XML_Char *entityName, - int is_parameter_entity); -</pre> -<p>Set a skipped entity handler. This is called in two situations:</p> -<ol> - <li>An entity reference is encountered for which no declaration - has been read <em>and</em> this is not an error.</li> - <li>An internal entity reference is read, but not expanded, because - <a href="#XML_SetDefaultHandler"><code>XML_SetDefaultHandler</code></a> - has been called.</li> -</ol> -<p>The <code>is_parameter_entity</code> argument will be non-zero for -a parameter entity and zero for a general entity.</p> <p>Note: skipped -parameter entities in declarations and skipped general entities in -attribute values cannot be reported, because the event would be out of -sync with the reporting of the declarations or attribute values</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetUnknownEncodingHandler"> -void XMLCALL -XML_SetUnknownEncodingHandler(XML_Parser p, - XML_UnknownEncodingHandler enchandler, - void *encodingHandlerData) -</pre> -<pre class="signature"> -typedef int -(XMLCALL *XML_UnknownEncodingHandler)(void *encodingHandlerData, - const XML_Char *name, - XML_Encoding *info); - -typedef struct { - int map[256]; - void *data; - int (XMLCALL *convert)(void *data, const char *s); - void (XMLCALL *release)(void *data); -} XML_Encoding; -</pre> -<p>Set a handler to deal with encodings other than the <a -href="#builtin_encodings">built in set</a>. This should be done before -<code><a href= "#XML_Parse" >XML_Parse</a></code> or <code><a href= -"#XML_ParseBuffer" >XML_ParseBuffer</a></code> have been called on the -given parser.</p> <p>If the handler knows how to deal with an encoding -with the given name, it should fill in the <code>info</code> data -structure and return <code>XML_STATUS_OK</code>. Otherwise it -should return <code>XML_STATUS_ERROR</code>. The handler will be called -at most once per parsed (external) entity. The optional application -data pointer <code>encodingHandlerData</code> will be passed back to -the handler.</p> - -<p>The map array contains information for every possible possible leading -byte in a byte sequence. If the corresponding value is >= 0, then it's -a single byte sequence and the byte encodes that Unicode value. If the -value is -1, then that byte is invalid as the initial byte in a sequence. -If the value is -n, where n is an integer > 1, then n is the number of -bytes in the sequence and the actual conversion is accomplished by a -call to the function pointed at by convert. This function may return -1 -if the sequence itself is invalid. The convert pointer may be null if -there are only single byte codes. The data parameter passed to the convert -function is the data pointer from <code>XML_Encoding</code>. The -string s is <em>NOT</em> nul-terminated and points at the sequence of -bytes to be converted.</p> - -<p>The function pointed at by <code>release</code> is called by the -parser when it is finished with the encoding. It may be NULL.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetStartNamespaceDeclHandler"> -void XMLCALL -XML_SetStartNamespaceDeclHandler(XML_Parser p, - XML_StartNamespaceDeclHandler start); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_StartNamespaceDeclHandler)(void *userData, - const XML_Char *prefix, - const XML_Char *uri); -</pre> -<p>Set a handler to be called when a namespace is declared. Namespace -declarations occur inside start tags. But the namespace declaration start -handler is called before the start tag handler for each namespace declared -in that start tag.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetEndNamespaceDeclHandler"> -void XMLCALL -XML_SetEndNamespaceDeclHandler(XML_Parser p, - XML_EndNamespaceDeclHandler end); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_EndNamespaceDeclHandler)(void *userData, - const XML_Char *prefix); -</pre> -<p>Set a handler to be called when leaving the scope of a namespace -declaration. This will be called, for each namespace declaration, -after the handler for the end tag of the element in which the -namespace was declared.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetNamespaceDeclHandler"> -void XMLCALL -XML_SetNamespaceDeclHandler(XML_Parser p, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end) -</pre> -<p>Sets both namespace declaration handlers with a single call.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetXmlDeclHandler"> -void XMLCALL -XML_SetXmlDeclHandler(XML_Parser p, - XML_XmlDeclHandler xmldecl); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_XmlDeclHandler)(void *userData, - const XML_Char *version, - const XML_Char *encoding, - int standalone); -</pre> -<p>Sets a handler that is called for XML declarations and also for -text declarations discovered in external entities. The way to -distinguish is that the <code>version</code> parameter will be NULL -for text declarations. The <code>encoding</code> parameter may be NULL -for an XML declaration. The <code>standalone</code> argument will -contain -1, 0, or 1 indicating respectively that there was no -standalone parameter in the declaration, that it was given as no, or -that it was given as yes.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetStartDoctypeDeclHandler"> -void XMLCALL -XML_SetStartDoctypeDeclHandler(XML_Parser p, - XML_StartDoctypeDeclHandler start); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_StartDoctypeDeclHandler)(void *userData, - const XML_Char *doctypeName, - const XML_Char *sysid, - const XML_Char *pubid, - int has_internal_subset); -</pre> -<p>Set a handler that is called at the start of a DOCTYPE declaration, -before any external or internal subset is parsed. Both <code>sysid</code> -and <code>pubid</code> may be NULL. The <code>has_internal_subset</code> -will be non-zero if the DOCTYPE declaration has an internal subset.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetEndDoctypeDeclHandler"> -void XMLCALL -XML_SetEndDoctypeDeclHandler(XML_Parser p, - XML_EndDoctypeDeclHandler end); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); -</pre> -<p>Set a handler that is called at the end of a DOCTYPE declaration, -after parsing any external subset.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetDoctypeDeclHandler"> -void XMLCALL -XML_SetDoctypeDeclHandler(XML_Parser p, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end); -</pre> -<p>Set both doctype handlers with one call.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetElementDeclHandler"> -void XMLCALL -XML_SetElementDeclHandler(XML_Parser p, - XML_ElementDeclHandler eldecl); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_ElementDeclHandler)(void *userData, - const XML_Char *name, - XML_Content *model); -</pre> -<pre class="signature"> -enum XML_Content_Type { - XML_CTYPE_EMPTY = 1, - XML_CTYPE_ANY, - XML_CTYPE_MIXED, - XML_CTYPE_NAME, - XML_CTYPE_CHOICE, - XML_CTYPE_SEQ -}; - -enum XML_Content_Quant { - XML_CQUANT_NONE, - XML_CQUANT_OPT, - XML_CQUANT_REP, - XML_CQUANT_PLUS -}; - -typedef struct XML_cp XML_Content; - -struct XML_cp { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - const XML_Char * name; - unsigned int numchildren; - XML_Content * children; -}; -</pre> -<p>Sets a handler for element declarations in a DTD. The handler gets -called with the name of the element in the declaration and a pointer -to a structure that contains the element model. It is the -application's responsibility to free this data structure using -<code><a href="#XML_FreeContentModel" ->XML_FreeContentModel</a></code>.</p> - -<p>The <code>model</code> argument is the root of a tree of -<code>XML_Content</code> nodes. If <code>type</code> equals -<code>XML_CTYPE_EMPTY</code> or <code>XML_CTYPE_ANY</code>, then -<code>quant</code> will be <code>XML_CQUANT_NONE</code>, and the other -fields will be zero or NULL. If <code>type</code> is -<code>XML_CTYPE_MIXED</code>, then <code>quant</code> will be -<code>XML_CQUANT_NONE</code> or <code>XML_CQUANT_REP</code> and -<code>numchildren</code> will contain the number of elements that are -allowed to be mixed in and <code>children</code> points to an array of -<code>XML_Content</code> structures that will all have type -XML_CTYPE_NAME with no quantification. Only the root node can be type -<code>XML_CTYPE_EMPTY</code>, <code>XML_CTYPE_ANY</code>, or -<code>XML_CTYPE_MIXED</code>.</p> - -<p>For type <code>XML_CTYPE_NAME</code>, the <code>name</code> field -points to the name and the <code>numchildren</code> and -<code>children</code> fields will be zero and NULL. The -<code>quant</code> field will indicate any quantifiers placed on the -name.</p> - -<p>Types <code>XML_CTYPE_CHOICE</code> and <code>XML_CTYPE_SEQ</code> -indicate a choice or sequence respectively. The -<code>numchildren</code> field indicates how many nodes in the choice -or sequence and <code>children</code> points to the nodes.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetAttlistDeclHandler"> -void XMLCALL -XML_SetAttlistDeclHandler(XML_Parser p, - XML_AttlistDeclHandler attdecl); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_AttlistDeclHandler)(void *userData, - const XML_Char *elname, - const XML_Char *attname, - const XML_Char *att_type, - const XML_Char *dflt, - int isrequired); -</pre> -<p>Set a handler for attlist declarations in the DTD. This handler is -called for <em>each</em> attribute. So a single attlist declaration -with multiple attributes declared will generate multiple calls to this -handler. The <code>elname</code> parameter returns the name of the -element for which the attribute is being declared. The attribute name -is in the <code>attname</code> parameter. The attribute type is in the -<code>att_type</code> parameter. It is the string representing the -type in the declaration with whitespace removed.</p> - -<p>The <code>dflt</code> parameter holds the default value. It will be -NULL in the case of "#IMPLIED" or "#REQUIRED" attributes. You can -distinguish these two cases by checking the <code>isrequired</code> -parameter, which will be true in the case of "#REQUIRED" attributes. -Attributes which are "#FIXED" will have also have a true -<code>isrequired</code>, but they will have the non-NULL fixed value -in the <code>dflt</code> parameter.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetEntityDeclHandler"> -void XMLCALL -XML_SetEntityDeclHandler(XML_Parser p, - XML_EntityDeclHandler handler); -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_EntityDeclHandler)(void *userData, - const XML_Char *entityName, - int is_parameter_entity, - const XML_Char *value, - int value_length, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); -</pre> -<p>Sets a handler that will be called for all entity declarations. -The <code>is_parameter_entity</code> argument will be non-zero in the -case of parameter entities and zero otherwise.</p> - -<p>For internal entities (<code><!ENTITY foo "bar"></code>), -<code>value</code> will be non-NULL and <code>systemId</code>, -<code>publicId</code>, and <code>notationName</code> will all be NULL. -The value string is <em>not</em> NULL terminated; the length is -provided in the <code>value_length</code> parameter. Do not use -<code>value_length</code> to test for internal entities, since it is -legal to have zero-length values. Instead check for whether or not -<code>value</code> is NULL.</p> <p>The <code>notationName</code> -argument will have a non-NULL value only for unparsed entity -declarations.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetUnparsedEntityDeclHandler"> -void XMLCALL -XML_SetUnparsedEntityDeclHandler(XML_Parser p, - XML_UnparsedEntityDeclHandler h) -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_UnparsedEntityDeclHandler)(void *userData, - const XML_Char *entityName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); -</pre> -<p>Set a handler that receives declarations of unparsed entities. These -are entity declarations that have a notation (NDATA) field:</p> - -<div id="eg"><pre> -<!ENTITY logo SYSTEM "images/logo.gif" NDATA gif> -</pre></div> -<p>This handler is obsolete and is provided for backwards -compatibility. Use instead <a href= "#XML_SetEntityDeclHandler" ->XML_SetEntityDeclHandler</a>.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetNotationDeclHandler"> -void XMLCALL -XML_SetNotationDeclHandler(XML_Parser p, - XML_NotationDeclHandler h) -</pre> -<pre class="signature"> -typedef void -(XMLCALL *XML_NotationDeclHandler)(void *userData, - const XML_Char *notationName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); -</pre> -<p>Set a handler that receives notation declarations.</p> -</div> - -<div class="handler"> -<pre class="setter" id="XML_SetNotStandaloneHandler"> -void XMLCALL -XML_SetNotStandaloneHandler(XML_Parser p, - XML_NotStandaloneHandler h) -</pre> -<pre class="signature"> -typedef int -(XMLCALL *XML_NotStandaloneHandler)(void *userData); -</pre> -<p>Set a handler that is called if the document is not "standalone". -This happens when there is an external subset or a reference to a -parameter entity, but does not have standalone set to "yes" in an XML -declaration. If this handler returns <code>XML_STATUS_ERROR</code>, -then the parser will throw an <code>XML_ERROR_NOT_STANDALONE</code> -error.</p> -</div> - -<h3><a name="position">Parse position and error reporting functions</a></h3> - -<p>These are the functions you'll want to call when the parse -functions return <code>XML_STATUS_ERROR</code> (a parse error has -occurred), although the position reporting functions are useful outside -of errors. The position reported is the byte position (in the original -document or entity encoding) of the first of the sequence of -characters that generated the current event (or the error that caused -the parse functions to return <code>XML_STATUS_ERROR</code>.) The -exceptions are callbacks trigged by declarations in the document -prologue, in which case they exact position reported is somewhere in the -relevant markup, but not necessarily as meaningful as for other -events.</p> - -<p>The position reporting functions are accurate only outside of the -DTD. In other words, they usually return bogus information when -called from within a DTD declaration handler.</p> - -<pre class="fcndec" id="XML_GetErrorCode"> -enum XML_Error XMLCALL -XML_GetErrorCode(XML_Parser p); -</pre> -<div class="fcndef"> -Return what type of error has occurred. -</div> - -<pre class="fcndec" id="XML_ErrorString"> -const XML_LChar * XMLCALL -XML_ErrorString(enum XML_Error code); -</pre> -<div class="fcndef"> -Return a string describing the error corresponding to code. -The code should be one of the enums that can be returned from -<code><a href= "#XML_GetErrorCode" >XML_GetErrorCode</a></code>. -</div> - -<pre class="fcndec" id="XML_GetCurrentByteIndex"> -XML_Index XMLCALL -XML_GetCurrentByteIndex(XML_Parser p); -</pre> -<div class="fcndef"> -Return the byte offset of the position. This always corresponds to -the values returned by <code><a href= "#XML_GetCurrentLineNumber" ->XML_GetCurrentLineNumber</a></code> and <code><a href= -"#XML_GetCurrentColumnNumber" >XML_GetCurrentColumnNumber</a></code>. -</div> - -<pre class="fcndec" id="XML_GetCurrentLineNumber"> -XML_Size XMLCALL -XML_GetCurrentLineNumber(XML_Parser p); -</pre> -<div class="fcndef"> -Return the line number of the position. The first line is reported as -<code>1</code>. -</div> - -<pre class="fcndec" id="XML_GetCurrentColumnNumber"> -XML_Size XMLCALL -XML_GetCurrentColumnNumber(XML_Parser p); -</pre> -<div class="fcndef"> -Return the offset, from the beginning of the current line, of -the position. -</div> - -<pre class="fcndec" id="XML_GetCurrentByteCount"> -int XMLCALL -XML_GetCurrentByteCount(XML_Parser p); -</pre> -<div class="fcndef"> -Return the number of bytes in the current event. Returns -<code>0</code> if the event is inside a reference to an internal -entity and for the end-tag event for empty element tags (the later can -be used to distinguish empty-element tags from empty elements using -separate start and end tags). -</div> - -<pre class="fcndec" id="XML_GetInputContext"> -const char * XMLCALL -XML_GetInputContext(XML_Parser p, - int *offset, - int *size); -</pre> -<div class="fcndef"> - -<p>Returns the parser's input buffer, sets the integer pointed at by -<code>offset</code> to the offset within this buffer of the current -parse position, and set the integer pointed at by <code>size</code> to -the size of the returned buffer.</p> - -<p>This should only be called from within a handler during an active -parse and the returned buffer should only be referred to from within -the handler that made the call. This input buffer contains the -untranslated bytes of the input.</p> - -<p>Only a limited amount of context is kept, so if the event -triggering a call spans over a very large amount of input, the actual -parse position may be before the beginning of the buffer.</p> - -<p>If <code>XML_CONTEXT_BYTES</code> is not defined, this will always -return NULL.</p> -</div> - -<h3><a name="miscellaneous">Miscellaneous functions</a></h3> - -<p>The functions in this section either obtain state information from -the parser or can be used to dynamicly set parser options.</p> - -<pre class="fcndec" id="XML_SetUserData"> -void XMLCALL -XML_SetUserData(XML_Parser p, - void *userData); -</pre> -<div class="fcndef"> -This sets the user data pointer that gets passed to handlers. It -overwrites any previous value for this pointer. Note that the -application is responsible for freeing the memory associated with -<code>userData</code> when it is finished with the parser. So if you -call this when there's already a pointer there, and you haven't freed -the memory associated with it, then you've probably just leaked -memory. -</div> - -<pre class="fcndec" id="XML_GetUserData"> -void * XMLCALL -XML_GetUserData(XML_Parser p); -</pre> -<div class="fcndef"> -This returns the user data pointer that gets passed to handlers. -It is actually implemented as a macro. -</div> - -<pre class="fcndec" id="XML_UseParserAsHandlerArg"> -void XMLCALL -XML_UseParserAsHandlerArg(XML_Parser p); -</pre> -<div class="fcndef"> -After this is called, handlers receive the parser in their -<code>userData</code> arguments. The user data can still be obtained -using the <code><a href= "#XML_GetUserData" ->XML_GetUserData</a></code> function. -</div> - -<pre class="fcndec" id="XML_SetBase"> -enum XML_Status XMLCALL -XML_SetBase(XML_Parser p, - const XML_Char *base); -</pre> -<div class="fcndef"> -Set the base to be used for resolving relative URIs in system -identifiers. The return value is <code>XML_STATUS_ERROR</code> if -there's no memory to store base, otherwise it's -<code>XML_STATUS_OK</code>. -</div> - -<pre class="fcndec" id="XML_GetBase"> -const XML_Char * XMLCALL -XML_GetBase(XML_Parser p); -</pre> -<div class="fcndef"> -Return the base for resolving relative URIs. -</div> - -<pre class="fcndec" id="XML_GetSpecifiedAttributeCount"> -int XMLCALL -XML_GetSpecifiedAttributeCount(XML_Parser p); -</pre> -<div class="fcndef"> -When attributes are reported to the start handler in the atts vector, -attributes that were explicitly set in the element occur before any -attributes that receive their value from default information in an -ATTLIST declaration. This function returns the number of attributes -that were explicitly set times two, thus giving the offset in the -<code>atts</code> array passed to the start tag handler of the first -attribute set due to defaults. It supplies information for the last -call to a start handler. If called inside a start handler, then that -means the current call. -</div> - -<pre class="fcndec" id="XML_GetIdAttributeIndex"> -int XMLCALL -XML_GetIdAttributeIndex(XML_Parser p); -</pre> -<div class="fcndef"> -Returns the index of the ID attribute passed in the atts array in the -last call to <code><a href= "#XML_StartElementHandler" ->XML_StartElementHandler</a></code>, or -1 if there is no ID -attribute. If called inside a start handler, then that means the -current call. -</div> - -<pre class="fcndec" id="XML_GetAttributeInfo"> -const XML_AttrInfo * XMLCALL -XML_GetAttributeInfo(XML_Parser parser); -</pre> -<pre class="signature"> -typedef struct { - XML_Index nameStart; /* Offset to beginning of the attribute name. */ - XML_Index nameEnd; /* Offset after the attribute name's last byte. */ - XML_Index valueStart; /* Offset to beginning of the attribute value. */ - XML_Index valueEnd; /* Offset after the attribute value's last byte. */ -} XML_AttrInfo; -</pre> -<div class="fcndef"> -Returns an array of <code>XML_AttrInfo</code> structures for the -attribute/value pairs passed in the last call to the -<code>XML_StartElementHandler</code> that were specified -in the start-tag rather than defaulted. Each attribute/value pair counts -as 1; thus the number of entries in the array is -<code>XML_GetSpecifiedAttributeCount(parser) / 2</code>. -</div> - -<pre class="fcndec" id="XML_SetEncoding"> -enum XML_Status XMLCALL -XML_SetEncoding(XML_Parser p, - const XML_Char *encoding); -</pre> -<div class="fcndef"> -Set the encoding to be used by the parser. It is equivalent to -passing a non-null encoding argument to the parser creation functions. -It must not be called after <code><a href= "#XML_Parse" ->XML_Parse</a></code> or <code><a href= "#XML_ParseBuffer" ->XML_ParseBuffer</a></code> have been called on the given parser. -Returns <code>XML_STATUS_OK</code> on success or -<code>XML_STATUS_ERROR</code> on error. -</div> - -<pre class="fcndec" id="XML_SetParamEntityParsing"> -int XMLCALL -XML_SetParamEntityParsing(XML_Parser p, - enum XML_ParamEntityParsing code); -</pre> -<div class="fcndef"> -This enables parsing of parameter entities, including the external -parameter entity that is the external DTD subset, according to -<code>code</code>. -The choices for <code>code</code> are: -<ul> -<li><code>XML_PARAM_ENTITY_PARSING_NEVER</code></li> -<li><code>XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE</code></li> -<li><code>XML_PARAM_ENTITY_PARSING_ALWAYS</code></li> -</ul> -<b>Note:</b> If <code>XML_SetParamEntityParsing</code> is called after -<code>XML_Parse</code> or <code>XML_ParseBuffer</code>, then it has -no effect and will always return 0. -</div> - -<pre class="fcndec" id="XML_SetHashSalt"> -int XMLCALL -XML_SetHashSalt(XML_Parser p, - unsigned long hash_salt); -</pre> -<div class="fcndef"> -Sets the hash salt to use for internal hash calculations. -Helps in preventing DoS attacks based on predicting hash -function behavior. In order to have an effect this must be called -before parsing has started. Returns 1 if successful, 0 when called -after <code>XML_Parse</code> or <code>XML_ParseBuffer</code>. -<p><b>Note:</b> This call is optional, as the parser will auto-generate a new -random salt value if no value has been set at the start of parsing.</p> -</div> - -<pre class="fcndec" id="XML_UseForeignDTD"> -enum XML_Error XMLCALL -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); -</pre> -<div class="fcndef"> -<p>This function allows an application to provide an external subset -for the document type declaration for documents which do not specify -an external subset of their own. For documents which specify an -external subset in their DOCTYPE declaration, the application-provided -subset will be ignored. If the document does not contain a DOCTYPE -declaration at all and <code>useDTD</code> is true, the -application-provided subset will be parsed, but the -<code>startDoctypeDeclHandler</code> and -<code>endDoctypeDeclHandler</code> functions, if set, will not be -called. The setting of parameter entity parsing, controlled using -<code><a href= "#XML_SetParamEntityParsing" ->XML_SetParamEntityParsing</a></code>, will be honored.</p> - -<p>The application-provided external subset is read by calling the -external entity reference handler set via <code><a href= -"#XML_SetExternalEntityRefHandler" ->XML_SetExternalEntityRefHandler</a></code> with both -<code>publicId</code> and <code>systemId</code> set to NULL.</p> - -<p>If this function is called after parsing has begun, it returns -<code>XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING</code> and ignores -<code>useDTD</code>. If called when Expat has been compiled without -DTD support, it returns -<code>XML_ERROR_FEATURE_REQUIRES_XML_DTD</code>. Otherwise, it -returns <code>XML_ERROR_NONE</code>.</p> - -<p><b>Note:</b> For the purpose of checking WFC: Entity Declared, passing -<code>useDTD == XML_TRUE</code> will make the parser behave as if -the document had a DTD with an external subset. This holds true even if -the external entity reference handler returns without action.</p> -</div> - -<pre class="fcndec" id="XML_SetReturnNSTriplet"> -void XMLCALL -XML_SetReturnNSTriplet(XML_Parser parser, - int do_nst); -</pre> -<div class="fcndef"> -<p> -This function only has an effect when using a parser created with -<code><a href= "#XML_ParserCreateNS" >XML_ParserCreateNS</a></code>, -i.e. when namespace processing is in effect. The <code>do_nst</code> -sets whether or not prefixes are returned with names qualified with a -namespace prefix. If this function is called with <code>do_nst</code> -non-zero, then afterwards namespace qualified names (that is qualified -with a prefix as opposed to belonging to a default namespace) are -returned as a triplet with the three parts separated by the namespace -separator specified when the parser was created. The order of -returned parts is URI, local name, and prefix.</p> <p>If -<code>do_nst</code> is zero, then namespaces are reported in the -default manner, URI then local_name separated by the namespace -separator.</p> -</div> - -<pre class="fcndec" id="XML_DefaultCurrent"> -void XMLCALL -XML_DefaultCurrent(XML_Parser parser); -</pre> -<div class="fcndef"> -This can be called within a handler for a start element, end element, -processing instruction or character data. It causes the corresponding -markup to be passed to the default handler set by <code><a -href="#XML_SetDefaultHandler" >XML_SetDefaultHandler</a></code> or -<code><a href="#XML_SetDefaultHandlerExpand" ->XML_SetDefaultHandlerExpand</a></code>. It does nothing if there is -not a default handler. -</div> - -<pre class="fcndec" id="XML_ExpatVersion"> -XML_LChar * XMLCALL -XML_ExpatVersion(); -</pre> -<div class="fcndef"> -Return the library version as a string (e.g. <code>"expat_1.95.1"</code>). -</div> - -<pre class="fcndec" id="XML_ExpatVersionInfo"> -struct XML_Expat_Version XMLCALL -XML_ExpatVersionInfo(); -</pre> -<pre class="signature"> -typedef struct { - int major; - int minor; - int micro; -} XML_Expat_Version; -</pre> -<div class="fcndef"> -Return the library version information as a structure. -Some macros are also defined that support compile-time tests of the -library version: -<ul> -<li><code>XML_MAJOR_VERSION</code></li> -<li><code>XML_MINOR_VERSION</code></li> -<li><code>XML_MICRO_VERSION</code></li> -</ul> -Testing these constants is currently the best way to determine if -particular parts of the Expat API are available. -</div> - -<pre class="fcndec" id="XML_GetFeatureList"> -const XML_Feature * XMLCALL -XML_GetFeatureList(); -</pre> -<pre class="signature"> -enum XML_FeatureEnum { - XML_FEATURE_END = 0, - XML_FEATURE_UNICODE, - XML_FEATURE_UNICODE_WCHAR_T, - XML_FEATURE_DTD, - XML_FEATURE_CONTEXT_BYTES, - XML_FEATURE_MIN_SIZE, - XML_FEATURE_SIZEOF_XML_CHAR, - XML_FEATURE_SIZEOF_XML_LCHAR, - XML_FEATURE_NS, - XML_FEATURE_LARGE_SIZE -}; - -typedef struct { - enum XML_FeatureEnum feature; - XML_LChar *name; - long int value; -} XML_Feature; -</pre> -<div class="fcndef"> -<p>Returns a list of "feature" records, providing details on how -Expat was configured at compile time. Most applications should not -need to worry about this, but this information is otherwise not -available from Expat. This function allows code that does need to -check these features to do so at runtime.</p> - -<p>The return value is an array of <code>XML_Feature</code>, -terminated by a record with a <code>feature</code> of -<code>XML_FEATURE_END</code> and <code>name</code> of NULL, -identifying the feature-test macros Expat was compiled with. Since an -application that requires this kind of information needs to determine -the type of character the <code>name</code> points to, records for the -<code>XML_FEATURE_SIZEOF_XML_CHAR</code> and -<code>XML_FEATURE_SIZEOF_XML_LCHAR</code> will be located at the -beginning of the list, followed by <code>XML_FEATURE_UNICODE</code> -and <code>XML_FEATURE_UNICODE_WCHAR_T</code>, if they are present at -all.</p> - -<p>Some features have an associated value. If there isn't an -associated value, the <code>value</code> field is set to 0. At this -time, the following features have been defined to have values:</p> - -<dl> - <dt><code>XML_FEATURE_SIZEOF_XML_CHAR</code></dt> - <dd>The number of bytes occupied by one <code>XML_Char</code> - character.</dd> - <dt><code>XML_FEATURE_SIZEOF_XML_LCHAR</code></dt> - <dd>The number of bytes occupied by one <code>XML_LChar</code> - character.</dd> - <dt><code>XML_FEATURE_CONTEXT_BYTES</code></dt> - <dd>The maximum number of characters of context which can be - reported by <code><a href= "#XML_GetInputContext" - >XML_GetInputContext</a></code>.</dd> -</dl> -</div> - -<pre class="fcndec" id="XML_FreeContentModel"> -void XMLCALL -XML_FreeContentModel(XML_Parser parser, XML_Content *model); -</pre> -<div class="fcndef"> -Function to deallocate the <code>model</code> argument passed to the -<code>XML_ElementDeclHandler</code> callback set using <code><a -href="#XML_SetElementDeclHandler" >XML_ElementDeclHandler</a></code>. -This function should not be used for any other purpose. -</div> - -<p>The following functions allow external code to share the memory -allocator an <code>XML_Parser</code> has been configured to use. This -is especially useful for third-party libraries that interact with a -parser object created by application code, or heavily layered -applications. This can be essential when using dynamically loaded -libraries which use different C standard libraries (this can happen on -Windows, at least).</p> - -<pre class="fcndec" id="XML_MemMalloc"> -void * XMLCALL -XML_MemMalloc(XML_Parser parser, size_t size); -</pre> -<div class="fcndef"> -Allocate <code>size</code> bytes of memory using the allocator the -<code>parser</code> object has been configured to use. Returns a -pointer to the memory or NULL on failure. Memory allocated in this -way must be freed using <code><a href="#XML_MemFree" ->XML_MemFree</a></code>. -</div> - -<pre class="fcndec" id="XML_MemRealloc"> -void * XMLCALL -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); -</pre> -<div class="fcndef"> -Allocate <code>size</code> bytes of memory using the allocator the -<code>parser</code> object has been configured to use. -<code>ptr</code> must point to a block of memory allocated by <code><a -href="#XML_MemMalloc" >XML_MemMalloc</a></code> or -<code>XML_MemRealloc</code>, or be NULL. This function tries to -expand the block pointed to by <code>ptr</code> if possible. Returns -a pointer to the memory or NULL on failure. On success, the original -block has either been expanded or freed. On failure, the original -block has not been freed; the caller is responsible for freeing the -original block. Memory allocated in this way must be freed using -<code><a href="#XML_MemFree" ->XML_MemFree</a></code>. -</div> - -<pre class="fcndec" id="XML_MemFree"> -void XMLCALL -XML_MemFree(XML_Parser parser, void *ptr); -</pre> -<div class="fcndef"> -Free a block of memory pointed to by <code>ptr</code>. The block must -have been allocated by <code><a href="#XML_MemMalloc" ->XML_MemMalloc</a></code> or <code>XML_MemRealloc</code>, or be NULL. -</div> - -<hr /> -<p><a href="http://validator.w3.org/check/referer"><img - src="valid-xhtml10.png" alt="Valid XHTML 1.0!" - height="31" width="88" class="noborder" /></a></p> -</div> -</body> -</html> diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/style.css b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/style.css deleted file mode 100644 index 69df30bc..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/style.css +++ /dev/null @@ -1,101 +0,0 @@ -body { - background-color: white; - border: 0px; - margin: 0px; - padding: 0px; -} - -.corner { - width: 200px; - height: 80px; - text-align: center; -} - -.banner { - background-color: rgb(110,139,61); - color: rgb(255,236,176); - padding-left: 2em; -} - -.banner h1 { - font-size: 200%; -} - -.content { - padding: 0em 2em 1em 2em; -} - -.releaseno { - background-color: rgb(110,139,61); - color: rgb(255,236,176); - padding-bottom: 0.3em; - padding-top: 0.5em; - text-align: center; - font-weight: bold; -} - -.noborder { - border-width: 0px; -} - -.eg { - padding-left: 1em; - padding-top: .5em; - padding-bottom: .5em; - border: solid thin; - margin: 1em 0; - background-color: tan; - margin-left: 2em; - margin-right: 10%; -} - -.pseudocode { - padding-left: 1em; - padding-top: .5em; - padding-bottom: .5em; - border: solid thin; - margin: 1em 0; - background-color: rgb(250,220,180); - margin-left: 2em; - margin-right: 10%; -} - -.handler { - width: 100%; - border-top-width: thin; - margin-bottom: 1em; -} - -.handler p { - margin-left: 2em; -} - -.setter { - font-weight: bold; -} - -.signature { - color: navy; -} - -.fcndec { - width: 100%; - border-top-width: thin; - font-weight: bold; -} - -.fcndef { - margin-left: 2em; - margin-bottom: 2em; -} - -dd { - margin-bottom: 2em; -} - -.cpp-symbols dt { - font-family: monospace; -} -.cpp-symbols dd { - margin-bottom: 1em; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/valid-xhtml10.png b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/valid-xhtml10.png deleted file mode 100644 index 4c23f48fe02a58fbb3d1088e6a7d372568830b53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2368 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 diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 deleted file mode 100644 index 174719a7..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.1 +++ /dev/null @@ -1,251 +0,0 @@ -.\" This manpage has been automatically generated by docbook2man -.\" from a DocBook document. This tool can be found at: -.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> -.\" Please send any bug reports, improvements, comments, patches, -.\" etc. to Steve Cheng <steve@ggi-project.org>. -.TH "XMLWF" "1" "24 January 2003" "" "" -.SH NAME -xmlwf \- Determines if an XML document is well-formed -.SH SYNOPSIS - -\fBxmlwf\fR [ \fB-s\fR] [ \fB-n\fR] [ \fB-p\fR] [ \fB-x\fR] [ \fB-e \fIencoding\fB\fR] [ \fB-w\fR] [ \fB-d \fIoutput-dir\fB\fR] [ \fB-c\fR] [ \fB-m\fR] [ \fB-r\fR] [ \fB-t\fR] [ \fB-v\fR] [ \fBfile ...\fR] - -.SH "DESCRIPTION" -.PP -\fBxmlwf\fR uses the Expat library to -determine if an XML document is well-formed. It is -non-validating. -.PP -If you do not specify any files on the command-line, and you -have a recent version of \fBxmlwf\fR, the -input file will be read from standard input. -.SH "WELL-FORMED DOCUMENTS" -.PP -A well-formed document must adhere to the -following rules: -.TP 0.2i -\(bu -The file begins with an XML declaration. For instance, -<?xml version="1.0" standalone="yes"?>. -\fBNOTE:\fR -\fBxmlwf\fR does not currently -check for a valid XML declaration. -.TP 0.2i -\(bu -Every start tag is either empty (<tag/>) -or has a corresponding end tag. -.TP 0.2i -\(bu -There is exactly one root element. This element must contain -all other elements in the document. Only comments, white -space, and processing instructions may come after the close -of the root element. -.TP 0.2i -\(bu -All elements nest properly. -.TP 0.2i -\(bu -All attribute values are enclosed in quotes (either single -or double). -.PP -If the document has a DTD, and it strictly complies with that -DTD, then the document is also considered \fBvalid\fR. -\fBxmlwf\fR is a non-validating parser -- -it does not check the DTD. However, it does support -external entities (see the \fB-x\fR option). -.SH "OPTIONS" -.PP -When an option includes an argument, you may specify the argument either -separately ("\fB-d\fR output") or concatenated with the -option ("\fB-d\fRoutput"). \fBxmlwf\fR -supports both. -.TP -\fB-c\fR -If the input file is well-formed and \fBxmlwf\fR -doesn't encounter any errors, the input file is simply copied to -the output directory unchanged. -This implies no namespaces (turns off \fB-n\fR) and -requires \fB-d\fR to specify an output file. -.TP -\fB-d output-dir\fR -Specifies a directory to contain transformed -representations of the input files. -By default, \fB-d\fR outputs a canonical representation -(described below). -You can select different output formats using \fB-c\fR -and \fB-m\fR. - -The output filenames will -be exactly the same as the input filenames or "STDIN" if the input is -coming from standard input. Therefore, you must be careful that the -output file does not go into the same directory as the input -file. Otherwise, \fBxmlwf\fR will delete the -input file before it generates the output file (just like running -cat < file > file in most shells). - -Two structurally equivalent XML documents have a byte-for-byte -identical canonical XML representation. -Note that ignorable white space is considered significant and -is treated equivalently to data. -More on canonical XML can be found at -http://www.jclark.com/xml/canonxml.html . -.TP -\fB-e encoding\fR -Specifies the character encoding for the document, overriding -any document encoding declaration. \fBxmlwf\fR -supports four built-in encodings: -US-ASCII, -UTF-8, -UTF-16, and -ISO-8859-1. -Also see the \fB-w\fR option. -.TP -\fB-m\fR -Outputs some strange sort of XML file that completely -describes the input file, including character positions. -Requires \fB-d\fR to specify an output file. -.TP -\fB-n\fR -Turns on namespace processing. (describe namespaces) -\fB-c\fR disables namespaces. -.TP -\fB-p\fR -Tells xmlwf to process external DTDs and parameter -entities. - -Normally \fBxmlwf\fR never parses parameter -entities. \fB-p\fR tells it to always parse them. -\fB-p\fR implies \fB-x\fR. -.TP -\fB-r\fR -Normally \fBxmlwf\fR memory-maps the XML file -before parsing; this can result in faster parsing on many -platforms. -\fB-r\fR turns off memory-mapping and uses normal file -IO calls instead. -Of course, memory-mapping is automatically turned off -when reading from standard input. - -Use of memory-mapping can cause some platforms to report -substantially higher memory usage for -\fBxmlwf\fR, but this appears to be a matter of -the operating system reporting memory in a strange way; there is -not a leak in \fBxmlwf\fR. -.TP -\fB-s\fR -Prints an error if the document is not standalone. -A document is standalone if it has no external subset and no -references to parameter entities. -.TP -\fB-t\fR -Turns on timings. This tells Expat to parse the entire file, -but not perform any processing. -This gives a fairly accurate idea of the raw speed of Expat itself -without client overhead. -\fB-t\fR turns off most of the output options -(\fB-d\fR, \fB-m\fR, \fB-c\fR, -\&...). -.TP -\fB-v\fR -Prints the version of the Expat library being used, including some -information on the compile-time configuration of the library, and -then exits. -.TP -\fB-w\fR -Enables support for Windows code pages. -Normally, \fBxmlwf\fR will throw an error if it -runs across an encoding that it is not equipped to handle itself. With -\fB-w\fR, xmlwf will try to use a Windows code -page. See also \fB-e\fR. -.TP -\fB-x\fR -Turns on parsing external entities. - -Non-validating parsers are not required to resolve external -entities, or even expand entities at all. -Expat always expands internal entities (?), -but external entity parsing must be enabled explicitly. - -External entities are simply entities that obtain their -data from outside the XML file currently being parsed. - -This is an example of an internal entity: - -.nf -<!ENTITY vers '1.0.2'> -.fi - -And here are some examples of external entities: - -.nf -<!ENTITY header SYSTEM "header-&vers;.xml"> (parsed) -<!ENTITY logo SYSTEM "logo.png" PNG> (unparsed) -.fi -.TP -\fB--\fR -(Two hyphens.) -Terminates the list of options. This is only needed if a filename -starts with a hyphen. For example: - -.nf -xmlwf -- -myfile.xml -.fi - -will run \fBxmlwf\fR on the file -\fI-myfile.xml\fR. -.PP -Older versions of \fBxmlwf\fR do not support -reading from standard input. -.SH "OUTPUT" -.PP -If an input file is not well-formed, -\fBxmlwf\fR prints a single line describing -the problem to standard output. If a file is well formed, -\fBxmlwf\fR outputs nothing. -Note that the result code is \fBnot\fR set. -.SH "BUGS" -.PP -According to the W3C standard, an XML file without a -declaration at the beginning is not considered well-formed. -However, \fBxmlwf\fR allows this to pass. -.PP -\fBxmlwf\fR returns a 0 - noerr result, -even if the file is not well-formed. There is no good way for -a program to use \fBxmlwf\fR to quickly -check a file -- it must parse \fBxmlwf\fR's -standard output. -.PP -The errors should go to standard error, not standard output. -.PP -There should be a way to get \fB-d\fR to send its -output to standard output rather than forcing the user to send -it to a file. -.PP -I have no idea why anyone would want to use the -\fB-d\fR, \fB-c\fR, and -\fB-m\fR options. If someone could explain it to -me, I'd like to add this information to this manpage. -.SH "ALTERNATIVES" -.PP -Here are some XML validators on the web: - -.nf -http://www.hcrc.ed.ac.uk/~richard/xml-check.html -http://www.stg.brown.edu/service/xmlvalid/ -http://www.scripting.com/frontier5/xml/code/xmlValidator.html -http://www.xml.com/pub/a/tools/ruwf/check.html -.fi -.SH "SEE ALSO" -.PP - -.nf -The Expat home page: http://www.libexpat.org/ -The W3 XML specification: http://www.w3.org/TR/REC-xml -.fi -.SH "AUTHOR" -.PP -This manual page was written by Scott Bronson <bronson@rinspin.com> for -the Debian GNU/Linux system (but may be used by others). Permission is -granted to copy, distribute and/or modify this document under -the terms of the GNU Free Documentation -License, Version 1.1. diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml deleted file mode 100644 index 313cfbcb..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/doc/xmlwf.sgml +++ /dev/null @@ -1,468 +0,0 @@ -<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ - -<!-- Process this file with docbook-to-man to generate an nroff manual - page: `docbook-to-man manpage.sgml > manpage.1'. You may view - the manual page with: `docbook-to-man manpage.sgml | nroff -man | - less'. A typical entry in a Makefile or Makefile.am is: - -manpage.1: manpage.sgml - docbook-to-man $< > $@ - --> - - <!-- Fill in your name for FIRSTNAME and SURNAME. --> - <!ENTITY dhfirstname "<firstname>Scott</firstname>"> - <!ENTITY dhsurname "<surname>Bronson</surname>"> - <!-- Please adjust the date whenever revising the manpage. --> - <!ENTITY dhdate "<date>December 5, 2001</date>"> - <!-- SECTION should be 1-8, maybe w/ subsection other parameters are - allowed: see man(7), man(1). --> - <!ENTITY dhsection "<manvolnum>1</manvolnum>"> - <!ENTITY dhemail "<email>bronson@rinspin.com</email>"> - <!ENTITY dhusername "Scott Bronson"> - <!ENTITY dhucpackage "<refentrytitle>XMLWF</refentrytitle>"> - <!ENTITY dhpackage "xmlwf"> - - <!ENTITY debian "<productname>Debian GNU/Linux</productname>"> - <!ENTITY gnu "<acronym>GNU</acronym>"> -]> - -<refentry> - <refentryinfo> - <address> - &dhemail; - </address> - <author> - &dhfirstname; - &dhsurname; - </author> - <copyright> - <year>2001</year> - <holder>&dhusername;</holder> - </copyright> - &dhdate; - </refentryinfo> - <refmeta> - &dhucpackage; - - &dhsection; - </refmeta> - <refnamediv> - <refname>&dhpackage;</refname> - - <refpurpose>Determines if an XML document is well-formed</refpurpose> - </refnamediv> - <refsynopsisdiv> - <cmdsynopsis> - <command>&dhpackage;</command> - <arg><option>-s</option></arg> - <arg><option>-n</option></arg> - <arg><option>-p</option></arg> - <arg><option>-x</option></arg> - - <arg><option>-e <replaceable>encoding</replaceable></option></arg> - <arg><option>-w</option></arg> - - <arg><option>-d <replaceable>output-dir</replaceable></option></arg> - <arg><option>-c</option></arg> - <arg><option>-m</option></arg> - - <arg><option>-r</option></arg> - <arg><option>-t</option></arg> - - <arg><option>-v</option></arg> - - <arg>file ...</arg> - </cmdsynopsis> - </refsynopsisdiv> - - <refsect1> - <title>DESCRIPTION</title> - - <para> - <command>&dhpackage;</command> uses the Expat library to - determine if an XML document is well-formed. It is - non-validating. - </para> - - <para> - If you do not specify any files on the command-line, and you - have a recent version of <command>&dhpackage;</command>, the - input file will be read from standard input. - </para> - - </refsect1> - - <refsect1> - <title>WELL-FORMED DOCUMENTS</title> - - <para> - A well-formed document must adhere to the - following rules: - </para> - - <itemizedlist> - <listitem><para> - The file begins with an XML declaration. For instance, - <literal><?xml version="1.0" standalone="yes"?></literal>. - <emphasis>NOTE:</emphasis> - <command>&dhpackage;</command> does not currently - check for a valid XML declaration. - </para></listitem> - <listitem><para> - Every start tag is either empty (<tag/>) - or has a corresponding end tag. - </para></listitem> - <listitem><para> - There is exactly one root element. This element must contain - all other elements in the document. Only comments, white - space, and processing instructions may come after the close - of the root element. - </para></listitem> - <listitem><para> - All elements nest properly. - </para></listitem> - <listitem><para> - All attribute values are enclosed in quotes (either single - or double). - </para></listitem> - </itemizedlist> - - <para> - If the document has a DTD, and it strictly complies with that - DTD, then the document is also considered <emphasis>valid</emphasis>. - <command>&dhpackage;</command> is a non-validating parser -- - it does not check the DTD. However, it does support - external entities (see the <option>-x</option> option). - </para> - </refsect1> - - <refsect1> - <title>OPTIONS</title> - -<para> -When an option includes an argument, you may specify the argument either -separately ("<option>-d</option> output") or concatenated with the -option ("<option>-d</option>output"). <command>&dhpackage;</command> -supports both. -</para> - - <variablelist> - - <varlistentry> - <term><option>-c</option></term> - <listitem> - <para> - If the input file is well-formed and <command>&dhpackage;</command> - doesn't encounter any errors, the input file is simply copied to - the output directory unchanged. - This implies no namespaces (turns off <option>-n</option>) and - requires <option>-d</option> to specify an output file. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-d output-dir</option></term> - <listitem> - <para> - Specifies a directory to contain transformed - representations of the input files. - By default, <option>-d</option> outputs a canonical representation - (described below). - You can select different output formats using <option>-c</option> - and <option>-m</option>. - </para> - <para> - The output filenames will - be exactly the same as the input filenames or "STDIN" if the input is - coming from standard input. Therefore, you must be careful that the - output file does not go into the same directory as the input - file. Otherwise, <command>&dhpackage;</command> will delete the - input file before it generates the output file (just like running - <literal>cat < file > file</literal> in most shells). - </para> - <para> - Two structurally equivalent XML documents have a byte-for-byte - identical canonical XML representation. - Note that ignorable white space is considered significant and - is treated equivalently to data. - More on canonical XML can be found at - http://www.jclark.com/xml/canonxml.html . - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-e encoding</option></term> - <listitem> - <para> - Specifies the character encoding for the document, overriding - any document encoding declaration. <command>&dhpackage;</command> - supports four built-in encodings: - <literal>US-ASCII</literal>, - <literal>UTF-8</literal>, - <literal>UTF-16</literal>, and - <literal>ISO-8859-1</literal>. - Also see the <option>-w</option> option. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-m</option></term> - <listitem> - <para> - Outputs some strange sort of XML file that completely - describes the the input file, including character postitions. - Requires <option>-d</option> to specify an output file. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-n</option></term> - <listitem> - <para> - Turns on namespace processing. (describe namespaces) - <option>-c</option> disables namespaces. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-p</option></term> - <listitem> - <para> - Tells xmlwf to process external DTDs and parameter - entities. - </para> - <para> - Normally <command>&dhpackage;</command> never parses parameter - entities. <option>-p</option> tells it to always parse them. - <option>-p</option> implies <option>-x</option>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-r</option></term> - <listitem> - <para> - Normally <command>&dhpackage;</command> memory-maps the XML file - before parsing; this can result in faster parsing on many - platforms. - <option>-r</option> turns off memory-mapping and uses normal file - IO calls instead. - Of course, memory-mapping is automatically turned off - when reading from standard input. - </para> - <para> - Use of memory-mapping can cause some platforms to report - substantially higher memory usage for - <command>&dhpackage;</command>, but this appears to be a matter of - the operating system reporting memory in a strange way; there is - not a leak in <command>&dhpackage;</command>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-s</option></term> - <listitem> - <para> - Prints an error if the document is not standalone. - A document is standalone if it has no external subset and no - references to parameter entities. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-t</option></term> - <listitem> - <para> - Turns on timings. This tells Expat to parse the entire file, - but not perform any processing. - This gives a fairly accurate idea of the raw speed of Expat itself - without client overhead. - <option>-t</option> turns off most of the output options - (<option>-d</option>, <option>-m</option>, <option>-c</option>, - ...). - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-v</option></term> - <listitem> - <para> - Prints the version of the Expat library being used, including some - information on the compile-time configuration of the library, and - then exits. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-w</option></term> - <listitem> - <para> - Enables support for Windows code pages. - Normally, <command>&dhpackage;</command> will throw an error if it - runs across an encoding that it is not equipped to handle itself. With - <option>-w</option>, &dhpackage; will try to use a Windows code - page. See also <option>-e</option>. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-x</option></term> - <listitem> - <para> - Turns on parsing external entities. - </para> -<para> - Non-validating parsers are not required to resolve external - entities, or even expand entities at all. - Expat always expands internal entities (?), - but external entity parsing must be enabled explicitly. - </para> - <para> - External entities are simply entities that obtain their - data from outside the XML file currently being parsed. - </para> - <para> - This is an example of an internal entity: -<literallayout> -<!ENTITY vers '1.0.2'> -</literallayout> - </para> - <para> - And here are some examples of external entities: - -<literallayout> -<!ENTITY header SYSTEM "header-&vers;.xml"> (parsed) -<!ENTITY logo SYSTEM "logo.png" PNG> (unparsed) -</literallayout> - - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>--</option></term> - <listitem> - <para> - (Two hyphens.) - Terminates the list of options. This is only needed if a filename - starts with a hyphen. For example: - </para> -<literallayout> -&dhpackage; -- -myfile.xml -</literallayout> - <para> - will run <command>&dhpackage;</command> on the file - <filename>-myfile.xml</filename>. - </para> - </listitem> - </varlistentry> - </variablelist> - - <para> - Older versions of <command>&dhpackage;</command> do not support - reading from standard input. - </para> - </refsect1> - - <refsect1> - <title>OUTPUT</title> - <para> - If an input file is not well-formed, - <command>&dhpackage;</command> prints a single line describing - the problem to standard output. If a file is well formed, - <command>&dhpackage;</command> outputs nothing. - Note that the result code is <emphasis>not</emphasis> set. - </para> - </refsect1> - - <refsect1> - <title>BUGS</title> - <para> - <command>&dhpackage;</command> returns a 0 - noerr result, - even if the file is not well-formed. There is no good way for - a program to use <command>&dhpackage;</command> to quickly - check a file -- it must parse <command>&dhpackage;</command>'s - standard output. - </para> - <para> - The errors should go to standard error, not standard output. - </para> - <para> - There should be a way to get <option>-d</option> to send its - output to standard output rather than forcing the user to send - it to a file. - </para> - <para> - I have no idea why anyone would want to use the - <option>-d</option>, <option>-c</option>, and - <option>-m</option> options. If someone could explain it to - me, I'd like to add this information to this manpage. - </para> - </refsect1> - - <refsect1> - <title>ALTERNATIVES</title> - <para> - Here are some XML validators on the web: - -<literallayout> -http://www.hcrc.ed.ac.uk/~richard/xml-check.html -http://www.stg.brown.edu/service/xmlvalid/ -http://www.scripting.com/frontier5/xml/code/xmlValidator.html -http://www.xml.com/pub/a/tools/ruwf/check.html -</literallayout> - - </para> - </refsect1> - - <refsect1> - <title>SEE ALSO</title> - <para> - -<literallayout> -The Expat home page: http://www.libexpat.org/ -The W3 XML specification: http://www.w3.org/TR/REC-xml -</literallayout> - - </para> - </refsect1> - - <refsect1> - <title>AUTHOR</title> - <para> - This manual page was written by &dhusername; &dhemail; for - the &debian; system (but may be used by others). Permission is - granted to copy, distribute and/or modify this document under - the terms of the <acronym>GNU</acronym> Free Documentation - License, Version 1.1. - </para> - </refsect1> -</refentry> - -<!-- Keep this comment at the end of the file -Local variables: -mode: sgml -sgml-omittag:t -sgml-shorttag:t -sgml-minimize-attributes:nil -sgml-always-quote-attributes:t -sgml-indent-step:2 -sgml-indent-data:t -sgml-parent-document:nil -sgml-default-dtd-file:nil -sgml-exposed-tags:nil -sgml-local-catalogs:nil -sgml-local-ecat-files:nil -End: ---> diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.dsw b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.dsw deleted file mode 100644 index 2d62eec5..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.dsw +++ /dev/null @@ -1,110 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "elements"=.\examples\elements.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name expat_static - End Project Dependency -}}} - -############################################################################### - -Project: "expat"=.\lib\expat.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "expat_static"=.\lib\expat_static.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "expatw"=.\lib\expatw.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "expatw_static"=.\lib\expatw_static.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "outline"=.\examples\outline.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name expat - End Project Dependency -}}} - -############################################################################### - -Project: "xmlwf"=.\xmlwf\xmlwf.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name expat - End Project Dependency -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.pc.in b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.pc.in deleted file mode 100644 index 5207e3e1..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: expat -Version: @PACKAGE_VERSION@ -Description: expat XML parser -URL: http://www.libexpat.org -Libs: -L${libdir} -lexpat -Cflags: -I${includedir} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.cmake b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.cmake deleted file mode 100644 index 25d79a6d..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.cmake +++ /dev/null @@ -1,91 +0,0 @@ -/* expat_config.h.in. Generated from configure.in by autoheader. */ - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#cmakedefine BYTEORDER @BYTEORDER@ - -/* Define to 1 if you have the `bcopy' function. */ -#cmakedefine HAVE_BCOPY - -/* Define to 1 if you have the <dlfcn.h> header file. */ -#cmakedefine HAVE_DLFCN_H - -/* Define to 1 if you have the <fcntl.h> header file. */ -#cmakedefine HAVE_FCNTL_H - -/* Define to 1 if you have the `getpagesize' function. */ -#cmakedefine HAVE_GETPAGESIZE - -/* Define to 1 if you have the <inttypes.h> header file. */ -#cmakedefine HAVE_INTTYPES_H - -/* Define to 1 if you have the `memmove' function. */ -#cmakedefine HAVE_MEMMOVE - -/* Define to 1 if you have the <memory.h> header file. */ -#cmakedefine HAVE_MEMORY_H - -/* Define to 1 if you have a working `mmap' system call. */ -#cmakedefine HAVE_MMAP - -/* Define to 1 if you have the <stdint.h> header file. */ -#cmakedefine HAVE_STDINT_H - -/* Define to 1 if you have the <stdlib.h> header file. */ -#cmakedefine HAVE_STDLIB_H - -/* Define to 1 if you have the <strings.h> header file. */ -#cmakedefine HAVE_STRINGS_H - -/* Define to 1 if you have the <string.h> header file. */ -#cmakedefine HAVE_STRING_H - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#cmakedefine HAVE_SYS_STAT_H - -/* Define to 1 if you have the <sys/types.h> header file. */ -#cmakedefine HAVE_SYS_TYPES_H - -/* Define to 1 if you have the <unistd.h> header file. */ -#cmakedefine HAVE_UNISTD_H - -/* Define to the address where bug reports for this package should be sent. */ -#cmakedefine PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#cmakedefine PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#cmakedefine PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#cmakedefine PACKAGE_TARNAME - -/* Define to the version of this package. */ -#cmakedefine PACKAGE_VERSION - -/* Define to 1 if you have the ANSI C header files. */ -#cmakedefine STDC_HEADERS - -/* whether byteorder is bigendian */ -#cmakedefine WORDS_BIGENDIAN - -/* Define to specify how much context to retain around the current parse - point. */ -#cmakedefine XML_CONTEXT_BYTES @XML_CONTEXT_BYTES@ - -/* Define to make parameter entity parsing functionality available. */ -#cmakedefine XML_DTD - -/* Define to make XML Namespaces functionality available. */ -#cmakedefine XML_NS - -/* Define to __FUNCTION__ or "" if `__func__' does not conform to ANSI C. */ -#ifdef _MSC_VER -# define __func__ __FUNCTION__ -#endif - -/* Define to `long' if <sys/types.h> does not define. */ -#cmakedefine off_t @OFF_T@ - -/* Define to `unsigned' if <sys/types.h> does not define. */ -#cmakedefine size_t @SIZE_T@ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.in b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.in deleted file mode 100644 index 8c6e5140..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/expat_config.h.in +++ /dev/null @@ -1,102 +0,0 @@ -/* expat_config.h.in. Generated from configure.in by autoheader. */ - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#undef BYTEORDER - -/* Define to 1 if you have the `bcopy' function. */ -#undef HAVE_BCOPY - -/* Define to 1 if you have the <dlfcn.h> header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the <fcntl.h> header file. */ -#undef HAVE_FCNTL_H - -/* Define to 1 if you have the `getpagesize' function. */ -#undef HAVE_GETPAGESIZE - -/* Define to 1 if you have the <inttypes.h> header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `memmove' function. */ -#undef HAVE_MEMMOVE - -/* Define to 1 if you have the <memory.h> header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define to 1 if you have the <stdint.h> header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the <stdlib.h> header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the <strings.h> header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the <string.h> header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the <sys/param.h> header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the <sys/types.h> header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the <unistd.h> header file. */ -#undef HAVE_UNISTD_H - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* whether byteorder is bigendian */ -#undef WORDS_BIGENDIAN - -/* Define to specify how much context to retain around the current parse - point. */ -#undef XML_CONTEXT_BYTES - -/* Define to make parameter entity parsing functionality available. */ -#undef XML_DTD - -/* Define to make XML Namespaces functionality available. */ -#undef XML_NS - -/* Define to __FUNCTION__ or "" if `__func__' does not conform to ANSI C. */ -#undef __func__ - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Define to `long int' if <sys/types.h> does not define. */ -#undef off_t - -/* Define to `unsigned int' if <sys/types.h> does not define. */ -#undef size_t diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/Makefile.MPW b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/Makefile.MPW deleted file mode 100644 index 046af005..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/Makefile.MPW +++ /dev/null @@ -1,206 +0,0 @@ -# File: Makefile.MPW -# Targets: All, Dynamic, Static (and Clean, Clean-All) -# Created: Tuesday, July 02, 2002 -# -# MPW Makefile for building expat under the "classic" (i.e. pre-X) Mac OS -# Copyright � 2002 Daryle Walker -# Portions Copyright � 2002 Thomas Wegner -# See the COPYING file for distribution information -# -# Description: -# This Makefile lets you build static, dynamic (i.e. shared) and stub -# versions of the expat library as well as the elements.c and outline.c -# examples (built as tools for MPW). This is for PPC only; it should be -# no problem to build a 68K version of the expat library, though. -# -# Usage: -# Buildprogram All -# or Buildprogram Dynamic -# or Buildprogram Static -# -# Note: You first have to rename this file to "Makefile", or the Buildprogram -# commando will not recognize it. -# - -MAKEFILE = Makefile -�MondoBuild� = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified - -ObjDir = : -SrcDir = : -HdrDir = : - -ToolDir = ::examples: - -Includes = -i {HdrDir} - -Sym-PPC = -sym off - -Defines = -d MACOS_CLASSIC - -PPCCOptions = {Includes} {Sym-PPC} -w 35 {Defines} - -FragName = libexpat - - -### Source Files ### - -SrcFiles = � - "{SrcDir}xmlparse.c" � - "{SrcDir}xmlrole.c" � - "{SrcDir}xmltok.c" - -ToolSrcFiles = � - "{ToolDir}elements.c" � - "{ToolDir}outline.c" - - -### Object Files ### - -ObjFiles-PPC = � - "{ObjDir}xmlparse.c.o" � - "{ObjDir}xmlrole.c.o" � - "{ObjDir}xmltok.c.o" - -ElementToolObjFile = "{ObjDir}elements.c.o" - -OutlineToolObjFile = "{ObjDir}outline.c.o" - - -### Libraries ### - -StLibFiles-PPC = � - "{PPCLibraries}StdCRuntime.o" � - "{PPCLibraries}PPCCRuntime.o" � - "{PPCLibraries}PPCToolLibs.o" - -ShLibFiles-PPC = � - "{SharedLibraries}InterfaceLib" � - "{SharedLibraries}StdCLib" � - "{SharedLibraries}MathLib" - -LibFiles-PPC = � - {StLibFiles-PPC} � - {ShLibFiles-PPC} - - -### Special Files ### - -ExportFile = "{ObjDir}{FragName}.exp" - -StLibFile = "{ObjDir}{FragName}.MrC.o" - -ShLibFile = "{ObjDir}{FragName}" - -StubFile = "{ObjDir}{FragName}.stub" - -ElementsTool = "{ToolDir}elements" - -OutlineTool = "{ToolDir}outline" - - -### Default Rules ### - -.c.o � .c {�MondoBuild�} - {PPCC} {depDir}{default}.c -o {targDir}{default}.c.o {PPCCOptions} - - -### Build Rules ### - -All � Dynamic {ElementsTool} {OutlineTool} - -Static � {StLibFile} - -Dynamic � Static {ShLibFile} {StubFile} - -{StLibFile} �� {ObjFiles-PPC} {StLibFiles-PPC} {�MondoBuild�} - PPCLink � - -o {Targ} � - {ObjFiles-PPC} � - {StLibFiles-PPC} � - {Sym-PPC} � - -mf -d � - -t 'XCOF' � - -c 'MPS ' � - -xm l - -{ShLibFile} �� {StLibFile} {ShLibFiles-PPC} {ExportFile} {�MondoBuild�} - PPCLink � - -o {Targ} � - {StLibFile} � - {ShLibFiles-PPC} � - {Sym-PPC} � - -@export {ExportFile} � - -fragname {FragName} � - -mf -d � - -t 'shlb' � - -c '????' � - -xm s - -{StubFile} �� {ShLibFile} {�MondoBuild�} - shlb2stub -o {Targ} {ShLibFile} - -{ElementsTool} �� {ElementToolObjFile} {StubFile} {LibFiles-PPC} {�MondoBuild�} - PPCLink � - -o {Targ} � - {ElementToolObjFile} � - {StLibFile} � - {LibFiles-PPC} � - {Sym-PPC} � - -mf -d � - -t 'MPST' � - -c 'MPS ' - -{OutlineTool} �� {OutlineToolObjFile} {StubFile} {LibFiles-PPC} {�MondoBuild�} - PPCLink � - -o {Targ} � - {OutlineToolObjFile} � - {StLibFile} � - {LibFiles-PPC} � - {Sym-PPC} � - -mf -d � - -t 'MPST' � - -c 'MPS ' - - -### Special Rules ### - -{ExportFile} �� "{HdrDir}expat.h" {�MondoBuild�} - StreamEdit -d � - -e "/�('XMLPARSEAPI('�') ')�0,1�'XML_'([A-Za-z0-9_]+)�1'('/ Print 'XML_' �1" � - "{HdrDir}expat.h" > {Targ} - - -### Required Dependencies ### - -"{ObjDir}xmlparse.c.o" � "{SrcDir}xmlparse.c" -"{ObjDir}xmlrole.c.o" � "{SrcDir}xmlrole.c" -"{ObjDir}xmltok.c.o" � "{SrcDir}xmltok.c" - -"{ObjDir}elements.c.o" � "{ToolDir}elements.c" -"{ObjDir}outline.c.o" � "{ToolDir}outline.c" - - -### Optional Dependencies ### -### Build this target to clean out generated intermediate files. ### - -Clean � - Delete {ObjFiles-PPC} {ExportFile} {ElementToolObjFile} {OutlineToolObjFile} - -### Build this target to clean out all generated files. ### - -Clean-All � Clean - Delete {StLibFile} {ShLibFile} {StubFile} {ElementsTool} {OutlineTool} - -### Build this target to generate "include file" dependencies. ### - -Dependencies � $OutOfDate - MakeDepend � - -append {MAKEFILE} � - -ignore "{CIncludes}" � - -objdir "{ObjDir}" � - -objext .o � - {Defines} � - {Includes} � - {SrcFiles} - - diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/amigaconfig.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/amigaconfig.h deleted file mode 100644 index 86c61150..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/amigaconfig.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef AMIGACONFIG_H -#define AMIGACONFIG_H - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#define BYTEORDER 4321 - -/* Define to 1 if you have the `bcopy' function. */ -#define HAVE_BCOPY 1 - -/* Define to 1 if you have the <check.h> header file. */ -#undef HAVE_CHECK_H - -/* Define to 1 if you have the `memmove' function. */ -#define HAVE_MEMMOVE 1 - -/* Define to 1 if you have the <unistd.h> header file. */ -#define HAVE_UNISTD_H 1 - -/* whether byteorder is bigendian */ -#define WORDS_BIGENDIAN - -/* Define to specify how much context to retain around the current parse - point. */ -#define XML_CONTEXT_BYTES 1024 - -/* Define to make parameter entity parsing functionality available. */ -#define XML_DTD - -/* Define to make XML Namespaces functionality available. */ -#define XML_NS - -#endif /* AMIGACONFIG_H */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/ascii.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/ascii.h deleted file mode 100644 index d10530b0..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/ascii.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#define ASCII_A 0x41 -#define ASCII_B 0x42 -#define ASCII_C 0x43 -#define ASCII_D 0x44 -#define ASCII_E 0x45 -#define ASCII_F 0x46 -#define ASCII_G 0x47 -#define ASCII_H 0x48 -#define ASCII_I 0x49 -#define ASCII_J 0x4A -#define ASCII_K 0x4B -#define ASCII_L 0x4C -#define ASCII_M 0x4D -#define ASCII_N 0x4E -#define ASCII_O 0x4F -#define ASCII_P 0x50 -#define ASCII_Q 0x51 -#define ASCII_R 0x52 -#define ASCII_S 0x53 -#define ASCII_T 0x54 -#define ASCII_U 0x55 -#define ASCII_V 0x56 -#define ASCII_W 0x57 -#define ASCII_X 0x58 -#define ASCII_Y 0x59 -#define ASCII_Z 0x5A - -#define ASCII_a 0x61 -#define ASCII_b 0x62 -#define ASCII_c 0x63 -#define ASCII_d 0x64 -#define ASCII_e 0x65 -#define ASCII_f 0x66 -#define ASCII_g 0x67 -#define ASCII_h 0x68 -#define ASCII_i 0x69 -#define ASCII_j 0x6A -#define ASCII_k 0x6B -#define ASCII_l 0x6C -#define ASCII_m 0x6D -#define ASCII_n 0x6E -#define ASCII_o 0x6F -#define ASCII_p 0x70 -#define ASCII_q 0x71 -#define ASCII_r 0x72 -#define ASCII_s 0x73 -#define ASCII_t 0x74 -#define ASCII_u 0x75 -#define ASCII_v 0x76 -#define ASCII_w 0x77 -#define ASCII_x 0x78 -#define ASCII_y 0x79 -#define ASCII_z 0x7A - -#define ASCII_0 0x30 -#define ASCII_1 0x31 -#define ASCII_2 0x32 -#define ASCII_3 0x33 -#define ASCII_4 0x34 -#define ASCII_5 0x35 -#define ASCII_6 0x36 -#define ASCII_7 0x37 -#define ASCII_8 0x38 -#define ASCII_9 0x39 - -#define ASCII_TAB 0x09 -#define ASCII_SPACE 0x20 -#define ASCII_EXCL 0x21 -#define ASCII_QUOT 0x22 -#define ASCII_AMP 0x26 -#define ASCII_APOS 0x27 -#define ASCII_MINUS 0x2D -#define ASCII_PERIOD 0x2E -#define ASCII_COLON 0x3A -#define ASCII_SEMI 0x3B -#define ASCII_LT 0x3C -#define ASCII_EQUALS 0x3D -#define ASCII_GT 0x3E -#define ASCII_LSQB 0x5B -#define ASCII_RSQB 0x5D -#define ASCII_UNDERSCORE 0x5F -#define ASCII_LPAREN 0x28 -#define ASCII_RPAREN 0x29 -#define ASCII_FF 0x0C -#define ASCII_SLASH 0x2F -#define ASCII_HASH 0x23 -#define ASCII_PIPE 0x7C -#define ASCII_COMMA 0x2C diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/asciitab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/asciitab.h deleted file mode 100644 index 79a15c28..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/asciitab.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.dsp deleted file mode 100644 index bf728da0..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.dsp +++ /dev/null @@ -1,185 +0,0 @@ -# Microsoft Developer Studio Project File - Name="expat" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=expat - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "expat.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "expat.mak" CFG="expat - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "expat - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "expat - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "expat - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILED_FROM_DSP" /FD /c -# SUBTRACT CPP /YX /Yc /Yu -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /dll /machine:I386 -# ADD LINK32 /nologo /dll /pdb:none /machine:I386 /out:"..\win32\bin\Release\libexpat.dll" - -!ELSEIF "$(CFG)" == "expat - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "_DEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 /nologo /dll /pdb:none /debug /machine:I386 /out:"..\win32\bin\Debug\libexpat.dll" - -!ENDIF - -# Begin Target - -# Name "expat - Win32 Release" -# Name "expat - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\libexpat.def -# End Source File -# Begin Source File - -SOURCE=.\xmlparse.c - -!IF "$(CFG)" == "expat - Win32 Release" - -!ELSEIF "$(CFG)" == "expat - Win32 Debug" - -# ADD CPP /GX- /Od - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_ns.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\ascii.h -# End Source File -# Begin Source File - -SOURCE=.\asciitab.h -# End Source File -# Begin Source File - -SOURCE=.\expat.h -# End Source File -# Begin Source File - -SOURCE=.\expat_external.h -# End Source File -# Begin Source File - -SOURCE=.\iasciitab.h -# End Source File -# Begin Source File - -SOURCE=.\internal.h -# End Source File -# Begin Source File - -SOURCE=.\latin1tab.h -# End Source File -# Begin Source File - -SOURCE=.\nametab.h -# End Source File -# Begin Source File - -SOURCE=.\utf8tab.h -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.h deleted file mode 100644 index 9a21680b..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat.h +++ /dev/null @@ -1,1047 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef Expat_INCLUDED -#define Expat_INCLUDED 1 - -#ifdef __VMS -/* 0 1 2 3 0 1 2 3 - 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler -#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler -#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler -#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg -#endif - -#include <stdlib.h> -#include "expat_external.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct XML_ParserStruct; -typedef struct XML_ParserStruct *XML_Parser; - -/* Should this be defined using stdbool.h when C99 is available? */ -typedef unsigned char XML_Bool; -#define XML_TRUE ((XML_Bool) 1) -#define XML_FALSE ((XML_Bool) 0) - -/* The XML_Status enum gives the possible return values for several - API functions. The preprocessor #defines are included so this - stanza can be added to code that still needs to support older - versions of Expat 1.95.x: - - #ifndef XML_STATUS_OK - #define XML_STATUS_OK 1 - #define XML_STATUS_ERROR 0 - #endif - - Otherwise, the #define hackery is quite ugly and would have been - dropped. -*/ -enum XML_Status { - XML_STATUS_ERROR = 0, -#define XML_STATUS_ERROR XML_STATUS_ERROR - XML_STATUS_OK = 1, -#define XML_STATUS_OK XML_STATUS_OK - XML_STATUS_SUSPENDED = 2 -#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED -}; - -enum XML_Error { - XML_ERROR_NONE, - XML_ERROR_NO_MEMORY, - XML_ERROR_SYNTAX, - XML_ERROR_NO_ELEMENTS, - XML_ERROR_INVALID_TOKEN, - XML_ERROR_UNCLOSED_TOKEN, - XML_ERROR_PARTIAL_CHAR, - XML_ERROR_TAG_MISMATCH, - XML_ERROR_DUPLICATE_ATTRIBUTE, - XML_ERROR_JUNK_AFTER_DOC_ELEMENT, - XML_ERROR_PARAM_ENTITY_REF, - XML_ERROR_UNDEFINED_ENTITY, - XML_ERROR_RECURSIVE_ENTITY_REF, - XML_ERROR_ASYNC_ENTITY, - XML_ERROR_BAD_CHAR_REF, - XML_ERROR_BINARY_ENTITY_REF, - XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, - XML_ERROR_MISPLACED_XML_PI, - XML_ERROR_UNKNOWN_ENCODING, - XML_ERROR_INCORRECT_ENCODING, - XML_ERROR_UNCLOSED_CDATA_SECTION, - XML_ERROR_EXTERNAL_ENTITY_HANDLING, - XML_ERROR_NOT_STANDALONE, - XML_ERROR_UNEXPECTED_STATE, - XML_ERROR_ENTITY_DECLARED_IN_PE, - XML_ERROR_FEATURE_REQUIRES_XML_DTD, - XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, - /* Added in 1.95.7. */ - XML_ERROR_UNBOUND_PREFIX, - /* Added in 1.95.8. */ - XML_ERROR_UNDECLARING_PREFIX, - XML_ERROR_INCOMPLETE_PE, - XML_ERROR_XML_DECL, - XML_ERROR_TEXT_DECL, - XML_ERROR_PUBLICID, - XML_ERROR_SUSPENDED, - XML_ERROR_NOT_SUSPENDED, - XML_ERROR_ABORTED, - XML_ERROR_FINISHED, - XML_ERROR_SUSPEND_PE, - /* Added in 2.0. */ - XML_ERROR_RESERVED_PREFIX_XML, - XML_ERROR_RESERVED_PREFIX_XMLNS, - XML_ERROR_RESERVED_NAMESPACE_URI -}; - -enum XML_Content_Type { - XML_CTYPE_EMPTY = 1, - XML_CTYPE_ANY, - XML_CTYPE_MIXED, - XML_CTYPE_NAME, - XML_CTYPE_CHOICE, - XML_CTYPE_SEQ -}; - -enum XML_Content_Quant { - XML_CQUANT_NONE, - XML_CQUANT_OPT, - XML_CQUANT_REP, - XML_CQUANT_PLUS -}; - -/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be - XML_CQUANT_NONE, and the other fields will be zero or NULL. - If type == XML_CTYPE_MIXED, then quant will be NONE or REP and - numchildren will contain number of elements that may be mixed in - and children point to an array of XML_Content cells that will be - all of XML_CTYPE_NAME type with no quantification. - - If type == XML_CTYPE_NAME, then the name points to the name, and - the numchildren field will be zero and children will be NULL. The - quant fields indicates any quantifiers placed on the name. - - CHOICE and SEQ will have name NULL, the number of children in - numchildren and children will point, recursively, to an array - of XML_Content cells. - - The EMPTY, ANY, and MIXED types will only occur at top level. -*/ - -typedef struct XML_cp XML_Content; - -struct XML_cp { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - XML_Char * name; - unsigned int numchildren; - XML_Content * children; -}; - - -/* This is called for an element declaration. See above for - description of the model argument. It's the caller's responsibility - to free model when finished with it. -*/ -typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, - const XML_Char *name, - XML_Content *model); - -XMLPARSEAPI(void) -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl); - -/* The Attlist declaration handler is called for *each* attribute. So - a single Attlist declaration with multiple attributes declared will - generate multiple calls to this handler. The "default" parameter - may be NULL in the case of the "#IMPLIED" or "#REQUIRED" - keyword. The "isrequired" parameter will be true and the default - value will be NULL in the case of "#REQUIRED". If "isrequired" is - true and default is non-NULL, then this is a "#FIXED" default. -*/ -typedef void (XMLCALL *XML_AttlistDeclHandler) ( - void *userData, - const XML_Char *elname, - const XML_Char *attname, - const XML_Char *att_type, - const XML_Char *dflt, - int isrequired); - -XMLPARSEAPI(void) -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl); - -/* The XML declaration handler is called for *both* XML declarations - and text declarations. The way to distinguish is that the version - parameter will be NULL for text declarations. The encoding - parameter may be NULL for XML declarations. The standalone - parameter will be -1, 0, or 1 indicating respectively that there - was no standalone parameter in the declaration, that it was given - as no, or that it was given as yes. -*/ -typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, - const XML_Char *version, - const XML_Char *encoding, - int standalone); - -XMLPARSEAPI(void) -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler xmldecl); - - -typedef struct { - void *(*malloc_fcn)(size_t size); - void *(*realloc_fcn)(void *ptr, size_t size); - void (*free_fcn)(void *ptr); -} XML_Memory_Handling_Suite; - -/* Constructs a new parser; encoding is the encoding specified by the - external protocol or NULL if there is none specified. -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreate(const XML_Char *encoding); - -/* Constructs a new parser and namespace processor. Element type - names and attribute names that belong to a namespace will be - expanded; unprefixed attribute names are never expanded; unprefixed - element type names are expanded only if there is a default - namespace. The expanded name is the concatenation of the namespace - URI, the namespace separator character, and the local part of the - name. If the namespace separator is '\0' then the namespace URI - and the local part will be concatenated without any separator. - It is a programming error to use the separator '\0' with namespace - triplets (see XML_SetReturnNSTriplet). -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); - - -/* Constructs a new parser using the memory management suite referred to - by memsuite. If memsuite is NULL, then use the standard library memory - suite. If namespaceSeparator is non-NULL it creates a parser with - namespace processing as described above. The character pointed at - will serve as the namespace separator. - - All further memory operations used for the created parser will come from - the given suite. -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreate_MM(const XML_Char *encoding, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *namespaceSeparator); - -/* Prepare a parser object to be re-used. This is particularly - valuable when memory allocation overhead is disproportionatly high, - such as when a large number of small documnents need to be parsed. - All handlers are cleared from the parser, except for the - unknownEncodingHandler. The parser's external state is re-initialized - except for the values of ns and ns_triplets. - - Added in Expat 1.95.3. -*/ -XMLPARSEAPI(XML_Bool) -XML_ParserReset(XML_Parser parser, const XML_Char *encoding); - -/* atts is array of name/value pairs, terminated by 0; - names and values are 0 terminated. -*/ -typedef void (XMLCALL *XML_StartElementHandler) (void *userData, - const XML_Char *name, - const XML_Char **atts); - -typedef void (XMLCALL *XML_EndElementHandler) (void *userData, - const XML_Char *name); - - -/* s is not 0 terminated. */ -typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, - const XML_Char *s, - int len); - -/* target and data are 0 terminated */ -typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( - void *userData, - const XML_Char *target, - const XML_Char *data); - -/* data is 0 terminated */ -typedef void (XMLCALL *XML_CommentHandler) (void *userData, - const XML_Char *data); - -typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); -typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); - -/* This is called for any characters in the XML document for which - there is no applicable handler. This includes both characters that - are part of markup which is of a kind that is not reported - (comments, markup declarations), or characters that are part of a - construct which could be reported but for which no handler has been - supplied. The characters are passed exactly as they were in the XML - document except that they will be encoded in UTF-8 or UTF-16. - Line boundaries are not normalized. Note that a byte order mark - character is not passed to the default handler. There are no - guarantees about how characters are divided between calls to the - default handler: for example, a comment might be split between - multiple calls. -*/ -typedef void (XMLCALL *XML_DefaultHandler) (void *userData, - const XML_Char *s, - int len); - -/* This is called for the start of the DOCTYPE declaration, before - any DTD or internal subset is parsed. -*/ -typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( - void *userData, - const XML_Char *doctypeName, - const XML_Char *sysid, - const XML_Char *pubid, - int has_internal_subset); - -/* This is called for the start of the DOCTYPE declaration when the - closing > is encountered, but after processing any external - subset. -*/ -typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); - -/* This is called for entity declarations. The is_parameter_entity - argument will be non-zero if the entity is a parameter entity, zero - otherwise. - - For internal entities (<!ENTITY foo "bar">), value will - be non-NULL and systemId, publicID, and notationName will be NULL. - The value string is NOT nul-terminated; the length is provided in - the value_length argument. Since it is legal to have zero-length - values, do not use this argument to test for internal entities. - - For external entities, value will be NULL and systemId will be - non-NULL. The publicId argument will be NULL unless a public - identifier was provided. The notationName argument will have a - non-NULL value only for unparsed entity declarations. - - Note that is_parameter_entity can't be changed to XML_Bool, since - that would break binary compatibility. -*/ -typedef void (XMLCALL *XML_EntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity, - const XML_Char *value, - int value_length, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); - -XMLPARSEAPI(void) -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler); - -/* OBSOLETE -- OBSOLETE -- OBSOLETE - This handler has been superceded by the EntityDeclHandler above. - It is provided here for backward compatibility. - - This is called for a declaration of an unparsed (NDATA) entity. - The base argument is whatever was set by XML_SetBase. The - entityName, systemId and notationName arguments will never be - NULL. The other arguments may be. -*/ -typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); - -/* This is called for a declaration of notation. The base argument is - whatever was set by XML_SetBase. The notationName will never be - NULL. The other arguments can be. -*/ -typedef void (XMLCALL *XML_NotationDeclHandler) ( - void *userData, - const XML_Char *notationName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); - -/* When namespace processing is enabled, these are called once for - each namespace declaration. The call to the start and end element - handlers occur between the calls to the start and end namespace - declaration handlers. For an xmlns attribute, prefix will be - NULL. For an xmlns="" attribute, uri will be NULL. -*/ -typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix, - const XML_Char *uri); - -typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix); - -/* This is called if the document is not standalone, that is, it has an - external subset or a reference to a parameter entity, but does not - have standalone="yes". If this handler returns XML_STATUS_ERROR, - then processing will not continue, and the parser will return a - XML_ERROR_NOT_STANDALONE error. - If parameter entity parsing is enabled, then in addition to the - conditions above this handler will only be called if the referenced - entity was actually read. -*/ -typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); - -/* This is called for a reference to an external parsed general - entity. The referenced entity is not automatically parsed. The - application can parse it immediately or later using - XML_ExternalEntityParserCreate. - - The parser argument is the parser parsing the entity containing the - reference; it can be passed as the parser argument to - XML_ExternalEntityParserCreate. The systemId argument is the - system identifier as specified in the entity declaration; it will - not be NULL. - - The base argument is the system identifier that should be used as - the base for resolving systemId if systemId was relative; this is - set by XML_SetBase; it may be NULL. - - The publicId argument is the public identifier as specified in the - entity declaration, or NULL if none was specified; the whitespace - in the public identifier will have been normalized as required by - the XML spec. - - The context argument specifies the parsing context in the format - expected by the context argument to XML_ExternalEntityParserCreate; - context is valid only until the handler returns, so if the - referenced entity is to be parsed later, it must be copied. - context is NULL only when the entity is a parameter entity. - - The handler should return XML_STATUS_ERROR if processing should not - continue because of a fatal error in the handling of the external - entity. In this case the calling parser will return an - XML_ERROR_EXTERNAL_ENTITY_HANDLING error. - - Note that unlike other handlers the first argument is the parser, - not userData. -*/ -typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( - XML_Parser parser, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); - -/* This is called in two situations: - 1) An entity reference is encountered for which no declaration - has been read *and* this is not an error. - 2) An internal entity reference is read, but not expanded, because - XML_SetDefaultHandler has been called. - Note: skipped parameter entities in declarations and skipped general - entities in attribute values cannot be reported, because - the event would be out of sync with the reporting of the - declarations or attribute values -*/ -typedef void (XMLCALL *XML_SkippedEntityHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity); - -/* This structure is filled in by the XML_UnknownEncodingHandler to - provide information to the parser about encodings that are unknown - to the parser. - - The map[b] member gives information about byte sequences whose - first byte is b. - - If map[b] is c where c is >= 0, then b by itself encodes the - Unicode scalar value c. - - If map[b] is -1, then the byte sequence is malformed. - - If map[b] is -n, where n >= 2, then b is the first byte of an - n-byte sequence that encodes a single Unicode scalar value. - - The data member will be passed as the first argument to the convert - function. - - The convert function is used to convert multibyte sequences; s will - point to a n-byte sequence where map[(unsigned char)*s] == -n. The - convert function must return the Unicode scalar value represented - by this byte sequence or -1 if the byte sequence is malformed. - - The convert function may be NULL if the encoding is a single-byte - encoding, that is if map[b] >= -1 for all bytes b. - - When the parser is finished with the encoding, then if release is - not NULL, it will call release passing it the data member; once - release has been called, the convert function will not be called - again. - - Expat places certain restrictions on the encodings that are supported - using this mechanism. - - 1. Every ASCII character that can appear in a well-formed XML document, - other than the characters - - $@\^`{}~ - - must be represented by a single byte, and that byte must be the - same byte that represents that character in ASCII. - - 2. No character may require more than 4 bytes to encode. - - 3. All characters encoded must have Unicode scalar values <= - 0xFFFF, (i.e., characters that would be encoded by surrogates in - UTF-16 are not allowed). Note that this restriction doesn't - apply to the built-in support for UTF-8 and UTF-16. - - 4. No Unicode character may be encoded by more than one distinct - sequence of bytes. -*/ -typedef struct { - int map[256]; - void *data; - int (XMLCALL *convert)(void *data, const char *s); - void (XMLCALL *release)(void *data); -} XML_Encoding; - -/* This is called for an encoding that is unknown to the parser. - - The encodingHandlerData argument is that which was passed as the - second argument to XML_SetUnknownEncodingHandler. - - The name argument gives the name of the encoding as specified in - the encoding declaration. - - If the callback can provide information about the encoding, it must - fill in the XML_Encoding structure, and return XML_STATUS_OK. - Otherwise it must return XML_STATUS_ERROR. - - If info does not describe a suitable encoding, then the parser will - return an XML_UNKNOWN_ENCODING error. -*/ -typedef int (XMLCALL *XML_UnknownEncodingHandler) ( - void *encodingHandlerData, - const XML_Char *name, - XML_Encoding *info); - -XMLPARSEAPI(void) -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, - XML_EndElementHandler end); - -XMLPARSEAPI(void) -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler handler); - -XMLPARSEAPI(void) -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler handler); - -XMLPARSEAPI(void) -XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler); - -XMLPARSEAPI(void) -XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler); -XMLPARSEAPI(void) -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler); - -XMLPARSEAPI(void) -XML_SetCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end); - -XMLPARSEAPI(void) -XML_SetStartCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start); - -XMLPARSEAPI(void) -XML_SetEndCdataSectionHandler(XML_Parser parser, - XML_EndCdataSectionHandler end); - -/* This sets the default handler and also inhibits expansion of - internal entities. These entity references will be passed to the - default handler, or to the skipped entity handler, if one is set. -*/ -XMLPARSEAPI(void) -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler); - -/* This sets the default handler but does not inhibit expansion of - internal entities. The entity reference will not be passed to the - default handler. -*/ -XMLPARSEAPI(void) -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler); - -XMLPARSEAPI(void) -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end); - -XMLPARSEAPI(void) -XML_SetStartDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start); - -XMLPARSEAPI(void) -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end); - -XMLPARSEAPI(void) -XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler); - -XMLPARSEAPI(void) -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler); - -XMLPARSEAPI(void) -XML_SetNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end); - -XMLPARSEAPI(void) -XML_SetStartNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start); - -XMLPARSEAPI(void) -XML_SetEndNamespaceDeclHandler(XML_Parser parser, - XML_EndNamespaceDeclHandler end); - -XMLPARSEAPI(void) -XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler); - -XMLPARSEAPI(void) -XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler); - -/* If a non-NULL value for arg is specified here, then it will be - passed as the first argument to the external entity ref handler - instead of the parser object. -*/ -XMLPARSEAPI(void) -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, - void *arg); - -XMLPARSEAPI(void) -XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler); - -XMLPARSEAPI(void) -XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, - void *encodingHandlerData); - -/* This can be called within a handler for a start element, end - element, processing instruction or character data. It causes the - corresponding markup to be passed to the default handler. -*/ -XMLPARSEAPI(void) -XML_DefaultCurrent(XML_Parser parser); - -/* If do_nst is non-zero, and namespace processing is in effect, and - a name has a prefix (i.e. an explicit namespace qualifier) then - that name is returned as a triplet in a single string separated by - the separator character specified when the parser was created: URI - + sep + local_name + sep + prefix. - - If do_nst is zero, then namespace information is returned in the - default manner (URI + sep + local_name) whether or not the name - has a prefix. - - Note: Calling XML_SetReturnNSTriplet after XML_Parse or - XML_ParseBuffer has no effect. -*/ - -XMLPARSEAPI(void) -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); - -/* This value is passed as the userData argument to callbacks. */ -XMLPARSEAPI(void) -XML_SetUserData(XML_Parser parser, void *userData); - -/* Returns the last value set by XML_SetUserData or NULL. */ -#define XML_GetUserData(parser) (*(void **)(parser)) - -/* This is equivalent to supplying an encoding argument to - XML_ParserCreate. On success XML_SetEncoding returns non-zero, - zero otherwise. - Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer - has no effect and returns XML_STATUS_ERROR. -*/ -XMLPARSEAPI(enum XML_Status) -XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); - -/* If this function is called, then the parser will be passed as the - first argument to callbacks instead of userData. The userData will - still be accessible using XML_GetUserData. -*/ -XMLPARSEAPI(void) -XML_UseParserAsHandlerArg(XML_Parser parser); - -/* If useDTD == XML_TRUE is passed to this function, then the parser - will assume that there is an external subset, even if none is - specified in the document. In such a case the parser will call the - externalEntityRefHandler with a value of NULL for the systemId - argument (the publicId and context arguments will be NULL as well). - Note: For the purpose of checking WFC: Entity Declared, passing - useDTD == XML_TRUE will make the parser behave as if the document - had a DTD with an external subset. - Note: If this function is called, then this must be done before - the first call to XML_Parse or XML_ParseBuffer, since it will - have no effect after that. Returns - XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. - Note: If the document does not have a DOCTYPE declaration at all, - then startDoctypeDeclHandler and endDoctypeDeclHandler will not - be called, despite an external subset being parsed. - Note: If XML_DTD is not defined when Expat is compiled, returns - XML_ERROR_FEATURE_REQUIRES_XML_DTD. -*/ -XMLPARSEAPI(enum XML_Error) -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); - - -/* Sets the base to be used for resolving relative URIs in system - identifiers in declarations. Resolving relative identifiers is - left to the application: this value will be passed through as the - base argument to the XML_ExternalEntityRefHandler, - XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base - argument will be copied. Returns XML_STATUS_ERROR if out of memory, - XML_STATUS_OK otherwise. -*/ -XMLPARSEAPI(enum XML_Status) -XML_SetBase(XML_Parser parser, const XML_Char *base); - -XMLPARSEAPI(const XML_Char *) -XML_GetBase(XML_Parser parser); - -/* Returns the number of the attribute/value pairs passed in last call - to the XML_StartElementHandler that were specified in the start-tag - rather than defaulted. Each attribute/value pair counts as 2; thus - this correspondds to an index into the atts array passed to the - XML_StartElementHandler. -*/ -XMLPARSEAPI(int) -XML_GetSpecifiedAttributeCount(XML_Parser parser); - -/* Returns the index of the ID attribute passed in the last call to - XML_StartElementHandler, or -1 if there is no ID attribute. Each - attribute/value pair counts as 2; thus this correspondds to an - index into the atts array passed to the XML_StartElementHandler. -*/ -XMLPARSEAPI(int) -XML_GetIdAttributeIndex(XML_Parser parser); - -#ifdef XML_ATTR_INFO -/* Source file byte offsets for the start and end of attribute names and values. - The value indices are exclusive of surrounding quotes; thus in a UTF-8 source - file an attribute value of "blah" will yield: - info->valueEnd - info->valueStart = 4 bytes. -*/ -typedef struct { - XML_Index nameStart; /* Offset to beginning of the attribute name. */ - XML_Index nameEnd; /* Offset after the attribute name's last byte. */ - XML_Index valueStart; /* Offset to beginning of the attribute value. */ - XML_Index valueEnd; /* Offset after the attribute value's last byte. */ -} XML_AttrInfo; - -/* Returns an array of XML_AttrInfo structures for the attribute/value pairs - passed in last call to the XML_StartElementHandler that were specified - in the start-tag rather than defaulted. Each attribute/value pair counts - as 1; thus the number of entries in the array is - XML_GetSpecifiedAttributeCount(parser) / 2. -*/ -XMLPARSEAPI(const XML_AttrInfo *) -XML_GetAttributeInfo(XML_Parser parser); -#endif - -/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is - detected. The last call to XML_Parse must have isFinal true; len - may be zero for this call (or any other). - - Though the return values for these functions has always been - described as a Boolean value, the implementation, at least for the - 1.95.x series, has always returned exactly one of the XML_Status - values. -*/ -XMLPARSEAPI(enum XML_Status) -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); - -XMLPARSEAPI(void *) -XML_GetBuffer(XML_Parser parser, int len); - -XMLPARSEAPI(enum XML_Status) -XML_ParseBuffer(XML_Parser parser, int len, int isFinal); - -/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. - Must be called from within a call-back handler, except when aborting - (resumable = 0) an already suspended parser. Some call-backs may - still follow because they would otherwise get lost. Examples: - - endElementHandler() for empty elements when stopped in - startElementHandler(), - - endNameSpaceDeclHandler() when stopped in endElementHandler(), - and possibly others. - - Can be called from most handlers, including DTD related call-backs, - except when parsing an external parameter entity and resumable != 0. - Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. - Possible error codes: - - XML_ERROR_SUSPENDED: when suspending an already suspended parser. - - XML_ERROR_FINISHED: when the parser has already finished. - - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. - - When resumable != 0 (true) then parsing is suspended, that is, - XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. - Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() - return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. - - *Note*: - This will be applied to the current parser instance only, that is, if - there is a parent parser then it will continue parsing when the - externalEntityRefHandler() returns. It is up to the implementation of - the externalEntityRefHandler() to call XML_StopParser() on the parent - parser (recursively), if one wants to stop parsing altogether. - - When suspended, parsing can be resumed by calling XML_ResumeParser(). -*/ -XMLPARSEAPI(enum XML_Status) -XML_StopParser(XML_Parser parser, XML_Bool resumable); - -/* Resumes parsing after it has been suspended with XML_StopParser(). - Must not be called from within a handler call-back. Returns same - status codes as XML_Parse() or XML_ParseBuffer(). - Additional error code XML_ERROR_NOT_SUSPENDED possible. - - *Note*: - This must be called on the most deeply nested child parser instance - first, and on its parent parser only after the child parser has finished, - to be applied recursively until the document entity's parser is restarted. - That is, the parent parser will not resume by itself and it is up to the - application to call XML_ResumeParser() on it at the appropriate moment. -*/ -XMLPARSEAPI(enum XML_Status) -XML_ResumeParser(XML_Parser parser); - -enum XML_Parsing { - XML_INITIALIZED, - XML_PARSING, - XML_FINISHED, - XML_SUSPENDED -}; - -typedef struct { - enum XML_Parsing parsing; - XML_Bool finalBuffer; -} XML_ParsingStatus; - -/* Returns status of parser with respect to being initialized, parsing, - finished, or suspended and processing the final buffer. - XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, - XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED -*/ -XMLPARSEAPI(void) -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); - -/* Creates an XML_Parser object that can parse an external general - entity; context is a '\0'-terminated string specifying the parse - context; encoding is a '\0'-terminated string giving the name of - the externally specified encoding, or NULL if there is no - externally specified encoding. The context string consists of a - sequence of tokens separated by formfeeds (\f); a token consisting - of a name specifies that the general entity of the name is open; a - token of the form prefix=uri specifies the namespace for a - particular prefix; a token of the form =uri specifies the default - namespace. This can be called at any point after the first call to - an ExternalEntityRefHandler so longer as the parser has not yet - been freed. The new parser is completely independent and may - safely be used in a separate thread. The handlers and userData are - initialized from the parser argument. Returns NULL if out of memory. - Otherwise returns a new XML_Parser object. -*/ -XMLPARSEAPI(XML_Parser) -XML_ExternalEntityParserCreate(XML_Parser parser, - const XML_Char *context, - const XML_Char *encoding); - -enum XML_ParamEntityParsing { - XML_PARAM_ENTITY_PARSING_NEVER, - XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, - XML_PARAM_ENTITY_PARSING_ALWAYS -}; - -/* Controls parsing of parameter entities (including the external DTD - subset). If parsing of parameter entities is enabled, then - references to external parameter entities (including the external - DTD subset) will be passed to the handler set with - XML_SetExternalEntityRefHandler. The context passed will be 0. - - Unlike external general entities, external parameter entities can - only be parsed synchronously. If the external parameter entity is - to be parsed, it must be parsed during the call to the external - entity ref handler: the complete sequence of - XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and - XML_ParserFree calls must be made during this call. After - XML_ExternalEntityParserCreate has been called to create the parser - for the external parameter entity (context must be 0 for this - call), it is illegal to make any calls on the old parser until - XML_ParserFree has been called on the newly created parser. - If the library has been compiled without support for parameter - entity parsing (ie without XML_DTD being defined), then - XML_SetParamEntityParsing will return 0 if parsing of parameter - entities is requested; otherwise it will return non-zero. - Note: If XML_SetParamEntityParsing is called after XML_Parse or - XML_ParseBuffer, then it has no effect and will always return 0. -*/ -XMLPARSEAPI(int) -XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing parsing); - -/* Sets the hash salt to use for internal hash calculations. - Helps in preventing DoS attacks based on predicting hash - function behavior. This must be called before parsing is started. - Returns 1 if successful, 0 when called after parsing has started. -*/ -XMLPARSEAPI(int) -XML_SetHashSalt(XML_Parser parser, - unsigned long hash_salt); - -/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then - XML_GetErrorCode returns information about the error. -*/ -XMLPARSEAPI(enum XML_Error) -XML_GetErrorCode(XML_Parser parser); - -/* These functions return information about the current parse - location. They may be called from any callback called to report - some parse event; in this case the location is the location of the - first of the sequence of characters that generated the event. When - called from callbacks generated by declarations in the document - prologue, the location identified isn't as neatly defined, but will - be within the relevant markup. When called outside of the callback - functions, the position indicated will be just past the last parse - event (regardless of whether there was an associated callback). - - They may also be called after returning from a call to XML_Parse - or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then - the location is the location of the character at which the error - was detected; otherwise the location is the location of the last - parse event, as described above. -*/ -XMLPARSEAPI(XML_Size) XML_GetCurrentLineNumber(XML_Parser parser); -XMLPARSEAPI(XML_Size) XML_GetCurrentColumnNumber(XML_Parser parser); -XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser); - -/* Return the number of bytes in the current event. - Returns 0 if the event is in an internal entity. -*/ -XMLPARSEAPI(int) -XML_GetCurrentByteCount(XML_Parser parser); - -/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets - the integer pointed to by offset to the offset within this buffer - of the current parse position, and sets the integer pointed to by size - to the size of this buffer (the number of input bytes). Otherwise - returns a NULL pointer. Also returns a NULL pointer if a parse isn't - active. - - NOTE: The character pointer returned should not be used outside - the handler that makes the call. -*/ -XMLPARSEAPI(const char *) -XML_GetInputContext(XML_Parser parser, - int *offset, - int *size); - -/* For backwards compatibility with previous versions. */ -#define XML_GetErrorLineNumber XML_GetCurrentLineNumber -#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber -#define XML_GetErrorByteIndex XML_GetCurrentByteIndex - -/* Frees the content model passed to the element declaration handler */ -XMLPARSEAPI(void) -XML_FreeContentModel(XML_Parser parser, XML_Content *model); - -/* Exposing the memory handling functions used in Expat */ -XMLPARSEAPI(void *) -XML_MemMalloc(XML_Parser parser, size_t size); - -XMLPARSEAPI(void *) -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); - -XMLPARSEAPI(void) -XML_MemFree(XML_Parser parser, void *ptr); - -/* Frees memory used by the parser. */ -XMLPARSEAPI(void) -XML_ParserFree(XML_Parser parser); - -/* Returns a string describing the error. */ -XMLPARSEAPI(const XML_LChar *) -XML_ErrorString(enum XML_Error code); - -/* Return a string containing the version number of this expat */ -XMLPARSEAPI(const XML_LChar *) -XML_ExpatVersion(void); - -typedef struct { - int major; - int minor; - int micro; -} XML_Expat_Version; - -/* Return an XML_Expat_Version structure containing numeric version - number information for this version of expat. -*/ -XMLPARSEAPI(XML_Expat_Version) -XML_ExpatVersionInfo(void); - -/* Added in Expat 1.95.5. */ -enum XML_FeatureEnum { - XML_FEATURE_END = 0, - XML_FEATURE_UNICODE, - XML_FEATURE_UNICODE_WCHAR_T, - XML_FEATURE_DTD, - XML_FEATURE_CONTEXT_BYTES, - XML_FEATURE_MIN_SIZE, - XML_FEATURE_SIZEOF_XML_CHAR, - XML_FEATURE_SIZEOF_XML_LCHAR, - XML_FEATURE_NS, - XML_FEATURE_LARGE_SIZE, - XML_FEATURE_ATTR_INFO - /* Additional features must be added to the end of this enum. */ -}; - -typedef struct { - enum XML_FeatureEnum feature; - const XML_LChar *name; - long int value; -} XML_Feature; - -XMLPARSEAPI(const XML_Feature *) -XML_GetFeatureList(void); - - -/* Expat follows the GNU/Linux convention of odd number minor version for - beta/development releases and even number minor version for stable - releases. Micro is bumped with each release, and set to 0 with each - change to major or minor version. -*/ -#define XML_MAJOR_VERSION 2 -#define XML_MINOR_VERSION 1 -#define XML_MICRO_VERSION 0 - -#ifdef __cplusplus -} -#endif - -#endif /* not Expat_INCLUDED */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_external.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_external.h deleted file mode 100644 index 2c03284e..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_external.h +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef Expat_External_INCLUDED -#define Expat_External_INCLUDED 1 - -/* External API definitions */ - -#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) -#define XML_USE_MSC_EXTENSIONS 1 -#endif - -/* Expat tries very hard to make the API boundary very specifically - defined. There are two macros defined to control this boundary; - each of these can be defined before including this header to - achieve some different behavior, but doing so it not recommended or - tested frequently. - - XMLCALL - The calling convention to use for all calls across the - "library boundary." This will default to cdecl, and - try really hard to tell the compiler that's what we - want. - - XMLIMPORT - Whatever magic is needed to note that a function is - to be imported from a dynamically loaded library - (.dll, .so, or .sl, depending on your platform). - - The XMLCALL macro was added in Expat 1.95.7. The only one which is - expected to be directly useful in client code is XMLCALL. - - Note that on at least some Unix versions, the Expat library must be - compiled with the cdecl calling convention as the default since - system headers may assume the cdecl convention. -*/ -#ifndef XMLCALL -#if defined(_MSC_VER) -#define XMLCALL __cdecl -#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER) -#define XMLCALL __attribute__((cdecl)) -#else -/* For any platform which uses this definition and supports more than - one calling convention, we need to extend this definition to - declare the convention used on that platform, if it's possible to - do so. - - If this is the case for your platform, please file a bug report - with information on how to identify your platform via the C - pre-processor and how to specify the same calling convention as the - platform's malloc() implementation. -*/ -#define XMLCALL -#endif -#endif /* not defined XMLCALL */ - - -#if !defined(XML_STATIC) && !defined(XMLIMPORT) -#ifndef XML_BUILDING_EXPAT -/* using Expat from an application */ - -#ifdef XML_USE_MSC_EXTENSIONS -#define XMLIMPORT __declspec(dllimport) -#endif - -#endif -#endif /* not defined XML_STATIC */ - - -/* If we didn't define it above, define it away: */ -#ifndef XMLIMPORT -#define XMLIMPORT -#endif - - -#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef XML_UNICODE_WCHAR_T -#define XML_UNICODE -#endif - -#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ -#ifdef XML_UNICODE_WCHAR_T -typedef wchar_t XML_Char; -typedef wchar_t XML_LChar; -#else -typedef unsigned short XML_Char; -typedef char XML_LChar; -#endif /* XML_UNICODE_WCHAR_T */ -#else /* Information is UTF-8 encoded. */ -typedef char XML_Char; -typedef char XML_LChar; -#endif /* XML_UNICODE */ - -#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */ -#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 -typedef __int64 XML_Index; -typedef unsigned __int64 XML_Size; -#else -typedef long long XML_Index; -typedef unsigned long long XML_Size; -#endif -#else -typedef long XML_Index; -typedef unsigned long XML_Size; -#endif /* XML_LARGE_SIZE */ - -#ifdef __cplusplus -} -#endif - -#endif /* not Expat_External_INCLUDED */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.dsp deleted file mode 100644 index 180f0dc6..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="expat_static" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=expat_static - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "expat_static.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "expat_static.mak" CFG="expat_static - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "expat_static - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "expat_static - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "expat_static - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "expat_static___Win32_Release" -# PROP BASE Intermediate_Dir "expat_static___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release_static" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "COMPILED_FROM_DSP" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x1009 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\win32\bin\Release\libexpatMT.lib" - -!ELSEIF "$(CFG)" == "expat_static - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "expat_static___Win32_Debug" -# PROP BASE Intermediate_Dir "expat_static___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug_static" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "COMPILED_FROM_DSP" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x1009 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\win32\bin\Debug\libexpatMT.lib" - -!ENDIF - -# Begin Target - -# Name "expat_static - Win32 Release" -# Name "expat_static - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\xmlparse.c -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_ns.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\ascii.h -# End Source File -# Begin Source File - -SOURCE=.\asciitab.h -# End Source File -# Begin Source File - -SOURCE=.\expat.h -# End Source File -# Begin Source File - -SOURCE=.\expat_external.h -# End Source File -# Begin Source File - -SOURCE=.\iasciitab.h -# End Source File -# Begin Source File - -SOURCE=.\internal.h -# End Source File -# Begin Source File - -SOURCE=.\latin1tab.h -# End Source File -# Begin Source File - -SOURCE=.\nametab.h -# End Source File -# Begin Source File - -SOURCE=.\utf8tab.h -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.h -# End Source File -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.sln b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.sln deleted file mode 100644 index 6325342a..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.sln +++ /dev/null @@ -1,26 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "expat", "expat_static.vcproj", "{60AF91BC-74EB-47E7-9C71-646D525591C5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Debug|Win32.ActiveCfg = Debug|Win32 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Debug|Win32.Build.0 = Debug|Win32 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Debug|x64.ActiveCfg = Debug|x64 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Debug|x64.Build.0 = Debug|x64 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Release|Win32.ActiveCfg = Release|Win32 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Release|Win32.Build.0 = Release|Win32 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Release|x64.ActiveCfg = Release|x64 - {60AF91BC-74EB-47E7-9C71-646D525591C5}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.vcproj b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.vcproj deleted file mode 100644 index 73b3a757..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expat_static.vcproj +++ /dev/null @@ -1,549 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9.00" - Name="expat" - ProjectGUID="{60AF91BC-74EB-47E7-9C71-646D525591C5}" - RootNamespace="expat_static" - TargetFrameworkVersion="0" - > - <Platforms> - <Platform - Name="Win32" - /> - <Platform - Name="x64" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory="$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="4" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_LIB;COMPILED_FROM_DSP" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - PrecompiledHeaderFile="" - WarningLevel="3" - SuppressStartupBanner="true" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\libs\Aol_XML\Win32\Debug\libexpatMT.lib" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Debug|x64" - OutputDirectory="$(ConfigurationName)64" - IntermediateDirectory="$(ConfigurationName)64" - ConfigurationType="4" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - TargetEnvironment="3" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;COMPILED_FROM_DSP;_LIB;XML_LARGE_SIZE" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - PrecompiledHeaderFile="" - WarningLevel="3" - SuppressStartupBanner="true" - DebugInformationFormat="3" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\libs\Aol_XML\Win64\Debug\libexpatMT.lib" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory="$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="4" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - WholeProgramOptimization="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="1" - InlineFunctionExpansion="1" - EnableIntrinsicFunctions="true" - FavorSizeOrSpeed="2" - PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP" - StringPooling="true" - BufferSecurityCheck="false" - PrecompiledHeaderFile="" - WarningLevel="3" - SuppressStartupBanner="true" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\libs\Aol_XML\Win32\Release\libexpatMT.lib" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile=".\..\win32\bin\Release/expat_static.bsc" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Release|x64" - OutputDirectory="$(ConfigurationName)64" - IntermediateDirectory="$(ConfigurationName)64" - ConfigurationType="4" - InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" - CharacterSet="2" - WholeProgramOptimization="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - TargetEnvironment="3" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="1" - InlineFunctionExpansion="1" - EnableIntrinsicFunctions="true" - FavorSizeOrSpeed="2" - PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;_LIB;COMPILED_FROM_DSP;XML_LARGE_SIZE" - StringPooling="true" - BufferSecurityCheck="false" - PrecompiledHeaderFile="" - WarningLevel="3" - SuppressStartupBanner="true" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\libs\Aol_XML\Win64\Release\libexpatMT.lib" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - SuppressStartupBanner="true" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" - > - <File - RelativePath="xmlparse.c" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="xmlrole.c" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="xmltok.c" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="xmltok_impl.c" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - <File - RelativePath="xmltok_ns.c" - > - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Release|x64" - > - <Tool - Name="VCCLCompilerTool" - PreprocessorDefinitions="" - /> - </FileConfiguration> - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl" - > - <File - RelativePath="ascii.h" - > - </File> - <File - RelativePath="asciitab.h" - > - </File> - <File - RelativePath="expat.h" - > - </File> - <File - RelativePath="expat_external.h" - > - </File> - <File - RelativePath="iasciitab.h" - > - </File> - <File - RelativePath="internal.h" - > - </File> - <File - RelativePath="latin1tab.h" - > - </File> - <File - RelativePath="nametab.h" - > - </File> - <File - RelativePath="utf8tab.h" - > - </File> - <File - RelativePath="xmlrole.h" - > - </File> - <File - RelativePath="xmltok.h" - > - </File> - <File - RelativePath="xmltok_impl.h" - > - </File> - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp deleted file mode 100644 index b91a117c..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw.dsp +++ /dev/null @@ -1,185 +0,0 @@ -# Microsoft Developer Studio Project File - Name="expatw" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=expatw - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "expatw.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "expatw.mak" CFG="expatw - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "expatw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "expatw - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "expatw - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release-w" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XML_UNICODE_WCHAR_T" /FD /c -# SUBTRACT CPP /YX /Yc /Yu -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /dll /machine:I386 -# ADD LINK32 /nologo /dll /pdb:none /machine:I386 /out:"..\win32\bin\Release\libexpatw.dll" - -!ELSEIF "$(CFG)" == "expatw - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug-w" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "_DEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XML_UNICODE_WCHAR_T" /FR /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 /nologo /dll /pdb:none /debug /machine:I386 /out:"..\win32\bin\Debug\libexpatw.dll" - -!ENDIF - -# Begin Target - -# Name "expatw - Win32 Release" -# Name "expatw - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\libexpatw.def -# End Source File -# Begin Source File - -SOURCE=.\xmlparse.c - -!IF "$(CFG)" == "expatw - Win32 Release" - -!ELSEIF "$(CFG)" == "expatw - Win32 Debug" - -# ADD CPP /GX- /Od - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_ns.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\ascii.h -# End Source File -# Begin Source File - -SOURCE=.\asciitab.h -# End Source File -# Begin Source File - -SOURCE=.\expat.h -# End Source File -# Begin Source File - -SOURCE=.\expat_external.h -# End Source File -# Begin Source File - -SOURCE=.\iasciitab.h -# End Source File -# Begin Source File - -SOURCE=.\internal.h -# End Source File -# Begin Source File - -SOURCE=.\latin1tab.h -# End Source File -# Begin Source File - -SOURCE=.\nametab.h -# End Source File -# Begin Source File - -SOURCE=.\utf8tab.h -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw_static.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw_static.dsp deleted file mode 100644 index d28632cf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/expatw_static.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="expatw_static" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=expatw_static - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "expatw_static.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "expatw_static.mak" CFG="expatw_static - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "expatw_static - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "expatw_static - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "expatw_static - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "expatw_static___Win32_Release" -# PROP BASE Intermediate_Dir "expatw_static___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release-w_static" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "COMPILED_FROM_DSP" /D "XML_UNICODE_WCHAR_T" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x1009 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\win32\bin\Release\libexpatwMT.lib" - -!ELSEIF "$(CFG)" == "expatw_static - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "expatw_static___Win32_Debug" -# PROP BASE Intermediate_Dir "expatw_static___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug-w_static" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_LIB" /D "COMPILED_FROM_DSP" /D "XML_UNICODE_WCHAR_T" /FR /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x1009 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\win32\bin\Debug\libexpatwMT.lib" - -!ENDIF - -# Begin Target - -# Name "expatw_static - Win32 Release" -# Name "expatw_static - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\xmlparse.c -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.c -# End Source File -# Begin Source File - -SOURCE=.\xmltok_ns.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\ascii.h -# End Source File -# Begin Source File - -SOURCE=.\asciitab.h -# End Source File -# Begin Source File - -SOURCE=.\expat.h -# End Source File -# Begin Source File - -SOURCE=.\expat_external.h -# End Source File -# Begin Source File - -SOURCE=.\iasciitab.h -# End Source File -# Begin Source File - -SOURCE=.\internal.h -# End Source File -# Begin Source File - -SOURCE=.\latin1tab.h -# End Source File -# Begin Source File - -SOURCE=.\nametab.h -# End Source File -# Begin Source File - -SOURCE=.\utf8tab.h -# End Source File -# Begin Source File - -SOURCE=.\xmlrole.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok.h -# End Source File -# Begin Source File - -SOURCE=.\xmltok_impl.h -# End Source File -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/iasciitab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/iasciitab.h deleted file mode 100644 index 24a1d5cc..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/iasciitab.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ -/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/internal.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/internal.h deleted file mode 100644 index dd545483..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/internal.h +++ /dev/null @@ -1,73 +0,0 @@ -/* internal.h - - Internal definitions used by Expat. This is not needed to compile - client code. - - The following calling convention macros are defined for frequently - called functions: - - FASTCALL - Used for those internal functions that have a simple - body and a low number of arguments and local variables. - - PTRCALL - Used for functions called though function pointers. - - PTRFASTCALL - Like PTRCALL, but for low number of arguments. - - inline - Used for selected internal functions for which inlining - may improve performance on some platforms. - - Note: Use of these macros is based on judgement, not hard rules, - and therefore subject to change. -*/ - -#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__) -/* We'll use this version by default only where we know it helps. - - regparm() generates warnings on Solaris boxes. See SF bug #692878. - - Instability reported with egcs on a RedHat Linux 7.3. - Let's comment out: - #define FASTCALL __attribute__((stdcall, regparm(3))) - and let's try this: -*/ -#define FASTCALL __attribute__((regparm(3))) -#define PTRFASTCALL __attribute__((regparm(3))) -#endif - -/* Using __fastcall seems to have an unexpected negative effect under - MS VC++, especially for function pointers, so we won't use it for - now on that platform. It may be reconsidered for a future release - if it can be made more effective. - Likely reason: __fastcall on Windows is like stdcall, therefore - the compiler cannot perform stack optimizations for call clusters. -*/ - -/* Make sure all of these are defined if they aren't already. */ - -#ifndef FASTCALL -#define FASTCALL -#endif - -#ifndef PTRCALL -#define PTRCALL -#endif - -#ifndef PTRFASTCALL -#define PTRFASTCALL -#endif - -#ifndef XML_MIN_SIZE -#if !defined(__cplusplus) && !defined(inline) -#ifdef __GNUC__ -#define inline __inline -#endif /* __GNUC__ */ -#endif -#endif /* XML_MIN_SIZE */ - -#ifdef __cplusplus -#define inline inline -#else -#ifndef inline -#define inline -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/latin1tab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/latin1tab.h deleted file mode 100644 index 53c25d76..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/latin1tab.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, -/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpat.def b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpat.def deleted file mode 100644 index 3920bbcf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpat.def +++ /dev/null @@ -1,73 +0,0 @@ -; DEF file for MS VC++ - -LIBRARY -EXPORTS - XML_DefaultCurrent @1 - XML_ErrorString @2 - XML_ExpatVersion @3 - XML_ExpatVersionInfo @4 - XML_ExternalEntityParserCreate @5 - XML_GetBase @6 - XML_GetBuffer @7 - XML_GetCurrentByteCount @8 - XML_GetCurrentByteIndex @9 - XML_GetCurrentColumnNumber @10 - XML_GetCurrentLineNumber @11 - XML_GetErrorCode @12 - XML_GetIdAttributeIndex @13 - XML_GetInputContext @14 - XML_GetSpecifiedAttributeCount @15 - XML_Parse @16 - XML_ParseBuffer @17 - XML_ParserCreate @18 - XML_ParserCreateNS @19 - XML_ParserCreate_MM @20 - XML_ParserFree @21 - XML_SetAttlistDeclHandler @22 - XML_SetBase @23 - XML_SetCdataSectionHandler @24 - XML_SetCharacterDataHandler @25 - XML_SetCommentHandler @26 - XML_SetDefaultHandler @27 - XML_SetDefaultHandlerExpand @28 - XML_SetDoctypeDeclHandler @29 - XML_SetElementDeclHandler @30 - XML_SetElementHandler @31 - XML_SetEncoding @32 - XML_SetEndCdataSectionHandler @33 - XML_SetEndDoctypeDeclHandler @34 - XML_SetEndElementHandler @35 - XML_SetEndNamespaceDeclHandler @36 - XML_SetEntityDeclHandler @37 - XML_SetExternalEntityRefHandler @38 - XML_SetExternalEntityRefHandlerArg @39 - XML_SetNamespaceDeclHandler @40 - XML_SetNotStandaloneHandler @41 - XML_SetNotationDeclHandler @42 - XML_SetParamEntityParsing @43 - XML_SetProcessingInstructionHandler @44 - XML_SetReturnNSTriplet @45 - XML_SetStartCdataSectionHandler @46 - XML_SetStartDoctypeDeclHandler @47 - XML_SetStartElementHandler @48 - XML_SetStartNamespaceDeclHandler @49 - XML_SetUnknownEncodingHandler @50 - XML_SetUnparsedEntityDeclHandler @51 - XML_SetUserData @52 - XML_SetXmlDeclHandler @53 - XML_UseParserAsHandlerArg @54 -; added with version 1.95.3 - XML_ParserReset @55 - XML_SetSkippedEntityHandler @56 -; added with version 1.95.5 - XML_GetFeatureList @57 - XML_UseForeignDTD @58 -; added with version 1.95.6 - XML_FreeContentModel @59 - XML_MemMalloc @60 - XML_MemRealloc @61 - XML_MemFree @62 -; added with version 1.95.8 - XML_StopParser @63 - XML_ResumeParser @64 - XML_GetParsingStatus @65 diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpatw.def b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpatw.def deleted file mode 100644 index 3920bbcf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/libexpatw.def +++ /dev/null @@ -1,73 +0,0 @@ -; DEF file for MS VC++ - -LIBRARY -EXPORTS - XML_DefaultCurrent @1 - XML_ErrorString @2 - XML_ExpatVersion @3 - XML_ExpatVersionInfo @4 - XML_ExternalEntityParserCreate @5 - XML_GetBase @6 - XML_GetBuffer @7 - XML_GetCurrentByteCount @8 - XML_GetCurrentByteIndex @9 - XML_GetCurrentColumnNumber @10 - XML_GetCurrentLineNumber @11 - XML_GetErrorCode @12 - XML_GetIdAttributeIndex @13 - XML_GetInputContext @14 - XML_GetSpecifiedAttributeCount @15 - XML_Parse @16 - XML_ParseBuffer @17 - XML_ParserCreate @18 - XML_ParserCreateNS @19 - XML_ParserCreate_MM @20 - XML_ParserFree @21 - XML_SetAttlistDeclHandler @22 - XML_SetBase @23 - XML_SetCdataSectionHandler @24 - XML_SetCharacterDataHandler @25 - XML_SetCommentHandler @26 - XML_SetDefaultHandler @27 - XML_SetDefaultHandlerExpand @28 - XML_SetDoctypeDeclHandler @29 - XML_SetElementDeclHandler @30 - XML_SetElementHandler @31 - XML_SetEncoding @32 - XML_SetEndCdataSectionHandler @33 - XML_SetEndDoctypeDeclHandler @34 - XML_SetEndElementHandler @35 - XML_SetEndNamespaceDeclHandler @36 - XML_SetEntityDeclHandler @37 - XML_SetExternalEntityRefHandler @38 - XML_SetExternalEntityRefHandlerArg @39 - XML_SetNamespaceDeclHandler @40 - XML_SetNotStandaloneHandler @41 - XML_SetNotationDeclHandler @42 - XML_SetParamEntityParsing @43 - XML_SetProcessingInstructionHandler @44 - XML_SetReturnNSTriplet @45 - XML_SetStartCdataSectionHandler @46 - XML_SetStartDoctypeDeclHandler @47 - XML_SetStartElementHandler @48 - XML_SetStartNamespaceDeclHandler @49 - XML_SetUnknownEncodingHandler @50 - XML_SetUnparsedEntityDeclHandler @51 - XML_SetUserData @52 - XML_SetXmlDeclHandler @53 - XML_UseParserAsHandlerArg @54 -; added with version 1.95.3 - XML_ParserReset @55 - XML_SetSkippedEntityHandler @56 -; added with version 1.95.5 - XML_GetFeatureList @57 - XML_UseForeignDTD @58 -; added with version 1.95.6 - XML_FreeContentModel @59 - XML_MemMalloc @60 - XML_MemRealloc @61 - XML_MemFree @62 -; added with version 1.95.8 - XML_StopParser @63 - XML_ResumeParser @64 - XML_GetParsingStatus @65 diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/macconfig.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/macconfig.h deleted file mode 100644 index 2725caaf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/macconfig.h +++ /dev/null @@ -1,53 +0,0 @@ -/*================================================================ -** Copyright 2000, Clark Cooper -** All rights reserved. -** -** This is free software. You are permitted to copy, distribute, or modify -** it under the terms of the MIT/X license (contained in the COPYING file -** with this distribution.) -** -*/ - -#ifndef MACCONFIG_H -#define MACCONFIG_H - - -/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */ -#define BYTEORDER 4321 - -/* Define to 1 if you have the `bcopy' function. */ -#undef HAVE_BCOPY - -/* Define to 1 if you have the `memmove' function. */ -#define HAVE_MEMMOVE - -/* Define to 1 if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define to 1 if you have the <unistd.h> header file. */ -#undef HAVE_UNISTD_H - -/* whether byteorder is bigendian */ -#define WORDS_BIGENDIAN - -/* Define to specify how much context to retain around the current parse - point. */ -#undef XML_CONTEXT_BYTES - -/* Define to make parameter entity parsing functionality available. */ -#define XML_DTD - -/* Define to make XML Namespaces functionality available. */ -#define XML_NS - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Define to `long' if <sys/types.h> does not define. */ -#define off_t long - -/* Define to `unsigned' if <sys/types.h> does not define. */ -#undef size_t - - -#endif /* ifndef MACCONFIG_H */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/nametab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/nametab.h deleted file mode 100644 index b05e62c7..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/nametab.h +++ /dev/null @@ -1,150 +0,0 @@ -static const unsigned namingBitmap[] = { -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, -0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, -0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, -0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, -0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, -0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, -0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, -0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, -0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, -0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, -0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, -0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, -0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, -0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, -0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, -0x40000000, 0xF580C900, 0x00000007, 0x02010800, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, -0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, -0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, -0x00000000, 0x00004C40, 0x00000000, 0x00000000, -0x00000007, 0x00000000, 0x00000000, 0x00000000, -0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, -0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, -0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, -0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, -0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, -0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, -0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, -0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, -0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, -0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, -0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, -0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, -0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, -0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, -0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, -0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, -0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, -0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, -}; -static const unsigned char nmstrtPages[] = { -0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, -0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -static const unsigned char namePages[] = { -0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, -0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h deleted file mode 100644 index 7bb3e776..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/utf8tab.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - - -/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, -/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/winconfig.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/winconfig.h deleted file mode 100644 index c1b791d6..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/winconfig.h +++ /dev/null @@ -1,30 +0,0 @@ -/*================================================================ -** Copyright 2000, Clark Cooper -** All rights reserved. -** -** This is free software. You are permitted to copy, distribute, or modify -** it under the terms of the MIT/X license (contained in the COPYING file -** with this distribution.) -*/ - -#ifndef WINCONFIG_H -#define WINCONFIG_H - -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#undef WIN32_LEAN_AND_MEAN - -#include <memory.h> -#include <string.h> - -#define XML_NS 1 -#define XML_DTD 1 -#define XML_CONTEXT_BYTES 1024 - -/* we will assume all Windows platforms are little endian */ -#define BYTEORDER 1234 - -/* Windows has memmove() available. */ -#define HAVE_MEMMOVE - -#endif /* ndef WINCONFIG_H */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c deleted file mode 100644 index f35aa36b..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlparse.c +++ /dev/null @@ -1,6403 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <stddef.h> -#include <string.h> /* memset(), memcpy() */ -#include <assert.h> -#include <limits.h> /* UINT_MAX */ -#include <time.h> /* time() */ - -#define XML_BUILDING_EXPAT 1 - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#elif defined(HAVE_EXPAT_CONFIG_H) -#include <expat_config.h> -#endif /* ndef COMPILED_FROM_DSP */ - -#include "ascii.h" -#include "expat.h" - -#ifdef XML_UNICODE -#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX -#define XmlConvert XmlUtf16Convert -#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS -#define XmlEncode XmlUtf16Encode -/* Using pointer subtraction to convert to integer type. */ -#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1)) -typedef unsigned short ICHAR; -#else -#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX -#define XmlConvert XmlUtf8Convert -#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS -#define XmlEncode XmlUtf8Encode -#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) -typedef char ICHAR; -#endif - - -#ifndef XML_NS - -#define XmlInitEncodingNS XmlInitEncoding -#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding -#undef XmlGetInternalEncodingNS -#define XmlGetInternalEncodingNS XmlGetInternalEncoding -#define XmlParseXmlDeclNS XmlParseXmlDecl - -#endif - -#ifdef XML_UNICODE - -#ifdef XML_UNICODE_WCHAR_T -#define XML_T(x) (const wchar_t)x -#define XML_L(x) L ## x -#else -#define XML_T(x) (const unsigned short)x -#define XML_L(x) x -#endif - -#else - -#define XML_T(x) x -#define XML_L(x) x - -#endif - -/* Round up n to be a multiple of sz, where sz is a power of 2. */ -#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) - -/* Handle the case where memmove() doesn't exist. */ -#ifndef HAVE_MEMMOVE -#ifdef HAVE_BCOPY -#define memmove(d,s,l) bcopy((s),(d),(l)) -#else -#error memmove does not exist on this platform, nor is a substitute available -#endif /* HAVE_BCOPY */ -#endif /* HAVE_MEMMOVE */ - -#include "internal.h" -#include "xmltok.h" -#include "xmlrole.h" - -typedef const XML_Char *KEY; - -typedef struct { - KEY name; -} NAMED; - -typedef struct { - NAMED **v; - unsigned char power; - size_t size; - size_t used; - const XML_Memory_Handling_Suite *mem; -} HASH_TABLE; - -/* Basic character hash algorithm, taken from Python's string hash: - h = h * 1000003 ^ character, the constant being a prime number. - -*/ -#ifdef XML_UNICODE -#define CHAR_HASH(h, c) \ - (((h) * 0xF4243) ^ (unsigned short)(c)) -#else -#define CHAR_HASH(h, c) \ - (((h) * 0xF4243) ^ (unsigned char)(c)) -#endif - -/* For probing (after a collision) we need a step size relative prime - to the hash table size, which is a power of 2. We use double-hashing, - since we can calculate a second hash value cheaply by taking those bits - of the first hash value that were discarded (masked out) when the table - index was calculated: index = hash & mask, where mask = table->size - 1. - We limit the maximum step size to table->size / 4 (mask >> 2) and make - it odd, since odd numbers are always relative prime to a power of 2. -*/ -#define SECOND_HASH(hash, mask, power) \ - ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) -#define PROBE_STEP(hash, mask, power) \ - ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) - -typedef struct { - NAMED **p; - NAMED **end; -} HASH_TABLE_ITER; - -#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ -#define INIT_DATA_BUF_SIZE 1024 -#define INIT_ATTS_SIZE 16 -#define INIT_ATTS_VERSION 0xFFFFFFFF -#define INIT_BLOCK_SIZE 1024 -#define INIT_BUFFER_SIZE 1024 - -#define EXPAND_SPARE 24 - -typedef struct binding { - struct prefix *prefix; - struct binding *nextTagBinding; - struct binding *prevPrefixBinding; - const struct attribute_id *attId; - XML_Char *uri; - int uriLen; - int uriAlloc; -} BINDING; - -typedef struct prefix { - const XML_Char *name; - BINDING *binding; -} PREFIX; - -typedef struct { - const XML_Char *str; - const XML_Char *localPart; - const XML_Char *prefix; - int strLen; - int uriLen; - int prefixLen; -} TAG_NAME; - -/* TAG represents an open element. - The name of the element is stored in both the document and API - encodings. The memory buffer 'buf' is a separately-allocated - memory area which stores the name. During the XML_Parse()/ - XMLParseBuffer() when the element is open, the memory for the 'raw' - version of the name (in the document encoding) is shared with the - document buffer. If the element is open across calls to - XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to - contain the 'raw' name as well. - - A parser re-uses these structures, maintaining a list of allocated - TAG objects in a free list. -*/ -typedef struct tag { - struct tag *parent; /* parent of this element */ - const char *rawName; /* tagName in the original encoding */ - int rawNameLength; - TAG_NAME name; /* tagName in the API encoding */ - char *buf; /* buffer for name components */ - char *bufEnd; /* end of the buffer */ - BINDING *bindings; -} TAG; - -typedef struct { - const XML_Char *name; - const XML_Char *textPtr; - int textLen; /* length in XML_Chars */ - int processed; /* # of processed bytes - when suspended */ - const XML_Char *systemId; - const XML_Char *base; - const XML_Char *publicId; - const XML_Char *notation; - XML_Bool open; - XML_Bool is_param; - XML_Bool is_internal; /* true if declared in internal subset outside PE */ -} ENTITY; - -typedef struct { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - const XML_Char * name; - int firstchild; - int lastchild; - int childcnt; - int nextsib; -} CONTENT_SCAFFOLD; - -#define INIT_SCAFFOLD_ELEMENTS 32 - -typedef struct block { - struct block *next; - int size; - XML_Char s[1]; -} BLOCK; - -typedef struct { - BLOCK *blocks; - BLOCK *freeBlocks; - const XML_Char *end; - XML_Char *ptr; - XML_Char *start; - const XML_Memory_Handling_Suite *mem; -} STRING_POOL; - -/* The XML_Char before the name is used to determine whether - an attribute has been specified. */ -typedef struct attribute_id { - XML_Char *name; - PREFIX *prefix; - XML_Bool maybeTokenized; - XML_Bool xmlns; -} ATTRIBUTE_ID; - -typedef struct { - const ATTRIBUTE_ID *id; - XML_Bool isCdata; - const XML_Char *value; -} DEFAULT_ATTRIBUTE; - -typedef struct { - unsigned long version; - unsigned long hash; - const XML_Char *uriName; -} NS_ATT; - -typedef struct { - const XML_Char *name; - PREFIX *prefix; - const ATTRIBUTE_ID *idAtt; - int nDefaultAtts; - int allocDefaultAtts; - DEFAULT_ATTRIBUTE *defaultAtts; -} ELEMENT_TYPE; - -typedef struct { - HASH_TABLE generalEntities; - HASH_TABLE elementTypes; - HASH_TABLE attributeIds; - HASH_TABLE prefixes; - STRING_POOL pool; - STRING_POOL entityValuePool; - /* false once a parameter entity reference has been skipped */ - XML_Bool keepProcessing; - /* true once an internal or external PE reference has been encountered; - this includes the reference to an external subset */ - XML_Bool hasParamEntityRefs; - XML_Bool standalone; -#ifdef XML_DTD - /* indicates if external PE has been read */ - XML_Bool paramEntityRead; - HASH_TABLE paramEntities; -#endif /* XML_DTD */ - PREFIX defaultPrefix; - /* === scaffolding for building content model === */ - XML_Bool in_eldecl; - CONTENT_SCAFFOLD *scaffold; - unsigned contentStringLen; - unsigned scaffSize; - unsigned scaffCount; - int scaffLevel; - int *scaffIndex; -} DTD; - -typedef struct open_internal_entity { - const char *internalEventPtr; - const char *internalEventEndPtr; - struct open_internal_entity *next; - ENTITY *entity; - int startTagLevel; - XML_Bool betweenDecl; /* WFC: PE Between Declarations */ -} OPEN_INTERNAL_ENTITY; - -typedef enum XML_Error PTRCALL Processor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr); - -static Processor prologProcessor; -static Processor prologInitProcessor; -static Processor contentProcessor; -static Processor cdataSectionProcessor; -#ifdef XML_DTD -static Processor ignoreSectionProcessor; -static Processor externalParEntProcessor; -static Processor externalParEntInitProcessor; -static Processor entityValueProcessor; -static Processor entityValueInitProcessor; -#endif /* XML_DTD */ -static Processor epilogProcessor; -static Processor errorProcessor; -static Processor externalEntityInitProcessor; -static Processor externalEntityInitProcessor2; -static Processor externalEntityInitProcessor3; -static Processor externalEntityContentProcessor; -static Processor internalEntityProcessor; - -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next); -static enum XML_Error -initializeEncoding(XML_Parser parser); -static enum XML_Error -doProlog(XML_Parser parser, const ENCODING *enc, const char *s, - const char *end, int tok, const char *next, const char **nextPtr, - XML_Bool haveMore); -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl); -static enum XML_Error -doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, - const char *start, const char *end, const char **endPtr, - XML_Bool haveMore); -static enum XML_Error -doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); -#ifdef XML_DTD -static enum XML_Error -doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); -#endif /* XML_DTD */ - -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *, const char *s, - TAG_NAME *tagNamePtr, BINDING **bindingsPtr); -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr); -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, - XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); -static enum XML_Error -storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end); -static int -reportComment(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static void -reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); - -static const XML_Char * getContext(XML_Parser parser); -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context); - -static void FASTCALL normalizePublicId(XML_Char *s); - -static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); -/* do not call if parentParser != NULL */ -static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); -static int -dtdCopy(XML_Parser oldParser, - DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); -static int -copyEntityTable(XML_Parser oldParser, - HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); -static NAMED * -lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize); -static void FASTCALL -hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); -static void FASTCALL hashTableClear(HASH_TABLE *); -static void FASTCALL hashTableDestroy(HASH_TABLE *); -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); -static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); - -static void FASTCALL -poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); -static void FASTCALL poolClear(STRING_POOL *); -static void FASTCALL poolDestroy(STRING_POOL *); -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); -static XML_Bool FASTCALL poolGrow(STRING_POOL *pool); -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s); -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s); - -static int FASTCALL nextScaffoldPart(XML_Parser parser); -static XML_Content * build_model(XML_Parser parser); -static ELEMENT_TYPE * -getElementType(XML_Parser parser, const ENCODING *enc, - const char *ptr, const char *end); - -static unsigned long generate_hash_secret_salt(void); -static XML_Bool startParsing(XML_Parser parser); - -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd); - -static void -parserInit(XML_Parser parser, const XML_Char *encodingName); - -#define poolStart(pool) ((pool)->start) -#define poolEnd(pool) ((pool)->ptr) -#define poolLength(pool) ((pool)->ptr - (pool)->start) -#define poolChop(pool) ((void)--(pool->ptr)) -#define poolLastChar(pool) (((pool)->ptr)[-1]) -#define poolDiscard(pool) ((pool)->ptr = (pool)->start) -#define poolFinish(pool) ((pool)->start = (pool)->ptr) -#define poolAppendChar(pool, c) \ - (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ - ? 0 \ - : ((*((pool)->ptr)++ = c), 1)) - -struct XML_ParserStruct { - /* The first member must be userData so that the XML_GetUserData - macro works. */ - void *m_userData; - void *m_handlerArg; - char *m_buffer; - const XML_Memory_Handling_Suite m_mem; - /* first character to be parsed */ - const char *m_bufferPtr; - /* past last character to be parsed */ - char *m_bufferEnd; - /* allocated end of buffer */ - const char *m_bufferLim; - XML_Index m_parseEndByteIndex; - const char *m_parseEndPtr; - XML_Char *m_dataBuf; - XML_Char *m_dataBufEnd; - XML_StartElementHandler m_startElementHandler; - XML_EndElementHandler m_endElementHandler; - XML_CharacterDataHandler m_characterDataHandler; - XML_ProcessingInstructionHandler m_processingInstructionHandler; - XML_CommentHandler m_commentHandler; - XML_StartCdataSectionHandler m_startCdataSectionHandler; - XML_EndCdataSectionHandler m_endCdataSectionHandler; - XML_DefaultHandler m_defaultHandler; - XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; - XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; - XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; - XML_NotationDeclHandler m_notationDeclHandler; - XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; - XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; - XML_NotStandaloneHandler m_notStandaloneHandler; - XML_ExternalEntityRefHandler m_externalEntityRefHandler; - XML_Parser m_externalEntityRefHandlerArg; - XML_SkippedEntityHandler m_skippedEntityHandler; - XML_UnknownEncodingHandler m_unknownEncodingHandler; - XML_ElementDeclHandler m_elementDeclHandler; - XML_AttlistDeclHandler m_attlistDeclHandler; - XML_EntityDeclHandler m_entityDeclHandler; - XML_XmlDeclHandler m_xmlDeclHandler; - const ENCODING *m_encoding; - INIT_ENCODING m_initEncoding; - const ENCODING *m_internalEncoding; - const XML_Char *m_protocolEncodingName; - XML_Bool m_ns; - XML_Bool m_ns_triplets; - void *m_unknownEncodingMem; - void *m_unknownEncodingData; - void *m_unknownEncodingHandlerData; - void (XMLCALL *m_unknownEncodingRelease)(void *); - PROLOG_STATE m_prologState; - Processor *m_processor; - enum XML_Error m_errorCode; - const char *m_eventPtr; - const char *m_eventEndPtr; - const char *m_positionPtr; - OPEN_INTERNAL_ENTITY *m_openInternalEntities; - OPEN_INTERNAL_ENTITY *m_freeInternalEntities; - XML_Bool m_defaultExpandInternalEntities; - int m_tagLevel; - ENTITY *m_declEntity; - const XML_Char *m_doctypeName; - const XML_Char *m_doctypeSysid; - const XML_Char *m_doctypePubid; - const XML_Char *m_declAttributeType; - const XML_Char *m_declNotationName; - const XML_Char *m_declNotationPublicId; - ELEMENT_TYPE *m_declElementType; - ATTRIBUTE_ID *m_declAttributeId; - XML_Bool m_declAttributeIsCdata; - XML_Bool m_declAttributeIsId; - DTD *m_dtd; - const XML_Char *m_curBase; - TAG *m_tagStack; - TAG *m_freeTagList; - BINDING *m_inheritedBindings; - BINDING *m_freeBindingList; - int m_attsSize; - int m_nSpecifiedAtts; - int m_idAttIndex; - ATTRIBUTE *m_atts; - NS_ATT *m_nsAtts; - unsigned long m_nsAttsVersion; - unsigned char m_nsAttsPower; -#ifdef XML_ATTR_INFO - XML_AttrInfo *m_attInfo; -#endif - POSITION m_position; - STRING_POOL m_tempPool; - STRING_POOL m_temp2Pool; - char *m_groupConnector; - unsigned int m_groupSize; - XML_Char m_namespaceSeparator; - XML_Parser m_parentParser; - XML_ParsingStatus m_parsingStatus; -#ifdef XML_DTD - XML_Bool m_isParamEntity; - XML_Bool m_useForeignDTD; - enum XML_ParamEntityParsing m_paramEntityParsing; -#endif - unsigned long m_hash_secret_salt; -}; - -#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) -#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) -#define FREE(p) (parser->m_mem.free_fcn((p))) - -#define userData (parser->m_userData) -#define handlerArg (parser->m_handlerArg) -#define startElementHandler (parser->m_startElementHandler) -#define endElementHandler (parser->m_endElementHandler) -#define characterDataHandler (parser->m_characterDataHandler) -#define processingInstructionHandler \ - (parser->m_processingInstructionHandler) -#define commentHandler (parser->m_commentHandler) -#define startCdataSectionHandler \ - (parser->m_startCdataSectionHandler) -#define endCdataSectionHandler (parser->m_endCdataSectionHandler) -#define defaultHandler (parser->m_defaultHandler) -#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) -#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) -#define unparsedEntityDeclHandler \ - (parser->m_unparsedEntityDeclHandler) -#define notationDeclHandler (parser->m_notationDeclHandler) -#define startNamespaceDeclHandler \ - (parser->m_startNamespaceDeclHandler) -#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) -#define notStandaloneHandler (parser->m_notStandaloneHandler) -#define externalEntityRefHandler \ - (parser->m_externalEntityRefHandler) -#define externalEntityRefHandlerArg \ - (parser->m_externalEntityRefHandlerArg) -#define internalEntityRefHandler \ - (parser->m_internalEntityRefHandler) -#define skippedEntityHandler (parser->m_skippedEntityHandler) -#define unknownEncodingHandler (parser->m_unknownEncodingHandler) -#define elementDeclHandler (parser->m_elementDeclHandler) -#define attlistDeclHandler (parser->m_attlistDeclHandler) -#define entityDeclHandler (parser->m_entityDeclHandler) -#define xmlDeclHandler (parser->m_xmlDeclHandler) -#define encoding (parser->m_encoding) -#define initEncoding (parser->m_initEncoding) -#define internalEncoding (parser->m_internalEncoding) -#define unknownEncodingMem (parser->m_unknownEncodingMem) -#define unknownEncodingData (parser->m_unknownEncodingData) -#define unknownEncodingHandlerData \ - (parser->m_unknownEncodingHandlerData) -#define unknownEncodingRelease (parser->m_unknownEncodingRelease) -#define protocolEncodingName (parser->m_protocolEncodingName) -#define ns (parser->m_ns) -#define ns_triplets (parser->m_ns_triplets) -#define prologState (parser->m_prologState) -#define processor (parser->m_processor) -#define errorCode (parser->m_errorCode) -#define eventPtr (parser->m_eventPtr) -#define eventEndPtr (parser->m_eventEndPtr) -#define positionPtr (parser->m_positionPtr) -#define position (parser->m_position) -#define openInternalEntities (parser->m_openInternalEntities) -#define freeInternalEntities (parser->m_freeInternalEntities) -#define defaultExpandInternalEntities \ - (parser->m_defaultExpandInternalEntities) -#define tagLevel (parser->m_tagLevel) -#define buffer (parser->m_buffer) -#define bufferPtr (parser->m_bufferPtr) -#define bufferEnd (parser->m_bufferEnd) -#define parseEndByteIndex (parser->m_parseEndByteIndex) -#define parseEndPtr (parser->m_parseEndPtr) -#define bufferLim (parser->m_bufferLim) -#define dataBuf (parser->m_dataBuf) -#define dataBufEnd (parser->m_dataBufEnd) -#define _dtd (parser->m_dtd) -#define curBase (parser->m_curBase) -#define declEntity (parser->m_declEntity) -#define doctypeName (parser->m_doctypeName) -#define doctypeSysid (parser->m_doctypeSysid) -#define doctypePubid (parser->m_doctypePubid) -#define declAttributeType (parser->m_declAttributeType) -#define declNotationName (parser->m_declNotationName) -#define declNotationPublicId (parser->m_declNotationPublicId) -#define declElementType (parser->m_declElementType) -#define declAttributeId (parser->m_declAttributeId) -#define declAttributeIsCdata (parser->m_declAttributeIsCdata) -#define declAttributeIsId (parser->m_declAttributeIsId) -#define freeTagList (parser->m_freeTagList) -#define freeBindingList (parser->m_freeBindingList) -#define inheritedBindings (parser->m_inheritedBindings) -#define tagStack (parser->m_tagStack) -#define atts (parser->m_atts) -#define attsSize (parser->m_attsSize) -#define nSpecifiedAtts (parser->m_nSpecifiedAtts) -#define idAttIndex (parser->m_idAttIndex) -#define nsAtts (parser->m_nsAtts) -#define nsAttsVersion (parser->m_nsAttsVersion) -#define nsAttsPower (parser->m_nsAttsPower) -#define attInfo (parser->m_attInfo) -#define tempPool (parser->m_tempPool) -#define temp2Pool (parser->m_temp2Pool) -#define groupConnector (parser->m_groupConnector) -#define groupSize (parser->m_groupSize) -#define namespaceSeparator (parser->m_namespaceSeparator) -#define parentParser (parser->m_parentParser) -#define ps_parsing (parser->m_parsingStatus.parsing) -#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer) -#ifdef XML_DTD -#define isParamEntity (parser->m_isParamEntity) -#define useForeignDTD (parser->m_useForeignDTD) -#define paramEntityParsing (parser->m_paramEntityParsing) -#endif /* XML_DTD */ -#define hash_secret_salt (parser->m_hash_secret_salt) - -XML_Parser XMLCALL -XML_ParserCreate(const XML_Char *encodingName) -{ - return XML_ParserCreate_MM(encodingName, NULL, NULL); -} - -XML_Parser XMLCALL -XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) -{ - XML_Char tmp[2]; - *tmp = nsSep; - return XML_ParserCreate_MM(encodingName, NULL, tmp); -} - -static const XML_Char implicitContext[] = { - ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p, - ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, - ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, - ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, - ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, - ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0' -}; - -static unsigned long -generate_hash_secret_salt(void) -{ - unsigned int seed = time(NULL) % UINT_MAX; - srand(seed); - return rand(); -} - -static XML_Bool /* only valid for root parser */ -startParsing(XML_Parser parser) -{ - /* hash functions must be initialized before setContext() is called */ - if (hash_secret_salt == 0) - hash_secret_salt = generate_hash_secret_salt(); - if (ns) { - /* implicit context only set for root parser, since child - parsers (i.e. external entity parsers) will inherit it - */ - return setContext(parser, implicitContext); - } - return XML_TRUE; -} - -XML_Parser XMLCALL -XML_ParserCreate_MM(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep) -{ - return parserCreate(encodingName, memsuite, nameSep, NULL); -} - -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd) -{ - XML_Parser parser; - - if (memsuite) { - XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser) - memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); - if (parser != NULL) { - mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); - mtemp->malloc_fcn = memsuite->malloc_fcn; - mtemp->realloc_fcn = memsuite->realloc_fcn; - mtemp->free_fcn = memsuite->free_fcn; - } - } - else { - XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); - if (parser != NULL) { - mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); - mtemp->malloc_fcn = malloc; - mtemp->realloc_fcn = realloc; - mtemp->free_fcn = free; - } - } - - if (!parser) - return parser; - - buffer = NULL; - bufferLim = NULL; - - attsSize = INIT_ATTS_SIZE; - atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); - if (atts == NULL) { - FREE(parser); - return NULL; - } -#ifdef XML_ATTR_INFO - attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo)); - if (attInfo == NULL) { - FREE(atts); - FREE(parser); - return NULL; - } -#endif - dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); - if (dataBuf == NULL) { - FREE(atts); -#ifdef XML_ATTR_INFO - FREE(attInfo); -#endif - FREE(parser); - return NULL; - } - dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; - - if (dtd) - _dtd = dtd; - else { - _dtd = dtdCreate(&parser->m_mem); - if (_dtd == NULL) { - FREE(dataBuf); - FREE(atts); -#ifdef XML_ATTR_INFO - FREE(attInfo); -#endif - FREE(parser); - return NULL; - } - } - - freeBindingList = NULL; - freeTagList = NULL; - freeInternalEntities = NULL; - - groupSize = 0; - groupConnector = NULL; - - unknownEncodingHandler = NULL; - unknownEncodingHandlerData = NULL; - - namespaceSeparator = ASCII_EXCL; - ns = XML_FALSE; - ns_triplets = XML_FALSE; - - nsAtts = NULL; - nsAttsVersion = 0; - nsAttsPower = 0; - - poolInit(&tempPool, &(parser->m_mem)); - poolInit(&temp2Pool, &(parser->m_mem)); - parserInit(parser, encodingName); - - if (encodingName && !protocolEncodingName) { - XML_ParserFree(parser); - return NULL; - } - - if (nameSep) { - ns = XML_TRUE; - internalEncoding = XmlGetInternalEncodingNS(); - namespaceSeparator = *nameSep; - } - else { - internalEncoding = XmlGetInternalEncoding(); - } - - return parser; -} - -static void -parserInit(XML_Parser parser, const XML_Char *encodingName) -{ - processor = prologInitProcessor; - XmlPrologStateInit(&prologState); - protocolEncodingName = (encodingName != NULL - ? poolCopyString(&tempPool, encodingName) - : NULL); - curBase = NULL; - XmlInitEncoding(&initEncoding, &encoding, 0); - userData = NULL; - handlerArg = NULL; - startElementHandler = NULL; - endElementHandler = NULL; - characterDataHandler = NULL; - processingInstructionHandler = NULL; - commentHandler = NULL; - startCdataSectionHandler = NULL; - endCdataSectionHandler = NULL; - defaultHandler = NULL; - startDoctypeDeclHandler = NULL; - endDoctypeDeclHandler = NULL; - unparsedEntityDeclHandler = NULL; - notationDeclHandler = NULL; - startNamespaceDeclHandler = NULL; - endNamespaceDeclHandler = NULL; - notStandaloneHandler = NULL; - externalEntityRefHandler = NULL; - externalEntityRefHandlerArg = parser; - skippedEntityHandler = NULL; - elementDeclHandler = NULL; - attlistDeclHandler = NULL; - entityDeclHandler = NULL; - xmlDeclHandler = NULL; - bufferPtr = buffer; - bufferEnd = buffer; - parseEndByteIndex = 0; - parseEndPtr = NULL; - declElementType = NULL; - declAttributeId = NULL; - declEntity = NULL; - doctypeName = NULL; - doctypeSysid = NULL; - doctypePubid = NULL; - declAttributeType = NULL; - declNotationName = NULL; - declNotationPublicId = NULL; - declAttributeIsCdata = XML_FALSE; - declAttributeIsId = XML_FALSE; - memset(&position, 0, sizeof(POSITION)); - errorCode = XML_ERROR_NONE; - eventPtr = NULL; - eventEndPtr = NULL; - positionPtr = NULL; - openInternalEntities = NULL; - defaultExpandInternalEntities = XML_TRUE; - tagLevel = 0; - tagStack = NULL; - inheritedBindings = NULL; - nSpecifiedAtts = 0; - unknownEncodingMem = NULL; - unknownEncodingRelease = NULL; - unknownEncodingData = NULL; - parentParser = NULL; - ps_parsing = XML_INITIALIZED; -#ifdef XML_DTD - isParamEntity = XML_FALSE; - useForeignDTD = XML_FALSE; - paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; -#endif - hash_secret_salt = 0; -} - -/* moves list of bindings to freeBindingList */ -static void FASTCALL -moveToFreeBindingList(XML_Parser parser, BINDING *bindings) -{ - while (bindings) { - BINDING *b = bindings; - bindings = bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - } -} - -XML_Bool XMLCALL -XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) -{ - TAG *tStk; - OPEN_INTERNAL_ENTITY *openEntityList; - if (parentParser) - return XML_FALSE; - /* move tagStack to freeTagList */ - tStk = tagStack; - while (tStk) { - TAG *tag = tStk; - tStk = tStk->parent; - tag->parent = freeTagList; - moveToFreeBindingList(parser, tag->bindings); - tag->bindings = NULL; - freeTagList = tag; - } - /* move openInternalEntities to freeInternalEntities */ - openEntityList = openInternalEntities; - while (openEntityList) { - OPEN_INTERNAL_ENTITY *openEntity = openEntityList; - openEntityList = openEntity->next; - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - moveToFreeBindingList(parser, inheritedBindings); - FREE(unknownEncodingMem); - if (unknownEncodingRelease) - unknownEncodingRelease(unknownEncodingData); - poolClear(&tempPool); - poolClear(&temp2Pool); - parserInit(parser, encodingName); - dtdReset(_dtd, &parser->m_mem); - return XML_TRUE; -} - -enum XML_Status XMLCALL -XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) -{ - /* Block after XML_Parse()/XML_ParseBuffer() has been called. - XXX There's no way for the caller to determine which of the - XXX possible error cases caused the XML_STATUS_ERROR return. - */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return XML_STATUS_ERROR; - if (encodingName == NULL) - protocolEncodingName = NULL; - else { - protocolEncodingName = poolCopyString(&tempPool, encodingName); - if (!protocolEncodingName) - return XML_STATUS_ERROR; - } - return XML_STATUS_OK; -} - -XML_Parser XMLCALL -XML_ExternalEntityParserCreate(XML_Parser oldParser, - const XML_Char *context, - const XML_Char *encodingName) -{ - XML_Parser parser = oldParser; - DTD *newDtd = NULL; - DTD *oldDtd = _dtd; - XML_StartElementHandler oldStartElementHandler = startElementHandler; - XML_EndElementHandler oldEndElementHandler = endElementHandler; - XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; - XML_ProcessingInstructionHandler oldProcessingInstructionHandler - = processingInstructionHandler; - XML_CommentHandler oldCommentHandler = commentHandler; - XML_StartCdataSectionHandler oldStartCdataSectionHandler - = startCdataSectionHandler; - XML_EndCdataSectionHandler oldEndCdataSectionHandler - = endCdataSectionHandler; - XML_DefaultHandler oldDefaultHandler = defaultHandler; - XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler - = unparsedEntityDeclHandler; - XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; - XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler - = startNamespaceDeclHandler; - XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler - = endNamespaceDeclHandler; - XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; - XML_ExternalEntityRefHandler oldExternalEntityRefHandler - = externalEntityRefHandler; - XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; - XML_UnknownEncodingHandler oldUnknownEncodingHandler - = unknownEncodingHandler; - XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; - XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; - XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; - XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; - ELEMENT_TYPE * oldDeclElementType = declElementType; - - void *oldUserData = userData; - void *oldHandlerArg = handlerArg; - XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; - XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; -#ifdef XML_DTD - enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; - int oldInEntityValue = prologState.inEntityValue; -#endif - XML_Bool oldns_triplets = ns_triplets; - /* Note that the new parser shares the same hash secret as the old - parser, so that dtdCopy and copyEntityTable can lookup values - from hash tables associated with either parser without us having - to worry which hash secrets each table has. - */ - unsigned long oldhash_secret_salt = hash_secret_salt; - -#ifdef XML_DTD - if (!context) - newDtd = oldDtd; -#endif /* XML_DTD */ - - /* Note that the magical uses of the pre-processor to make field - access look more like C++ require that `parser' be overwritten - here. This makes this function more painful to follow than it - would be otherwise. - */ - if (ns) { - XML_Char tmp[2]; - *tmp = namespaceSeparator; - parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); - } - else { - parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); - } - - if (!parser) - return NULL; - - startElementHandler = oldStartElementHandler; - endElementHandler = oldEndElementHandler; - characterDataHandler = oldCharacterDataHandler; - processingInstructionHandler = oldProcessingInstructionHandler; - commentHandler = oldCommentHandler; - startCdataSectionHandler = oldStartCdataSectionHandler; - endCdataSectionHandler = oldEndCdataSectionHandler; - defaultHandler = oldDefaultHandler; - unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; - notationDeclHandler = oldNotationDeclHandler; - startNamespaceDeclHandler = oldStartNamespaceDeclHandler; - endNamespaceDeclHandler = oldEndNamespaceDeclHandler; - notStandaloneHandler = oldNotStandaloneHandler; - externalEntityRefHandler = oldExternalEntityRefHandler; - skippedEntityHandler = oldSkippedEntityHandler; - unknownEncodingHandler = oldUnknownEncodingHandler; - elementDeclHandler = oldElementDeclHandler; - attlistDeclHandler = oldAttlistDeclHandler; - entityDeclHandler = oldEntityDeclHandler; - xmlDeclHandler = oldXmlDeclHandler; - declElementType = oldDeclElementType; - userData = oldUserData; - if (oldUserData == oldHandlerArg) - handlerArg = userData; - else - handlerArg = parser; - if (oldExternalEntityRefHandlerArg != oldParser) - externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; - defaultExpandInternalEntities = oldDefaultExpandInternalEntities; - ns_triplets = oldns_triplets; - hash_secret_salt = oldhash_secret_salt; - parentParser = oldParser; -#ifdef XML_DTD - paramEntityParsing = oldParamEntityParsing; - prologState.inEntityValue = oldInEntityValue; - if (context) { -#endif /* XML_DTD */ - if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem) - || !setContext(parser, context)) { - XML_ParserFree(parser); - return NULL; - } - processor = externalEntityInitProcessor; -#ifdef XML_DTD - } - else { - /* The DTD instance referenced by _dtd is shared between the document's - root parser and external PE parsers, therefore one does not need to - call setContext. In addition, one also *must* not call setContext, - because this would overwrite existing prefix->binding pointers in - _dtd with ones that get destroyed with the external PE parser. - This would leave those prefixes with dangling pointers. - */ - isParamEntity = XML_TRUE; - XmlPrologStateInitExternalEntity(&prologState); - processor = externalParEntInitProcessor; - } -#endif /* XML_DTD */ - return parser; -} - -static void FASTCALL -destroyBindings(BINDING *bindings, XML_Parser parser) -{ - for (;;) { - BINDING *b = bindings; - if (!b) - break; - bindings = b->nextTagBinding; - FREE(b->uri); - FREE(b); - } -} - -void XMLCALL -XML_ParserFree(XML_Parser parser) -{ - TAG *tagList; - OPEN_INTERNAL_ENTITY *entityList; - if (parser == NULL) - return; - /* free tagStack and freeTagList */ - tagList = tagStack; - for (;;) { - TAG *p; - if (tagList == NULL) { - if (freeTagList == NULL) - break; - tagList = freeTagList; - freeTagList = NULL; - } - p = tagList; - tagList = tagList->parent; - FREE(p->buf); - destroyBindings(p->bindings, parser); - FREE(p); - } - /* free openInternalEntities and freeInternalEntities */ - entityList = openInternalEntities; - for (;;) { - OPEN_INTERNAL_ENTITY *openEntity; - if (entityList == NULL) { - if (freeInternalEntities == NULL) - break; - entityList = freeInternalEntities; - freeInternalEntities = NULL; - } - openEntity = entityList; - entityList = entityList->next; - FREE(openEntity); - } - - destroyBindings(freeBindingList, parser); - destroyBindings(inheritedBindings, parser); - poolDestroy(&tempPool); - poolDestroy(&temp2Pool); -#ifdef XML_DTD - /* external parameter entity parsers share the DTD structure - parser->m_dtd with the root parser, so we must not destroy it - */ - if (!isParamEntity && _dtd) -#else - if (_dtd) -#endif /* XML_DTD */ - dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); - FREE((void *)atts); -#ifdef XML_ATTR_INFO - FREE((void *)attInfo); -#endif - FREE(groupConnector); - FREE(buffer); - FREE(dataBuf); - FREE(nsAtts); - FREE(unknownEncodingMem); - if (unknownEncodingRelease) - unknownEncodingRelease(unknownEncodingData); - FREE(parser); -} - -void XMLCALL -XML_UseParserAsHandlerArg(XML_Parser parser) -{ - handlerArg = parser; -} - -enum XML_Error XMLCALL -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) -{ -#ifdef XML_DTD - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; - useForeignDTD = useDTD; - return XML_ERROR_NONE; -#else - return XML_ERROR_FEATURE_REQUIRES_XML_DTD; -#endif -} - -void XMLCALL -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return; - ns_triplets = do_nst ? XML_TRUE : XML_FALSE; -} - -void XMLCALL -XML_SetUserData(XML_Parser parser, void *p) -{ - if (handlerArg == userData) - handlerArg = userData = p; - else - userData = p; -} - -enum XML_Status XMLCALL -XML_SetBase(XML_Parser parser, const XML_Char *p) -{ - if (p) { - p = poolCopyString(&_dtd->pool, p); - if (!p) - return XML_STATUS_ERROR; - curBase = p; - } - else - curBase = NULL; - return XML_STATUS_OK; -} - -const XML_Char * XMLCALL -XML_GetBase(XML_Parser parser) -{ - return curBase; -} - -int XMLCALL -XML_GetSpecifiedAttributeCount(XML_Parser parser) -{ - return nSpecifiedAtts; -} - -int XMLCALL -XML_GetIdAttributeIndex(XML_Parser parser) -{ - return idAttIndex; -} - -#ifdef XML_ATTR_INFO -const XML_AttrInfo * XMLCALL -XML_GetAttributeInfo(XML_Parser parser) -{ - return attInfo; -} -#endif - -void XMLCALL -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, - XML_EndElementHandler end) -{ - startElementHandler = start; - endElementHandler = end; -} - -void XMLCALL -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler start) { - startElementHandler = start; -} - -void XMLCALL -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler end) { - endElementHandler = end; -} - -void XMLCALL -XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler) -{ - characterDataHandler = handler; -} - -void XMLCALL -XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler) -{ - processingInstructionHandler = handler; -} - -void XMLCALL -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler) -{ - commentHandler = handler; -} - -void XMLCALL -XML_SetCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end) -{ - startCdataSectionHandler = start; - endCdataSectionHandler = end; -} - -void XMLCALL -XML_SetStartCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start) { - startCdataSectionHandler = start; -} - -void XMLCALL -XML_SetEndCdataSectionHandler(XML_Parser parser, - XML_EndCdataSectionHandler end) { - endCdataSectionHandler = end; -} - -void XMLCALL -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler) -{ - defaultHandler = handler; - defaultExpandInternalEntities = XML_FALSE; -} - -void XMLCALL -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler) -{ - defaultHandler = handler; - defaultExpandInternalEntities = XML_TRUE; -} - -void XMLCALL -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end) -{ - startDoctypeDeclHandler = start; - endDoctypeDeclHandler = end; -} - -void XMLCALL -XML_SetStartDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start) { - startDoctypeDeclHandler = start; -} - -void XMLCALL -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end) { - endDoctypeDeclHandler = end; -} - -void XMLCALL -XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler) -{ - unparsedEntityDeclHandler = handler; -} - -void XMLCALL -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler) -{ - notationDeclHandler = handler; -} - -void XMLCALL -XML_SetNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end) -{ - startNamespaceDeclHandler = start; - endNamespaceDeclHandler = end; -} - -void XMLCALL -XML_SetStartNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start) { - startNamespaceDeclHandler = start; -} - -void XMLCALL -XML_SetEndNamespaceDeclHandler(XML_Parser parser, - XML_EndNamespaceDeclHandler end) { - endNamespaceDeclHandler = end; -} - -void XMLCALL -XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler) -{ - notStandaloneHandler = handler; -} - -void XMLCALL -XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler) -{ - externalEntityRefHandler = handler; -} - -void XMLCALL -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) -{ - if (arg) - externalEntityRefHandlerArg = (XML_Parser)arg; - else - externalEntityRefHandlerArg = parser; -} - -void XMLCALL -XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler) -{ - skippedEntityHandler = handler; -} - -void XMLCALL -XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, - void *data) -{ - unknownEncodingHandler = handler; - unknownEncodingHandlerData = data; -} - -void XMLCALL -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl) -{ - elementDeclHandler = eldecl; -} - -void XMLCALL -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl) -{ - attlistDeclHandler = attdecl; -} - -void XMLCALL -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler) -{ - entityDeclHandler = handler; -} - -void XMLCALL -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler handler) { - xmlDeclHandler = handler; -} - -int XMLCALL -XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing peParsing) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return 0; -#ifdef XML_DTD - paramEntityParsing = peParsing; - return 1; -#else - return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; -#endif -} - -int XMLCALL -XML_SetHashSalt(XML_Parser parser, - unsigned long hash_salt) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return 0; - hash_secret_salt = hash_salt; - return 1; -} - -enum XML_Status XMLCALL -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - case XML_INITIALIZED: - if (parentParser == NULL && !startParsing(parser)) { - errorCode = XML_ERROR_NO_MEMORY; - return XML_STATUS_ERROR; - } - default: - ps_parsing = XML_PARSING; - } - - if (len == 0) { - ps_finalBuffer = (XML_Bool)isFinal; - if (!isFinal) - return XML_STATUS_OK; - positionPtr = bufferPtr; - parseEndPtr = bufferEnd; - - /* If data are left over from last buffer, and we now know that these - data are the final chunk of input, then we have to check them again - to detect errors based on that fact. - */ - errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); - - if (errorCode == XML_ERROR_NONE) { - switch (ps_parsing) { - case XML_SUSPENDED: - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return XML_STATUS_SUSPENDED; - case XML_INITIALIZED: - case XML_PARSING: - ps_parsing = XML_FINISHED; - /* fall through */ - default: - return XML_STATUS_OK; - } - } - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } -#ifndef XML_CONTEXT_BYTES - else if (bufferPtr == bufferEnd) { - const char *end; - int nLeftOver; - enum XML_Error result; - parseEndByteIndex += len; - positionPtr = s; - ps_finalBuffer = (XML_Bool)isFinal; - - errorCode = processor(parser, s, parseEndPtr = s + len, &end); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (isFinal) { - ps_parsing = XML_FINISHED; - return XML_STATUS_OK; - } - /* fall through */ - default: - result = XML_STATUS_OK; - } - } - - XmlUpdatePosition(encoding, positionPtr, end, &position); - nLeftOver = s + len - end; - if (nLeftOver) { - if (buffer == NULL || nLeftOver > bufferLim - buffer) { - /* FIXME avoid integer overflow */ - char *temp; - temp = (buffer == NULL - ? (char *)MALLOC(len * 2) - : (char *)REALLOC(buffer, len * 2)); - if (temp == NULL) { - errorCode = XML_ERROR_NO_MEMORY; - eventPtr = eventEndPtr = NULL; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - buffer = temp; - bufferLim = buffer + len * 2; - } - memcpy(buffer, end, nLeftOver); - } - bufferPtr = buffer; - bufferEnd = buffer + nLeftOver; - positionPtr = bufferPtr; - parseEndPtr = bufferEnd; - eventPtr = bufferPtr; - eventEndPtr = bufferPtr; - return result; - } -#endif /* not defined XML_CONTEXT_BYTES */ - else { - void *buff = XML_GetBuffer(parser, len); - if (buff == NULL) - return XML_STATUS_ERROR; - else { - memcpy(buff, s, len); - return XML_ParseBuffer(parser, len, isFinal); - } - } -} - -enum XML_Status XMLCALL -XML_ParseBuffer(XML_Parser parser, int len, int isFinal) -{ - const char *start; - enum XML_Status result = XML_STATUS_OK; - - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - case XML_INITIALIZED: - if (parentParser == NULL && !startParsing(parser)) { - errorCode = XML_ERROR_NO_MEMORY; - return XML_STATUS_ERROR; - } - default: - ps_parsing = XML_PARSING; - } - - start = bufferPtr; - positionPtr = start; - bufferEnd += len; - parseEndPtr = bufferEnd; - parseEndByteIndex += len; - ps_finalBuffer = (XML_Bool)isFinal; - - errorCode = processor(parser, start, parseEndPtr, &bufferPtr); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (isFinal) { - ps_parsing = XML_FINISHED; - return result; - } - default: ; /* should not happen */ - } - } - - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return result; -} - -void * XMLCALL -XML_GetBuffer(XML_Parser parser, int len) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return NULL; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return NULL; - default: ; - } - - if (len > bufferLim - bufferEnd) { - /* FIXME avoid integer overflow */ - int neededSize = len + (int)(bufferEnd - bufferPtr); -#ifdef XML_CONTEXT_BYTES - int keep = (int)(bufferPtr - buffer); - - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; - neededSize += keep; -#endif /* defined XML_CONTEXT_BYTES */ - if (neededSize <= bufferLim - buffer) { -#ifdef XML_CONTEXT_BYTES - if (keep < bufferPtr - buffer) { - int offset = (int)(bufferPtr - buffer) - keep; - memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); - bufferEnd -= offset; - bufferPtr -= offset; - } -#else - memmove(buffer, bufferPtr, bufferEnd - bufferPtr); - bufferEnd = buffer + (bufferEnd - bufferPtr); - bufferPtr = buffer; -#endif /* not defined XML_CONTEXT_BYTES */ - } - else { - char *newBuf; - int bufferSize = (int)(bufferLim - bufferPtr); - if (bufferSize == 0) - bufferSize = INIT_BUFFER_SIZE; - do { - bufferSize *= 2; - } while (bufferSize < neededSize); - newBuf = (char *)MALLOC(bufferSize); - if (newBuf == 0) { - errorCode = XML_ERROR_NO_MEMORY; - return NULL; - } - bufferLim = newBuf + bufferSize; -#ifdef XML_CONTEXT_BYTES - if (bufferPtr) { - int keep = (int)(bufferPtr - buffer); - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; - memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); - FREE(buffer); - buffer = newBuf; - bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; - bufferPtr = buffer + keep; - } - else { - bufferEnd = newBuf + (bufferEnd - bufferPtr); - bufferPtr = buffer = newBuf; - } -#else - if (bufferPtr) { - memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); - FREE(buffer); - } - bufferEnd = newBuf + (bufferEnd - bufferPtr); - bufferPtr = buffer = newBuf; -#endif /* not defined XML_CONTEXT_BYTES */ - } - eventPtr = eventEndPtr = NULL; - positionPtr = NULL; - } - return bufferEnd; -} - -enum XML_Status XMLCALL -XML_StopParser(XML_Parser parser, XML_Bool resumable) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - if (resumable) { - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - } - ps_parsing = XML_FINISHED; - break; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - default: - if (resumable) { -#ifdef XML_DTD - if (isParamEntity) { - errorCode = XML_ERROR_SUSPEND_PE; - return XML_STATUS_ERROR; - } -#endif - ps_parsing = XML_SUSPENDED; - } - else - ps_parsing = XML_FINISHED; - } - return XML_STATUS_OK; -} - -enum XML_Status XMLCALL -XML_ResumeParser(XML_Parser parser) -{ - enum XML_Status result = XML_STATUS_OK; - - if (ps_parsing != XML_SUSPENDED) { - errorCode = XML_ERROR_NOT_SUSPENDED; - return XML_STATUS_ERROR; - } - ps_parsing = XML_PARSING; - - errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (ps_finalBuffer) { - ps_parsing = XML_FINISHED; - return result; - } - default: ; - } - } - - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return result; -} - -void XMLCALL -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) -{ - assert(status != NULL); - *status = parser->m_parsingStatus; -} - -enum XML_Error XMLCALL -XML_GetErrorCode(XML_Parser parser) -{ - return errorCode; -} - -XML_Index XMLCALL -XML_GetCurrentByteIndex(XML_Parser parser) -{ - if (eventPtr) - return parseEndByteIndex - (parseEndPtr - eventPtr); - return -1; -} - -int XMLCALL -XML_GetCurrentByteCount(XML_Parser parser) -{ - if (eventEndPtr && eventPtr) - return (int)(eventEndPtr - eventPtr); - return 0; -} - -const char * XMLCALL -XML_GetInputContext(XML_Parser parser, int *offset, int *size) -{ -#ifdef XML_CONTEXT_BYTES - if (eventPtr && buffer) { - *offset = (int)(eventPtr - buffer); - *size = (int)(bufferEnd - buffer); - return buffer; - } -#endif /* defined XML_CONTEXT_BYTES */ - return (char *) 0; -} - -XML_Size XMLCALL -XML_GetCurrentLineNumber(XML_Parser parser) -{ - if (eventPtr && eventPtr >= positionPtr) { - XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); - positionPtr = eventPtr; - } - return position.lineNumber + 1; -} - -XML_Size XMLCALL -XML_GetCurrentColumnNumber(XML_Parser parser) -{ - if (eventPtr && eventPtr >= positionPtr) { - XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); - positionPtr = eventPtr; - } - return position.columnNumber; -} - -void XMLCALL -XML_FreeContentModel(XML_Parser parser, XML_Content *model) -{ - FREE(model); -} - -void * XMLCALL -XML_MemMalloc(XML_Parser parser, size_t size) -{ - return MALLOC(size); -} - -void * XMLCALL -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) -{ - return REALLOC(ptr, size); -} - -void XMLCALL -XML_MemFree(XML_Parser parser, void *ptr) -{ - FREE(ptr); -} - -void XMLCALL -XML_DefaultCurrent(XML_Parser parser) -{ - if (defaultHandler) { - if (openInternalEntities) - reportDefault(parser, - internalEncoding, - openInternalEntities->internalEventPtr, - openInternalEntities->internalEventEndPtr); - else - reportDefault(parser, encoding, eventPtr, eventEndPtr); - } -} - -const XML_LChar * XMLCALL -XML_ErrorString(enum XML_Error code) -{ - static const XML_LChar* const message[] = { - 0, - XML_L("out of memory"), - XML_L("syntax error"), - XML_L("no element found"), - XML_L("not well-formed (invalid token)"), - XML_L("unclosed token"), - XML_L("partial character"), - XML_L("mismatched tag"), - XML_L("duplicate attribute"), - XML_L("junk after document element"), - XML_L("illegal parameter entity reference"), - XML_L("undefined entity"), - XML_L("recursive entity reference"), - XML_L("asynchronous entity"), - XML_L("reference to invalid character number"), - XML_L("reference to binary entity"), - XML_L("reference to external entity in attribute"), - XML_L("XML or text declaration not at start of entity"), - XML_L("unknown encoding"), - XML_L("encoding specified in XML declaration is incorrect"), - XML_L("unclosed CDATA section"), - XML_L("error in processing external entity reference"), - XML_L("document is not standalone"), - XML_L("unexpected parser state - please send a bug report"), - XML_L("entity declared in parameter entity"), - XML_L("requested feature requires XML_DTD support in Expat"), - XML_L("cannot change setting once parsing has begun"), - XML_L("unbound prefix"), - XML_L("must not undeclare prefix"), - XML_L("incomplete markup in parameter entity"), - XML_L("XML declaration not well-formed"), - XML_L("text declaration not well-formed"), - XML_L("illegal character(s) in public id"), - XML_L("parser suspended"), - XML_L("parser not suspended"), - XML_L("parsing aborted"), - XML_L("parsing finished"), - XML_L("cannot suspend in external parameter entity"), - XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"), - XML_L("reserved prefix (xmlns) must not be declared or undeclared"), - XML_L("prefix must not be bound to one of the reserved namespace names") - }; - if (code > 0 && code < sizeof(message)/sizeof(message[0])) - return message[code]; - return NULL; -} - -const XML_LChar * XMLCALL -XML_ExpatVersion(void) { - - /* V1 is used to string-ize the version number. However, it would - string-ize the actual version macro *names* unless we get them - substituted before being passed to V1. CPP is defined to expand - a macro, then rescan for more expansions. Thus, we use V2 to expand - the version macros, then CPP will expand the resulting V1() macro - with the correct numerals. */ - /* ### I'm assuming cpp is portable in this respect... */ - -#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) -#define V2(a,b,c) XML_L("expat_")V1(a,b,c) - - return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); - -#undef V1 -#undef V2 -} - -XML_Expat_Version XMLCALL -XML_ExpatVersionInfo(void) -{ - XML_Expat_Version version; - - version.major = XML_MAJOR_VERSION; - version.minor = XML_MINOR_VERSION; - version.micro = XML_MICRO_VERSION; - - return version; -} - -const XML_Feature * XMLCALL -XML_GetFeatureList(void) -{ - static const XML_Feature features[] = { - {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), - sizeof(XML_Char)}, - {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), - sizeof(XML_LChar)}, -#ifdef XML_UNICODE - {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, -#endif -#ifdef XML_UNICODE_WCHAR_T - {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, -#endif -#ifdef XML_DTD - {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, -#endif -#ifdef XML_CONTEXT_BYTES - {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), - XML_CONTEXT_BYTES}, -#endif -#ifdef XML_MIN_SIZE - {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, -#endif -#ifdef XML_NS - {XML_FEATURE_NS, XML_L("XML_NS"), 0}, -#endif -#ifdef XML_LARGE_SIZE - {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, -#endif -#ifdef XML_ATTR_INFO - {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0}, -#endif - {XML_FEATURE_END, NULL, 0} - }; - - return features; -} - -/* Initially tag->rawName always points into the parse buffer; - for those TAG instances opened while the current parse buffer was - processed, and not yet closed, we need to store tag->rawName in a more - permanent location, since the parse buffer is about to be discarded. -*/ -static XML_Bool -storeRawNames(XML_Parser parser) -{ - TAG *tag = tagStack; - while (tag) { - int bufSize; - int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); - char *rawNameBuf = tag->buf + nameLen; - /* Stop if already stored. Since tagStack is a stack, we can stop - at the first entry that has already been copied; everything - below it in the stack is already been accounted for in a - previous call to this function. - */ - if (tag->rawName == rawNameBuf) - break; - /* For re-use purposes we need to ensure that the - size of tag->buf is a multiple of sizeof(XML_Char). - */ - bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); - if (bufSize > tag->bufEnd - tag->buf) { - char *temp = (char *)REALLOC(tag->buf, bufSize); - if (temp == NULL) - return XML_FALSE; - /* if tag->name.str points to tag->buf (only when namespace - processing is off) then we have to update it - */ - if (tag->name.str == (XML_Char *)tag->buf) - tag->name.str = (XML_Char *)temp; - /* if tag->name.localPart is set (when namespace processing is on) - then update it as well, since it will always point into tag->buf - */ - if (tag->name.localPart) - tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - - (XML_Char *)tag->buf); - tag->buf = temp; - tag->bufEnd = temp + bufSize; - rawNameBuf = temp + nameLen; - } - memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); - tag->rawName = rawNameBuf; - tag = tag->parent; - } - return XML_TRUE; -} - -static enum XML_Error PTRCALL -contentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 0, encoding, start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; - } - return result; -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - processor = externalEntityInitProcessor2; - return externalEntityInitProcessor2(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor2(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - const char *next = start; /* XmlContentTok doesn't always set the last arg */ - int tok = XmlContentTok(encoding, start, end, &next); - switch (tok) { - case XML_TOK_BOM: - /* If we are at the end of the buffer, this would cause the next stage, - i.e. externalEntityInitProcessor3, to pass control directly to - doContent (by detecting XML_TOK_NONE) without processing any xml text - declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. - */ - if (next == end && !ps_finalBuffer) { - *endPtr = next; - return XML_ERROR_NONE; - } - start = next; - break; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - eventPtr = start; - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - eventPtr = start; - return XML_ERROR_PARTIAL_CHAR; - } - processor = externalEntityInitProcessor3; - return externalEntityInitProcessor3(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor3(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - int tok; - const char *next = start; /* XmlContentTok doesn't always set the last arg */ - eventPtr = start; - tok = XmlContentTok(encoding, start, end, &next); - eventEndPtr = next; - - switch (tok) { - case XML_TOK_XML_DECL: - { - enum XML_Error result; - result = processXmlDecl(parser, 1, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (ps_parsing) { - case XML_SUSPENDED: - *endPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - start = next; - } - } - break; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - } - processor = externalEntityContentProcessor; - tagLevel = 1; - return externalEntityContentProcessor(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityContentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 1, encoding, start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; - } - return result; -} - -static enum XML_Error -doContent(XML_Parser parser, - int startTagLevel, - const ENCODING *enc, - const char *s, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - /* save one level of indirection */ - DTD * const dtd = _dtd; - - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - - for (;;) { - const char *next = s; /* XmlContentTok doesn't always set the last arg */ - int tok = XmlContentTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_TRAILING_CR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - *eventEndPP = end; - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) - return XML_ERROR_NO_ELEMENTS; - if (tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (startTagLevel > 0) { - if (tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_NO_ELEMENTS; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (characterDataHandler) - characterDataHandler(handlerArg, &ch, 1); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&dtd->pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity or default handler. - */ - if (!dtd->hasParamEntityRefs || dtd->standalone) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->notation) - return XML_ERROR_BINARY_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - if (!defaultExpandInternalEntities) { - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, entity->name, 0); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - result = processInternalEntity(parser, entity, XML_FALSE); - if (result != XML_ERROR_NONE) - return result; - } - else if (externalEntityRefHandler) { - const XML_Char *context; - entity->open = XML_TRUE; - context = getContext(parser); - entity->open = XML_FALSE; - if (!context) - return XML_ERROR_NO_MEMORY; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - context, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - poolDiscard(&tempPool); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - case XML_TOK_START_TAG_NO_ATTS: - /* fall through */ - case XML_TOK_START_TAG_WITH_ATTS: - { - TAG *tag; - enum XML_Error result; - XML_Char *toPtr; - if (freeTagList) { - tag = freeTagList; - freeTagList = freeTagList->parent; - } - else { - tag = (TAG *)MALLOC(sizeof(TAG)); - if (!tag) - return XML_ERROR_NO_MEMORY; - tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); - if (!tag->buf) { - FREE(tag); - return XML_ERROR_NO_MEMORY; - } - tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; - } - tag->bindings = NULL; - tag->parent = tagStack; - tagStack = tag; - tag->name.localPart = NULL; - tag->name.prefix = NULL; - tag->rawName = s + enc->minBytesPerChar; - tag->rawNameLength = XmlNameLength(enc, tag->rawName); - ++tagLevel; - { - const char *rawNameEnd = tag->rawName + tag->rawNameLength; - const char *fromPtr = tag->rawName; - toPtr = (XML_Char *)tag->buf; - for (;;) { - int bufSize; - int convLen; - XmlConvert(enc, - &fromPtr, rawNameEnd, - (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); - convLen = (int)(toPtr - (XML_Char *)tag->buf); - if (fromPtr == rawNameEnd) { - tag->name.strLen = convLen; - break; - } - bufSize = (int)(tag->bufEnd - tag->buf) << 1; - { - char *temp = (char *)REALLOC(tag->buf, bufSize); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - tag->buf = temp; - tag->bufEnd = temp + bufSize; - toPtr = (XML_Char *)temp + convLen; - } - } - } - tag->name.str = (XML_Char *)tag->buf; - *toPtr = XML_T('\0'); - result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); - if (result) - return result; - if (startElementHandler) - startElementHandler(handlerArg, tag->name.str, - (const XML_Char **)atts); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&tempPool); - break; - } - case XML_TOK_EMPTY_ELEMENT_NO_ATTS: - /* fall through */ - case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: - { - const char *rawName = s + enc->minBytesPerChar; - enum XML_Error result; - BINDING *bindings = NULL; - XML_Bool noElmHandlers = XML_TRUE; - TAG_NAME name; - name.str = poolStoreString(&tempPool, enc, rawName, - rawName + XmlNameLength(enc, rawName)); - if (!name.str) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - result = storeAtts(parser, enc, s, &name, &bindings); - if (result) - return result; - poolFinish(&tempPool); - if (startElementHandler) { - startElementHandler(handlerArg, name.str, (const XML_Char **)atts); - noElmHandlers = XML_FALSE; - } - if (endElementHandler) { - if (startElementHandler) - *eventPP = *eventEndPP; - endElementHandler(handlerArg, name.str); - noElmHandlers = XML_FALSE; - } - if (noElmHandlers && defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&tempPool); - while (bindings) { - BINDING *b = bindings; - if (endNamespaceDeclHandler) - endNamespaceDeclHandler(handlerArg, b->prefix->name); - bindings = bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - b->prefix->binding = b->prevPrefixBinding; - } - } - if (tagLevel == 0) - return epilogProcessor(parser, next, end, nextPtr); - break; - case XML_TOK_END_TAG: - if (tagLevel == startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - else { - int len; - const char *rawName; - TAG *tag = tagStack; - tagStack = tag->parent; - tag->parent = freeTagList; - freeTagList = tag; - rawName = s + enc->minBytesPerChar*2; - len = XmlNameLength(enc, rawName); - if (len != tag->rawNameLength - || memcmp(tag->rawName, rawName, len) != 0) { - *eventPP = rawName; - return XML_ERROR_TAG_MISMATCH; - } - --tagLevel; - if (endElementHandler) { - const XML_Char *localPart; - const XML_Char *prefix; - XML_Char *uri; - localPart = tag->name.localPart; - if (ns && localPart) { - /* localPart and prefix may have been overwritten in - tag->name.str, since this points to the binding->uri - buffer which gets re-used; so we have to add them again - */ - uri = (XML_Char *)tag->name.str + tag->name.uriLen; - /* don't need to check for space - already done in storeAtts() */ - while (*localPart) *uri++ = *localPart++; - prefix = (XML_Char *)tag->name.prefix; - if (ns_triplets && prefix) { - *uri++ = namespaceSeparator; - while (*prefix) *uri++ = *prefix++; - } - *uri = XML_T('\0'); - } - endElementHandler(handlerArg, tag->name.str); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - while (tag->bindings) { - BINDING *b = tag->bindings; - if (endNamespaceDeclHandler) - endNamespaceDeclHandler(handlerArg, b->prefix->name); - tag->bindings = tag->bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - b->prefix->binding = b->prevPrefixBinding; - } - if (tagLevel == 0) - return epilogProcessor(parser, next, end, nextPtr); - } - break; - case XML_TOK_CHAR_REF: - { - int n = XmlCharRefNumber(enc, s); - if (n < 0) - return XML_ERROR_BAD_CHAR_REF; - if (characterDataHandler) { - XML_Char buf[XML_ENCODE_MAX]; - characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - case XML_TOK_DATA_NEWLINE: - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_CDATA_SECT_OPEN: - { - enum XML_Error result; - if (startCdataSectionHandler) - startCdataSectionHandler(handlerArg); -#if 0 - /* Suppose you doing a transformation on a document that involves - changing only the character data. You set up a defaultHandler - and a characterDataHandler. The defaultHandler simply copies - characters through. The characterDataHandler does the - transformation and writes the characters out escaping them as - necessary. This case will fail to work if we leave out the - following two lines (because & and < inside CDATA sections will - be incorrectly escaped). - - However, now we have a start/endCdataSectionHandler, so it seems - easier to let the user deal with this. - */ - else if (characterDataHandler) - characterDataHandler(handlerArg, dataBuf, 0); -#endif - else if (defaultHandler) - reportDefault(parser, enc, s, next); - result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - processor = cdataSectionProcessor; - return result; - } - } - break; - case XML_TOK_TRAILING_RSQB: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (characterDataHandler) { - if (MUST_CONVERT(enc, s)) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); - characterDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - } - else - characterDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)end - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) { - *eventPP = end; - return XML_ERROR_NO_ELEMENTS; - } - if (tagLevel != startTagLevel) { - *eventPP = end; - return XML_ERROR_ASYNC_ENTITY; - } - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = s; - charDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - if (s == next) - break; - *eventPP = s; - } - } - else - charDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (!reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - default: - if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - *eventPP = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } - /* not reached */ -} - -/* Precondition: all arguments must be non-NULL; - Purpose: - - normalize attributes - - check attributes for well-formedness - - generate namespace aware attribute names (URI, prefix) - - build list of attributes for startElementHandler - - default attributes - - process namespace declarations (check and report them) - - generate namespace aware element name (URI, prefix) -*/ -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *enc, - const char *attStr, TAG_NAME *tagNamePtr, - BINDING **bindingsPtr) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - ELEMENT_TYPE *elementType; - int nDefaultAtts; - const XML_Char **appAtts; /* the attribute list for the application */ - int attIndex = 0; - int prefixLen; - int i; - int n; - XML_Char *uri; - int nPrefixes = 0; - BINDING *binding; - const XML_Char *localPart; - - /* lookup the element type name */ - elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0); - if (!elementType) { - const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); - if (!name) - return XML_ERROR_NO_MEMORY; - elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name, - sizeof(ELEMENT_TYPE)); - if (!elementType) - return XML_ERROR_NO_MEMORY; - if (ns && !setElementTypePrefix(parser, elementType)) - return XML_ERROR_NO_MEMORY; - } - nDefaultAtts = elementType->nDefaultAtts; - - /* get the attributes from the tokenizer */ - n = XmlGetAttributes(enc, attStr, attsSize, atts); - if (n + nDefaultAtts > attsSize) { - int oldAttsSize = attsSize; - ATTRIBUTE *temp; -#ifdef XML_ATTR_INFO - XML_AttrInfo *temp2; -#endif - attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; - temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - atts = temp; -#ifdef XML_ATTR_INFO - temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo)); - if (temp2 == NULL) - return XML_ERROR_NO_MEMORY; - attInfo = temp2; -#endif - if (n > oldAttsSize) - XmlGetAttributes(enc, attStr, n, atts); - } - - appAtts = (const XML_Char **)atts; - for (i = 0; i < n; i++) { - ATTRIBUTE *currAtt = &atts[i]; -#ifdef XML_ATTR_INFO - XML_AttrInfo *currAttInfo = &attInfo[i]; -#endif - /* add the name and value to the attribute list */ - ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name, - currAtt->name - + XmlNameLength(enc, currAtt->name)); - if (!attId) - return XML_ERROR_NO_MEMORY; -#ifdef XML_ATTR_INFO - currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name); - currAttInfo->nameEnd = currAttInfo->nameStart + - XmlNameLength(enc, currAtt->name); - currAttInfo->valueStart = parseEndByteIndex - - (parseEndPtr - currAtt->valuePtr); - currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd); -#endif - /* Detect duplicate attributes by their QNames. This does not work when - namespace processing is turned on and different prefixes for the same - namespace are used. For this case we have a check further down. - */ - if ((attId->name)[-1]) { - if (enc == encoding) - eventPtr = atts[i].name; - return XML_ERROR_DUPLICATE_ATTRIBUTE; - } - (attId->name)[-1] = 1; - appAtts[attIndex++] = attId->name; - if (!atts[i].normalized) { - enum XML_Error result; - XML_Bool isCdata = XML_TRUE; - - /* figure out whether declared as other than CDATA */ - if (attId->maybeTokenized) { - int j; - for (j = 0; j < nDefaultAtts; j++) { - if (attId == elementType->defaultAtts[j].id) { - isCdata = elementType->defaultAtts[j].isCdata; - break; - } - } - } - - /* normalize the attribute value */ - result = storeAttributeValue(parser, enc, isCdata, - atts[i].valuePtr, atts[i].valueEnd, - &tempPool); - if (result) - return result; - appAtts[attIndex] = poolStart(&tempPool); - poolFinish(&tempPool); - } - else { - /* the value did not need normalizing */ - appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, - atts[i].valueEnd); - if (appAtts[attIndex] == 0) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - } - /* handle prefixed attribute names */ - if (attId->prefix) { - if (attId->xmlns) { - /* deal with namespace declarations here */ - enum XML_Error result = addBinding(parser, attId->prefix, attId, - appAtts[attIndex], bindingsPtr); - if (result) - return result; - --attIndex; - } - else { - /* deal with other prefixed names later */ - attIndex++; - nPrefixes++; - (attId->name)[-1] = 2; - } - } - else - attIndex++; - } - - /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */ - nSpecifiedAtts = attIndex; - if (elementType->idAtt && (elementType->idAtt->name)[-1]) { - for (i = 0; i < attIndex; i += 2) - if (appAtts[i] == elementType->idAtt->name) { - idAttIndex = i; - break; - } - } - else - idAttIndex = -1; - - /* do attribute defaulting */ - for (i = 0; i < nDefaultAtts; i++) { - const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; - if (!(da->id->name)[-1] && da->value) { - if (da->id->prefix) { - if (da->id->xmlns) { - enum XML_Error result = addBinding(parser, da->id->prefix, da->id, - da->value, bindingsPtr); - if (result) - return result; - } - else { - (da->id->name)[-1] = 2; - nPrefixes++; - appAtts[attIndex++] = da->id->name; - appAtts[attIndex++] = da->value; - } - } - else { - (da->id->name)[-1] = 1; - appAtts[attIndex++] = da->id->name; - appAtts[attIndex++] = da->value; - } - } - } - appAtts[attIndex] = 0; - - /* expand prefixed attribute names, check for duplicates, - and clear flags that say whether attributes were specified */ - i = 0; - if (nPrefixes) { - int j; /* hash table index */ - unsigned long version = nsAttsVersion; - int nsAttsSize = (int)1 << nsAttsPower; - /* size of hash table must be at least 2 * (# of prefixed attributes) */ - if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */ - NS_ATT *temp; - /* hash table size must also be a power of 2 and >= 8 */ - while (nPrefixes >> nsAttsPower++); - if (nsAttsPower < 3) - nsAttsPower = 3; - nsAttsSize = (int)1 << nsAttsPower; - temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT)); - if (!temp) - return XML_ERROR_NO_MEMORY; - nsAtts = temp; - version = 0; /* force re-initialization of nsAtts hash table */ - } - /* using a version flag saves us from initializing nsAtts every time */ - if (!version) { /* initialize version flags when version wraps around */ - version = INIT_ATTS_VERSION; - for (j = nsAttsSize; j != 0; ) - nsAtts[--j].version = version; - } - nsAttsVersion = --version; - - /* expand prefixed names and check for duplicates */ - for (; i < attIndex; i += 2) { - const XML_Char *s = appAtts[i]; - if (s[-1] == 2) { /* prefixed */ - ATTRIBUTE_ID *id; - const BINDING *b; - unsigned long uriHash = hash_secret_salt; - ((XML_Char *)s)[-1] = 0; /* clear flag */ - id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0); - b = id->prefix->binding; - if (!b) - return XML_ERROR_UNBOUND_PREFIX; - - /* as we expand the name we also calculate its hash value */ - for (j = 0; j < b->uriLen; j++) { - const XML_Char c = b->uri[j]; - if (!poolAppendChar(&tempPool, c)) - return XML_ERROR_NO_MEMORY; - uriHash = CHAR_HASH(uriHash, c); - } - while (*s++ != XML_T(ASCII_COLON)) - ; - do { /* copies null terminator */ - const XML_Char c = *s; - if (!poolAppendChar(&tempPool, *s)) - return XML_ERROR_NO_MEMORY; - uriHash = CHAR_HASH(uriHash, c); - } while (*s++); - - { /* Check hash table for duplicate of expanded name (uriName). - Derived from code in lookup(parser, HASH_TABLE *table, ...). - */ - unsigned char step = 0; - unsigned long mask = nsAttsSize - 1; - j = uriHash & mask; /* index into hash table */ - while (nsAtts[j].version == version) { - /* for speed we compare stored hash values first */ - if (uriHash == nsAtts[j].hash) { - const XML_Char *s1 = poolStart(&tempPool); - const XML_Char *s2 = nsAtts[j].uriName; - /* s1 is null terminated, but not s2 */ - for (; *s1 == *s2 && *s1 != 0; s1++, s2++); - if (*s1 == 0) - return XML_ERROR_DUPLICATE_ATTRIBUTE; - } - if (!step) - step = PROBE_STEP(uriHash, mask, nsAttsPower); - j < step ? (j += nsAttsSize - step) : (j -= step); - } - } - - if (ns_triplets) { /* append namespace separator and prefix */ - tempPool.ptr[-1] = namespaceSeparator; - s = b->prefix->name; - do { - if (!poolAppendChar(&tempPool, *s)) - return XML_ERROR_NO_MEMORY; - } while (*s++); - } - - /* store expanded name in attribute list */ - s = poolStart(&tempPool); - poolFinish(&tempPool); - appAtts[i] = s; - - /* fill empty slot with new version, uriName and hash value */ - nsAtts[j].version = version; - nsAtts[j].hash = uriHash; - nsAtts[j].uriName = s; - - if (!--nPrefixes) { - i += 2; - break; - } - } - else /* not prefixed */ - ((XML_Char *)s)[-1] = 0; /* clear flag */ - } - } - /* clear flags for the remaining attributes */ - for (; i < attIndex; i += 2) - ((XML_Char *)(appAtts[i]))[-1] = 0; - for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) - binding->attId->name[-1] = 0; - - if (!ns) - return XML_ERROR_NONE; - - /* expand the element type name */ - if (elementType->prefix) { - binding = elementType->prefix->binding; - if (!binding) - return XML_ERROR_UNBOUND_PREFIX; - localPart = tagNamePtr->str; - while (*localPart++ != XML_T(ASCII_COLON)) - ; - } - else if (dtd->defaultPrefix.binding) { - binding = dtd->defaultPrefix.binding; - localPart = tagNamePtr->str; - } - else - return XML_ERROR_NONE; - prefixLen = 0; - if (ns_triplets && binding->prefix->name) { - for (; binding->prefix->name[prefixLen++];) - ; /* prefixLen includes null terminator */ - } - tagNamePtr->localPart = localPart; - tagNamePtr->uriLen = binding->uriLen; - tagNamePtr->prefix = binding->prefix->name; - tagNamePtr->prefixLen = prefixLen; - for (i = 0; localPart[i++];) - ; /* i includes null terminator */ - n = i + binding->uriLen + prefixLen; - if (n > binding->uriAlloc) { - TAG *p; - uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); - if (!uri) - return XML_ERROR_NO_MEMORY; - binding->uriAlloc = n + EXPAND_SPARE; - memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); - for (p = tagStack; p; p = p->parent) - if (p->name.str == binding->uri) - p->name.str = uri; - FREE(binding->uri); - binding->uri = uri; - } - /* if namespaceSeparator != '\0' then uri includes it already */ - uri = binding->uri + binding->uriLen; - memcpy(uri, localPart, i * sizeof(XML_Char)); - /* we always have a namespace separator between localPart and prefix */ - if (prefixLen) { - uri += i - 1; - *uri = namespaceSeparator; /* replace null terminator */ - memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); - } - tagNamePtr->str = binding->uri; - return XML_ERROR_NONE; -} - -/* addBinding() overwrites the value of prefix->binding without checking. - Therefore one must keep track of the old value outside of addBinding(). -*/ -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr) -{ - static const XML_Char xmlNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, - ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH, - ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, - ASCII_e, '\0' - }; - static const int xmlLen = - (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1; - static const XML_Char xmlnsNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, - ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, - ASCII_SLASH, '\0' - }; - static const int xmlnsLen = - (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1; - - XML_Bool mustBeXML = XML_FALSE; - XML_Bool isXML = XML_TRUE; - XML_Bool isXMLNS = XML_TRUE; - - BINDING *b; - int len; - - /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ - if (*uri == XML_T('\0') && prefix->name) - return XML_ERROR_UNDECLARING_PREFIX; - - if (prefix->name - && prefix->name[0] == XML_T(ASCII_x) - && prefix->name[1] == XML_T(ASCII_m) - && prefix->name[2] == XML_T(ASCII_l)) { - - /* Not allowed to bind xmlns */ - if (prefix->name[3] == XML_T(ASCII_n) - && prefix->name[4] == XML_T(ASCII_s) - && prefix->name[5] == XML_T('\0')) - return XML_ERROR_RESERVED_PREFIX_XMLNS; - - if (prefix->name[3] == XML_T('\0')) - mustBeXML = XML_TRUE; - } - - for (len = 0; uri[len]; len++) { - if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) - isXML = XML_FALSE; - - if (!mustBeXML && isXMLNS - && (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) - isXMLNS = XML_FALSE; - } - isXML = isXML && len == xmlLen; - isXMLNS = isXMLNS && len == xmlnsLen; - - if (mustBeXML != isXML) - return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML - : XML_ERROR_RESERVED_NAMESPACE_URI; - - if (isXMLNS) - return XML_ERROR_RESERVED_NAMESPACE_URI; - - if (namespaceSeparator) - len++; - if (freeBindingList) { - b = freeBindingList; - if (len > b->uriAlloc) { - XML_Char *temp = (XML_Char *)REALLOC(b->uri, - sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - b->uri = temp; - b->uriAlloc = len + EXPAND_SPARE; - } - freeBindingList = b->nextTagBinding; - } - else { - b = (BINDING *)MALLOC(sizeof(BINDING)); - if (!b) - return XML_ERROR_NO_MEMORY; - b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (!b->uri) { - FREE(b); - return XML_ERROR_NO_MEMORY; - } - b->uriAlloc = len + EXPAND_SPARE; - } - b->uriLen = len; - memcpy(b->uri, uri, len * sizeof(XML_Char)); - if (namespaceSeparator) - b->uri[len - 1] = namespaceSeparator; - b->prefix = prefix; - b->attId = attId; - b->prevPrefixBinding = prefix->binding; - /* NULL binding when default namespace undeclared */ - if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) - prefix->binding = NULL; - else - prefix->binding = b; - b->nextTagBinding = *bindingsPtr; - *bindingsPtr = b; - /* if attId == NULL then we are not starting a namespace scope */ - if (attId && startNamespaceDeclHandler) - startNamespaceDeclHandler(handlerArg, prefix->name, - prefix->binding ? uri : 0); - return XML_ERROR_NONE; -} - -/* The idea here is to avoid using stack for each CDATA section when - the whole file is parsed with one call. -*/ -static enum XML_Error PTRCALL -cdataSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doCdataSection(parser, encoding, &start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result != XML_ERROR_NONE) - return result; - if (start) { - if (parentParser) { /* we are parsing an external entity */ - processor = externalEntityContentProcessor; - return externalEntityContentProcessor(parser, start, end, endPtr); - } - else { - processor = contentProcessor; - return contentProcessor(parser, start, end, endPtr); - } - } - return result; -} - -/* startPtr gets set to non-null if the section is closed, and to null if - the section is not yet closed. -*/ -static enum XML_Error -doCdataSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - const char *s = *startPtr; - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - *eventPP = s; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - *startPtr = NULL; - - for (;;) { - const char *next; - int tok = XmlCdataSectionTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_CDATA_SECT_CLOSE: - if (endCdataSectionHandler) - endCdataSectionHandler(handlerArg); -#if 0 - /* see comment under XML_TOK_CDATA_SECT_OPEN */ - else if (characterDataHandler) - characterDataHandler(handlerArg, dataBuf, 0); -#endif - else if (defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_DATA_NEWLINE: - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = next; - charDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - if (s == next) - break; - *eventPP = s; - } - } - else - charDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_CDATA_SECTION; - default: - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - } - - *eventPP = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } - /* not reached */ -} - -#ifdef XML_DTD - -/* The idea here is to avoid using stack for each IGNORE section when - the whole file is parsed with one call. -*/ -static enum XML_Error PTRCALL -ignoreSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result != XML_ERROR_NONE) - return result; - if (start) { - processor = prologProcessor; - return prologProcessor(parser, start, end, endPtr); - } - return result; -} - -/* startPtr gets set to non-null is the section is closed, and to null - if the section is not yet closed. -*/ -static enum XML_Error -doIgnoreSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - const char *next; - int tok; - const char *s = *startPtr; - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - *eventPP = s; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - *startPtr = NULL; - tok = XmlIgnoreSectionTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_IGNORE_SECT: - if (defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ - default: - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - } - /* not reached */ -} - -#endif /* XML_DTD */ - -static enum XML_Error -initializeEncoding(XML_Parser parser) -{ - const char *s; -#ifdef XML_UNICODE - char encodingBuf[128]; - if (!protocolEncodingName) - s = NULL; - else { - int i; - for (i = 0; protocolEncodingName[i]; i++) { - if (i == sizeof(encodingBuf) - 1 - || (protocolEncodingName[i] & ~0x7f) != 0) { - encodingBuf[0] = '\0'; - break; - } - encodingBuf[i] = (char)protocolEncodingName[i]; - } - encodingBuf[i] = '\0'; - s = encodingBuf; - } -#else - s = protocolEncodingName; -#endif - if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) - return XML_ERROR_NONE; - return handleUnknownEncoding(parser, protocolEncodingName); -} - -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next) -{ - const char *encodingName = NULL; - const XML_Char *storedEncName = NULL; - const ENCODING *newEncoding = NULL; - const char *version = NULL; - const char *versionend; - const XML_Char *storedversion = NULL; - int standalone = -1; - if (!(ns - ? XmlParseXmlDeclNS - : XmlParseXmlDecl)(isGeneralTextEntity, - encoding, - s, - next, - &eventPtr, - &version, - &versionend, - &encodingName, - &newEncoding, - &standalone)) { - if (isGeneralTextEntity) - return XML_ERROR_TEXT_DECL; - else - return XML_ERROR_XML_DECL; - } - if (!isGeneralTextEntity && standalone == 1) { - _dtd->standalone = XML_TRUE; -#ifdef XML_DTD - if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) - paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; -#endif /* XML_DTD */ - } - if (xmlDeclHandler) { - if (encodingName != NULL) { - storedEncName = poolStoreString(&temp2Pool, - encoding, - encodingName, - encodingName - + XmlNameLength(encoding, encodingName)); - if (!storedEncName) - return XML_ERROR_NO_MEMORY; - poolFinish(&temp2Pool); - } - if (version) { - storedversion = poolStoreString(&temp2Pool, - encoding, - version, - versionend - encoding->minBytesPerChar); - if (!storedversion) - return XML_ERROR_NO_MEMORY; - } - xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); - } - else if (defaultHandler) - reportDefault(parser, encoding, s, next); - if (protocolEncodingName == NULL) { - if (newEncoding) { - if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { - eventPtr = encodingName; - return XML_ERROR_INCORRECT_ENCODING; - } - encoding = newEncoding; - } - else if (encodingName) { - enum XML_Error result; - if (!storedEncName) { - storedEncName = poolStoreString( - &temp2Pool, encoding, encodingName, - encodingName + XmlNameLength(encoding, encodingName)); - if (!storedEncName) - return XML_ERROR_NO_MEMORY; - } - result = handleUnknownEncoding(parser, storedEncName); - poolClear(&temp2Pool); - if (result == XML_ERROR_UNKNOWN_ENCODING) - eventPtr = encodingName; - return result; - } - } - - if (storedEncName || storedversion) - poolClear(&temp2Pool); - - return XML_ERROR_NONE; -} - -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) -{ - if (unknownEncodingHandler) { - XML_Encoding info; - int i; - for (i = 0; i < 256; i++) - info.map[i] = -1; - info.convert = NULL; - info.data = NULL; - info.release = NULL; - if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, - &info)) { - ENCODING *enc; - unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); - if (!unknownEncodingMem) { - if (info.release) - info.release(info.data); - return XML_ERROR_NO_MEMORY; - } - enc = (ns - ? XmlInitUnknownEncodingNS - : XmlInitUnknownEncoding)(unknownEncodingMem, - info.map, - info.convert, - info.data); - if (enc) { - unknownEncodingData = info.data; - unknownEncodingRelease = info.release; - encoding = enc; - return XML_ERROR_NONE; - } - } - if (info.release != NULL) - info.release(info.data); - } - return XML_ERROR_UNKNOWN_ENCODING; -} - -static enum XML_Error PTRCALL -prologInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - processor = prologProcessor; - return prologProcessor(parser, s, end, nextPtr); -} - -#ifdef XML_DTD - -static enum XML_Error PTRCALL -externalParEntInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - - /* we know now that XML_Parse(Buffer) has been called, - so we consider the external parameter entity read */ - _dtd->paramEntityRead = XML_TRUE; - - if (prologState.inEntityValue) { - processor = entityValueInitProcessor; - return entityValueInitProcessor(parser, s, end, nextPtr); - } - else { - processor = externalParEntProcessor; - return externalParEntProcessor(parser, s, end, nextPtr); - } -} - -static enum XML_Error PTRCALL -entityValueInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - int tok; - const char *start = s; - const char *next = start; - eventPtr = start; - - for (;;) { - tok = XmlPrologTok(encoding, start, end, &next); - eventEndPtr = next; - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - /* found end of entity value - can store it now */ - return storeEntityValue(parser, encoding, s, end); - } - else if (tok == XML_TOK_XML_DECL) { - enum XML_Error result; - result = processXmlDecl(parser, 0, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - *nextPtr = next; - } - /* stop scanning for text declaration - we found one */ - processor = entityValueProcessor; - return entityValueProcessor(parser, next, end, nextPtr); - } - /* If we are at the end of the buffer, this would cause XmlPrologTok to - return XML_TOK_NONE on the next call, which would then cause the - function to exit with *nextPtr set to s - that is what we want for other - tokens, but not for the BOM - we would rather like to skip it; - then, when this routine is entered the next time, XmlPrologTok will - return XML_TOK_INVALID, since the BOM is still in the buffer - */ - else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) { - *nextPtr = next; - return XML_ERROR_NONE; - } - start = next; - eventPtr = start; - } -} - -static enum XML_Error PTRCALL -externalParEntProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *next = s; - int tok; - - tok = XmlPrologTok(encoding, s, end, &next); - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - } - /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. - However, when parsing an external subset, doProlog will not accept a BOM - as valid, and report a syntax error, so we have to skip the BOM - */ - else if (tok == XML_TOK_BOM) { - s = next; - tok = XmlPrologTok(encoding, s, end, &next); - } - - processor = prologProcessor; - return doProlog(parser, encoding, s, end, tok, next, - nextPtr, (XML_Bool)!ps_finalBuffer); -} - -static enum XML_Error PTRCALL -entityValueProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *start = s; - const char *next = s; - const ENCODING *enc = encoding; - int tok; - - for (;;) { - tok = XmlPrologTok(enc, start, end, &next); - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - /* found end of entity value - can store it now */ - return storeEntityValue(parser, enc, s, end); - } - start = next; - } -} - -#endif /* XML_DTD */ - -static enum XML_Error PTRCALL -prologProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *next = s; - int tok = XmlPrologTok(encoding, s, end, &next); - return doProlog(parser, encoding, s, end, tok, next, - nextPtr, (XML_Bool)!ps_finalBuffer); -} - -static enum XML_Error -doProlog(XML_Parser parser, - const ENCODING *enc, - const char *s, - const char *end, - int tok, - const char *next, - const char **nextPtr, - XML_Bool haveMore) -{ -#ifdef XML_DTD - static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' }; -#endif /* XML_DTD */ - static const XML_Char atypeCDATA[] = - { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; - static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' }; - static const XML_Char atypeIDREF[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; - static const XML_Char atypeIDREFS[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; - static const XML_Char atypeENTITY[] = - { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; - static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N, - ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; - static const XML_Char atypeNMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; - static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, - ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; - static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T, - ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' }; - static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' }; - static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' }; - - /* save one level of indirection */ - DTD * const dtd = _dtd; - - const char **eventPP; - const char **eventEndPP; - enum XML_Content_Quant quant; - - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - - for (;;) { - int role; - XML_Bool handleDefault = XML_TRUE; - *eventPP = s; - *eventEndPP = next; - if (tok <= 0) { - if (haveMore && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case -XML_TOK_PROLOG_S: - tok = -tok; - break; - case XML_TOK_NONE: -#ifdef XML_DTD - /* for internal PE NOT referenced between declarations */ - if (enc != encoding && !openInternalEntities->betweenDecl) { - *nextPtr = s; - return XML_ERROR_NONE; - } - /* WFC: PE Between Declarations - must check that PE contains - complete markup, not only for external PEs, but also for - internal PEs if the reference occurs between declarations. - */ - if (isParamEntity || enc != encoding) { - if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) - == XML_ROLE_ERROR) - return XML_ERROR_INCOMPLETE_PE; - *nextPtr = s; - return XML_ERROR_NONE; - } -#endif /* XML_DTD */ - return XML_ERROR_NO_ELEMENTS; - default: - tok = -tok; - next = end; - break; - } - } - role = XmlTokenRole(&prologState, tok, s, next, enc); - switch (role) { - case XML_ROLE_XML_DECL: - { - enum XML_Error result = processXmlDecl(parser, 0, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = encoding; - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_DOCTYPE_NAME: - if (startDoctypeDeclHandler) { - doctypeName = poolStoreString(&tempPool, enc, s, next); - if (!doctypeName) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - doctypePubid = NULL; - handleDefault = XML_FALSE; - } - doctypeSysid = NULL; /* always initialize to NULL */ - break; - case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: - if (startDoctypeDeclHandler) { - startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, - doctypePubid, 1); - doctypeName = NULL; - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - break; -#ifdef XML_DTD - case XML_ROLE_TEXT_DECL: - { - enum XML_Error result = processXmlDecl(parser, 1, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = encoding; - handleDefault = XML_FALSE; - } - break; -#endif /* XML_DTD */ - case XML_ROLE_DOCTYPE_PUBLIC_ID: -#ifdef XML_DTD - useForeignDTD = XML_FALSE; - declEntity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (startDoctypeDeclHandler) { - XML_Char *pubId; - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - pubId = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!pubId) - return XML_ERROR_NO_MEMORY; - normalizePublicId(pubId); - poolFinish(&tempPool); - doctypePubid = pubId; - handleDefault = XML_FALSE; - goto alreadyChecked; - } - /* fall through */ - case XML_ROLE_ENTITY_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - alreadyChecked: - if (dtd->keepProcessing && declEntity) { - XML_Char *tem = poolStoreString(&dtd->pool, - enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - declEntity->publicId = tem; - poolFinish(&dtd->pool); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_DOCTYPE_CLOSE: - if (doctypeName) { - startDoctypeDeclHandler(handlerArg, doctypeName, - doctypeSysid, doctypePubid, 0); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - /* doctypeSysid will be non-NULL in the case of a previous - XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler - was not set, indicating an external subset - */ -#ifdef XML_DTD - if (doctypeSysid || useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (paramEntityParsing && externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) - return XML_ERROR_NO_MEMORY; - if (useForeignDTD) - entity->base = curBase; - dtd->paramEntityRead = XML_FALSE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else if (!doctypeSysid) - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ - } - useForeignDTD = XML_FALSE; - } -#endif /* XML_DTD */ - if (endDoctypeDeclHandler) { - endDoctypeDeclHandler(handlerArg); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_INSTANCE_START: -#ifdef XML_DTD - /* if there is no DOCTYPE declaration then now is the - last chance to read the foreign DTD - */ - if (useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (paramEntityParsing && externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) - return XML_ERROR_NO_MEMORY; - entity->base = curBase; - dtd->paramEntityRead = XML_FALSE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ - } - } -#endif /* XML_DTD */ - processor = contentProcessor; - return contentProcessor(parser, s, end, nextPtr); - case XML_ROLE_ATTLIST_ELEMENT_NAME: - declElementType = getElementType(parser, enc, s, next); - if (!declElementType) - return XML_ERROR_NO_MEMORY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_NAME: - declAttributeId = getAttributeId(parser, enc, s, next); - if (!declAttributeId) - return XML_ERROR_NO_MEMORY; - declAttributeIsCdata = XML_FALSE; - declAttributeType = NULL; - declAttributeIsId = XML_FALSE; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_CDATA: - declAttributeIsCdata = XML_TRUE; - declAttributeType = atypeCDATA; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ID: - declAttributeIsId = XML_TRUE; - declAttributeType = atypeID; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREF: - declAttributeType = atypeIDREF; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: - declAttributeType = atypeIDREFS; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: - declAttributeType = atypeENTITY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: - declAttributeType = atypeENTITIES; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: - declAttributeType = atypeNMTOKEN; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: - declAttributeType = atypeNMTOKENS; - checkAttListDeclHandler: - if (dtd->keepProcessing && attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTRIBUTE_ENUM_VALUE: - case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: - if (dtd->keepProcessing && attlistDeclHandler) { - const XML_Char *prefix; - if (declAttributeType) { - prefix = enumValueSep; - } - else { - prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE - ? notationPrefix - : enumValueStart); - } - if (!poolAppendString(&tempPool, prefix)) - return XML_ERROR_NO_MEMORY; - if (!poolAppend(&tempPool, enc, s, next)) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: - case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - if (!defineAttribute(declElementType, declAttributeId, - declAttributeIsCdata, declAttributeIsId, - 0, parser)) - return XML_ERROR_NO_MEMORY; - if (attlistDeclHandler && declAttributeType) { - if (*declAttributeType == XML_T(ASCII_LPAREN) - || (*declAttributeType == XML_T(ASCII_N) - && declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - poolFinish(&tempPool); - } - *eventEndPP = s; - attlistDeclHandler(handlerArg, declElementType->name, - declAttributeId->name, declAttributeType, - 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: - case XML_ROLE_FIXED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - const XML_Char *attVal; - enum XML_Error result = - storeAttributeValue(parser, enc, declAttributeIsCdata, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar, - &dtd->pool); - if (result) - return result; - attVal = poolStart(&dtd->pool); - poolFinish(&dtd->pool); - /* ID attributes aren't allowed to have a default */ - if (!defineAttribute(declElementType, declAttributeId, - declAttributeIsCdata, XML_FALSE, attVal, parser)) - return XML_ERROR_NO_MEMORY; - if (attlistDeclHandler && declAttributeType) { - if (*declAttributeType == XML_T(ASCII_LPAREN) - || (*declAttributeType == XML_T(ASCII_N) - && declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - poolFinish(&tempPool); - } - *eventEndPP = s; - attlistDeclHandler(handlerArg, declElementType->name, - declAttributeId->name, declAttributeType, - attVal, - role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_ENTITY_VALUE: - if (dtd->keepProcessing) { - enum XML_Error result = storeEntityValue(parser, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (declEntity) { - declEntity->textPtr = poolStart(&dtd->entityValuePool); - declEntity->textLen = (int)(poolLength(&dtd->entityValuePool)); - poolFinish(&dtd->entityValuePool); - if (entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - declEntity->is_param, - declEntity->textPtr, - declEntity->textLen, - curBase, 0, 0, 0); - handleDefault = XML_FALSE; - } - } - else - poolDiscard(&dtd->entityValuePool); - if (result != XML_ERROR_NONE) - return result; - } - break; - case XML_ROLE_DOCTYPE_SYSTEM_ID: -#ifdef XML_DTD - useForeignDTD = XML_FALSE; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (startDoctypeDeclHandler) { - doctypeSysid = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (doctypeSysid == NULL) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } -#ifdef XML_DTD - else - /* use externalSubsetName to make doctypeSysid non-NULL - for the case where no startDoctypeDeclHandler is set */ - doctypeSysid = externalSubsetName; -#endif /* XML_DTD */ - if (!dtd->standalone -#ifdef XML_DTD - && !paramEntityParsing -#endif /* XML_DTD */ - && notStandaloneHandler - && !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; -#ifndef XML_DTD - break; -#else /* XML_DTD */ - if (!declEntity) { - declEntity = (ENTITY *)lookup(parser, - &dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - declEntity->publicId = NULL; - } - /* fall through */ -#endif /* XML_DTD */ - case XML_ROLE_ENTITY_SYSTEM_ID: - if (dtd->keepProcessing && declEntity) { - declEntity->systemId = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!declEntity->systemId) - return XML_ERROR_NO_MEMORY; - declEntity->base = curBase; - poolFinish(&dtd->pool); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_COMPLETE: - if (dtd->keepProcessing && declEntity && entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - declEntity->is_param, - 0,0, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - 0); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_NOTATION_NAME: - if (dtd->keepProcessing && declEntity) { - declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); - if (!declEntity->notation) - return XML_ERROR_NO_MEMORY; - poolFinish(&dtd->pool); - if (unparsedEntityDeclHandler) { - *eventEndPP = s; - unparsedEntityDeclHandler(handlerArg, - declEntity->name, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - declEntity->notation); - handleDefault = XML_FALSE; - } - else if (entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - 0,0,0, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - declEntity->notation); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_GENERAL_ENTITY_NAME: - { - if (XmlPredefinedEntityName(enc, s, next)) { - declEntity = NULL; - break; - } - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) - return XML_ERROR_NO_MEMORY; - declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - if (declEntity->name != name) { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - else { - poolFinish(&dtd->pool); - declEntity->publicId = NULL; - declEntity->is_param = XML_FALSE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - declEntity->is_internal = !(parentParser || openInternalEntities); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - } - else { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - } - break; - case XML_ROLE_PARAM_ENTITY_NAME: -#ifdef XML_DTD - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) - return XML_ERROR_NO_MEMORY; - declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities, - name, sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - if (declEntity->name != name) { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - else { - poolFinish(&dtd->pool); - declEntity->publicId = NULL; - declEntity->is_param = XML_TRUE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - declEntity->is_internal = !(parentParser || openInternalEntities); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - } - else { - poolDiscard(&dtd->pool); - declEntity = NULL; - } -#else /* not XML_DTD */ - declEntity = NULL; -#endif /* XML_DTD */ - break; - case XML_ROLE_NOTATION_NAME: - declNotationPublicId = NULL; - declNotationName = NULL; - if (notationDeclHandler) { - declNotationName = poolStoreString(&tempPool, enc, s, next); - if (!declNotationName) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - if (declNotationName) { /* means notationDeclHandler != NULL */ - XML_Char *tem = poolStoreString(&tempPool, - enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - declNotationPublicId = tem; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_SYSTEM_ID: - if (declNotationName && notationDeclHandler) { - const XML_Char *systemId - = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!systemId) - return XML_ERROR_NO_MEMORY; - *eventEndPP = s; - notationDeclHandler(handlerArg, - declNotationName, - curBase, - systemId, - declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&tempPool); - break; - case XML_ROLE_NOTATION_NO_SYSTEM_ID: - if (declNotationPublicId && notationDeclHandler) { - *eventEndPP = s; - notationDeclHandler(handlerArg, - declNotationName, - curBase, - 0, - declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&tempPool); - break; - case XML_ROLE_ERROR: - switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: - /* PE references in internal subset are - not allowed within declarations. */ - return XML_ERROR_PARAM_ENTITY_REF; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - default: - return XML_ERROR_SYNTAX; - } -#ifdef XML_DTD - case XML_ROLE_IGNORE_SECT: - { - enum XML_Error result; - if (defaultHandler) - reportDefault(parser, enc, s, next); - handleDefault = XML_FALSE; - result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - processor = ignoreSectionProcessor; - return result; - } - } - break; -#endif /* XML_DTD */ - case XML_ROLE_GROUP_OPEN: - if (prologState.level >= groupSize) { - if (groupSize) { - char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - groupConnector = temp; - if (dtd->scaffIndex) { - int *temp = (int *)REALLOC(dtd->scaffIndex, - groupSize * sizeof(int)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - dtd->scaffIndex = temp; - } - } - else { - groupConnector = (char *)MALLOC(groupSize = 32); - if (!groupConnector) - return XML_ERROR_NO_MEMORY; - } - } - groupConnector[prologState.level] = 0; - if (dtd->in_eldecl) { - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - dtd->scaffIndex[dtd->scaffLevel] = myindex; - dtd->scaffLevel++; - dtd->scaffold[myindex].type = XML_CTYPE_SEQ; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_GROUP_SEQUENCE: - if (groupConnector[prologState.level] == ASCII_PIPE) - return XML_ERROR_SYNTAX; - groupConnector[prologState.level] = ASCII_COMMA; - if (dtd->in_eldecl && elementDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_GROUP_CHOICE: - if (groupConnector[prologState.level] == ASCII_COMMA) - return XML_ERROR_SYNTAX; - if (dtd->in_eldecl - && !groupConnector[prologState.level] - && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - != XML_CTYPE_MIXED) - ) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_CHOICE; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - groupConnector[prologState.level] = ASCII_PIPE; - break; - case XML_ROLE_PARAM_ENTITY_REF: -#ifdef XML_DTD - case XML_ROLE_INNER_PARAM_ENTITY_REF: - dtd->hasParamEntityRefs = XML_TRUE; - if (!paramEntityParsing) - dtd->keepProcessing = dtd->standalone; - else { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); - poolDiscard(&dtd->pool); - /* first, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity handler - */ - if (prologState.documentEntity && - (dtd->standalone - ? !openInternalEntities - : !dtd->hasParamEntityRefs)) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - dtd->keepProcessing = dtd->standalone; - /* cannot report skipped entities in declarations */ - if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { - skippedEntityHandler(handlerArg, name, 1); - handleDefault = XML_FALSE; - } - break; - } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - XML_Bool betweenDecl = - (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); - result = processInternalEntity(parser, entity, betweenDecl); - if (result != XML_ERROR_NONE) - return result; - handleDefault = XML_FALSE; - break; - } - if (externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { - entity->open = XML_FALSE; - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - } - entity->open = XML_FALSE; - handleDefault = XML_FALSE; - if (!dtd->paramEntityRead) { - dtd->keepProcessing = dtd->standalone; - break; - } - } - else { - dtd->keepProcessing = dtd->standalone; - break; - } - } -#endif /* XML_DTD */ - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - break; - - /* Element declaration stuff */ - - case XML_ROLE_ELEMENT_NAME: - if (elementDeclHandler) { - declElementType = getElementType(parser, enc, s, next); - if (!declElementType) - return XML_ERROR_NO_MEMORY; - dtd->scaffLevel = 0; - dtd->scaffCount = 0; - dtd->in_eldecl = XML_TRUE; - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ANY: - case XML_ROLE_CONTENT_EMPTY: - if (dtd->in_eldecl) { - if (elementDeclHandler) { - XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); - if (!content) - return XML_ERROR_NO_MEMORY; - content->quant = XML_CQUANT_NONE; - content->name = NULL; - content->numchildren = 0; - content->children = NULL; - content->type = ((role == XML_ROLE_CONTENT_ANY) ? - XML_CTYPE_ANY : - XML_CTYPE_EMPTY); - *eventEndPP = s; - elementDeclHandler(handlerArg, declElementType->name, content); - handleDefault = XML_FALSE; - } - dtd->in_eldecl = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_PCDATA: - if (dtd->in_eldecl) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_MIXED; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ELEMENT: - quant = XML_CQUANT_NONE; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_OPT: - quant = XML_CQUANT_OPT; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_REP: - quant = XML_CQUANT_REP; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_PLUS: - quant = XML_CQUANT_PLUS; - elementContent: - if (dtd->in_eldecl) { - ELEMENT_TYPE *el; - const XML_Char *name; - int nameLen; - const char *nxt = (quant == XML_CQUANT_NONE - ? next - : next - enc->minBytesPerChar); - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - dtd->scaffold[myindex].type = XML_CTYPE_NAME; - dtd->scaffold[myindex].quant = quant; - el = getElementType(parser, enc, s, nxt); - if (!el) - return XML_ERROR_NO_MEMORY; - name = el->name; - dtd->scaffold[myindex].name = name; - nameLen = 0; - for (; name[nameLen++]; ); - dtd->contentStringLen += nameLen; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_GROUP_CLOSE: - quant = XML_CQUANT_NONE; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_OPT: - quant = XML_CQUANT_OPT; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_REP: - quant = XML_CQUANT_REP; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_PLUS: - quant = XML_CQUANT_PLUS; - closeGroup: - if (dtd->in_eldecl) { - if (elementDeclHandler) - handleDefault = XML_FALSE; - dtd->scaffLevel--; - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; - if (dtd->scaffLevel == 0) { - if (!handleDefault) { - XML_Content *model = build_model(parser); - if (!model) - return XML_ERROR_NO_MEMORY; - *eventEndPP = s; - elementDeclHandler(handlerArg, declElementType->name, model); - } - dtd->in_eldecl = XML_FALSE; - dtd->contentStringLen = 0; - } - } - break; - /* End element declaration stuff */ - - case XML_ROLE_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_COMMENT: - if (!reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_NONE: - switch (tok) { - case XML_TOK_BOM: - handleDefault = XML_FALSE; - break; - } - break; - case XML_ROLE_DOCTYPE_NONE: - if (startDoctypeDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ENTITY_NONE: - if (dtd->keepProcessing && entityDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_NOTATION_NONE: - if (notationDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTLIST_NONE: - if (dtd->keepProcessing && attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ELEMENT_NONE: - if (elementDeclHandler) - handleDefault = XML_FALSE; - break; - } /* end of big switch */ - - if (handleDefault && defaultHandler) - reportDefault(parser, enc, s, next); - - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - s = next; - tok = XmlPrologTok(enc, s, end, &next); - } - } - /* not reached */ -} - -static enum XML_Error PTRCALL -epilogProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - processor = epilogProcessor; - eventPtr = s; - for (;;) { - const char *next = NULL; - int tok = XmlPrologTok(encoding, s, end, &next); - eventEndPtr = next; - switch (tok) { - /* report partial linebreak - it might be the last token */ - case -XML_TOK_PROLOG_S: - if (defaultHandler) { - reportDefault(parser, encoding, s, next); - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - } - *nextPtr = next; - return XML_ERROR_NONE; - case XML_TOK_NONE: - *nextPtr = s; - return XML_ERROR_NONE; - case XML_TOK_PROLOG_S: - if (defaultHandler) - reportDefault(parser, encoding, s, next); - break; - case XML_TOK_PI: - if (!reportProcessingInstruction(parser, encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (!reportComment(parser, encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_INVALID: - eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - default: - return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; - } - eventPtr = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } -} - -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl) -{ - const char *textStart, *textEnd; - const char *next; - enum XML_Error result; - OPEN_INTERNAL_ENTITY *openEntity; - - if (freeInternalEntities) { - openEntity = freeInternalEntities; - freeInternalEntities = openEntity->next; - } - else { - openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY)); - if (!openEntity) - return XML_ERROR_NO_MEMORY; - } - entity->open = XML_TRUE; - entity->processed = 0; - openEntity->next = openInternalEntities; - openInternalEntities = openEntity; - openEntity->entity = entity; - openEntity->startTagLevel = tagLevel; - openEntity->betweenDecl = betweenDecl; - openEntity->internalEventPtr = NULL; - openEntity->internalEventEndPtr = NULL; - textStart = (char *)entity->textPtr; - textEnd = (char *)(entity->textPtr + entity->textLen); - -#ifdef XML_DTD - if (entity->is_param) { - int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else -#endif /* XML_DTD */ - result = doContent(parser, tagLevel, internalEncoding, textStart, - textEnd, &next, XML_FALSE); - - if (result == XML_ERROR_NONE) { - if (textEnd != next && ps_parsing == XML_SUSPENDED) { - entity->processed = (int)(next - textStart); - processor = internalEntityProcessor; - } - else { - entity->open = XML_FALSE; - openInternalEntities = openEntity->next; - /* put openEntity back in list of free instances */ - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - } - return result; -} - -static enum XML_Error PTRCALL -internalEntityProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - ENTITY *entity; - const char *textStart, *textEnd; - const char *next; - enum XML_Error result; - OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities; - if (!openEntity) - return XML_ERROR_UNEXPECTED_STATE; - - entity = openEntity->entity; - textStart = ((char *)entity->textPtr) + entity->processed; - textEnd = (char *)(entity->textPtr + entity->textLen); - -#ifdef XML_DTD - if (entity->is_param) { - int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else -#endif /* XML_DTD */ - result = doContent(parser, openEntity->startTagLevel, internalEncoding, - textStart, textEnd, &next, XML_FALSE); - - if (result != XML_ERROR_NONE) - return result; - else if (textEnd != next && ps_parsing == XML_SUSPENDED) { - entity->processed = (int)(next - (char *)entity->textPtr); - return result; - } - else { - entity->open = XML_FALSE; - openInternalEntities = openEntity->next; - /* put openEntity back in list of free instances */ - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - -#ifdef XML_DTD - if (entity->is_param) { - int tok; - processor = prologProcessor; - tok = XmlPrologTok(encoding, s, end, &next); - return doProlog(parser, encoding, s, end, tok, next, nextPtr, - (XML_Bool)!ps_finalBuffer); - } - else -#endif /* XML_DTD */ - { - processor = contentProcessor; - /* see externalEntityContentProcessor vs contentProcessor */ - return doContent(parser, parentParser ? 1 : 0, encoding, s, end, - nextPtr, (XML_Bool)!ps_finalBuffer); - } -} - -static enum XML_Error PTRCALL -errorProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - return errorCode; -} - -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, - end, pool); - if (result) - return result; - if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) - poolChop(pool); - if (!poolAppendChar(pool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - return XML_ERROR_NONE; -} - -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - for (;;) { - const char *next; - int tok = XmlAttributeValueTok(enc, ptr, end, &next); - switch (tok) { - case XML_TOK_NONE: - return XML_ERROR_NONE; - case XML_TOK_INVALID: - if (enc == encoding) - eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, ptr); - if (n < 0) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - if (!isCdata - && n == 0x20 /* space */ - && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - n = XmlEncode(n, (ICHAR *)buf); - if (!n) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - for (i = 0; i < n; i++) { - if (!poolAppendChar(pool, buf[i])) - return XML_ERROR_NO_MEMORY; - } - } - break; - case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, ptr, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_TRAILING_CR: - next = ptr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_ATTRIBUTE_VALUE_S: - case XML_TOK_DATA_NEWLINE: - if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - if (!poolAppendChar(pool, 0x20)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - char checkEntityDecl; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (!poolAppendChar(pool, ch)) - return XML_ERROR_NO_MEMORY; - break; - } - name = poolStoreString(&temp2Pool, enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0); - poolDiscard(&temp2Pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal. - */ - if (pool == &dtd->pool) /* are we called from prolog? */ - checkEntityDecl = -#ifdef XML_DTD - prologState.documentEntity && -#endif /* XML_DTD */ - (dtd->standalone - ? !openInternalEntities - : !dtd->hasParamEntityRefs); - else /* if (pool == &tempPool): we are called from content */ - checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; - if (checkEntityDecl) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - /* Cannot report skipped entity here - see comments on - skippedEntityHandler. - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - */ - /* Cannot call the default handler because this would be - out of sync with the call to the startElementHandler. - if ((pool == &tempPool) && defaultHandler) - reportDefault(parser, enc, ptr, next); - */ - break; - } - if (entity->open) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_RECURSIVE_ENTITY_REF; - } - if (entity->notation) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BINARY_ENTITY_REF; - } - if (!entity->textPtr) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; - } - else { - enum XML_Error result; - const XML_Char *textEnd = entity->textPtr + entity->textLen; - entity->open = XML_TRUE; - result = appendAttributeValue(parser, internalEncoding, isCdata, - (char *)entity->textPtr, - (char *)textEnd, pool); - entity->open = XML_FALSE; - if (result) - return result; - } - } - break; - default: - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_UNEXPECTED_STATE; - } - ptr = next; - } - /* not reached */ -} - -static enum XML_Error -storeEntityValue(XML_Parser parser, - const ENCODING *enc, - const char *entityTextPtr, - const char *entityTextEnd) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - STRING_POOL *pool = &(dtd->entityValuePool); - enum XML_Error result = XML_ERROR_NONE; -#ifdef XML_DTD - int oldInEntityValue = prologState.inEntityValue; - prologState.inEntityValue = 1; -#endif /* XML_DTD */ - /* never return Null for the value argument in EntityDeclHandler, - since this would indicate an external entity; therefore we - have to make sure that entityValuePool.start is not null */ - if (!pool->blocks) { - if (!poolGrow(pool)) - return XML_ERROR_NO_MEMORY; - } - - for (;;) { - const char *next; - int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); - switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: -#ifdef XML_DTD - if (isParamEntity || enc != encoding) { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&tempPool, enc, - entityTextPtr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0); - poolDiscard(&tempPool); - if (!entity) { - /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ - /* cannot report skipped entity here - see comments on - skippedEntityHandler - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - */ - dtd->keepProcessing = dtd->standalone; - goto endEntityValue; - } - if (entity->open) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_RECURSIVE_ENTITY_REF; - goto endEntityValue; - } - if (entity->systemId) { - if (externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { - entity->open = XML_FALSE; - result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; - goto endEntityValue; - } - entity->open = XML_FALSE; - if (!dtd->paramEntityRead) - dtd->keepProcessing = dtd->standalone; - } - else - dtd->keepProcessing = dtd->standalone; - } - else { - entity->open = XML_TRUE; - result = storeEntityValue(parser, - internalEncoding, - (char *)entity->textPtr, - (char *)(entity->textPtr - + entity->textLen)); - entity->open = XML_FALSE; - if (result) - goto endEntityValue; - } - break; - } -#endif /* XML_DTD */ - /* In the internal subset, PE references are not legal - within markup declarations, e.g entity values in this case. */ - eventPtr = entityTextPtr; - result = XML_ERROR_PARAM_ENTITY_REF; - goto endEntityValue; - case XML_TOK_NONE: - result = XML_ERROR_NONE; - goto endEntityValue; - case XML_TOK_ENTITY_REF: - case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, entityTextPtr, next)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - break; - case XML_TOK_TRAILING_CR: - next = entityTextPtr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_DATA_NEWLINE: - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = 0xA; - break; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, entityTextPtr); - if (n < 0) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; - goto endEntityValue; - } - n = XmlEncode(n, (ICHAR *)buf); - if (!n) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; - goto endEntityValue; - } - for (i = 0; i < n; i++) { - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = buf[i]; - } - } - break; - case XML_TOK_PARTIAL: - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - case XML_TOK_INVALID: - if (enc == encoding) - eventPtr = next; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - default: - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_UNEXPECTED_STATE; - goto endEntityValue; - } - entityTextPtr = next; - } -endEntityValue: -#ifdef XML_DTD - prologState.inEntityValue = oldInEntityValue; -#endif /* XML_DTD */ - return result; -} - -static void FASTCALL -normalizeLines(XML_Char *s) -{ - XML_Char *p; - for (;; s++) { - if (*s == XML_T('\0')) - return; - if (*s == 0xD) - break; - } - p = s; - do { - if (*s == 0xD) { - *p++ = 0xA; - if (*++s == 0xA) - s++; - } - else - *p++ = *s++; - } while (*s); - *p = XML_T('\0'); -} - -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - const XML_Char *target; - XML_Char *data; - const char *tem; - if (!processingInstructionHandler) { - if (defaultHandler) - reportDefault(parser, enc, start, end); - return 1; - } - start += enc->minBytesPerChar * 2; - tem = start + XmlNameLength(enc, start); - target = poolStoreString(&tempPool, enc, start, tem); - if (!target) - return 0; - poolFinish(&tempPool); - data = poolStoreString(&tempPool, enc, - XmlSkipS(enc, tem), - end - enc->minBytesPerChar*2); - if (!data) - return 0; - normalizeLines(data); - processingInstructionHandler(handlerArg, target, data); - poolClear(&tempPool); - return 1; -} - -static int -reportComment(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - XML_Char *data; - if (!commentHandler) { - if (defaultHandler) - reportDefault(parser, enc, start, end); - return 1; - } - data = poolStoreString(&tempPool, - enc, - start + enc->minBytesPerChar * 4, - end - enc->minBytesPerChar * 3); - if (!data) - return 0; - normalizeLines(data); - commentHandler(handlerArg, data); - poolClear(&tempPool); - return 1; -} - -static void -reportDefault(XML_Parser parser, const ENCODING *enc, - const char *s, const char *end) -{ - if (MUST_CONVERT(enc, s)) { - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - do { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = s; - defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf)); - *eventPP = s; - } while (s != end); - } - else - defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s)); -} - - -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, - XML_Bool isId, const XML_Char *value, XML_Parser parser) -{ - DEFAULT_ATTRIBUTE *att; - if (value || isId) { - /* The handling of default attributes gets messed up if we have - a default which duplicates a non-default. */ - int i; - for (i = 0; i < type->nDefaultAtts; i++) - if (attId == type->defaultAtts[i].id) - return 1; - if (isId && !type->idAtt && !attId->xmlns) - type->idAtt = attId; - } - if (type->nDefaultAtts == type->allocDefaultAtts) { - if (type->allocDefaultAtts == 0) { - type->allocDefaultAtts = 8; - type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts - * sizeof(DEFAULT_ATTRIBUTE)); - if (!type->defaultAtts) - return 0; - } - else { - DEFAULT_ATTRIBUTE *temp; - int count = type->allocDefaultAtts * 2; - temp = (DEFAULT_ATTRIBUTE *) - REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); - if (temp == NULL) - return 0; - type->allocDefaultAtts = count; - type->defaultAtts = temp; - } - } - att = type->defaultAtts + type->nDefaultAtts; - att->id = attId; - att->value = value; - att->isCdata = isCdata; - if (!isCdata) - attId->maybeTokenized = XML_TRUE; - type->nDefaultAtts += 1; - return 1; -} - -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *name; - for (name = elementType->name; *name; name++) { - if (*name == XML_T(ASCII_COLON)) { - PREFIX *prefix; - const XML_Char *s; - for (s = elementType->name; s != name; s++) { - if (!poolAppendChar(&dtd->pool, *s)) - return 0; - } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return 0; - prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), - sizeof(PREFIX)); - if (!prefix) - return 0; - if (prefix->name == poolStart(&dtd->pool)) - poolFinish(&dtd->pool); - else - poolDiscard(&dtd->pool); - elementType->prefix = prefix; - - } - } - return 1; -} - -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - ATTRIBUTE_ID *id; - const XML_Char *name; - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; - name = poolStoreString(&dtd->pool, enc, start, end); - if (!name) - return NULL; - /* skip quotation mark - its storage will be re-used (like in name[-1]) */ - ++name; - id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); - if (!id) - return NULL; - if (id->name != name) - poolDiscard(&dtd->pool); - else { - poolFinish(&dtd->pool); - if (!ns) - ; - else if (name[0] == XML_T(ASCII_x) - && name[1] == XML_T(ASCII_m) - && name[2] == XML_T(ASCII_l) - && name[3] == XML_T(ASCII_n) - && name[4] == XML_T(ASCII_s) - && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { - if (name[5] == XML_T('\0')) - id->prefix = &dtd->defaultPrefix; - else - id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX)); - id->xmlns = XML_TRUE; - } - else { - int i; - for (i = 0; name[i]; i++) { - /* attributes without prefix are *not* in the default namespace */ - if (name[i] == XML_T(ASCII_COLON)) { - int j; - for (j = 0; j < i; j++) { - if (!poolAppendChar(&dtd->pool, name[j])) - return NULL; - } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; - id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), - sizeof(PREFIX)); - if (id->prefix->name == poolStart(&dtd->pool)) - poolFinish(&dtd->pool); - else - poolDiscard(&dtd->pool); - break; - } - } - } - } - return id; -} - -#define CONTEXT_SEP XML_T(ASCII_FF) - -static const XML_Char * -getContext(XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - HASH_TABLE_ITER iter; - XML_Bool needSep = XML_FALSE; - - if (dtd->defaultPrefix.binding) { - int i; - int len; - if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) - return NULL; - len = dtd->defaultPrefix.binding->uriLen; - if (namespaceSeparator) - len--; - for (i = 0; i < len; i++) - if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) - return NULL; - needSep = XML_TRUE; - } - - hashTableIterInit(&iter, &(dtd->prefixes)); - for (;;) { - int i; - int len; - const XML_Char *s; - PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); - if (!prefix) - break; - if (!prefix->binding) - continue; - if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) - return NULL; - for (s = prefix->name; *s; s++) - if (!poolAppendChar(&tempPool, *s)) - return NULL; - if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) - return NULL; - len = prefix->binding->uriLen; - if (namespaceSeparator) - len--; - for (i = 0; i < len; i++) - if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) - return NULL; - needSep = XML_TRUE; - } - - - hashTableIterInit(&iter, &(dtd->generalEntities)); - for (;;) { - const XML_Char *s; - ENTITY *e = (ENTITY *)hashTableIterNext(&iter); - if (!e) - break; - if (!e->open) - continue; - if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) - return NULL; - for (s = e->name; *s; s++) - if (!poolAppendChar(&tempPool, *s)) - return 0; - needSep = XML_TRUE; - } - - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return NULL; - return tempPool.start; -} - -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *s = context; - - while (*context != XML_T('\0')) { - if (*s == CONTEXT_SEP || *s == XML_T('\0')) { - ENTITY *e; - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0); - if (e) - e->open = XML_TRUE; - if (*s != XML_T('\0')) - s++; - context = s; - poolDiscard(&tempPool); - } - else if (*s == XML_T(ASCII_EQUALS)) { - PREFIX *prefix; - if (poolLength(&tempPool) == 0) - prefix = &dtd->defaultPrefix; - else { - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool), - sizeof(PREFIX)); - if (!prefix) - return XML_FALSE; - if (prefix->name == poolStart(&tempPool)) { - prefix->name = poolCopyString(&dtd->pool, prefix->name); - if (!prefix->name) - return XML_FALSE; - } - poolDiscard(&tempPool); - } - for (context = s + 1; - *context != CONTEXT_SEP && *context != XML_T('\0'); - context++) - if (!poolAppendChar(&tempPool, *context)) - return XML_FALSE; - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - if (addBinding(parser, prefix, NULL, poolStart(&tempPool), - &inheritedBindings) != XML_ERROR_NONE) - return XML_FALSE; - poolDiscard(&tempPool); - if (*context != XML_T('\0')) - ++context; - s = context; - } - else { - if (!poolAppendChar(&tempPool, *s)) - return XML_FALSE; - s++; - } - } - return XML_TRUE; -} - -static void FASTCALL -normalizePublicId(XML_Char *publicId) -{ - XML_Char *p = publicId; - XML_Char *s; - for (s = publicId; *s; s++) { - switch (*s) { - case 0x20: - case 0xD: - case 0xA: - if (p != publicId && p[-1] != 0x20) - *p++ = 0x20; - break; - default: - *p++ = *s; - } - } - if (p != publicId && p[-1] == 0x20) - --p; - *p = XML_T('\0'); -} - -static DTD * -dtdCreate(const XML_Memory_Handling_Suite *ms) -{ - DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); - if (p == NULL) - return p; - poolInit(&(p->pool), ms); - poolInit(&(p->entityValuePool), ms); - hashTableInit(&(p->generalEntities), ms); - hashTableInit(&(p->elementTypes), ms); - hashTableInit(&(p->attributeIds), ms); - hashTableInit(&(p->prefixes), ms); -#ifdef XML_DTD - p->paramEntityRead = XML_FALSE; - hashTableInit(&(p->paramEntities), ms); -#endif /* XML_DTD */ - p->defaultPrefix.name = NULL; - p->defaultPrefix.binding = NULL; - - p->in_eldecl = XML_FALSE; - p->scaffIndex = NULL; - p->scaffold = NULL; - p->scaffLevel = 0; - p->scaffSize = 0; - p->scaffCount = 0; - p->contentStringLen = 0; - - p->keepProcessing = XML_TRUE; - p->hasParamEntityRefs = XML_FALSE; - p->standalone = XML_FALSE; - return p; -} - -static void -dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - hashTableIterInit(&iter, &(p->elementTypes)); - for (;;) { - ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); - } - hashTableClear(&(p->generalEntities)); -#ifdef XML_DTD - p->paramEntityRead = XML_FALSE; - hashTableClear(&(p->paramEntities)); -#endif /* XML_DTD */ - hashTableClear(&(p->elementTypes)); - hashTableClear(&(p->attributeIds)); - hashTableClear(&(p->prefixes)); - poolClear(&(p->pool)); - poolClear(&(p->entityValuePool)); - p->defaultPrefix.name = NULL; - p->defaultPrefix.binding = NULL; - - p->in_eldecl = XML_FALSE; - - ms->free_fcn(p->scaffIndex); - p->scaffIndex = NULL; - ms->free_fcn(p->scaffold); - p->scaffold = NULL; - - p->scaffLevel = 0; - p->scaffSize = 0; - p->scaffCount = 0; - p->contentStringLen = 0; - - p->keepProcessing = XML_TRUE; - p->hasParamEntityRefs = XML_FALSE; - p->standalone = XML_FALSE; -} - -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - hashTableIterInit(&iter, &(p->elementTypes)); - for (;;) { - ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); - } - hashTableDestroy(&(p->generalEntities)); -#ifdef XML_DTD - hashTableDestroy(&(p->paramEntities)); -#endif /* XML_DTD */ - hashTableDestroy(&(p->elementTypes)); - hashTableDestroy(&(p->attributeIds)); - hashTableDestroy(&(p->prefixes)); - poolDestroy(&(p->pool)); - poolDestroy(&(p->entityValuePool)); - if (isDocEntity) { - ms->free_fcn(p->scaffIndex); - ms->free_fcn(p->scaffold); - } - ms->free_fcn(p); -} - -/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. - The new DTD has already been initialized. -*/ -static int -dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - - /* Copy the prefix table. */ - - hashTableIterInit(&iter, &(oldDtd->prefixes)); - for (;;) { - const XML_Char *name; - const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); - if (!oldP) - break; - name = poolCopyString(&(newDtd->pool), oldP->name); - if (!name) - return 0; - if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX))) - return 0; - } - - hashTableIterInit(&iter, &(oldDtd->attributeIds)); - - /* Copy the attribute id table. */ - - for (;;) { - ATTRIBUTE_ID *newA; - const XML_Char *name; - const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); - - if (!oldA) - break; - /* Remember to allocate the scratch byte before the name. */ - if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) - return 0; - name = poolCopyString(&(newDtd->pool), oldA->name); - if (!name) - return 0; - ++name; - newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name, - sizeof(ATTRIBUTE_ID)); - if (!newA) - return 0; - newA->maybeTokenized = oldA->maybeTokenized; - if (oldA->prefix) { - newA->xmlns = oldA->xmlns; - if (oldA->prefix == &oldDtd->defaultPrefix) - newA->prefix = &newDtd->defaultPrefix; - else - newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), - oldA->prefix->name, 0); - } - } - - /* Copy the element type table. */ - - hashTableIterInit(&iter, &(oldDtd->elementTypes)); - - for (;;) { - int i; - ELEMENT_TYPE *newE; - const XML_Char *name; - const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!oldE) - break; - name = poolCopyString(&(newDtd->pool), oldE->name); - if (!name) - return 0; - newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name, - sizeof(ELEMENT_TYPE)); - if (!newE) - return 0; - if (oldE->nDefaultAtts) { - newE->defaultAtts = (DEFAULT_ATTRIBUTE *) - ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); - if (!newE->defaultAtts) { - ms->free_fcn(newE); - return 0; - } - } - if (oldE->idAtt) - newE->idAtt = (ATTRIBUTE_ID *) - lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0); - newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; - if (oldE->prefix) - newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes), - oldE->prefix->name, 0); - for (i = 0; i < newE->nDefaultAtts; i++) { - newE->defaultAtts[i].id = (ATTRIBUTE_ID *) - lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); - newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; - if (oldE->defaultAtts[i].value) { - newE->defaultAtts[i].value - = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); - if (!newE->defaultAtts[i].value) - return 0; - } - else - newE->defaultAtts[i].value = NULL; - } - } - - /* Copy the entity tables. */ - if (!copyEntityTable(oldParser, - &(newDtd->generalEntities), - &(newDtd->pool), - &(oldDtd->generalEntities))) - return 0; - -#ifdef XML_DTD - if (!copyEntityTable(oldParser, - &(newDtd->paramEntities), - &(newDtd->pool), - &(oldDtd->paramEntities))) - return 0; - newDtd->paramEntityRead = oldDtd->paramEntityRead; -#endif /* XML_DTD */ - - newDtd->keepProcessing = oldDtd->keepProcessing; - newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; - newDtd->standalone = oldDtd->standalone; - - /* Don't want deep copying for scaffolding */ - newDtd->in_eldecl = oldDtd->in_eldecl; - newDtd->scaffold = oldDtd->scaffold; - newDtd->contentStringLen = oldDtd->contentStringLen; - newDtd->scaffSize = oldDtd->scaffSize; - newDtd->scaffLevel = oldDtd->scaffLevel; - newDtd->scaffIndex = oldDtd->scaffIndex; - - return 1; -} /* End dtdCopy */ - -static int -copyEntityTable(XML_Parser oldParser, - HASH_TABLE *newTable, - STRING_POOL *newPool, - const HASH_TABLE *oldTable) -{ - HASH_TABLE_ITER iter; - const XML_Char *cachedOldBase = NULL; - const XML_Char *cachedNewBase = NULL; - - hashTableIterInit(&iter, oldTable); - - for (;;) { - ENTITY *newE; - const XML_Char *name; - const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); - if (!oldE) - break; - name = poolCopyString(newPool, oldE->name); - if (!name) - return 0; - newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY)); - if (!newE) - return 0; - if (oldE->systemId) { - const XML_Char *tem = poolCopyString(newPool, oldE->systemId); - if (!tem) - return 0; - newE->systemId = tem; - if (oldE->base) { - if (oldE->base == cachedOldBase) - newE->base = cachedNewBase; - else { - cachedOldBase = oldE->base; - tem = poolCopyString(newPool, cachedOldBase); - if (!tem) - return 0; - cachedNewBase = newE->base = tem; - } - } - if (oldE->publicId) { - tem = poolCopyString(newPool, oldE->publicId); - if (!tem) - return 0; - newE->publicId = tem; - } - } - else { - const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, - oldE->textLen); - if (!tem) - return 0; - newE->textPtr = tem; - newE->textLen = oldE->textLen; - } - if (oldE->notation) { - const XML_Char *tem = poolCopyString(newPool, oldE->notation); - if (!tem) - return 0; - newE->notation = tem; - } - newE->is_param = oldE->is_param; - newE->is_internal = oldE->is_internal; - } - return 1; -} - -#define INIT_POWER 6 - -static XML_Bool FASTCALL -keyeq(KEY s1, KEY s2) -{ - for (; *s1 == *s2; s1++, s2++) - if (*s1 == 0) - return XML_TRUE; - return XML_FALSE; -} - -static unsigned long FASTCALL -hash(XML_Parser parser, KEY s) -{ - unsigned long h = hash_secret_salt; - while (*s) - h = CHAR_HASH(h, *s++); - return h; -} - -static NAMED * -lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) -{ - size_t i; - if (table->size == 0) { - size_t tsize; - if (!createSize) - return NULL; - table->power = INIT_POWER; - /* table->size is a power of 2 */ - table->size = (size_t)1 << INIT_POWER; - tsize = table->size * sizeof(NAMED *); - table->v = (NAMED **)table->mem->malloc_fcn(tsize); - if (!table->v) { - table->size = 0; - return NULL; - } - memset(table->v, 0, tsize); - i = hash(parser, name) & ((unsigned long)table->size - 1); - } - else { - unsigned long h = hash(parser, name); - unsigned long mask = (unsigned long)table->size - 1; - unsigned char step = 0; - i = h & mask; - while (table->v[i]) { - if (keyeq(name, table->v[i]->name)) - return table->v[i]; - if (!step) - step = PROBE_STEP(h, mask, table->power); - i < step ? (i += table->size - step) : (i -= step); - } - if (!createSize) - return NULL; - - /* check for overflow (table is half full) */ - if (table->used >> (table->power - 1)) { - unsigned char newPower = table->power + 1; - size_t newSize = (size_t)1 << newPower; - unsigned long newMask = (unsigned long)newSize - 1; - size_t tsize = newSize * sizeof(NAMED *); - NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); - if (!newV) - return NULL; - memset(newV, 0, tsize); - for (i = 0; i < table->size; i++) - if (table->v[i]) { - unsigned long newHash = hash(parser, table->v[i]->name); - size_t j = newHash & newMask; - step = 0; - while (newV[j]) { - if (!step) - step = PROBE_STEP(newHash, newMask, newPower); - j < step ? (j += newSize - step) : (j -= step); - } - newV[j] = table->v[i]; - } - table->mem->free_fcn(table->v); - table->v = newV; - table->power = newPower; - table->size = newSize; - i = h & newMask; - step = 0; - while (table->v[i]) { - if (!step) - step = PROBE_STEP(h, newMask, newPower); - i < step ? (i += newSize - step) : (i -= step); - } - } - } - table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); - if (!table->v[i]) - return NULL; - memset(table->v[i], 0, createSize); - table->v[i]->name = name; - (table->used)++; - return table->v[i]; -} - -static void FASTCALL -hashTableClear(HASH_TABLE *table) -{ - size_t i; - for (i = 0; i < table->size; i++) { - table->mem->free_fcn(table->v[i]); - table->v[i] = NULL; - } - table->used = 0; -} - -static void FASTCALL -hashTableDestroy(HASH_TABLE *table) -{ - size_t i; - for (i = 0; i < table->size; i++) - table->mem->free_fcn(table->v[i]); - table->mem->free_fcn(table->v); -} - -static void FASTCALL -hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) -{ - p->power = 0; - p->size = 0; - p->used = 0; - p->v = NULL; - p->mem = ms; -} - -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) -{ - iter->p = table->v; - iter->end = iter->p + table->size; -} - -static NAMED * FASTCALL -hashTableIterNext(HASH_TABLE_ITER *iter) -{ - while (iter->p != iter->end) { - NAMED *tem = *(iter->p)++; - if (tem) - return tem; - } - return NULL; -} - -static void FASTCALL -poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) -{ - pool->blocks = NULL; - pool->freeBlocks = NULL; - pool->start = NULL; - pool->ptr = NULL; - pool->end = NULL; - pool->mem = ms; -} - -static void FASTCALL -poolClear(STRING_POOL *pool) -{ - if (!pool->freeBlocks) - pool->freeBlocks = pool->blocks; - else { - BLOCK *p = pool->blocks; - while (p) { - BLOCK *tem = p->next; - p->next = pool->freeBlocks; - pool->freeBlocks = p; - p = tem; - } - } - pool->blocks = NULL; - pool->start = NULL; - pool->ptr = NULL; - pool->end = NULL; -} - -static void FASTCALL -poolDestroy(STRING_POOL *pool) -{ - BLOCK *p = pool->blocks; - while (p) { - BLOCK *tem = p->next; - pool->mem->free_fcn(p); - p = tem; - } - p = pool->freeBlocks; - while (p) { - BLOCK *tem = p->next; - pool->mem->free_fcn(p); - p = tem; - } -} - -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!pool->ptr && !poolGrow(pool)) - return NULL; - for (;;) { - XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); - if (ptr == end) - break; - if (!poolGrow(pool)) - return NULL; - } - return pool->start; -} - -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s) -{ - do { - if (!poolAppendChar(pool, *s)) - return NULL; - } while (*s++); - s = pool->start; - poolFinish(pool); - return s; -} - -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) -{ - if (!pool->ptr && !poolGrow(pool)) - return NULL; - for (; n > 0; --n, s++) { - if (!poolAppendChar(pool, *s)) - return NULL; - } - s = pool->start; - poolFinish(pool); - return s; -} - -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s) -{ - while (*s) { - if (!poolAppendChar(pool, *s)) - return NULL; - s++; - } - return pool->start; -} - -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!poolAppend(pool, enc, ptr, end)) - return NULL; - if (pool->ptr == pool->end && !poolGrow(pool)) - return NULL; - *(pool->ptr)++ = 0; - return pool->start; -} - -static XML_Bool FASTCALL -poolGrow(STRING_POOL *pool) -{ - if (pool->freeBlocks) { - if (pool->start == 0) { - pool->blocks = pool->freeBlocks; - pool->freeBlocks = pool->freeBlocks->next; - pool->blocks->next = NULL; - pool->start = pool->blocks->s; - pool->end = pool->start + pool->blocks->size; - pool->ptr = pool->start; - return XML_TRUE; - } - if (pool->end - pool->start < pool->freeBlocks->size) { - BLOCK *tem = pool->freeBlocks->next; - pool->freeBlocks->next = pool->blocks; - pool->blocks = pool->freeBlocks; - pool->freeBlocks = tem; - memcpy(pool->blocks->s, pool->start, - (pool->end - pool->start) * sizeof(XML_Char)); - pool->ptr = pool->blocks->s + (pool->ptr - pool->start); - pool->start = pool->blocks->s; - pool->end = pool->start + pool->blocks->size; - return XML_TRUE; - } - } - if (pool->blocks && pool->start == pool->blocks->s) { - int blockSize = (int)(pool->end - pool->start)*2; - BLOCK *temp = (BLOCK *) - pool->mem->realloc_fcn(pool->blocks, - (offsetof(BLOCK, s) - + blockSize * sizeof(XML_Char))); - if (temp == NULL) - return XML_FALSE; - pool->blocks = temp; - pool->blocks->size = blockSize; - pool->ptr = pool->blocks->s + (pool->ptr - pool->start); - pool->start = pool->blocks->s; - pool->end = pool->start + blockSize; - } - else { - BLOCK *tem; - int blockSize = (int)(pool->end - pool->start); - if (blockSize < INIT_BLOCK_SIZE) - blockSize = INIT_BLOCK_SIZE; - else - blockSize *= 2; - tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) - + blockSize * sizeof(XML_Char)); - if (!tem) - return XML_FALSE; - tem->size = blockSize; - tem->next = pool->blocks; - pool->blocks = tem; - if (pool->ptr != pool->start) - memcpy(tem->s, pool->start, - (pool->ptr - pool->start) * sizeof(XML_Char)); - pool->ptr = tem->s + (pool->ptr - pool->start); - pool->start = tem->s; - pool->end = tem->s + blockSize; - } - return XML_TRUE; -} - -static int FASTCALL -nextScaffoldPart(XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - CONTENT_SCAFFOLD * me; - int next; - - if (!dtd->scaffIndex) { - dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); - if (!dtd->scaffIndex) - return -1; - dtd->scaffIndex[0] = 0; - } - - if (dtd->scaffCount >= dtd->scaffSize) { - CONTENT_SCAFFOLD *temp; - if (dtd->scaffold) { - temp = (CONTENT_SCAFFOLD *) - REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; - dtd->scaffSize *= 2; - } - else { - temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS - * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; - dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; - } - dtd->scaffold = temp; - } - next = dtd->scaffCount++; - me = &dtd->scaffold[next]; - if (dtd->scaffLevel) { - CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; - if (parent->lastchild) { - dtd->scaffold[parent->lastchild].nextsib = next; - } - if (!parent->childcnt) - parent->firstchild = next; - parent->lastchild = next; - parent->childcnt++; - } - me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; - return next; -} - -static void -build_node(XML_Parser parser, - int src_node, - XML_Content *dest, - XML_Content **contpos, - XML_Char **strpos) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - dest->type = dtd->scaffold[src_node].type; - dest->quant = dtd->scaffold[src_node].quant; - if (dest->type == XML_CTYPE_NAME) { - const XML_Char *src; - dest->name = *strpos; - src = dtd->scaffold[src_node].name; - for (;;) { - *(*strpos)++ = *src; - if (!*src) - break; - src++; - } - dest->numchildren = 0; - dest->children = NULL; - } - else { - unsigned int i; - int cn; - dest->numchildren = dtd->scaffold[src_node].childcnt; - dest->children = *contpos; - *contpos += dest->numchildren; - for (i = 0, cn = dtd->scaffold[src_node].firstchild; - i < dest->numchildren; - i++, cn = dtd->scaffold[cn].nextsib) { - build_node(parser, cn, &(dest->children[i]), contpos, strpos); - } - dest->name = NULL; - } -} - -static XML_Content * -build_model (XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - XML_Content *ret; - XML_Content *cpos; - XML_Char * str; - int allocsize = (dtd->scaffCount * sizeof(XML_Content) - + (dtd->contentStringLen * sizeof(XML_Char))); - - ret = (XML_Content *)MALLOC(allocsize); - if (!ret) - return NULL; - - str = (XML_Char *) (&ret[dtd->scaffCount]); - cpos = &ret[1]; - - build_node(parser, 0, ret, &cpos, &str); - return ret; -} - -static ELEMENT_TYPE * -getElementType(XML_Parser parser, - const ENCODING *enc, - const char *ptr, - const char *end) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); - ELEMENT_TYPE *ret; - - if (!name) - return NULL; - ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); - if (!ret) - return NULL; - if (ret->name != name) - poolDiscard(&dtd->pool); - else { - poolFinish(&dtd->pool); - if (!setElementTypePrefix(parser, ret)) - return NULL; - } - return ret; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c deleted file mode 100644 index 44772e21..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.c +++ /dev/null @@ -1,1336 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <stddef.h> - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#else -#ifdef HAVE_EXPAT_CONFIG_H -#include <expat_config.h> -#endif -#endif /* ndef COMPILED_FROM_DSP */ - -#include "expat_external.h" -#include "internal.h" -#include "xmlrole.h" -#include "ascii.h" - -/* Doesn't check: - - that ,| are not mixed in a model group - content of literals - -*/ - -static const char KW_ANY[] = { - ASCII_A, ASCII_N, ASCII_Y, '\0' }; -static const char KW_ATTLIST[] = { - ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; -static const char KW_CDATA[] = { - ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_DOCTYPE[] = { - ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; -static const char KW_ELEMENT[] = { - ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; -static const char KW_EMPTY[] = { - ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; -static const char KW_ENTITIES[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, - '\0' }; -static const char KW_ENTITY[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; -static const char KW_FIXED[] = { - ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; -static const char KW_ID[] = { - ASCII_I, ASCII_D, '\0' }; -static const char KW_IDREF[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; -static const char KW_IDREFS[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; -#ifdef XML_DTD -static const char KW_IGNORE[] = { - ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; -#endif -static const char KW_IMPLIED[] = { - ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; -#ifdef XML_DTD -static const char KW_INCLUDE[] = { - ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; -#endif -static const char KW_NDATA[] = { - ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_NMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; -static const char KW_NMTOKENS[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, - '\0' }; -static const char KW_NOTATION[] = - { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, - '\0' }; -static const char KW_PCDATA[] = { - ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_PUBLIC[] = { - ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; -static const char KW_REQUIRED[] = { - ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, - '\0' }; -static const char KW_SYSTEM[] = { - ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; - -#ifndef MIN_BYTES_PER_CHAR -#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) -#endif - -#ifdef XML_DTD -#define setTopLevel(state) \ - ((state)->handler = ((state)->documentEntity \ - ? internalSubset \ - : externalSubset1)) -#else /* not XML_DTD */ -#define setTopLevel(state) ((state)->handler = internalSubset) -#endif /* not XML_DTD */ - -typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc); - -static PROLOG_HANDLER - prolog0, prolog1, prolog2, - doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, - internalSubset, - entity0, entity1, entity2, entity3, entity4, entity5, entity6, - entity7, entity8, entity9, entity10, - notation0, notation1, notation2, notation3, notation4, - attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, - attlist7, attlist8, attlist9, - element0, element1, element2, element3, element4, element5, element6, - element7, -#ifdef XML_DTD - externalSubset0, externalSubset1, - condSect0, condSect1, condSect2, -#endif /* XML_DTD */ - declClose, - error; - -static int FASTCALL common(PROLOG_STATE *state, int tok); - -static int PTRCALL -prolog0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - state->handler = prolog1; - return XML_ROLE_NONE; - case XML_TOK_XML_DECL: - state->handler = prolog1; - return XML_ROLE_XML_DECL; - case XML_TOK_PI: - state->handler = prolog1; - return XML_ROLE_PI; - case XML_TOK_COMMENT: - state->handler = prolog1; - return XML_ROLE_COMMENT; - case XML_TOK_BOM: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) - break; - state->handler = doctype0; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -prolog1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_BOM: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) - break; - state->handler = doctype0; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -prolog2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -doctype0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = doctype1; - return XML_ROLE_DOCTYPE_NAME; - } - return common(state, tok); -} - -static int PTRCALL -doctype1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = internalSubset; - return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = doctype3; - return XML_ROLE_DOCTYPE_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = doctype2; - return XML_ROLE_DOCTYPE_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -doctype2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_LITERAL: - state->handler = doctype3; - return XML_ROLE_DOCTYPE_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -doctype3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_LITERAL: - state->handler = doctype4; - return XML_ROLE_DOCTYPE_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -doctype4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = internalSubset; - return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - } - return common(state, tok); -} - -static int PTRCALL -doctype5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - } - return common(state, tok); -} - -static int PTRCALL -internalSubset(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ENTITY)) { - state->handler = entity0; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ATTLIST)) { - state->handler = attlist0; - return XML_ROLE_ATTLIST_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ELEMENT)) { - state->handler = element0; - return XML_ROLE_ELEMENT_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_NOTATION)) { - state->handler = notation0; - return XML_ROLE_NOTATION_NONE; - } - break; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_PARAM_ENTITY_REF: - return XML_ROLE_PARAM_ENTITY_REF; - case XML_TOK_CLOSE_BRACKET: - state->handler = doctype5; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_NONE: - return XML_ROLE_NONE; - } - return common(state, tok); -} - -#ifdef XML_DTD - -static int PTRCALL -externalSubset0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - state->handler = externalSubset1; - if (tok == XML_TOK_XML_DECL) - return XML_ROLE_TEXT_DECL; - return externalSubset1(state, tok, ptr, end, enc); -} - -static int PTRCALL -externalSubset1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_COND_SECT_OPEN: - state->handler = condSect0; - return XML_ROLE_NONE; - case XML_TOK_COND_SECT_CLOSE: - if (state->includeLevel == 0) - break; - state->includeLevel -= 1; - return XML_ROLE_NONE; - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_CLOSE_BRACKET: - break; - case XML_TOK_NONE: - if (state->includeLevel) - break; - return XML_ROLE_NONE; - default: - return internalSubset(state, tok, ptr, end, enc); - } - return common(state, tok); -} - -#endif /* XML_DTD */ - -static int PTRCALL -entity0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_PERCENT: - state->handler = entity1; - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = entity2; - return XML_ROLE_GENERAL_ENTITY_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = entity7; - return XML_ROLE_PARAM_ENTITY_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = entity4; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = entity3; - return XML_ROLE_ENTITY_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -entity3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity4; - return XML_ROLE_ENTITY_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity5; - return XML_ROLE_ENTITY_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ENTITY_COMPLETE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { - state->handler = entity6; - return XML_ROLE_ENTITY_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -entity6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_NOTATION_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = entity9; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = entity8; - return XML_ROLE_ENTITY_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -entity8(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity9; - return XML_ROLE_ENTITY_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity9(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity10; - return XML_ROLE_ENTITY_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity10(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ENTITY_COMPLETE; - } - return common(state, tok); -} - -static int PTRCALL -notation0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_NAME: - state->handler = notation1; - return XML_ROLE_NOTATION_NAME; - } - return common(state, tok); -} - -static int PTRCALL -notation1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = notation3; - return XML_ROLE_NOTATION_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = notation2; - return XML_ROLE_NOTATION_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -notation2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = notation4; - return XML_ROLE_NOTATION_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -notation3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_NOTATION_NONE; - return XML_ROLE_NOTATION_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -notation4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_NOTATION_NONE; - return XML_ROLE_NOTATION_SYSTEM_ID; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_NOTATION_NO_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -attlist0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist1; - return XML_ROLE_ATTLIST_ELEMENT_NAME; - } - return common(state, tok); -} - -static int PTRCALL -attlist1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist2; - return XML_ROLE_ATTRIBUTE_NAME; - } - return common(state, tok); -} - -static int PTRCALL -attlist2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - { - static const char * const types[] = { - KW_CDATA, - KW_ID, - KW_IDREF, - KW_IDREFS, - KW_ENTITY, - KW_ENTITIES, - KW_NMTOKEN, - KW_NMTOKENS, - }; - int i; - for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) - if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { - state->handler = attlist8; - return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; - } - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { - state->handler = attlist5; - return XML_ROLE_ATTLIST_NONE; - } - break; - case XML_TOK_OPEN_PAREN: - state->handler = attlist3; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NMTOKEN: - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist4; - return XML_ROLE_ATTRIBUTE_ENUM_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = attlist8; - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OR: - state->handler = attlist3; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OPEN_PAREN: - state->handler = attlist6; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - state->handler = attlist7; - return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = attlist8; - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OR: - state->handler = attlist6; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -/* default value */ -static int PTRCALL -attlist8(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_IMPLIED)) { - state->handler = attlist1; - return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; - } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_REQUIRED)) { - state->handler = attlist1; - return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; - } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_FIXED)) { - state->handler = attlist9; - return XML_ROLE_ATTLIST_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = attlist1; - return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist9(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_LITERAL: - state->handler = attlist1; - return XML_ROLE_FIXED_ATTRIBUTE_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -element0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element1; - return XML_ROLE_ELEMENT_NAME; - } - return common(state, tok); -} - -static int PTRCALL -element1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_CONTENT_EMPTY; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_CONTENT_ANY; - } - break; - case XML_TOK_OPEN_PAREN: - state->handler = element2; - state->level = 1; - return XML_ROLE_GROUP_OPEN; - } - return common(state, tok); -} - -static int PTRCALL -element2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_PCDATA)) { - state->handler = element3; - return XML_ROLE_CONTENT_PCDATA; - } - break; - case XML_TOK_OPEN_PAREN: - state->level = 2; - state->handler = element6; - return XML_ROLE_GROUP_OPEN; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT; - case XML_TOK_NAME_QUESTION: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_OPT; - case XML_TOK_NAME_ASTERISK: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_REP; - case XML_TOK_NAME_PLUS: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_PLUS; - } - return common(state, tok); -} - -static int PTRCALL -element3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_OR: - state->handler = element4; - return XML_ROLE_ELEMENT_NONE; - } - return common(state, tok); -} - -static int PTRCALL -element4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element5; - return XML_ROLE_CONTENT_ELEMENT; - } - return common(state, tok); -} - -static int PTRCALL -element5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_OR: - state->handler = element4; - return XML_ROLE_ELEMENT_NONE; - } - return common(state, tok); -} - -static int PTRCALL -element6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_OPEN_PAREN: - state->level += 1; - return XML_ROLE_GROUP_OPEN; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT; - case XML_TOK_NAME_QUESTION: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_OPT; - case XML_TOK_NAME_ASTERISK: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_REP; - case XML_TOK_NAME_PLUS: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_PLUS; - } - return common(state, tok); -} - -static int PTRCALL -element7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_CLOSE_PAREN_QUESTION: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_OPT; - case XML_TOK_CLOSE_PAREN_PLUS: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_PLUS; - case XML_TOK_COMMA: - state->handler = element6; - return XML_ROLE_GROUP_SEQUENCE; - case XML_TOK_OR: - state->handler = element6; - return XML_ROLE_GROUP_CHOICE; - } - return common(state, tok); -} - -#ifdef XML_DTD - -static int PTRCALL -condSect0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { - state->handler = condSect1; - return XML_ROLE_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { - state->handler = condSect2; - return XML_ROLE_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -condSect1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = externalSubset1; - state->includeLevel += 1; - return XML_ROLE_NONE; - } - return common(state, tok); -} - -static int PTRCALL -condSect2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = externalSubset1; - return XML_ROLE_IGNORE_SECT; - } - return common(state, tok); -} - -#endif /* XML_DTD */ - -static int PTRCALL -declClose(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return state->role_none; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return state->role_none; - } - return common(state, tok); -} - -static int PTRCALL -error(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - return XML_ROLE_NONE; -} - -static int FASTCALL -common(PROLOG_STATE *state, int tok) -{ -#ifdef XML_DTD - if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) - return XML_ROLE_INNER_PARAM_ENTITY_REF; -#endif - state->handler = error; - return XML_ROLE_ERROR; -} - -void -XmlPrologStateInit(PROLOG_STATE *state) -{ - state->handler = prolog0; -#ifdef XML_DTD - state->documentEntity = 1; - state->includeLevel = 0; - state->inEntityValue = 0; -#endif /* XML_DTD */ -} - -#ifdef XML_DTD - -void -XmlPrologStateInitExternalEntity(PROLOG_STATE *state) -{ - state->handler = externalSubset0; - state->documentEntity = 0; - state->includeLevel = 0; -} - -#endif /* XML_DTD */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h deleted file mode 100644 index 4dd9f06f..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmlrole.h +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef XmlRole_INCLUDED -#define XmlRole_INCLUDED 1 - -#ifdef __VMS -/* 0 1 2 3 0 1 2 3 - 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt -#endif - -#include "xmltok.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - XML_ROLE_ERROR = -1, - XML_ROLE_NONE = 0, - XML_ROLE_XML_DECL, - XML_ROLE_INSTANCE_START, - XML_ROLE_DOCTYPE_NONE, - XML_ROLE_DOCTYPE_NAME, - XML_ROLE_DOCTYPE_SYSTEM_ID, - XML_ROLE_DOCTYPE_PUBLIC_ID, - XML_ROLE_DOCTYPE_INTERNAL_SUBSET, - XML_ROLE_DOCTYPE_CLOSE, - XML_ROLE_GENERAL_ENTITY_NAME, - XML_ROLE_PARAM_ENTITY_NAME, - XML_ROLE_ENTITY_NONE, - XML_ROLE_ENTITY_VALUE, - XML_ROLE_ENTITY_SYSTEM_ID, - XML_ROLE_ENTITY_PUBLIC_ID, - XML_ROLE_ENTITY_COMPLETE, - XML_ROLE_ENTITY_NOTATION_NAME, - XML_ROLE_NOTATION_NONE, - XML_ROLE_NOTATION_NAME, - XML_ROLE_NOTATION_SYSTEM_ID, - XML_ROLE_NOTATION_NO_SYSTEM_ID, - XML_ROLE_NOTATION_PUBLIC_ID, - XML_ROLE_ATTRIBUTE_NAME, - XML_ROLE_ATTRIBUTE_TYPE_CDATA, - XML_ROLE_ATTRIBUTE_TYPE_ID, - XML_ROLE_ATTRIBUTE_TYPE_IDREF, - XML_ROLE_ATTRIBUTE_TYPE_IDREFS, - XML_ROLE_ATTRIBUTE_TYPE_ENTITY, - XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, - XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, - XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, - XML_ROLE_ATTRIBUTE_ENUM_VALUE, - XML_ROLE_ATTRIBUTE_NOTATION_VALUE, - XML_ROLE_ATTLIST_NONE, - XML_ROLE_ATTLIST_ELEMENT_NAME, - XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, - XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, - XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, - XML_ROLE_FIXED_ATTRIBUTE_VALUE, - XML_ROLE_ELEMENT_NONE, - XML_ROLE_ELEMENT_NAME, - XML_ROLE_CONTENT_ANY, - XML_ROLE_CONTENT_EMPTY, - XML_ROLE_CONTENT_PCDATA, - XML_ROLE_GROUP_OPEN, - XML_ROLE_GROUP_CLOSE, - XML_ROLE_GROUP_CLOSE_REP, - XML_ROLE_GROUP_CLOSE_OPT, - XML_ROLE_GROUP_CLOSE_PLUS, - XML_ROLE_GROUP_CHOICE, - XML_ROLE_GROUP_SEQUENCE, - XML_ROLE_CONTENT_ELEMENT, - XML_ROLE_CONTENT_ELEMENT_REP, - XML_ROLE_CONTENT_ELEMENT_OPT, - XML_ROLE_CONTENT_ELEMENT_PLUS, - XML_ROLE_PI, - XML_ROLE_COMMENT, -#ifdef XML_DTD - XML_ROLE_TEXT_DECL, - XML_ROLE_IGNORE_SECT, - XML_ROLE_INNER_PARAM_ENTITY_REF, -#endif /* XML_DTD */ - XML_ROLE_PARAM_ENTITY_REF -}; - -typedef struct prolog_state { - int (PTRCALL *handler) (struct prolog_state *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc); - unsigned level; - int role_none; -#ifdef XML_DTD - unsigned includeLevel; - int documentEntity; - int inEntityValue; -#endif /* XML_DTD */ -} PROLOG_STATE; - -void XmlPrologStateInit(PROLOG_STATE *); -#ifdef XML_DTD -void XmlPrologStateInitExternalEntity(PROLOG_STATE *); -#endif /* XML_DTD */ - -#define XmlTokenRole(state, tok, ptr, end, enc) \ - (((state)->handler)(state, tok, ptr, end, enc)) - -#ifdef __cplusplus -} -#endif - -#endif /* not XmlRole_INCLUDED */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.c deleted file mode 100644 index bf09dfc7..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.c +++ /dev/null @@ -1,1651 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <stddef.h> - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#else -#ifdef HAVE_EXPAT_CONFIG_H -#include <expat_config.h> -#endif -#endif /* ndef COMPILED_FROM_DSP */ - -#include "expat_external.h" -#include "internal.h" -#include "xmltok.h" -#include "nametab.h" - -#ifdef XML_DTD -#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) -#else -#define IGNORE_SECTION_TOK_VTABLE /* as nothing */ -#endif - -#define VTABLE1 \ - { PREFIX(prologTok), PREFIX(contentTok), \ - PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ - { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ - PREFIX(sameName), \ - PREFIX(nameMatchesAscii), \ - PREFIX(nameLength), \ - PREFIX(skipS), \ - PREFIX(getAtts), \ - PREFIX(charRefNumber), \ - PREFIX(predefinedEntityName), \ - PREFIX(updatePosition), \ - PREFIX(isPublicId) - -#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) - -#define UCS2_GET_NAMING(pages, hi, lo) \ - (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) - -/* A 2 byte UTF-8 representation splits the characters 11 bits between - the bottom 5 and 6 bits of the bytes. We need 8 bits to index into - pages, 3 bits to add to that index and 5 bits to generate the mask. -*/ -#define UTF8_GET_NAMING2(pages, byte) \ - (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ - + ((((byte)[0]) & 3) << 1) \ - + ((((byte)[1]) >> 5) & 1)] \ - & (1 << (((byte)[1]) & 0x1F))) - -/* A 3 byte UTF-8 representation splits the characters 16 bits between - the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index - into pages, 3 bits to add to that index and 5 bits to generate the - mask. -*/ -#define UTF8_GET_NAMING3(pages, byte) \ - (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ - + ((((byte)[1]) >> 2) & 0xF)] \ - << 3) \ - + ((((byte)[1]) & 3) << 1) \ - + ((((byte)[2]) >> 5) & 1)] \ - & (1 << (((byte)[2]) & 0x1F))) - -#define UTF8_GET_NAMING(pages, p, n) \ - ((n) == 2 \ - ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ - : ((n) == 3 \ - ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ - : 0)) - -/* Detection of invalid UTF-8 sequences is based on Table 3.1B - of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ - with the additional restriction of not allowing the Unicode - code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). - Implementation details: - (A & 0x80) == 0 means A < 0x80 - and - (A & 0xC0) == 0xC0 means A > 0xBF -*/ - -#define UTF8_INVALID2(p) \ - ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0) - -#define UTF8_INVALID3(p) \ - (((p)[2] & 0x80) == 0 \ - || \ - ((*p) == 0xEF && (p)[1] == 0xBF \ - ? \ - (p)[2] > 0xBD \ - : \ - ((p)[2] & 0xC0) == 0xC0) \ - || \ - ((*p) == 0xE0 \ - ? \ - (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) - -#define UTF8_INVALID4(p) \ - (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \ - || \ - ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \ - || \ - ((*p) == 0xF0 \ - ? \ - (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) - -static int PTRFASTCALL -isNever(const ENCODING *enc, const char *p) -{ - return 0; -} - -static int PTRFASTCALL -utf8_isName2(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isName3(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); -} - -#define utf8_isName4 isNever - -static int PTRFASTCALL -utf8_isNmstrt2(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isNmstrt3(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); -} - -#define utf8_isNmstrt4 isNever - -static int PTRFASTCALL -utf8_isInvalid2(const ENCODING *enc, const char *p) -{ - return UTF8_INVALID2((const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isInvalid3(const ENCODING *enc, const char *p) -{ - return UTF8_INVALID3((const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isInvalid4(const ENCODING *enc, const char *p) -{ - return UTF8_INVALID4((const unsigned char *)p); -} - -struct normal_encoding { - ENCODING enc; - unsigned char type[256]; -#ifdef XML_MIN_SIZE - int (PTRFASTCALL *byteType)(const ENCODING *, const char *); - int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); - int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); - int (PTRCALL *charMatches)(const ENCODING *, const char *, int); -#endif /* XML_MIN_SIZE */ - int (PTRFASTCALL *isName2)(const ENCODING *, const char *); - int (PTRFASTCALL *isName3)(const ENCODING *, const char *); - int (PTRFASTCALL *isName4)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); -}; - -#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc)) - -#ifdef XML_MIN_SIZE - -#define STANDARD_VTABLE(E) \ - E ## byteType, \ - E ## isNameMin, \ - E ## isNmstrtMin, \ - E ## byteToAscii, \ - E ## charMatches, - -#else - -#define STANDARD_VTABLE(E) /* as nothing */ - -#endif - -#define NORMAL_VTABLE(E) \ - E ## isName2, \ - E ## isName3, \ - E ## isName4, \ - E ## isNmstrt2, \ - E ## isNmstrt3, \ - E ## isNmstrt4, \ - E ## isInvalid2, \ - E ## isInvalid3, \ - E ## isInvalid4 - -static int FASTCALL checkCharRefNumber(int); - -#include "xmltok_impl.h" -#include "ascii.h" - -#ifdef XML_MIN_SIZE -#define sb_isNameMin isNever -#define sb_isNmstrtMin isNever -#endif - -#ifdef XML_MIN_SIZE -#define MINBPC(enc) ((enc)->minBytesPerChar) -#else -/* minimum bytes per character */ -#define MINBPC(enc) 1 -#endif - -#define SB_BYTE_TYPE(enc, p) \ - (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) - -#ifdef XML_MIN_SIZE -static int PTRFASTCALL -sb_byteType(const ENCODING *enc, const char *p) -{ - return SB_BYTE_TYPE(enc, p); -} -#define BYTE_TYPE(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) -#else -#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) -#endif - -#ifdef XML_MIN_SIZE -#define BYTE_TO_ASCII(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) -static int PTRFASTCALL -sb_byteToAscii(const ENCODING *enc, const char *p) -{ - return *p; -} -#else -#define BYTE_TO_ASCII(enc, p) (*(p)) -#endif - -#define IS_NAME_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p)) -#define IS_NMSTRT_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p)) -#define IS_INVALID_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p)) - -#ifdef XML_MIN_SIZE -#define IS_NAME_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) -#else -#define IS_NAME_CHAR_MINBPC(enc, p) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) -#endif - -#ifdef XML_MIN_SIZE -#define CHAR_MATCHES(enc, p, c) \ - (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) -static int PTRCALL -sb_charMatches(const ENCODING *enc, const char *p, int c) -{ - return *p == c; -} -#else -/* c is an ASCII character */ -#define CHAR_MATCHES(enc, p, c) (*(p) == c) -#endif - -#define PREFIX(ident) normal_ ## ident -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ - UTF8_cval1 = 0x00, - UTF8_cval2 = 0xc0, - UTF8_cval3 = 0xe0, - UTF8_cval4 = 0xf0 -}; - -static void PTRCALL -utf8_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - char *to; - const char *from; - if (fromLim - *fromP > toLim - *toP) { - /* Avoid copying partial characters. */ - for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) - if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) - break; - } - for (to = *toP, from = *fromP; from != fromLim; from++, to++) - *to = *from; - *fromP = from; - *toP = to; -} - -static void PTRCALL -utf8_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - unsigned short *to = *toP; - const char *from = *fromP; - while (from != fromLim && to != toLim) { - switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { - case BT_LEAD2: - *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); - from += 2; - break; - case BT_LEAD3: - *to++ = (unsigned short)(((from[0] & 0xf) << 12) - | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); - from += 3; - break; - case BT_LEAD4: - { - unsigned long n; - if (to + 1 == toLim) - goto after; - n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) - | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); - n -= 0x10000; - to[0] = (unsigned short)((n >> 10) | 0xD800); - to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); - to += 2; - from += 4; - } - break; - default: - *to++ = *from++; - break; - } - } -after: - *fromP = from; - *toP = to; -} - -#ifdef XML_NS -static const struct normal_encoding utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include "asciitab.h" -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; -#endif - -static const struct normal_encoding utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -#ifdef XML_NS - -static const struct normal_encoding internal_utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include "iasciitab.h" -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -#endif - -static const struct normal_encoding internal_utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -static void PTRCALL -latin1_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - for (;;) { - unsigned char c; - if (*fromP == fromLim) - break; - c = (unsigned char)**fromP; - if (c & 0x80) { - if (toLim - *toP < 2) - break; - *(*toP)++ = (char)((c >> 6) | UTF8_cval2); - *(*toP)++ = (char)((c & 0x3f) | 0x80); - (*fromP)++; - } - else { - if (*toP == toLim) - break; - *(*toP)++ = *(*fromP)++; - } - } -} - -static void PTRCALL -latin1_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - while (*fromP != fromLim && *toP != toLim) - *(*toP)++ = (unsigned char)*(*fromP)++; -} - -#ifdef XML_NS - -static const struct normal_encoding latin1_encoding_ns = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(sb_) -}; - -#endif - -static const struct normal_encoding latin1_encoding = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(sb_) -}; - -static void PTRCALL -ascii_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - while (*fromP != fromLim && *toP != toLim) - *(*toP)++ = *(*fromP)++; -} - -#ifdef XML_NS - -static const struct normal_encoding ascii_encoding_ns = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { -#include "asciitab.h" -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) -}; - -#endif - -static const struct normal_encoding ascii_encoding = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) -}; - -static int PTRFASTCALL -unicode_byte_type(char hi, char lo) -{ - switch ((unsigned char)hi) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: - return BT_LEAD4; - case 0xDC: case 0xDD: case 0xDE: case 0xDF: - return BT_TRAIL; - case 0xFF: - switch ((unsigned char)lo) { - case 0xFF: - case 0xFE: - return BT_NONXML; - } - break; - } - return BT_NONASCII; -} - -#define DEFINE_UTF16_TO_UTF8(E) \ -static void PTRCALL \ -E ## toUtf8(const ENCODING *enc, \ - const char **fromP, const char *fromLim, \ - char **toP, const char *toLim) \ -{ \ - const char *from; \ - for (from = *fromP; from != fromLim; from += 2) { \ - int plane; \ - unsigned char lo2; \ - unsigned char lo = GET_LO(from); \ - unsigned char hi = GET_HI(from); \ - switch (hi) { \ - case 0: \ - if (lo < 0x80) { \ - if (*toP == toLim) { \ - *fromP = from; \ - return; \ - } \ - *(*toP)++ = lo; \ - break; \ - } \ - /* fall through */ \ - case 0x1: case 0x2: case 0x3: \ - case 0x4: case 0x5: case 0x6: case 0x7: \ - if (toLim - *toP < 2) { \ - *fromP = from; \ - return; \ - } \ - *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - default: \ - if (toLim - *toP < 3) { \ - *fromP = from; \ - return; \ - } \ - /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ - *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ - *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ - if (toLim - *toP < 4) { \ - *fromP = from; \ - return; \ - } \ - plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ - *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ - *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ - from += 2; \ - lo2 = GET_LO(from); \ - *(*toP)++ = (((lo & 0x3) << 4) \ - | ((GET_HI(from) & 0x3) << 2) \ - | (lo2 >> 6) \ - | 0x80); \ - *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ - break; \ - } \ - } \ - *fromP = from; \ -} - -#define DEFINE_UTF16_TO_UTF16(E) \ -static void PTRCALL \ -E ## toUtf16(const ENCODING *enc, \ - const char **fromP, const char *fromLim, \ - unsigned short **toP, const unsigned short *toLim) \ -{ \ - /* Avoid copying first half only of surrogate */ \ - if (fromLim - *fromP > ((toLim - *toP) << 1) \ - && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ - fromLim -= 2; \ - for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ - *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ -} - -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) -#define GET_LO(ptr) ((unsigned char)(ptr)[0]) -#define GET_HI(ptr) ((unsigned char)(ptr)[1]) - -DEFINE_UTF16_TO_UTF8(little2_) -DEFINE_UTF16_TO_UTF16(little2_) - -#undef SET2 -#undef GET_LO -#undef GET_HI - -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) -#define GET_LO(ptr) ((unsigned char)(ptr)[1]) -#define GET_HI(ptr) ((unsigned char)(ptr)[0]) - -DEFINE_UTF16_TO_UTF8(big2_) -DEFINE_UTF16_TO_UTF16(big2_) - -#undef SET2 -#undef GET_LO -#undef GET_HI - -#define LITTLE2_BYTE_TYPE(enc, p) \ - ((p)[1] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ - : unicode_byte_type((p)[1], (p)[0])) -#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) -#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) -#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) -#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) - -#ifdef XML_MIN_SIZE - -static int PTRFASTCALL -little2_byteType(const ENCODING *enc, const char *p) -{ - return LITTLE2_BYTE_TYPE(enc, p); -} - -static int PTRFASTCALL -little2_byteToAscii(const ENCODING *enc, const char *p) -{ - return LITTLE2_BYTE_TO_ASCII(enc, p); -} - -static int PTRCALL -little2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return LITTLE2_CHAR_MATCHES(enc, p, c); -} - -static int PTRFASTCALL -little2_isNameMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); -} - -static int PTRFASTCALL -little2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); -} - -#undef VTABLE -#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 - -#else /* not XML_MIN_SIZE */ - -#undef PREFIX -#define PREFIX(ident) little2_ ## ident -#define MINBPC(enc) 2 -/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -#endif /* not XML_MIN_SIZE */ - -#ifdef XML_NS - -static const struct normal_encoding little2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 1234 - 1 -#else - 0 -#endif - }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#endif - -static const struct normal_encoding little2_encoding = { - { VTABLE, 2, 0, -#if BYTEORDER == 1234 - 1 -#else - 0 -#endif - }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#if BYTEORDER != 4321 - -#ifdef XML_NS - -static const struct normal_encoding internal_little2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include "iasciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#endif - -static const struct normal_encoding internal_little2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#endif - - -#define BIG2_BYTE_TYPE(enc, p) \ - ((p)[0] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ - : unicode_byte_type((p)[0], (p)[1])) -#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) -#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) -#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) -#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) - -#ifdef XML_MIN_SIZE - -static int PTRFASTCALL -big2_byteType(const ENCODING *enc, const char *p) -{ - return BIG2_BYTE_TYPE(enc, p); -} - -static int PTRFASTCALL -big2_byteToAscii(const ENCODING *enc, const char *p) -{ - return BIG2_BYTE_TO_ASCII(enc, p); -} - -static int PTRCALL -big2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return BIG2_CHAR_MATCHES(enc, p, c); -} - -static int PTRFASTCALL -big2_isNameMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NAME_CHAR_MINBPC(enc, p); -} - -static int PTRFASTCALL -big2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); -} - -#undef VTABLE -#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 - -#else /* not XML_MIN_SIZE */ - -#undef PREFIX -#define PREFIX(ident) big2_ ## ident -#define MINBPC(enc) 2 -/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -#endif /* not XML_MIN_SIZE */ - -#ifdef XML_NS - -static const struct normal_encoding big2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 4321 - 1 -#else - 0 -#endif - }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#endif - -static const struct normal_encoding big2_encoding = { - { VTABLE, 2, 0, -#if BYTEORDER == 4321 - 1 -#else - 0 -#endif - }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#if BYTEORDER != 1234 - -#ifdef XML_NS - -static const struct normal_encoding internal_big2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include "iasciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#endif - -static const struct normal_encoding internal_big2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#endif - -#undef PREFIX - -static int FASTCALL -streqci(const char *s1, const char *s2) -{ - for (;;) { - char c1 = *s1++; - char c2 = *s2++; - if (ASCII_a <= c1 && c1 <= ASCII_z) - c1 += ASCII_A - ASCII_a; - if (ASCII_a <= c2 && c2 <= ASCII_z) - c2 += ASCII_A - ASCII_a; - if (c1 != c2) - return 0; - if (!c1) - break; - } - return 1; -} - -static void PTRCALL -initUpdatePosition(const ENCODING *enc, const char *ptr, - const char *end, POSITION *pos) -{ - normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); -} - -static int -toAscii(const ENCODING *enc, const char *ptr, const char *end) -{ - char buf[1]; - char *p = buf; - XmlUtf8Convert(enc, &ptr, end, &p, p + 1); - if (p == buf) - return -1; - else - return buf[0]; -} - -static int FASTCALL -isSpace(int c) -{ - switch (c) { - case 0x20: - case 0xD: - case 0xA: - case 0x9: - return 1; - } - return 0; -} - -/* Return 1 if there's just optional white space or there's an S - followed by name=val. -*/ -static int -parsePseudoAttribute(const ENCODING *enc, - const char *ptr, - const char *end, - const char **namePtr, - const char **nameEndPtr, - const char **valPtr, - const char **nextTokPtr) -{ - int c; - char open; - if (ptr == end) { - *namePtr = NULL; - return 1; - } - if (!isSpace(toAscii(enc, ptr, end))) { - *nextTokPtr = ptr; - return 0; - } - do { - ptr += enc->minBytesPerChar; - } while (isSpace(toAscii(enc, ptr, end))); - if (ptr == end) { - *namePtr = NULL; - return 1; - } - *namePtr = ptr; - for (;;) { - c = toAscii(enc, ptr, end); - if (c == -1) { - *nextTokPtr = ptr; - return 0; - } - if (c == ASCII_EQUALS) { - *nameEndPtr = ptr; - break; - } - if (isSpace(c)) { - *nameEndPtr = ptr; - do { - ptr += enc->minBytesPerChar; - } while (isSpace(c = toAscii(enc, ptr, end))); - if (c != ASCII_EQUALS) { - *nextTokPtr = ptr; - return 0; - } - break; - } - ptr += enc->minBytesPerChar; - } - if (ptr == *namePtr) { - *nextTokPtr = ptr; - return 0; - } - ptr += enc->minBytesPerChar; - c = toAscii(enc, ptr, end); - while (isSpace(c)) { - ptr += enc->minBytesPerChar; - c = toAscii(enc, ptr, end); - } - if (c != ASCII_QUOT && c != ASCII_APOS) { - *nextTokPtr = ptr; - return 0; - } - open = (char)c; - ptr += enc->minBytesPerChar; - *valPtr = ptr; - for (;; ptr += enc->minBytesPerChar) { - c = toAscii(enc, ptr, end); - if (c == open) - break; - if (!(ASCII_a <= c && c <= ASCII_z) - && !(ASCII_A <= c && c <= ASCII_Z) - && !(ASCII_0 <= c && c <= ASCII_9) - && c != ASCII_PERIOD - && c != ASCII_MINUS - && c != ASCII_UNDERSCORE) { - *nextTokPtr = ptr; - return 0; - } - } - *nextTokPtr = ptr + enc->minBytesPerChar; - return 1; -} - -static const char KW_version[] = { - ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' -}; - -static const char KW_encoding[] = { - ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' -}; - -static const char KW_standalone[] = { - ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, - ASCII_n, ASCII_e, '\0' -}; - -static const char KW_yes[] = { - ASCII_y, ASCII_e, ASCII_s, '\0' -}; - -static const char KW_no[] = { - ASCII_n, ASCII_o, '\0' -}; - -static int -doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, - const char *, - const char *), - int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ - const char *val = NULL; - const char *name = NULL; - const char *nameEnd = NULL; - ptr += 5 * enc->minBytesPerChar; - end -= 2 * enc->minBytesPerChar; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) - || !name) { - *badPtr = ptr; - return 0; - } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { - if (!isGeneralTextEntity) { - *badPtr = name; - return 0; - } - } - else { - if (versionPtr) - *versionPtr = val; - if (versionEndPtr) - *versionEndPtr = ptr; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { - *badPtr = ptr; - return 0; - } - if (!name) { - if (isGeneralTextEntity) { - /* a TextDecl must have an EncodingDecl */ - *badPtr = ptr; - return 0; - } - return 1; - } - } - if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { - int c = toAscii(enc, val, end); - if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { - *badPtr = val; - return 0; - } - if (encodingName) - *encodingName = val; - if (encoding) - *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { - *badPtr = ptr; - return 0; - } - if (!name) - return 1; - } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) - || isGeneralTextEntity) { - *badPtr = name; - return 0; - } - if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { - if (standalone) - *standalone = 1; - } - else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { - if (standalone) - *standalone = 0; - } - else { - *badPtr = val; - return 0; - } - while (isSpace(toAscii(enc, ptr, end))) - ptr += enc->minBytesPerChar; - if (ptr != end) { - *badPtr = ptr; - return 0; - } - return 1; -} - -static int FASTCALL -checkCharRefNumber(int result) -{ - switch (result >> 8) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: - case 0xDC: case 0xDD: case 0xDE: case 0xDF: - return -1; - case 0: - if (latin1_encoding.type[result] == BT_NONXML) - return -1; - break; - case 0xFF: - if (result == 0xFFFE || result == 0xFFFF) - return -1; - break; - } - return result; -} - -int FASTCALL -XmlUtf8Encode(int c, char *buf) -{ - enum { - /* minN is minimum legal resulting value for N byte sequence */ - min2 = 0x80, - min3 = 0x800, - min4 = 0x10000 - }; - - if (c < 0) - return 0; - if (c < min2) { - buf[0] = (char)(c | UTF8_cval1); - return 1; - } - if (c < min3) { - buf[0] = (char)((c >> 6) | UTF8_cval2); - buf[1] = (char)((c & 0x3f) | 0x80); - return 2; - } - if (c < min4) { - buf[0] = (char)((c >> 12) | UTF8_cval3); - buf[1] = (char)(((c >> 6) & 0x3f) | 0x80); - buf[2] = (char)((c & 0x3f) | 0x80); - return 3; - } - if (c < 0x110000) { - buf[0] = (char)((c >> 18) | UTF8_cval4); - buf[1] = (char)(((c >> 12) & 0x3f) | 0x80); - buf[2] = (char)(((c >> 6) & 0x3f) | 0x80); - buf[3] = (char)((c & 0x3f) | 0x80); - return 4; - } - return 0; -} - -int FASTCALL -XmlUtf16Encode(int charNum, unsigned short *buf) -{ - if (charNum < 0) - return 0; - if (charNum < 0x10000) { - buf[0] = (unsigned short)charNum; - return 1; - } - if (charNum < 0x110000) { - charNum -= 0x10000; - buf[0] = (unsigned short)((charNum >> 10) + 0xD800); - buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00); - return 2; - } - return 0; -} - -struct unknown_encoding { - struct normal_encoding normal; - CONVERTER convert; - void *userData; - unsigned short utf16[256]; - char utf8[256][4]; -}; - -#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc)) - -int -XmlSizeOfUnknownEncoding(void) -{ - return sizeof(struct unknown_encoding); -} - -static int PTRFASTCALL -unknown_isName(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - if (c & ~0xFFFF) - return 0; - return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); -} - -static int PTRFASTCALL -unknown_isNmstrt(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - if (c & ~0xFFFF) - return 0; - return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); -} - -static int PTRFASTCALL -unknown_isInvalid(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; -} - -static void PTRCALL -unknown_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - char buf[XML_UTF8_ENCODE_MAX]; - for (;;) { - const char *utf8; - int n; - if (*fromP == fromLim) - break; - utf8 = uenc->utf8[(unsigned char)**fromP]; - n = *utf8++; - if (n == 0) { - int c = uenc->convert(uenc->userData, *fromP); - n = XmlUtf8Encode(c, buf); - if (n > toLim - *toP) - break; - utf8 = buf; - *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - - (BT_LEAD2 - 2)); - } - else { - if (n > toLim - *toP) - break; - (*fromP)++; - } - do { - *(*toP)++ = *utf8++; - } while (--n != 0); - } -} - -static void PTRCALL -unknown_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - while (*fromP != fromLim && *toP != toLim) { - unsigned short c = uenc->utf16[(unsigned char)**fromP]; - if (c == 0) { - c = (unsigned short) - uenc->convert(uenc->userData, *fromP); - *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - - (BT_LEAD2 - 2)); - } - else - (*fromP)++; - *(*toP)++ = c; - } -} - -ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ - int i; - struct unknown_encoding *e = (struct unknown_encoding *)mem; - for (i = 0; i < (int)sizeof(struct normal_encoding); i++) - ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; - for (i = 0; i < 128; i++) - if (latin1_encoding.type[i] != BT_OTHER - && latin1_encoding.type[i] != BT_NONXML - && table[i] != i) - return 0; - for (i = 0; i < 256; i++) { - int c = table[i]; - if (c == -1) { - e->normal.type[i] = BT_MALFORM; - /* This shouldn't really get used. */ - e->utf16[i] = 0xFFFF; - e->utf8[i][0] = 1; - e->utf8[i][1] = 0; - } - else if (c < 0) { - if (c < -4) - return 0; - e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2)); - e->utf8[i][0] = 0; - e->utf16[i] = 0; - } - else if (c < 0x80) { - if (latin1_encoding.type[c] != BT_OTHER - && latin1_encoding.type[c] != BT_NONXML - && c != i) - return 0; - e->normal.type[i] = latin1_encoding.type[c]; - e->utf8[i][0] = 1; - e->utf8[i][1] = (char)c; - e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c); - } - else if (checkCharRefNumber(c) < 0) { - e->normal.type[i] = BT_NONXML; - /* This shouldn't really get used. */ - e->utf16[i] = 0xFFFF; - e->utf8[i][0] = 1; - e->utf8[i][1] = 0; - } - else { - if (c > 0xFFFF) - return 0; - if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) - e->normal.type[i] = BT_NMSTRT; - else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) - e->normal.type[i] = BT_NAME; - else - e->normal.type[i] = BT_OTHER; - e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); - e->utf16[i] = (unsigned short)c; - } - } - e->userData = userData; - e->convert = convert; - if (convert) { - e->normal.isName2 = unknown_isName; - e->normal.isName3 = unknown_isName; - e->normal.isName4 = unknown_isName; - e->normal.isNmstrt2 = unknown_isNmstrt; - e->normal.isNmstrt3 = unknown_isNmstrt; - e->normal.isNmstrt4 = unknown_isNmstrt; - e->normal.isInvalid2 = unknown_isInvalid; - e->normal.isInvalid3 = unknown_isInvalid; - e->normal.isInvalid4 = unknown_isInvalid; - } - e->normal.enc.utf8Convert = unknown_toUtf8; - e->normal.enc.utf16Convert = unknown_toUtf16; - return &(e->normal.enc); -} - -/* If this enumeration is changed, getEncodingIndex and encodings -must also be changed. */ -enum { - UNKNOWN_ENC = -1, - ISO_8859_1_ENC = 0, - US_ASCII_ENC, - UTF_8_ENC, - UTF_16_ENC, - UTF_16BE_ENC, - UTF_16LE_ENC, - /* must match encodingNames up to here */ - NO_ENC -}; - -static const char KW_ISO_8859_1[] = { - ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, - ASCII_MINUS, ASCII_1, '\0' -}; -static const char KW_US_ASCII[] = { - ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, - '\0' -}; -static const char KW_UTF_8[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' -}; -static const char KW_UTF_16[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' -}; -static const char KW_UTF_16BE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, - '\0' -}; -static const char KW_UTF_16LE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, - '\0' -}; - -static int FASTCALL -getEncodingIndex(const char *name) -{ - static const char * const encodingNames[] = { - KW_ISO_8859_1, - KW_US_ASCII, - KW_UTF_8, - KW_UTF_16, - KW_UTF_16BE, - KW_UTF_16LE, - }; - int i; - if (name == NULL) - return NO_ENC; - for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) - if (streqci(name, encodingNames[i])) - return i; - return UNKNOWN_ENC; -} - -/* For binary compatibility, we store the index of the encoding - specified at initialization in the isUtf16 member. -*/ - -#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16) -#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i) - -/* This is what detects the encoding. encodingTable maps from - encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of - the external (protocol) specified encoding; state is - XML_CONTENT_STATE if we're parsing an external text entity, and - XML_PROLOG_STATE otherwise. -*/ - - -static int -initScan(const ENCODING * const *encodingTable, - const INIT_ENCODING *enc, - int state, - const char *ptr, - const char *end, - const char **nextTokPtr) -{ - const ENCODING **encPtr; - - if (ptr == end) - return XML_TOK_NONE; - encPtr = enc->encPtr; - if (ptr + 1 == end) { - /* only a single byte available for auto-detection */ -#ifndef XML_DTD /* FIXME */ - /* a well-formed document entity must have more than one byte */ - if (state != XML_CONTENT_STATE) - return XML_TOK_PARTIAL; -#endif - /* so we're parsing an external text entity... */ - /* if UTF-16 was externally specified, then we need at least 2 bytes */ - switch (INIT_ENC_INDEX(enc)) { - case UTF_16_ENC: - case UTF_16LE_ENC: - case UTF_16BE_ENC: - return XML_TOK_PARTIAL; - } - switch ((unsigned char)*ptr) { - case 0xFE: - case 0xFF: - case 0xEF: /* possibly first byte of UTF-8 BOM */ - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - /* fall through */ - case 0x00: - case 0x3C: - return XML_TOK_PARTIAL; - } - } - else { - switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { - case 0xFEFF: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - *nextTokPtr = ptr + 2; - *encPtr = encodingTable[UTF_16BE_ENC]; - return XML_TOK_BOM; - /* 00 3C is handled in the default case */ - case 0x3C00: - if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC - || INIT_ENC_INDEX(enc) == UTF_16_ENC) - && state == XML_CONTENT_STATE) - break; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - case 0xFFFE: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - *nextTokPtr = ptr + 2; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XML_TOK_BOM; - case 0xEFBB: - /* Maybe a UTF-8 BOM (EF BB BF) */ - /* If there's an explicitly specified (external) encoding - of ISO-8859-1 or some flavour of UTF-16 - and this is an external text entity, - don't look for the BOM, - because it might be a legal data. - */ - if (state == XML_CONTENT_STATE) { - int e = INIT_ENC_INDEX(enc); - if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC - || e == UTF_16LE_ENC || e == UTF_16_ENC) - break; - } - if (ptr + 2 == end) - return XML_TOK_PARTIAL; - if ((unsigned char)ptr[2] == 0xBF) { - *nextTokPtr = ptr + 3; - *encPtr = encodingTable[UTF_8_ENC]; - return XML_TOK_BOM; - } - break; - default: - if (ptr[0] == '\0') { - /* 0 isn't a legal data character. Furthermore a document - entity can only start with ASCII characters. So the only - way this can fail to be big-endian UTF-16 if it it's an - external parsed general entity that's labelled as - UTF-16LE. - */ - if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) - break; - *encPtr = encodingTable[UTF_16BE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - } - else if (ptr[1] == '\0') { - /* We could recover here in the case: - - parsing an external entity - - second byte is 0 - - no externally specified encoding - - no encoding declaration - by assuming UTF-16LE. But we don't, because this would mean when - presented just with a single byte, we couldn't reliably determine - whether we needed further bytes. - */ - if (state == XML_CONTENT_STATE) - break; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - } - break; - } - } - *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); -} - - -#define NS(x) x -#define ns(x) x -#define XML_TOK_NS_C -#include "xmltok_ns.c" -#undef XML_TOK_NS_C -#undef NS -#undef ns - -#ifdef XML_NS - -#define NS(x) x ## NS -#define ns(x) x ## _ns - -#define XML_TOK_NS_C -#include "xmltok_ns.c" -#undef XML_TOK_NS_C - -#undef NS -#undef ns - -ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ - ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); - if (enc) - ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; - return enc; -} - -#endif /* XML_NS */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.h deleted file mode 100644 index ca867aa6..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok.h +++ /dev/null @@ -1,316 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef XmlTok_INCLUDED -#define XmlTok_INCLUDED 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* The following token may be returned by XmlContentTok */ -#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be - start of illegal ]]> sequence */ -/* The following tokens may be returned by both XmlPrologTok and - XmlContentTok. -*/ -#define XML_TOK_NONE -4 /* The string to be scanned is empty */ -#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; - might be part of CRLF sequence */ -#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ -#define XML_TOK_PARTIAL -1 /* only part of a token */ -#define XML_TOK_INVALID 0 - -/* The following tokens are returned by XmlContentTok; some are also - returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok. -*/ -#define XML_TOK_START_TAG_WITH_ATTS 1 -#define XML_TOK_START_TAG_NO_ATTS 2 -#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag <e/> */ -#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 -#define XML_TOK_END_TAG 5 -#define XML_TOK_DATA_CHARS 6 -#define XML_TOK_DATA_NEWLINE 7 -#define XML_TOK_CDATA_SECT_OPEN 8 -#define XML_TOK_ENTITY_REF 9 -#define XML_TOK_CHAR_REF 10 /* numeric character reference */ - -/* The following tokens may be returned by both XmlPrologTok and - XmlContentTok. -*/ -#define XML_TOK_PI 11 /* processing instruction */ -#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ -#define XML_TOK_COMMENT 13 -#define XML_TOK_BOM 14 /* Byte order mark */ - -/* The following tokens are returned only by XmlPrologTok */ -#define XML_TOK_PROLOG_S 15 -#define XML_TOK_DECL_OPEN 16 /* <!foo */ -#define XML_TOK_DECL_CLOSE 17 /* > */ -#define XML_TOK_NAME 18 -#define XML_TOK_NMTOKEN 19 -#define XML_TOK_POUND_NAME 20 /* #name */ -#define XML_TOK_OR 21 /* | */ -#define XML_TOK_PERCENT 22 -#define XML_TOK_OPEN_PAREN 23 -#define XML_TOK_CLOSE_PAREN 24 -#define XML_TOK_OPEN_BRACKET 25 -#define XML_TOK_CLOSE_BRACKET 26 -#define XML_TOK_LITERAL 27 -#define XML_TOK_PARAM_ENTITY_REF 28 -#define XML_TOK_INSTANCE_START 29 - -/* The following occur only in element type declarations */ -#define XML_TOK_NAME_QUESTION 30 /* name? */ -#define XML_TOK_NAME_ASTERISK 31 /* name* */ -#define XML_TOK_NAME_PLUS 32 /* name+ */ -#define XML_TOK_COND_SECT_OPEN 33 /* <![ */ -#define XML_TOK_COND_SECT_CLOSE 34 /* ]]> */ -#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ -#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ -#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ -#define XML_TOK_COMMA 38 - -/* The following token is returned only by XmlAttributeValueTok */ -#define XML_TOK_ATTRIBUTE_VALUE_S 39 - -/* The following token is returned only by XmlCdataSectionTok */ -#define XML_TOK_CDATA_SECT_CLOSE 40 - -/* With namespace processing this is returned by XmlPrologTok for a - name with a colon. -*/ -#define XML_TOK_PREFIXED_NAME 41 - -#ifdef XML_DTD -#define XML_TOK_IGNORE_SECT 42 -#endif /* XML_DTD */ - -#ifdef XML_DTD -#define XML_N_STATES 4 -#else /* not XML_DTD */ -#define XML_N_STATES 3 -#endif /* not XML_DTD */ - -#define XML_PROLOG_STATE 0 -#define XML_CONTENT_STATE 1 -#define XML_CDATA_SECTION_STATE 2 -#ifdef XML_DTD -#define XML_IGNORE_SECTION_STATE 3 -#endif /* XML_DTD */ - -#define XML_N_LITERAL_TYPES 2 -#define XML_ATTRIBUTE_VALUE_LITERAL 0 -#define XML_ENTITY_VALUE_LITERAL 1 - -/* The size of the buffer passed to XmlUtf8Encode must be at least this. */ -#define XML_UTF8_ENCODE_MAX 4 -/* The size of the buffer passed to XmlUtf16Encode must be at least this. */ -#define XML_UTF16_ENCODE_MAX 2 - -typedef struct position { - /* first line and first column are 0 not 1 */ - XML_Size lineNumber; - XML_Size columnNumber; -} POSITION; - -typedef struct { - const char *name; - const char *valuePtr; - const char *valueEnd; - char normalized; -} ATTRIBUTE; - -struct encoding; -typedef struct encoding ENCODING; - -typedef int (PTRCALL *SCANNER)(const ENCODING *, - const char *, - const char *, - const char **); - -struct encoding { - SCANNER scanners[XML_N_STATES]; - SCANNER literalScanners[XML_N_LITERAL_TYPES]; - int (PTRCALL *sameName)(const ENCODING *, - const char *, - const char *); - int (PTRCALL *nameMatchesAscii)(const ENCODING *, - const char *, - const char *, - const char *); - int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); - const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); - int (PTRCALL *getAtts)(const ENCODING *enc, - const char *ptr, - int attsMax, - ATTRIBUTE *atts); - int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); - int (PTRCALL *predefinedEntityName)(const ENCODING *, - const char *, - const char *); - void (PTRCALL *updatePosition)(const ENCODING *, - const char *ptr, - const char *end, - POSITION *); - int (PTRCALL *isPublicId)(const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr); - void (PTRCALL *utf8Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - char **toP, - const char *toLim); - void (PTRCALL *utf16Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - unsigned short **toP, - const unsigned short *toLim); - int minBytesPerChar; - char isUtf8; - char isUtf16; -}; - -/* Scan the string starting at ptr until the end of the next complete - token, but do not scan past eptr. Return an integer giving the - type of token. - - Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. - - Return XML_TOK_PARTIAL when the string does not contain a complete - token; nextTokPtr will not be set. - - Return XML_TOK_INVALID when the string does not start a valid - token; nextTokPtr will be set to point to the character which made - the token invalid. - - Otherwise the string starts with a valid token; nextTokPtr will be - set to point to the character following the end of that token. - - Each data character counts as a single token, but adjacent data - characters may be returned together. Similarly for characters in - the prolog outside literals, comments and processing instructions. -*/ - - -#define XmlTok(enc, state, ptr, end, nextTokPtr) \ - (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) - -#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) - -#define XmlContentTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) - -#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) - -#ifdef XML_DTD - -#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) - -#endif /* XML_DTD */ - -/* This is used for performing a 2nd-level tokenization on the content - of a literal that has already been returned by XmlTok. -*/ -#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ - (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) - -#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) - -#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) - -#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) - -#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ - (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) - -#define XmlNameLength(enc, ptr) \ - (((enc)->nameLength)(enc, ptr)) - -#define XmlSkipS(enc, ptr) \ - (((enc)->skipS)(enc, ptr)) - -#define XmlGetAttributes(enc, ptr, attsMax, atts) \ - (((enc)->getAtts)(enc, ptr, attsMax, atts)) - -#define XmlCharRefNumber(enc, ptr) \ - (((enc)->charRefNumber)(enc, ptr)) - -#define XmlPredefinedEntityName(enc, ptr, end) \ - (((enc)->predefinedEntityName)(enc, ptr, end)) - -#define XmlUpdatePosition(enc, ptr, end, pos) \ - (((enc)->updatePosition)(enc, ptr, end, pos)) - -#define XmlIsPublicId(enc, ptr, end, badPtr) \ - (((enc)->isPublicId)(enc, ptr, end, badPtr)) - -#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ - (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) - -#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ - (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) - -typedef struct { - ENCODING initEnc; - const ENCODING **encPtr; -} INIT_ENCODING; - -int XmlParseXmlDecl(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); - -int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); -const ENCODING *XmlGetUtf8InternalEncoding(void); -const ENCODING *XmlGetUtf16InternalEncoding(void); -int FASTCALL XmlUtf8Encode(int charNumber, char *buf); -int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); -int XmlSizeOfUnknownEncoding(void); - - -typedef int (XMLCALL *CONVERTER) (void *userData, const char *p); - -ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData); - -int XmlParseXmlDeclNS(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); - -int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); -const ENCODING *XmlGetUtf8InternalEncodingNS(void); -const ENCODING *XmlGetUtf16InternalEncodingNS(void); -ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData); -#ifdef __cplusplus -} -#endif - -#endif /* not XmlTok_INCLUDED */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.c deleted file mode 100644 index 9c2895b8..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.c +++ /dev/null @@ -1,1783 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* This file is included! */ -#ifdef XML_TOK_IMPL_C - -#ifndef IS_INVALID_CHAR -#define IS_INVALID_CHAR(enc, ptr, n) (0) -#endif - -#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_INVALID_CHAR(enc, ptr, n)) { \ - *(nextTokPtr) = (ptr); \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define INVALID_CASES(ptr, nextTokPtr) \ - INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ - case BT_NONXML: \ - case BT_MALFORM: \ - case BT_TRAIL: \ - *(nextTokPtr) = (ptr); \ - return XML_TOK_INVALID; - -#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NAME_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - case BT_NMSTRT: \ - case BT_HEX: \ - case BT_DIGIT: \ - case BT_NAME: \ - case BT_MINUS: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) - -#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - case BT_NMSTRT: \ - case BT_HEX: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) - -#ifndef PREFIX -#define PREFIX(ident) ident -#endif - -/* ptr points to character following "<!-" */ - -static int PTRCALL -PREFIX(scanComment)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr != end) { - if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - ptr += MINBPC(enc); - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - INVALID_CASES(ptr, nextTokPtr) - case BT_MINUS: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_COMMENT; - } - break; - default: - ptr += MINBPC(enc); - break; - } - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "<!" */ - -static int PTRCALL -PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_MINUS: - return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_LSQB: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_COND_SECT_OPEN; - case BT_NMSTRT: - case BT_HEX: - ptr += MINBPC(enc); - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_PERCNT: - if (ptr + MINBPC(enc) == end) - return XML_TOK_PARTIAL; - /* don't allow <!ENTITY% foo "whatever"> */ - switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { - case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - /* fall through */ - case BT_S: case BT_CR: case BT_LF: - *nextTokPtr = ptr; - return XML_TOK_DECL_OPEN; - case BT_NMSTRT: - case BT_HEX: - ptr += MINBPC(enc); - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, - const char *end, int *tokPtr) -{ - int upper = 0; - *tokPtr = XML_TOK_PI; - if (end - ptr != MINBPC(enc)*3) - return 1; - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_x: - break; - case ASCII_X: - upper = 1; - break; - default: - return 1; - } - ptr += MINBPC(enc); - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_m: - break; - case ASCII_M: - upper = 1; - break; - default: - return 1; - } - ptr += MINBPC(enc); - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_l: - break; - case ASCII_L: - upper = 1; - break; - default: - return 1; - } - if (upper) - return 0; - *tokPtr = XML_TOK_XML_DECL; - return 1; -} - -/* ptr points to character following "<?" */ - -static int PTRCALL -PREFIX(scanPi)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - int tok; - const char *target = ptr; - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_CR: case BT_LF: - if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - ptr += MINBPC(enc); - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - INVALID_CASES(ptr, nextTokPtr) - case BT_QUEST: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr + MINBPC(enc); - return tok; - } - break; - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; - case BT_QUEST: - if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr + MINBPC(enc); - return tok; - } - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - static const char CDATA_LSQB[] = { ASCII_C, ASCII_D, ASCII_A, - ASCII_T, ASCII_A, ASCII_LSQB }; - int i; - /* CDATA[ */ - if (end - ptr < 6 * MINBPC(enc)) - return XML_TOK_PARTIAL; - for (i = 0; i < 6; i++, ptr += MINBPC(enc)) { - if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - *nextTokPtr = ptr; - return XML_TOK_CDATA_SECT_OPEN; -} - -static int PTRCALL -PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_NONE; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) - break; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr -= MINBPC(enc); - break; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CDATA_SECT_CLOSE; - case BT_CR: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - case BT_LF: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - INVALID_CASES(ptr, nextTokPtr) - default: - ptr += MINBPC(enc); - break; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONXML: - case BT_MALFORM: - case BT_TRAIL: - case BT_CR: - case BT_LF: - case BT_RSQB: - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -/* ptr points to character following "</" */ - -static int PTRCALL -PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_CR: case BT_LF: - for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_CR: case BT_LF: - break; - case BT_GT: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_END_TAG; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -#ifdef XML_NS - case BT_COLON: - /* no need to check qname syntax here, - since end-tag must match exactly */ - ptr += MINBPC(enc); - break; -#endif - case BT_GT: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_END_TAG; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "&#X" */ - -static int PTRCALL -PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - case BT_HEX: - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - case BT_HEX: - break; - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CHAR_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "&#" */ - -static int PTRCALL -PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr != end) { - if (CHAR_MATCHES(enc, ptr, ASCII_x)) - return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - break; - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CHAR_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "&" */ - -static int PTRCALL -PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_NUM: - return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_ENTITY_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following first character of attribute name */ - -static int PTRCALL -PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ -#ifdef XML_NS - int hadColon = 0; -#endif - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) -#ifdef XML_NS - case BT_COLON: - if (hadColon) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - hadColon = 1; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - break; -#endif - case BT_S: case BT_CR: case BT_LF: - for (;;) { - int t; - - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - t = BYTE_TYPE(enc, ptr); - if (t == BT_EQUALS) - break; - switch (t) { - case BT_S: - case BT_LF: - case BT_CR: - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - /* fall through */ - case BT_EQUALS: - { - int open; -#ifdef XML_NS - hadColon = 0; -#endif - for (;;) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - open = BYTE_TYPE(enc, ptr); - if (open == BT_QUOT || open == BT_APOS) - break; - switch (open) { - case BT_S: - case BT_LF: - case BT_CR: - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - ptr += MINBPC(enc); - /* in attribute value */ - for (;;) { - int t; - if (ptr == end) - return XML_TOK_PARTIAL; - t = BYTE_TYPE(enc, ptr); - if (t == open) - break; - switch (t) { - INVALID_CASES(ptr, nextTokPtr) - case BT_AMP: - { - int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr); - if (tok <= 0) { - if (tok == XML_TOK_INVALID) - *nextTokPtr = ptr; - return tok; - } - break; - } - case BT_LT: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - default: - ptr += MINBPC(enc); - break; - } - } - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: - case BT_CR: - case BT_LF: - break; - case BT_SOL: - goto sol; - case BT_GT: - goto gt; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - /* ptr points to closing quote */ - for (;;) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_CR: case BT_LF: - continue; - case BT_GT: - gt: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_START_TAG_WITH_ATTS; - case BT_SOL: - sol: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_EMPTY_ELEMENT_WITH_ATTS; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - break; - } - break; - } - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "<" */ - -static int PTRCALL -PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ -#ifdef XML_NS - int hadColon; -#endif - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_EXCL: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_MINUS: - return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_LSQB: - return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), - end, nextTokPtr); - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_QUEST: - return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_SOL: - return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr); - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } -#ifdef XML_NS - hadColon = 0; -#endif - /* we have a start-tag */ - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) -#ifdef XML_NS - case BT_COLON: - if (hadColon) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - hadColon = 1; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - break; -#endif - case BT_S: case BT_CR: case BT_LF: - { - ptr += MINBPC(enc); - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_GT: - goto gt; - case BT_SOL: - goto sol; - case BT_S: case BT_CR: case BT_LF: - ptr += MINBPC(enc); - continue; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr); - } - return XML_TOK_PARTIAL; - } - case BT_GT: - gt: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_START_TAG_NO_ATTS; - case BT_SOL: - sol: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_EMPTY_ELEMENT_NO_ATTS; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_NONE; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_LT: - return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_AMP: - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_CR: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - case BT_LF: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) - break; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr -= MINBPC(enc); - break; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - INVALID_CASES(ptr, nextTokPtr) - default: - ptr += MINBPC(enc); - break; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_RSQB: - if (ptr + MINBPC(enc) != end) { - if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { - ptr += MINBPC(enc); - break; - } - if (ptr + 2*MINBPC(enc) != end) { - if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { - ptr += MINBPC(enc); - break; - } - *nextTokPtr = ptr + 2*MINBPC(enc); - return XML_TOK_INVALID; - } - } - /* fall through */ - case BT_AMP: - case BT_LT: - case BT_NONXML: - case BT_MALFORM: - case BT_TRAIL: - case BT_CR: - case BT_LF: - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -/* ptr points to character following "%" */ - -static int PTRCALL -PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: - *nextTokPtr = ptr; - return XML_TOK_PERCENT; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_PARAM_ENTITY_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_CR: case BT_LF: case BT_S: - case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: - *nextTokPtr = ptr; - return XML_TOK_POUND_NAME; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return -XML_TOK_POUND_NAME; -} - -static int PTRCALL -PREFIX(scanLit)(int open, const ENCODING *enc, - const char *ptr, const char *end, - const char **nextTokPtr) -{ - while (ptr != end) { - int t = BYTE_TYPE(enc, ptr); - switch (t) { - INVALID_CASES(ptr, nextTokPtr) - case BT_QUOT: - case BT_APOS: - ptr += MINBPC(enc); - if (t != open) - break; - if (ptr == end) - return -XML_TOK_LITERAL; - *nextTokPtr = ptr; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_CR: case BT_LF: - case BT_GT: case BT_PERCNT: case BT_LSQB: - return XML_TOK_LITERAL; - default: - return XML_TOK_INVALID; - } - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - int tok; - if (ptr == end) - return XML_TOK_NONE; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_QUOT: - return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_APOS: - return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_LT: - { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_EXCL: - return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_QUEST: - return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_NMSTRT: - case BT_HEX: - case BT_NONASCII: - case BT_LEAD2: - case BT_LEAD3: - case BT_LEAD4: - *nextTokPtr = ptr - MINBPC(enc); - return XML_TOK_INSTANCE_START; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - case BT_CR: - if (ptr + MINBPC(enc) == end) { - *nextTokPtr = end; - /* indicate that this might be part of a CR/LF pair */ - return -XML_TOK_PROLOG_S; - } - /* fall through */ - case BT_S: case BT_LF: - for (;;) { - ptr += MINBPC(enc); - if (ptr == end) - break; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_LF: - break; - case BT_CR: - /* don't split CR/LF pair */ - if (ptr + MINBPC(enc) != end) - break; - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_PROLOG_S; - } - } - *nextTokPtr = ptr; - return XML_TOK_PROLOG_S; - case BT_PERCNT: - return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_COMMA: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_COMMA; - case BT_LSQB: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OPEN_BRACKET; - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return -XML_TOK_CLOSE_BRACKET; - if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { - if (ptr + MINBPC(enc) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { - *nextTokPtr = ptr + 2*MINBPC(enc); - return XML_TOK_COND_SECT_CLOSE; - } - } - *nextTokPtr = ptr; - return XML_TOK_CLOSE_BRACKET; - case BT_LPAR: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OPEN_PAREN; - case BT_RPAR: - ptr += MINBPC(enc); - if (ptr == end) - return -XML_TOK_CLOSE_PAREN; - switch (BYTE_TYPE(enc, ptr)) { - case BT_AST: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_ASTERISK; - case BT_QUEST: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_QUESTION; - case BT_PLUS: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_PLUS; - case BT_CR: case BT_LF: case BT_S: - case BT_GT: case BT_COMMA: case BT_VERBAR: - case BT_RPAR: - *nextTokPtr = ptr; - return XML_TOK_CLOSE_PAREN; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_VERBAR: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OR; - case BT_GT: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DECL_CLOSE; - case BT_NUM: - return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NAME; \ - break; \ - } \ - if (IS_NAME_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NMTOKEN; \ - break; \ - } \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NMSTRT: - case BT_HEX: - tok = XML_TOK_NAME; - ptr += MINBPC(enc); - break; - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: -#ifdef XML_NS - case BT_COLON: -#endif - tok = XML_TOK_NMTOKEN; - ptr += MINBPC(enc); - break; - case BT_NONASCII: - if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { - ptr += MINBPC(enc); - tok = XML_TOK_NAME; - break; - } - if (IS_NAME_CHAR_MINBPC(enc, ptr)) { - ptr += MINBPC(enc); - tok = XML_TOK_NMTOKEN; - break; - } - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_GT: case BT_RPAR: case BT_COMMA: - case BT_VERBAR: case BT_LSQB: case BT_PERCNT: - case BT_S: case BT_CR: case BT_LF: - *nextTokPtr = ptr; - return tok; -#ifdef XML_NS - case BT_COLON: - ptr += MINBPC(enc); - switch (tok) { - case XML_TOK_NAME: - if (ptr == end) - return XML_TOK_PARTIAL; - tok = XML_TOK_PREFIXED_NAME; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - default: - tok = XML_TOK_NMTOKEN; - break; - } - break; - case XML_TOK_PREFIXED_NAME: - tok = XML_TOK_NMTOKEN; - break; - } - break; -#endif - case BT_PLUS: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_PLUS; - case BT_AST: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_ASTERISK; - case BT_QUEST: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_QUESTION; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return -tok; -} - -static int PTRCALL -PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - const char *start; - if (ptr == end) - return XML_TOK_NONE; - start = ptr; - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_AMP: - if (ptr == start) - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_LT: - /* this is for inside entity references */ - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_LF: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_CR: - if (ptr == start) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_S: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_ATTRIBUTE_VALUE_S; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -static int PTRCALL -PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - const char *start; - if (ptr == end) - return XML_TOK_NONE; - start = ptr; - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_AMP: - if (ptr == start) - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_PERCNT: - if (ptr == start) { - int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), - end, nextTokPtr); - return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_LF: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_CR: - if (ptr == start) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -#ifdef XML_DTD - -static int PTRCALL -PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - int level = 0; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - end = ptr + n; - } - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - INVALID_CASES(ptr, nextTokPtr) - case BT_LT: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { - ++level; - ptr += MINBPC(enc); - } - } - break; - case BT_RSQB: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr += MINBPC(enc); - if (level == 0) { - *nextTokPtr = ptr; - return XML_TOK_IGNORE_SECT; - } - --level; - } - } - break; - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; -} - -#endif /* XML_DTD */ - -static int PTRCALL -PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, - const char **badPtr) -{ - ptr += MINBPC(enc); - end -= MINBPC(enc); - for (; ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - case BT_HEX: - case BT_MINUS: - case BT_APOS: - case BT_LPAR: - case BT_RPAR: - case BT_PLUS: - case BT_COMMA: - case BT_SOL: - case BT_EQUALS: - case BT_QUEST: - case BT_CR: - case BT_LF: - case BT_SEMI: - case BT_EXCL: - case BT_AST: - case BT_PERCNT: - case BT_NUM: -#ifdef XML_NS - case BT_COLON: -#endif - break; - case BT_S: - if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { - *badPtr = ptr; - return 0; - } - break; - case BT_NAME: - case BT_NMSTRT: - if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) - break; - default: - switch (BYTE_TO_ASCII(enc, ptr)) { - case 0x24: /* $ */ - case 0x40: /* @ */ - break; - default: - *badPtr = ptr; - return 0; - } - break; - } - } - return 1; -} - -/* This must only be called for a well-formed start-tag or empty - element tag. Returns the number of attributes. Pointers to the - first attsMax attributes are stored in atts. -*/ - -static int PTRCALL -PREFIX(getAtts)(const ENCODING *enc, const char *ptr, - int attsMax, ATTRIBUTE *atts) -{ - enum { other, inName, inValue } state = inName; - int nAtts = 0; - int open = 0; /* defined when state == inValue; - initialization just to shut up compilers */ - - for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { -#define START_NAME \ - if (state == other) { \ - if (nAtts < attsMax) { \ - atts[nAtts].name = ptr; \ - atts[nAtts].normalized = 1; \ - } \ - state = inName; \ - } -#define LEAD_CASE(n) \ - case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONASCII: - case BT_NMSTRT: - case BT_HEX: - START_NAME - break; -#undef START_NAME - case BT_QUOT: - if (state != inValue) { - if (nAtts < attsMax) - atts[nAtts].valuePtr = ptr + MINBPC(enc); - state = inValue; - open = BT_QUOT; - } - else if (open == BT_QUOT) { - state = other; - if (nAtts < attsMax) - atts[nAtts].valueEnd = ptr; - nAtts++; - } - break; - case BT_APOS: - if (state != inValue) { - if (nAtts < attsMax) - atts[nAtts].valuePtr = ptr + MINBPC(enc); - state = inValue; - open = BT_APOS; - } - else if (open == BT_APOS) { - state = other; - if (nAtts < attsMax) - atts[nAtts].valueEnd = ptr; - nAtts++; - } - break; - case BT_AMP: - if (nAtts < attsMax) - atts[nAtts].normalized = 0; - break; - case BT_S: - if (state == inName) - state = other; - else if (state == inValue - && nAtts < attsMax - && atts[nAtts].normalized - && (ptr == atts[nAtts].valuePtr - || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE - || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE - || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) - atts[nAtts].normalized = 0; - break; - case BT_CR: case BT_LF: - /* This case ensures that the first attribute name is counted - Apart from that we could just change state on the quote. */ - if (state == inName) - state = other; - else if (state == inValue && nAtts < attsMax) - atts[nAtts].normalized = 0; - break; - case BT_GT: - case BT_SOL: - if (state != inValue) - return nAtts; - break; - default: - break; - } - } - /* not reached */ -} - -static int PTRFASTCALL -PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) -{ - int result = 0; - /* skip &# */ - ptr += 2*MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_x)) { - for (ptr += MINBPC(enc); - !CHAR_MATCHES(enc, ptr, ASCII_SEMI); - ptr += MINBPC(enc)) { - int c = BYTE_TO_ASCII(enc, ptr); - switch (c) { - case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: - case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: - result <<= 4; - result |= (c - ASCII_0); - break; - case ASCII_A: case ASCII_B: case ASCII_C: - case ASCII_D: case ASCII_E: case ASCII_F: - result <<= 4; - result += 10 + (c - ASCII_A); - break; - case ASCII_a: case ASCII_b: case ASCII_c: - case ASCII_d: case ASCII_e: case ASCII_f: - result <<= 4; - result += 10 + (c - ASCII_a); - break; - } - if (result >= 0x110000) - return -1; - } - } - else { - for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { - int c = BYTE_TO_ASCII(enc, ptr); - result *= 10; - result += (c - ASCII_0); - if (result >= 0x110000) - return -1; - } - } - return checkCharRefNumber(result); -} - -static int PTRCALL -PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, - const char *end) -{ - switch ((end - ptr)/MINBPC(enc)) { - case 2: - if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_l: - return ASCII_LT; - case ASCII_g: - return ASCII_GT; - } - } - break; - case 3: - if (CHAR_MATCHES(enc, ptr, ASCII_a)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_m)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_p)) - return ASCII_AMP; - } - } - break; - case 4: - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_q: - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_u)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_o)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_t)) - return ASCII_QUOT; - } - } - break; - case ASCII_a: - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_p)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_o)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_s)) - return ASCII_APOS; - } - } - break; - } - } - return 0; -} - -static int PTRCALL -PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) -{ - for (;;) { - switch (BYTE_TYPE(enc, ptr1)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (*ptr1++ != *ptr2++) \ - return 0; - LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) -#undef LEAD_CASE - /* fall through */ - if (*ptr1++ != *ptr2++) - return 0; - break; - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 1) { - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 2) { - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 3) { - if (*ptr2++ != *ptr1++) - return 0; - } - } - } - break; - default: - if (MINBPC(enc) == 1 && *ptr1 == *ptr2) - return 1; - switch (BYTE_TYPE(enc, ptr2)) { - case BT_LEAD2: - case BT_LEAD3: - case BT_LEAD4: - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - return 0; - default: - return 1; - } - } - } - /* not reached */ -} - -static int PTRCALL -PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, - const char *end1, const char *ptr2) -{ - for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { - if (ptr1 == end1) - return 0; - if (!CHAR_MATCHES(enc, ptr1, *ptr2)) - return 0; - } - return ptr1 == end1; -} - -static int PTRFASTCALL -PREFIX(nameLength)(const ENCODING *enc, const char *ptr) -{ - const char *start = ptr; - for (;;) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - ptr += MINBPC(enc); - break; - default: - return (int)(ptr - start); - } - } -} - -static const char * PTRFASTCALL -PREFIX(skipS)(const ENCODING *enc, const char *ptr) -{ - for (;;) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_LF: - case BT_CR: - case BT_S: - ptr += MINBPC(enc); - break; - default: - return ptr; - } - } -} - -static void PTRCALL -PREFIX(updatePosition)(const ENCODING *enc, - const char *ptr, - const char *end, - POSITION *pos) -{ - while (ptr < end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_LF: - pos->columnNumber = (XML_Size)-1; - pos->lineNumber++; - ptr += MINBPC(enc); - break; - case BT_CR: - pos->lineNumber++; - ptr += MINBPC(enc); - if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - pos->columnNumber = (XML_Size)-1; - break; - default: - ptr += MINBPC(enc); - break; - } - pos->columnNumber++; - } -} - -#undef DO_LEAD_CASE -#undef MULTIBYTE_CASES -#undef INVALID_CASES -#undef CHECK_NAME_CASE -#undef CHECK_NAME_CASES -#undef CHECK_NMSTRT_CASE -#undef CHECK_NMSTRT_CASES - -#endif /* XML_TOK_IMPL_C */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.h deleted file mode 100644 index da0ea60a..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_impl.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd -See the file COPYING for copying permission. -*/ - -enum { - BT_NONXML, - BT_MALFORM, - BT_LT, - BT_AMP, - BT_RSQB, - BT_LEAD2, - BT_LEAD3, - BT_LEAD4, - BT_TRAIL, - BT_CR, - BT_LF, - BT_GT, - BT_QUOT, - BT_APOS, - BT_EQUALS, - BT_QUEST, - BT_EXCL, - BT_SOL, - BT_SEMI, - BT_NUM, - BT_LSQB, - BT_S, - BT_NMSTRT, - BT_COLON, - BT_HEX, - BT_DIGIT, - BT_NAME, - BT_MINUS, - BT_OTHER, /* known not to be a name or name start character */ - BT_NONASCII, /* might be a name or name start character */ - BT_PERCNT, - BT_LPAR, - BT_RPAR, - BT_AST, - BT_PLUS, - BT_COMMA, - BT_VERBAR -}; - -#include <stddef.h> diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_ns.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_ns.c deleted file mode 100644 index c3b88fdf..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/lib/xmltok_ns.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* This file is included! */ -#ifdef XML_TOK_NS_C - -const ENCODING * -NS(XmlGetUtf8InternalEncoding)(void) -{ - return &ns(internal_utf8_encoding).enc; -} - -const ENCODING * -NS(XmlGetUtf16InternalEncoding)(void) -{ -#if BYTEORDER == 1234 - return &ns(internal_little2_encoding).enc; -#elif BYTEORDER == 4321 - return &ns(internal_big2_encoding).enc; -#else - const short n = 1; - return (*(const char *)&n - ? &ns(internal_little2_encoding).enc - : &ns(internal_big2_encoding).enc); -#endif -} - -static const ENCODING * const NS(encodings)[] = { - &ns(latin1_encoding).enc, - &ns(ascii_encoding).enc, - &ns(utf8_encoding).enc, - &ns(big2_encoding).enc, - &ns(big2_encoding).enc, - &ns(little2_encoding).enc, - &ns(utf8_encoding).enc /* NO_ENC */ -}; - -static int PTRCALL -NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_PROLOG_STATE, ptr, end, nextTokPtr); -} - -static int PTRCALL -NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_CONTENT_STATE, ptr, end, nextTokPtr); -} - -int -NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, - const char *name) -{ - int i = getEncodingIndex(name); - if (i == UNKNOWN_ENC) - return 0; - SET_INIT_ENC_INDEX(p, i); - p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); - p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); - p->initEnc.updatePosition = initUpdatePosition; - p->encPtr = encPtr; - *encPtr = &(p->initEnc); - return 1; -} - -static const ENCODING * -NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) -{ -#define ENCODING_MAX 128 - char buf[ENCODING_MAX]; - char *p = buf; - int i; - XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); - if (ptr != end) - return 0; - *p = 0; - if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) - return enc; - i = getEncodingIndex(buf); - if (i == UNKNOWN_ENC) - return 0; - return NS(encodings)[i]; -} - -int -NS(XmlParseXmlDecl)(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ - return doParseXmlDecl(NS(findEncoding), - isGeneralTextEntity, - enc, - ptr, - end, - badPtr, - versionPtr, - versionEndPtr, - encodingName, - encoding, - standalone); -} - -#endif /* XML_TOK_NS_C */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.c deleted file mode 100644 index 57e48ff2..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include "codepage.h" - -#if (defined(WIN32) || (defined(__WATCOMC__) && defined(__NT__))) -#define STRICT 1 -#define WIN32_LEAN_AND_MEAN 1 - -#include <windows.h> - -int -codepageMap(int cp, int *map) -{ - int i; - CPINFO info; - if (!GetCPInfo(cp, &info) || info.MaxCharSize > 2) - return 0; - for (i = 0; i < 256; i++) - map[i] = -1; - if (info.MaxCharSize > 1) { - for (i = 0; i < MAX_LEADBYTES; i+=2) { - int j, lim; - if (info.LeadByte[i] == 0 && info.LeadByte[i + 1] == 0) - break; - lim = info.LeadByte[i + 1]; - for (j = info.LeadByte[i]; j <= lim; j++) - map[j] = -2; - } - } - for (i = 0; i < 256; i++) { - if (map[i] == -1) { - char c = (char)i; - unsigned short n; - if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, - &c, 1, &n, 1) == 1) - map[i] = n; - } - } - return 1; -} - -int -codepageConvert(int cp, const char *p) -{ - unsigned short c; - if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, - p, 2, &c, 1) == 1) - return c; - return -1; -} - -#else /* not WIN32 */ - -int -codepageMap(int cp, int *map) -{ - return 0; -} - -int -codepageConvert(int cp, const char *p) -{ - return -1; -} - -#endif /* not WIN32 */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.h deleted file mode 100644 index 6a4df688..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/codepage.h +++ /dev/null @@ -1,6 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -int codepageMap(int cp, int *map); -int codepageConvert(int cp, const char *p); diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c deleted file mode 100644 index 95903a34..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/ct.c +++ /dev/null @@ -1,147 +0,0 @@ -#define CHARSET_MAX 41 - -static const char * -getTok(const char **pp) -{ - enum { inAtom, inString, init, inComment }; - int state = init; - const char *tokStart = 0; - for (;;) { - switch (**pp) { - case '\0': - return 0; - case ' ': - case '\r': - case '\t': - case '\n': - if (state == inAtom) - return tokStart; - break; - case '(': - if (state == inAtom) - return tokStart; - if (state != inString) - state++; - break; - case ')': - if (state > init) - --state; - else if (state != inString) - return 0; - break; - case ';': - case '/': - case '=': - if (state == inAtom) - return tokStart; - if (state == init) - return (*pp)++; - break; - case '\\': - ++*pp; - if (**pp == '\0') - return 0; - break; - case '"': - switch (state) { - case inString: - ++*pp; - return tokStart; - case inAtom: - return tokStart; - case init: - tokStart = *pp; - state = inString; - break; - } - break; - default: - if (state == init) { - tokStart = *pp; - state = inAtom; - } - break; - } - ++*pp; - } - /* not reached */ -} - -/* key must be lowercase ASCII */ - -static int -matchkey(const char *start, const char *end, const char *key) -{ - if (!start) - return 0; - for (; start != end; start++, key++) - if (*start != *key && *start != 'A' + (*key - 'a')) - return 0; - return *key == '\0'; -} - -void -getXMLCharset(const char *buf, char *charset) -{ - const char *next, *p; - - charset[0] = '\0'; - next = buf; - p = getTok(&next); - if (matchkey(p, next, "text")) - strcpy(charset, "us-ascii"); - else if (!matchkey(p, next, "application")) - return; - p = getTok(&next); - if (!p || *p != '/') - return; - p = getTok(&next); - if (matchkey(p, next, "xml")) - isXml = 1; - p = getTok(&next); - while (p) { - if (*p == ';') { - p = getTok(&next); - if (matchkey(p, next, "charset")) { - p = getTok(&next); - if (p && *p == '=') { - p = getTok(&next); - if (p) { - char *s = charset; - if (*p == '"') { - while (++p != next - 1) { - if (*p == '\\') - ++p; - if (s == charset + CHARSET_MAX - 1) { - charset[0] = '\0'; - break; - } - *s++ = *p; - } - *s++ = '\0'; - } - else { - if (next - p > CHARSET_MAX - 1) - break; - while (p != next) - *s++ = *p++; - *s = 0; - break; - } - } - } - } - } - else - p = getTok(&next); - } -} - -int -main(int argc, char **argv) -{ - char buf[CHARSET_MAX]; - getXMLCharset(argv[1], buf); - printf("charset = \"%s\"\n", buf); - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/filemap.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/filemap.h deleted file mode 100644 index 814edec2..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/filemap.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <stddef.h> - -#ifdef XML_UNICODE -int filemap(const wchar_t *name, - void (*processor)(const void *, size_t, - const wchar_t *, void *arg), - void *arg); -#else -int filemap(const char *name, - void (*processor)(const void *, size_t, - const char *, void *arg), - void *arg); -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/readfilemap.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/readfilemap.c deleted file mode 100644 index bd32b934..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/readfilemap.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <stdlib.h> -#include <stdio.h> - -#ifdef __WATCOMC__ -#ifndef __LINUX__ -#include <io.h> -#else -#include <unistd.h> -#endif -#endif - -#ifdef __BEOS__ -#include <unistd.h> -#endif - -#ifndef S_ISREG -#ifndef S_IFREG -#define S_IFREG _S_IFREG -#endif -#ifndef S_IFMT -#define S_IFMT _S_IFMT -#endif -#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -#endif /* not S_ISREG */ - -#ifndef O_BINARY -#ifdef _O_BINARY -#define O_BINARY _O_BINARY -#else -#define O_BINARY 0 -#endif -#endif - -#include "filemap.h" - -int -filemap(const char *name, - void (*processor)(const void *, size_t, const char *, void *arg), - void *arg) -{ - size_t nbytes; - int fd; - int n; - struct stat sb; - void *p; - - fd = open(name, O_RDONLY|O_BINARY); - if (fd < 0) { - perror(name); - return 0; - } - if (fstat(fd, &sb) < 0) { - perror(name); - close(fd); - return 0; - } - if (!S_ISREG(sb.st_mode)) { - fprintf(stderr, "%s: not a regular file\n", name); - close(fd); - return 0; - } - nbytes = sb.st_size; - /* malloc will return NULL with nbytes == 0, handle files with size 0 */ - if (nbytes == 0) { - static const char c = '\0'; - processor(&c, 0, name, arg); - close(fd); - return 1; - } - p = malloc(nbytes); - if (!p) { - fprintf(stderr, "%s: out of memory\n", name); - close(fd); - return 0; - } - n = read(fd, p, nbytes); - if (n < 0) { - perror(name); - free(p); - close(fd); - return 0; - } - if (n != nbytes) { - fprintf(stderr, "%s: read unexpected number of bytes\n", name); - free(p); - close(fd); - return 0; - } - processor(p, nbytes, name, arg); - free(p); - close(fd); - return 1; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/unixfilemap.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/unixfilemap.c deleted file mode 100644 index 93adce32..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/unixfilemap.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <sys/types.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <unistd.h> - -#ifndef MAP_FILE -#define MAP_FILE 0 -#endif - -#include "filemap.h" - -int -filemap(const char *name, - void (*processor)(const void *, size_t, const char *, void *arg), - void *arg) -{ - int fd; - size_t nbytes; - struct stat sb; - void *p; - - fd = open(name, O_RDONLY); - if (fd < 0) { - perror(name); - return 0; - } - if (fstat(fd, &sb) < 0) { - perror(name); - close(fd); - return 0; - } - if (!S_ISREG(sb.st_mode)) { - close(fd); - fprintf(stderr, "%s: not a regular file\n", name); - return 0; - } - - nbytes = sb.st_size; - /* mmap fails for zero length files */ - if (nbytes == 0) { - static const char c = '\0'; - processor(&c, 0, name, arg); - close(fd); - return 1; - } - p = (void *)mmap((caddr_t)0, (size_t)nbytes, PROT_READ, - MAP_FILE|MAP_PRIVATE, fd, (off_t)0); - if (p == (void *)-1) { - perror(name); - close(fd); - return 0; - } - processor(p, nbytes, name, arg); - munmap((caddr_t)p, nbytes); - close(fd); - return 1; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/win32filemap.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/win32filemap.c deleted file mode 100644 index 41dc35b6..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/win32filemap.c +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#define STRICT 1 -#define WIN32_LEAN_AND_MEAN 1 - -#ifdef XML_UNICODE_WCHAR_T -#ifndef XML_UNICODE -#define XML_UNICODE -#endif -#endif - -#ifdef XML_UNICODE -#define UNICODE -#define _UNICODE -#endif /* XML_UNICODE */ -#include <windows.h> -#include <stdio.h> -#include <tchar.h> -#include "filemap.h" - -static void win32perror(const TCHAR *); - -int -filemap(const TCHAR *name, - void (*processor)(const void *, size_t, const TCHAR *, void *arg), - void *arg) -{ - HANDLE f; - HANDLE m; - DWORD size; - DWORD sizeHi; - void *p; - - f = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, - FILE_FLAG_SEQUENTIAL_SCAN, NULL); - if (f == INVALID_HANDLE_VALUE) { - win32perror(name); - return 0; - } - size = GetFileSize(f, &sizeHi); - if (size == (DWORD)-1) { - win32perror(name); - return 0; - } - if (sizeHi) { - _ftprintf(stderr, _T("%s: bigger than 2Gb\n"), name); - return 0; - } - /* CreateFileMapping barfs on zero length files */ - if (size == 0) { - static const char c = '\0'; - processor(&c, 0, name, arg); - CloseHandle(f); - return 1; - } - m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL); - if (m == NULL) { - win32perror(name); - CloseHandle(f); - return 0; - } - p = MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0); - if (p == NULL) { - win32perror(name); - CloseHandle(m); - CloseHandle(f); - return 0; - } - processor(p, size, name, arg); - UnmapViewOfFile(p); - CloseHandle(m); - CloseHandle(f); - return 1; -} - -static void -win32perror(const TCHAR *s) -{ - LPVOID buf; - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buf, - 0, - NULL)) { - _ftprintf(stderr, _T("%s: %s"), s, buf); - fflush(stderr); - LocalFree(buf); - } - else - _ftprintf(stderr, _T("%s: unknown Windows error\n"), s); -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.c deleted file mode 100644 index 99eeeaae..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.c +++ /dev/null @@ -1,244 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <stddef.h> -#include <string.h> -#include <fcntl.h> - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#elif defined(HAVE_EXPAT_CONFIG_H) -#include <expat_config.h> -#endif /* ndef COMPILED_FROM_DSP */ - -#include "expat.h" -#include "xmlfile.h" -#include "xmltchar.h" -#include "filemap.h" - -#if (defined(_MSC_VER) || (defined(__WATCOMC__) && !defined(__LINUX__))) -#include <io.h> -#endif - -#if defined(__amigaos__) && defined(__USE_INLINE__) -#include <proto/expat.h> -#endif - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#ifndef O_BINARY -#ifdef _O_BINARY -#define O_BINARY _O_BINARY -#else -#define O_BINARY 0 -#endif -#endif - -#ifdef _DEBUG -#define READ_SIZE 16 -#else -#define READ_SIZE (1024*8) -#endif - - -typedef struct { - XML_Parser parser; - int *retPtr; -} PROCESS_ARGS; - -static void -reportError(XML_Parser parser, const XML_Char *filename) -{ - enum XML_Error code = XML_GetErrorCode(parser); - const XML_Char *message = XML_ErrorString(code); - if (message) - ftprintf(stdout, T("%s:%" XML_FMT_INT_MOD "u:%" XML_FMT_INT_MOD "u: %s\n"), - filename, - XML_GetErrorLineNumber(parser), - XML_GetErrorColumnNumber(parser), - message); - else - ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code); -} - -/* This implementation will give problems on files larger than INT_MAX. */ -static void -processFile(const void *data, size_t size, - const XML_Char *filename, void *args) -{ - XML_Parser parser = ((PROCESS_ARGS *)args)->parser; - int *retPtr = ((PROCESS_ARGS *)args)->retPtr; - if (XML_Parse(parser, (const char *)data, (int)size, 1) == XML_STATUS_ERROR) { - reportError(parser, filename); - *retPtr = 0; - } - else - *retPtr = 1; -} - -#if (defined(WIN32) || defined(__WATCOMC__)) - -static int -isAsciiLetter(XML_Char c) -{ - return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z')); -} - -#endif /* WIN32 */ - -static const XML_Char * -resolveSystemId(const XML_Char *base, const XML_Char *systemId, - XML_Char **toFree) -{ - XML_Char *s; - *toFree = 0; - if (!base - || *systemId == T('/') -#if (defined(WIN32) || defined(__WATCOMC__)) - || *systemId == T('\\') - || (isAsciiLetter(systemId[0]) && systemId[1] == T(':')) -#endif - ) - return systemId; - *toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2) - * sizeof(XML_Char)); - if (!*toFree) - return systemId; - tcscpy(*toFree, base); - s = *toFree; - if (tcsrchr(s, T('/'))) - s = tcsrchr(s, T('/')) + 1; -#if (defined(WIN32) || defined(__WATCOMC__)) - if (tcsrchr(s, T('\\'))) - s = tcsrchr(s, T('\\')) + 1; -#endif - tcscpy(s, systemId); - return *toFree; -} - -static int -externalEntityRefFilemap(XML_Parser parser, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) -{ - int result; - XML_Char *s; - const XML_Char *filename; - XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); - PROCESS_ARGS args; - args.retPtr = &result; - args.parser = entParser; - filename = resolveSystemId(base, systemId, &s); - XML_SetBase(entParser, filename); - if (!filemap(filename, processFile, &args)) - result = 0; - free(s); - XML_ParserFree(entParser); - return result; -} - -static int -processStream(const XML_Char *filename, XML_Parser parser) -{ - /* passing NULL for filename means read intput from stdin */ - int fd = 0; /* 0 is the fileno for stdin */ - - if (filename != NULL) { - fd = topen(filename, O_BINARY|O_RDONLY); - if (fd < 0) { - tperror(filename); - return 0; - } - } - for (;;) { - int nread; - char *buf = (char *)XML_GetBuffer(parser, READ_SIZE); - if (!buf) { - if (filename != NULL) - close(fd); - ftprintf(stderr, T("%s: out of memory\n"), - filename != NULL ? filename : "xmlwf"); - return 0; - } - nread = read(fd, buf, READ_SIZE); - if (nread < 0) { - tperror(filename != NULL ? filename : "STDIN"); - if (filename != NULL) - close(fd); - return 0; - } - if (XML_ParseBuffer(parser, nread, nread == 0) == XML_STATUS_ERROR) { - reportError(parser, filename != NULL ? filename : "STDIN"); - if (filename != NULL) - close(fd); - return 0; - } - if (nread == 0) { - if (filename != NULL) - close(fd); - break;; - } - } - return 1; -} - -static int -externalEntityRefStream(XML_Parser parser, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) -{ - XML_Char *s; - const XML_Char *filename; - int ret; - XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0); - filename = resolveSystemId(base, systemId, &s); - XML_SetBase(entParser, filename); - ret = processStream(filename, entParser); - free(s); - XML_ParserFree(entParser); - return ret; -} - -int -XML_ProcessFile(XML_Parser parser, - const XML_Char *filename, - unsigned flags) -{ - int result; - - if (!XML_SetBase(parser, filename)) { - ftprintf(stderr, T("%s: out of memory"), filename); - exit(1); - } - - if (flags & XML_EXTERNAL_ENTITIES) - XML_SetExternalEntityRefHandler(parser, - (flags & XML_MAP_FILE) - ? externalEntityRefFilemap - : externalEntityRefStream); - if (flags & XML_MAP_FILE) { - PROCESS_ARGS args; - args.retPtr = &result; - args.parser = parser; - if (!filemap(filename, processFile, &args)) - result = 0; - } - else - result = processStream(filename, parser); - return result; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.h deleted file mode 100644 index d093ecc0..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlfile.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#define XML_MAP_FILE 01 -#define XML_EXTERNAL_ENTITIES 02 - -#ifdef XML_LARGE_SIZE -#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 -#define XML_FMT_INT_MOD "I64" -#else -#define XML_FMT_INT_MOD "ll" -#endif -#else -#define XML_FMT_INT_MOD "l" -#endif - -extern int XML_ProcessFile(XML_Parser parser, - const XML_Char *filename, - unsigned flags); diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.c deleted file mode 100644 index 56a0e7f4..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.c +++ /dev/null @@ -1,163 +0,0 @@ -#include <string.h> -#include "xmlmime.h" - -static const char * -getTok(const char **pp) -{ - /* inComment means one level of nesting; inComment+1 means two levels etc */ - enum { inAtom, inString, init, inComment }; - int state = init; - const char *tokStart = 0; - for (;;) { - switch (**pp) { - case '\0': - if (state == inAtom) - return tokStart; - return 0; - case ' ': - case '\r': - case '\t': - case '\n': - if (state == inAtom) - return tokStart; - break; - case '(': - if (state == inAtom) - return tokStart; - if (state != inString) - state++; - break; - case ')': - if (state > init) - --state; - else if (state != inString) - return 0; - break; - case ';': - case '/': - case '=': - if (state == inAtom) - return tokStart; - if (state == init) - return (*pp)++; - break; - case '\\': - ++*pp; - if (**pp == '\0') - return 0; - break; - case '"': - switch (state) { - case inString: - ++*pp; - return tokStart; - case inAtom: - return tokStart; - case init: - tokStart = *pp; - state = inString; - break; - } - break; - default: - if (state == init) { - tokStart = *pp; - state = inAtom; - } - break; - } - ++*pp; - } - /* not reached */ -} - -/* key must be lowercase ASCII */ - -static int -matchkey(const char *start, const char *end, const char *key) -{ - if (!start) - return 0; - for (; start != end; start++, key++) - if (*start != *key && *start != 'A' + (*key - 'a')) - return 0; - return *key == '\0'; -} - -void -getXMLCharset(const char *buf, char *charset) -{ - const char *next, *p; - - charset[0] = '\0'; - next = buf; - p = getTok(&next); - if (matchkey(p, next, "text")) - strcpy(charset, "us-ascii"); - else if (!matchkey(p, next, "application")) - return; - p = getTok(&next); - if (!p || *p != '/') - return; - p = getTok(&next); -#if 0 - if (!matchkey(p, next, "xml") && charset[0] == '\0') - return; -#endif - p = getTok(&next); - while (p) { - if (*p == ';') { - p = getTok(&next); - if (matchkey(p, next, "charset")) { - p = getTok(&next); - if (p && *p == '=') { - p = getTok(&next); - if (p) { - char *s = charset; - if (*p == '"') { - while (++p != next - 1) { - if (*p == '\\') - ++p; - if (s == charset + CHARSET_MAX - 1) { - charset[0] = '\0'; - break; - } - *s++ = *p; - } - *s++ = '\0'; - } - else { - if (next - p > CHARSET_MAX - 1) - break; - while (p != next) - *s++ = *p++; - *s = 0; - break; - } - } - } - break; - } - } - else - p = getTok(&next); - } -} - -#ifdef TEST - -#include <stdio.h> - -int -main(int argc, char *argv[]) -{ - char buf[CHARSET_MAX]; - if (argc <= 1) - return 1; - printf("%s\n", argv[1]); - getXMLCharset(argv[1], buf); - printf("charset=\"%s\"\n", buf); - return 0; -} - -#endif /* TEST */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.h deleted file mode 100644 index bf0356df..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlmime.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif - -/* Registered charset names are at most 40 characters long. */ - -#define CHARSET_MAX 41 - -/* Figure out the charset to use from the ContentType. - buf contains the body of the header field (the part after "Content-Type:"). - charset gets the charset to use. It must be at least CHARSET_MAX chars - long. charset will be empty if the default charset should be used. -*/ - -void getXMLCharset(const char *buf, char *charset); - -#ifdef __cplusplus -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmltchar.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmltchar.h deleted file mode 100644 index 10885755..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmltchar.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifdef XML_UNICODE -#ifndef XML_UNICODE_WCHAR_T -#error xmlwf requires a 16-bit Unicode-compatible wchar_t -#endif -#define T(x) L ## x -#define ftprintf fwprintf -#define tfopen _wfopen -#define fputts fputws -#define puttc putwc -#define tcscmp wcscmp -#define tcscpy wcscpy -#define tcscat wcscat -#define tcschr wcschr -#define tcsrchr wcsrchr -#define tcslen wcslen -#define tperror _wperror -#define topen _wopen -#define tmain wmain -#define tremove _wremove -#else /* not XML_UNICODE */ -#define T(x) x -#define ftprintf fprintf -#define tfopen fopen -#define fputts fputs -#define puttc putc -#define tcscmp strcmp -#define tcscpy strcpy -#define tcscat strcat -#define tcschr strchr -#define tcsrchr strrchr -#define tcslen strlen -#define tperror perror -#define topen open -#define tmain main -#define tremove remove -#endif /* not XML_UNICODE */ diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h deleted file mode 100644 index d329913a..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlurl.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif - -int XML_URLInit(); -void XML_URLUninit(); -int XML_ProcessURL(XML_Parser parser, - const XML_Char *url, - unsigned flags); - -#ifdef __cplusplus -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c deleted file mode 100644 index 4fc77da9..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.c +++ /dev/null @@ -1,861 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <stddef.h> -#include <string.h> - -#include "expat.h" -#include "codepage.h" -#include "xmlfile.h" -#include "xmltchar.h" - -#ifdef _MSC_VER -#include <crtdbg.h> -#endif - -#if defined(__amigaos__) && defined(__USE_INLINE__) -#include <proto/expat.h> -#endif - -/* This ensures proper sorting. */ - -#define NSSEP T('\001') - -static void XMLCALL -characterData(void *userData, const XML_Char *s, int len) -{ - FILE *fp = (FILE *)userData; - for (; len > 0; --len, ++s) { - switch (*s) { - case T('&'): - fputts(T("&"), fp); - break; - case T('<'): - fputts(T("<"), fp); - break; - case T('>'): - fputts(T(">"), fp); - break; -#ifdef W3C14N - case 13: - fputts(T("
"), fp); - break; -#else - case T('"'): - fputts(T("""), fp); - break; - case 9: - case 10: - case 13: - ftprintf(fp, T("&#%d;"), *s); - break; -#endif - default: - puttc(*s, fp); - break; - } - } -} - -static void -attributeValue(FILE *fp, const XML_Char *s) -{ - puttc(T('='), fp); - puttc(T('"'), fp); - for (;;) { - switch (*s) { - case 0: - case NSSEP: - puttc(T('"'), fp); - return; - case T('&'): - fputts(T("&"), fp); - break; - case T('<'): - fputts(T("<"), fp); - break; - case T('"'): - fputts(T("""), fp); - break; -#ifdef W3C14N - case 9: - fputts(T("	"), fp); - break; - case 10: - fputts(T("
"), fp); - break; - case 13: - fputts(T("
"), fp); - break; -#else - case T('>'): - fputts(T(">"), fp); - break; - case 9: - case 10: - case 13: - ftprintf(fp, T("&#%d;"), *s); - break; -#endif - default: - puttc(*s, fp); - break; - } - s++; - } -} - -/* Lexicographically comparing UTF-8 encoded attribute values, -is equivalent to lexicographically comparing based on the character number. */ - -static int -attcmp(const void *att1, const void *att2) -{ - return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2); -} - -static void XMLCALL -startElement(void *userData, const XML_Char *name, const XML_Char **atts) -{ - int nAtts; - const XML_Char **p; - FILE *fp = (FILE *)userData; - puttc(T('<'), fp); - fputts(name, fp); - - p = atts; - while (*p) - ++p; - nAtts = (int)((p - atts) >> 1); - if (nAtts > 1) - qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp); - while (*atts) { - puttc(T(' '), fp); - fputts(*atts++, fp); - attributeValue(fp, *atts); - atts++; - } - puttc(T('>'), fp); -} - -static void XMLCALL -endElement(void *userData, const XML_Char *name) -{ - FILE *fp = (FILE *)userData; - puttc(T('<'), fp); - puttc(T('/'), fp); - fputts(name, fp); - puttc(T('>'), fp); -} - -static int -nsattcmp(const void *p1, const void *p2) -{ - const XML_Char *att1 = *(const XML_Char **)p1; - const XML_Char *att2 = *(const XML_Char **)p2; - int sep1 = (tcsrchr(att1, NSSEP) != 0); - int sep2 = (tcsrchr(att1, NSSEP) != 0); - if (sep1 != sep2) - return sep1 - sep2; - return tcscmp(att1, att2); -} - -static void XMLCALL -startElementNS(void *userData, const XML_Char *name, const XML_Char **atts) -{ - int nAtts; - int nsi; - const XML_Char **p; - FILE *fp = (FILE *)userData; - const XML_Char *sep; - puttc(T('<'), fp); - - sep = tcsrchr(name, NSSEP); - if (sep) { - fputts(T("n1:"), fp); - fputts(sep + 1, fp); - fputts(T(" xmlns:n1"), fp); - attributeValue(fp, name); - nsi = 2; - } - else { - fputts(name, fp); - nsi = 1; - } - - p = atts; - while (*p) - ++p; - nAtts = (int)((p - atts) >> 1); - if (nAtts > 1) - qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp); - while (*atts) { - name = *atts++; - sep = tcsrchr(name, NSSEP); - puttc(T(' '), fp); - if (sep) { - ftprintf(fp, T("n%d:"), nsi); - fputts(sep + 1, fp); - } - else - fputts(name, fp); - attributeValue(fp, *atts); - if (sep) { - ftprintf(fp, T(" xmlns:n%d"), nsi++); - attributeValue(fp, name); - } - atts++; - } - puttc(T('>'), fp); -} - -static void XMLCALL -endElementNS(void *userData, const XML_Char *name) -{ - FILE *fp = (FILE *)userData; - const XML_Char *sep; - puttc(T('<'), fp); - puttc(T('/'), fp); - sep = tcsrchr(name, NSSEP); - if (sep) { - fputts(T("n1:"), fp); - fputts(sep + 1, fp); - } - else - fputts(name, fp); - puttc(T('>'), fp); -} - -#ifndef W3C14N - -static void XMLCALL -processingInstruction(void *userData, const XML_Char *target, - const XML_Char *data) -{ - FILE *fp = (FILE *)userData; - puttc(T('<'), fp); - puttc(T('?'), fp); - fputts(target, fp); - puttc(T(' '), fp); - fputts(data, fp); - puttc(T('?'), fp); - puttc(T('>'), fp); -} - -#endif /* not W3C14N */ - -static void XMLCALL -defaultCharacterData(void *userData, const XML_Char *s, int len) -{ - XML_DefaultCurrent((XML_Parser) userData); -} - -static void XMLCALL -defaultStartElement(void *userData, const XML_Char *name, - const XML_Char **atts) -{ - XML_DefaultCurrent((XML_Parser) userData); -} - -static void XMLCALL -defaultEndElement(void *userData, const XML_Char *name) -{ - XML_DefaultCurrent((XML_Parser) userData); -} - -static void XMLCALL -defaultProcessingInstruction(void *userData, const XML_Char *target, - const XML_Char *data) -{ - XML_DefaultCurrent((XML_Parser) userData); -} - -static void XMLCALL -nopCharacterData(void *userData, const XML_Char *s, int len) -{ -} - -static void XMLCALL -nopStartElement(void *userData, const XML_Char *name, const XML_Char **atts) -{ -} - -static void XMLCALL -nopEndElement(void *userData, const XML_Char *name) -{ -} - -static void XMLCALL -nopProcessingInstruction(void *userData, const XML_Char *target, - const XML_Char *data) -{ -} - -static void XMLCALL -markup(void *userData, const XML_Char *s, int len) -{ - FILE *fp = (FILE *)XML_GetUserData((XML_Parser) userData); - for (; len > 0; --len, ++s) - puttc(*s, fp); -} - -static void -metaLocation(XML_Parser parser) -{ - const XML_Char *uri = XML_GetBase(parser); - if (uri) - ftprintf((FILE *)XML_GetUserData(parser), T(" uri=\"%s\""), uri); - ftprintf((FILE *)XML_GetUserData(parser), - T(" byte=\"%" XML_FMT_INT_MOD "d\" nbytes=\"%d\" \ - line=\"%" XML_FMT_INT_MOD "u\" col=\"%" XML_FMT_INT_MOD "u\""), - XML_GetCurrentByteIndex(parser), - XML_GetCurrentByteCount(parser), - XML_GetCurrentLineNumber(parser), - XML_GetCurrentColumnNumber(parser)); -} - -static void -metaStartDocument(void *userData) -{ - fputts(T("<document>\n"), (FILE *)XML_GetUserData((XML_Parser) userData)); -} - -static void -metaEndDocument(void *userData) -{ - fputts(T("</document>\n"), (FILE *)XML_GetUserData((XML_Parser) userData)); -} - -static void XMLCALL -metaStartElement(void *userData, const XML_Char *name, - const XML_Char **atts) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - const XML_Char **specifiedAttsEnd - = atts + XML_GetSpecifiedAttributeCount(parser); - const XML_Char **idAttPtr; - int idAttIndex = XML_GetIdAttributeIndex(parser); - if (idAttIndex < 0) - idAttPtr = 0; - else - idAttPtr = atts + idAttIndex; - - ftprintf(fp, T("<starttag name=\"%s\""), name); - metaLocation(parser); - if (*atts) { - fputts(T(">\n"), fp); - do { - ftprintf(fp, T("<attribute name=\"%s\" value=\""), atts[0]); - characterData(fp, atts[1], (int)tcslen(atts[1])); - if (atts >= specifiedAttsEnd) - fputts(T("\" defaulted=\"yes\"/>\n"), fp); - else if (atts == idAttPtr) - fputts(T("\" id=\"yes\"/>\n"), fp); - else - fputts(T("\"/>\n"), fp); - } while (*(atts += 2)); - fputts(T("</starttag>\n"), fp); - } - else - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaEndElement(void *userData, const XML_Char *name) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - ftprintf(fp, T("<endtag name=\"%s\""), name); - metaLocation(parser); - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaProcessingInstruction(void *userData, const XML_Char *target, - const XML_Char *data) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - ftprintf(fp, T("<pi target=\"%s\" data=\""), target); - characterData(fp, data, (int)tcslen(data)); - puttc(T('"'), fp); - metaLocation(parser); - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaComment(void *userData, const XML_Char *data) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("<comment data=\""), fp); - characterData(fp, data, (int)tcslen(data)); - puttc(T('"'), fp); - metaLocation(parser); - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaStartCdataSection(void *userData) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("<startcdata"), fp); - metaLocation(parser); - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaEndCdataSection(void *userData) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("<endcdata"), fp); - metaLocation(parser); - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaCharacterData(void *userData, const XML_Char *s, int len) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("<chars str=\""), fp); - characterData(fp, s, len); - puttc(T('"'), fp); - metaLocation(parser); - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaStartDoctypeDecl(void *userData, - const XML_Char *doctypeName, - const XML_Char *sysid, - const XML_Char *pubid, - int has_internal_subset) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - ftprintf(fp, T("<startdoctype name=\"%s\""), doctypeName); - metaLocation(parser); - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaEndDoctypeDecl(void *userData) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("<enddoctype"), fp); - metaLocation(parser); - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaNotationDecl(void *userData, - const XML_Char *notationName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - ftprintf(fp, T("<notation name=\"%s\""), notationName); - if (publicId) - ftprintf(fp, T(" public=\"%s\""), publicId); - if (systemId) { - fputts(T(" system=\""), fp); - characterData(fp, systemId, (int)tcslen(systemId)); - puttc(T('"'), fp); - } - metaLocation(parser); - fputts(T("/>\n"), fp); -} - - -static void XMLCALL -metaEntityDecl(void *userData, - const XML_Char *entityName, - int is_param, - const XML_Char *value, - int value_length, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - - if (value) { - ftprintf(fp, T("<entity name=\"%s\""), entityName); - metaLocation(parser); - puttc(T('>'), fp); - characterData(fp, value, value_length); - fputts(T("</entity/>\n"), fp); - } - else if (notationName) { - ftprintf(fp, T("<entity name=\"%s\""), entityName); - if (publicId) - ftprintf(fp, T(" public=\"%s\""), publicId); - fputts(T(" system=\""), fp); - characterData(fp, systemId, (int)tcslen(systemId)); - puttc(T('"'), fp); - ftprintf(fp, T(" notation=\"%s\""), notationName); - metaLocation(parser); - fputts(T("/>\n"), fp); - } - else { - ftprintf(fp, T("<entity name=\"%s\""), entityName); - if (publicId) - ftprintf(fp, T(" public=\"%s\""), publicId); - fputts(T(" system=\""), fp); - characterData(fp, systemId, (int)tcslen(systemId)); - puttc(T('"'), fp); - metaLocation(parser); - fputts(T("/>\n"), fp); - } -} - -static void XMLCALL -metaStartNamespaceDecl(void *userData, - const XML_Char *prefix, - const XML_Char *uri) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - fputts(T("<startns"), fp); - if (prefix) - ftprintf(fp, T(" prefix=\"%s\""), prefix); - if (uri) { - fputts(T(" ns=\""), fp); - characterData(fp, uri, (int)tcslen(uri)); - fputts(T("\"/>\n"), fp); - } - else - fputts(T("/>\n"), fp); -} - -static void XMLCALL -metaEndNamespaceDecl(void *userData, const XML_Char *prefix) -{ - XML_Parser parser = (XML_Parser) userData; - FILE *fp = (FILE *)XML_GetUserData(parser); - if (!prefix) - fputts(T("<endns/>\n"), fp); - else - ftprintf(fp, T("<endns prefix=\"%s\"/>\n"), prefix); -} - -static int XMLCALL -unknownEncodingConvert(void *data, const char *p) -{ - return codepageConvert(*(int *)data, p); -} - -static int XMLCALL -unknownEncoding(void *userData, const XML_Char *name, XML_Encoding *info) -{ - int cp; - static const XML_Char prefixL[] = T("windows-"); - static const XML_Char prefixU[] = T("WINDOWS-"); - int i; - - for (i = 0; prefixU[i]; i++) - if (name[i] != prefixU[i] && name[i] != prefixL[i]) - return 0; - - cp = 0; - for (; name[i]; i++) { - static const XML_Char digits[] = T("0123456789"); - const XML_Char *s = tcschr(digits, name[i]); - if (!s) - return 0; - cp *= 10; - cp += (int)(s - digits); - if (cp >= 0x10000) - return 0; - } - if (!codepageMap(cp, info->map)) - return 0; - info->convert = unknownEncodingConvert; - /* We could just cast the code page integer to a void *, - and avoid the use of release. */ - info->release = free; - info->data = malloc(sizeof(int)); - if (!info->data) - return 0; - *(int *)info->data = cp; - return 1; -} - -static int XMLCALL -notStandalone(void *userData) -{ - return 0; -} - -static void -showVersion(XML_Char *prog) -{ - XML_Char *s = prog; - XML_Char ch; - const XML_Feature *features = XML_GetFeatureList(); - while ((ch = *s) != 0) { - if (ch == '/' -#if (defined(WIN32) || defined(__WATCOMC__)) - || ch == '\\' -#endif - ) - prog = s + 1; - ++s; - } - ftprintf(stdout, T("%s using %s\n"), prog, XML_ExpatVersion()); - if (features != NULL && features[0].feature != XML_FEATURE_END) { - int i = 1; - ftprintf(stdout, T("%s"), features[0].name); - if (features[0].value) - ftprintf(stdout, T("=%ld"), features[0].value); - while (features[i].feature != XML_FEATURE_END) { - ftprintf(stdout, T(", %s"), features[i].name); - if (features[i].value) - ftprintf(stdout, T("=%ld"), features[i].value); - ++i; - } - ftprintf(stdout, T("\n")); - } -} - -static void -usage(const XML_Char *prog, int rc) -{ - ftprintf(stderr, - T("usage: %s [-n] [-p] [-r] [-s] [-w] [-x] [-d output-dir] " - "[-e encoding] file ...\n"), prog); - exit(rc); -} - -int -tmain(int argc, XML_Char **argv) -{ - int i, j; - const XML_Char *outputDir = NULL; - const XML_Char *encoding = NULL; - unsigned processFlags = XML_MAP_FILE; - int windowsCodePages = 0; - int outputType = 0; - int useNamespaces = 0; - int requireStandalone = 0; - enum XML_ParamEntityParsing paramEntityParsing = - XML_PARAM_ENTITY_PARSING_NEVER; - int useStdin = 0; - -#ifdef _MSC_VER - _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); -#endif - - i = 1; - j = 0; - while (i < argc) { - if (j == 0) { - if (argv[i][0] != T('-')) - break; - if (argv[i][1] == T('-') && argv[i][2] == T('\0')) { - i++; - break; - } - j++; - } - switch (argv[i][j]) { - case T('r'): - processFlags &= ~XML_MAP_FILE; - j++; - break; - case T('s'): - requireStandalone = 1; - j++; - break; - case T('n'): - useNamespaces = 1; - j++; - break; - case T('p'): - paramEntityParsing = XML_PARAM_ENTITY_PARSING_ALWAYS; - /* fall through */ - case T('x'): - processFlags |= XML_EXTERNAL_ENTITIES; - j++; - break; - case T('w'): - windowsCodePages = 1; - j++; - break; - case T('m'): - outputType = 'm'; - j++; - break; - case T('c'): - outputType = 'c'; - useNamespaces = 0; - j++; - break; - case T('t'): - outputType = 't'; - j++; - break; - case T('d'): - if (argv[i][j + 1] == T('\0')) { - if (++i == argc) - usage(argv[0], 2); - outputDir = argv[i]; - } - else - outputDir = argv[i] + j + 1; - i++; - j = 0; - break; - case T('e'): - if (argv[i][j + 1] == T('\0')) { - if (++i == argc) - usage(argv[0], 2); - encoding = argv[i]; - } - else - encoding = argv[i] + j + 1; - i++; - j = 0; - break; - case T('h'): - usage(argv[0], 0); - return 0; - case T('v'): - showVersion(argv[0]); - return 0; - case T('\0'): - if (j > 1) { - i++; - j = 0; - break; - } - /* fall through */ - default: - usage(argv[0], 2); - } - } - if (i == argc) { - useStdin = 1; - processFlags &= ~XML_MAP_FILE; - i--; - } - for (; i < argc; i++) { - FILE *fp = 0; - XML_Char *outName = 0; - int result; - XML_Parser parser; - if (useNamespaces) - parser = XML_ParserCreateNS(encoding, NSSEP); - else - parser = XML_ParserCreate(encoding); - if (requireStandalone) - XML_SetNotStandaloneHandler(parser, notStandalone); - XML_SetParamEntityParsing(parser, paramEntityParsing); - if (outputType == 't') { - /* This is for doing timings; this gives a more realistic estimate of - the parsing time. */ - outputDir = 0; - XML_SetElementHandler(parser, nopStartElement, nopEndElement); - XML_SetCharacterDataHandler(parser, nopCharacterData); - XML_SetProcessingInstructionHandler(parser, nopProcessingInstruction); - } - else if (outputDir) { - const XML_Char * delim = T("/"); - const XML_Char *file = useStdin ? T("STDIN") : argv[i]; - if (!useStdin) { - /* Jump after last (back)slash */ - const XML_Char * lastDelim = tcsrchr(file, delim[0]); - if (lastDelim) - file = lastDelim + 1; -#if (defined(WIN32) || defined(__WATCOMC__)) - else { - const XML_Char * winDelim = T("\\"); - lastDelim = tcsrchr(file, winDelim[0]); - if (lastDelim) { - file = lastDelim + 1; - delim = winDelim; - } - } -#endif - } - outName = (XML_Char *)malloc((tcslen(outputDir) + tcslen(file) + 2) - * sizeof(XML_Char)); - tcscpy(outName, outputDir); - tcscat(outName, delim); - tcscat(outName, file); - fp = tfopen(outName, T("wb")); - if (!fp) { - tperror(outName); - exit(1); - } - setvbuf(fp, NULL, _IOFBF, 16384); -#ifdef XML_UNICODE - puttc(0xFEFF, fp); -#endif - XML_SetUserData(parser, fp); - switch (outputType) { - case 'm': - XML_UseParserAsHandlerArg(parser); - XML_SetElementHandler(parser, metaStartElement, metaEndElement); - XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction); - XML_SetCommentHandler(parser, metaComment); - XML_SetCdataSectionHandler(parser, metaStartCdataSection, - metaEndCdataSection); - XML_SetCharacterDataHandler(parser, metaCharacterData); - XML_SetDoctypeDeclHandler(parser, metaStartDoctypeDecl, - metaEndDoctypeDecl); - XML_SetEntityDeclHandler(parser, metaEntityDecl); - XML_SetNotationDeclHandler(parser, metaNotationDecl); - XML_SetNamespaceDeclHandler(parser, metaStartNamespaceDecl, - metaEndNamespaceDecl); - metaStartDocument(parser); - break; - case 'c': - XML_UseParserAsHandlerArg(parser); - XML_SetDefaultHandler(parser, markup); - XML_SetElementHandler(parser, defaultStartElement, defaultEndElement); - XML_SetCharacterDataHandler(parser, defaultCharacterData); - XML_SetProcessingInstructionHandler(parser, - defaultProcessingInstruction); - break; - default: - if (useNamespaces) - XML_SetElementHandler(parser, startElementNS, endElementNS); - else - XML_SetElementHandler(parser, startElement, endElement); - XML_SetCharacterDataHandler(parser, characterData); -#ifndef W3C14N - XML_SetProcessingInstructionHandler(parser, processingInstruction); -#endif /* not W3C14N */ - break; - } - } - if (windowsCodePages) - XML_SetUnknownEncodingHandler(parser, unknownEncoding, 0); - result = XML_ProcessFile(parser, useStdin ? NULL : argv[i], processFlags); - if (outputDir) { - if (outputType == 'm') - metaEndDocument(parser); - fclose(fp); - if (!result) { - tremove(outName); - exit(2); - } - free(outName); - } - XML_ParserFree(parser); - } - return 0; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp deleted file mode 100644 index eb80c62b..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwf.dsp +++ /dev/null @@ -1,139 +0,0 @@ -# Microsoft Developer Studio Project File - Name="xmlwf" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=xmlwf - Win32 Release -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "xmlwf.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "xmlwf.mak" CFG="xmlwf - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "xmlwf - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "xmlwf - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "xmlwf - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir ".\Release" -# PROP BASE Intermediate_Dir ".\Release" -# PROP BASE Target_Dir "." -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\win32\bin\Release" -# PROP Intermediate_Dir "..\win32\tmp\Release-xmlwf" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "." -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\lib" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "COMPILED_FROM_DSP" /FD /c -# SUBTRACT CPP /YX /Yc /Yu -# ADD BASE RSC /l 0x809 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /subsystem:console /machine:I386 -# ADD LINK32 libexpat.lib setargv.obj /nologo /subsystem:console /pdb:none /machine:I386 /libpath:"..\win32\bin\Release" /out:"..\win32\bin\Release\xmlwf.exe" -# SUBTRACT LINK32 /nodefaultlib - -!ELSEIF "$(CFG)" == "xmlwf - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir ".\Debug" -# PROP BASE Intermediate_Dir ".\Debug" -# PROP BASE Target_Dir "." -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\win32\bin\Debug" -# PROP Intermediate_Dir "..\win32\tmp\Debug-xmlwf" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "." -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c -# ADD CPP /nologo /MTd /W3 /GX /ZI /Od /I "..\lib" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "COMPILED_FROM_DSP" /FD /c -# SUBTRACT CPP /Fr /YX -# ADD BASE RSC /l 0x809 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 /nologo /subsystem:console /debug /machine:I386 -# ADD LINK32 libexpat.lib setargv.obj /nologo /subsystem:console /pdb:none /debug /machine:I386 /libpath:"..\win32\bin\Debug" /out:"..\win32\bin\Debug\xmlwf.exe" - -!ENDIF - -# Begin Target - -# Name "xmlwf - Win32 Release" -# Name "xmlwf - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" -# Begin Source File - -SOURCE=.\codepage.c -# End Source File -# Begin Source File - -SOURCE=.\readfilemap.c -# PROP Exclude_From_Build 1 -# End Source File -# Begin Source File - -SOURCE=.\unixfilemap.c -# PROP Exclude_From_Build 1 -# End Source File -# Begin Source File - -SOURCE=.\win32filemap.c -# End Source File -# Begin Source File - -SOURCE=.\xmlfile.c -# End Source File -# Begin Source File - -SOURCE=.\xmlwf.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" -# Begin Source File - -SOURCE=.\codepage.h -# End Source File -# Begin Source File - -SOURCE=.\xmlfile.h -# End Source File -# Begin Source File - -SOURCE=.\xmltchar.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwin32url.cxx b/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwin32url.cxx deleted file mode 100644 index bbfcce22..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/_expat/xmlwf/xmlwin32url.cxx +++ /dev/null @@ -1,395 +0,0 @@ -#include "expat.h" -#ifdef XML_UNICODE -#define UNICODE -#endif -#include <windows.h> -#include <urlmon.h> -#include <wininet.h> -#include <stdio.h> -#include <tchar.h> -#include "xmlurl.h" -#include "xmlmime.h" - -static int -processURL(XML_Parser parser, IMoniker *baseMoniker, const XML_Char *url); - -typedef void (*StopHandler)(void *, HRESULT); - -class Callback : public IBindStatusCallback { -public: - // IUnknown methods - STDMETHODIMP QueryInterface(REFIID,void **); - STDMETHODIMP_(ULONG) AddRef(); - STDMETHODIMP_(ULONG) Release(); - // IBindStatusCallback methods - STDMETHODIMP OnStartBinding(DWORD, IBinding *); - STDMETHODIMP GetPriority(LONG *); - STDMETHODIMP OnLowResource(DWORD); - STDMETHODIMP OnProgress(ULONG, ULONG, ULONG, LPCWSTR); - STDMETHODIMP OnStopBinding(HRESULT, LPCWSTR); - STDMETHODIMP GetBindInfo(DWORD *, BINDINFO *); - STDMETHODIMP OnDataAvailable(DWORD, DWORD, FORMATETC *, STGMEDIUM *); - STDMETHODIMP OnObjectAvailable(REFIID, IUnknown *); - Callback(XML_Parser, IMoniker *, StopHandler, void *); - ~Callback(); - int externalEntityRef(const XML_Char *context, - const XML_Char *systemId, const XML_Char *publicId); -private: - XML_Parser parser_; - IMoniker *baseMoniker_; - DWORD totalRead_; - ULONG ref_; - IBinding *pBinding_; - StopHandler stopHandler_; - void *stopArg_; -}; - -STDMETHODIMP_(ULONG) -Callback::AddRef() -{ - return ref_++; -} - -STDMETHODIMP_(ULONG) -Callback::Release() -{ - if (--ref_ == 0) { - delete this; - return 0; - } - return ref_; -} - -STDMETHODIMP -Callback::QueryInterface(REFIID riid, void** ppv) -{ - if (IsEqualGUID(riid, IID_IUnknown)) - *ppv = (IUnknown *)this; - else if (IsEqualGUID(riid, IID_IBindStatusCallback)) - *ppv = (IBindStatusCallback *)this; - else - return E_NOINTERFACE; - ((LPUNKNOWN)*ppv)->AddRef(); - return S_OK; -} - -STDMETHODIMP -Callback::OnStartBinding(DWORD, IBinding* pBinding) -{ - pBinding_ = pBinding; - pBinding->AddRef(); - return S_OK; -} - -STDMETHODIMP -Callback::GetPriority(LONG *) -{ - return E_NOTIMPL; -} - -STDMETHODIMP -Callback::OnLowResource(DWORD) -{ - return E_NOTIMPL; -} - -STDMETHODIMP -Callback::OnProgress(ULONG, ULONG, ULONG, LPCWSTR) -{ - return S_OK; -} - -STDMETHODIMP -Callback::OnStopBinding(HRESULT hr, LPCWSTR szError) -{ - if (pBinding_) { - pBinding_->Release(); - pBinding_ = 0; - } - if (baseMoniker_) { - baseMoniker_->Release(); - baseMoniker_ = 0; - } - stopHandler_(stopArg_, hr); - return S_OK; -} - -STDMETHODIMP -Callback::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindinfo) -{ - *pgrfBINDF = BINDF_ASYNCHRONOUS; - return S_OK; -} - -static void -reportError(XML_Parser parser) -{ - int code = XML_GetErrorCode(parser); - const XML_Char *message = XML_ErrorString(code); - if (message) - _ftprintf(stderr, _T("%s:%d:%ld: %s\n"), - XML_GetBase(parser), - XML_GetErrorLineNumber(parser), - XML_GetErrorColumnNumber(parser), - message); - else - _ftprintf(stderr, _T("%s: (unknown message %d)\n"), - XML_GetBase(parser), code); -} - -STDMETHODIMP -Callback::OnDataAvailable(DWORD grfBSCF, - DWORD dwSize, - FORMATETC *pfmtetc, - STGMEDIUM* pstgmed) -{ - if (grfBSCF & BSCF_FIRSTDATANOTIFICATION) { - IWinInetHttpInfo *hp; - HRESULT hr = pBinding_->QueryInterface(IID_IWinInetHttpInfo, - (void **)&hp); - if (SUCCEEDED(hr)) { - char contentType[1024]; - DWORD bufSize = sizeof(contentType); - DWORD flags = 0; - contentType[0] = 0; - hr = hp->QueryInfo(HTTP_QUERY_CONTENT_TYPE, contentType, - &bufSize, 0, NULL); - if (SUCCEEDED(hr)) { - char charset[CHARSET_MAX]; - getXMLCharset(contentType, charset); - if (charset[0]) { -#ifdef XML_UNICODE - XML_Char wcharset[CHARSET_MAX]; - XML_Char *p1 = wcharset; - const char *p2 = charset; - while ((*p1++ = (unsigned char)*p2++) != 0) - ; - XML_SetEncoding(parser_, wcharset); -#else - XML_SetEncoding(parser_, charset); -#endif - } - } - hp->Release(); - } - } - if (!parser_) - return E_ABORT; - if (pstgmed->tymed == TYMED_ISTREAM) { - while (totalRead_ < dwSize) { -#define READ_MAX (64*1024) - DWORD nToRead = dwSize - totalRead_; - if (nToRead > READ_MAX) - nToRead = READ_MAX; - void *buf = XML_GetBuffer(parser_, nToRead); - if (!buf) { - _ftprintf(stderr, _T("out of memory\n")); - return E_ABORT; - } - DWORD nRead; - HRESULT hr = pstgmed->pstm->Read(buf, nToRead, &nRead); - if (SUCCEEDED(hr)) { - totalRead_ += nRead; - if (!XML_ParseBuffer(parser_, - nRead, - (grfBSCF & BSCF_LASTDATANOTIFICATION) != 0 - && totalRead_ == dwSize)) { - reportError(parser_); - return E_ABORT; - } - } - } - } - return S_OK; -} - -STDMETHODIMP -Callback::OnObjectAvailable(REFIID, IUnknown *) -{ - return S_OK; -} - -int -Callback::externalEntityRef(const XML_Char *context, - const XML_Char *systemId, - const XML_Char *publicId) -{ - XML_Parser entParser = XML_ExternalEntityParserCreate(parser_, context, 0); - XML_SetBase(entParser, systemId); - int ret = processURL(entParser, baseMoniker_, systemId); - XML_ParserFree(entParser); - return ret; -} - -Callback::Callback(XML_Parser parser, IMoniker *baseMoniker, - StopHandler stopHandler, void *stopArg) -: parser_(parser), - baseMoniker_(baseMoniker), - ref_(0), - pBinding_(0), - totalRead_(0), - stopHandler_(stopHandler), - stopArg_(stopArg) -{ - if (baseMoniker_) - baseMoniker_->AddRef(); -} - -Callback::~Callback() -{ - if (pBinding_) - pBinding_->Release(); - if (baseMoniker_) - baseMoniker_->Release(); -} - -static int -externalEntityRef(void *arg, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) -{ - return ((Callback *)arg)->externalEntityRef(context, systemId, publicId); -} - - -static HRESULT -openStream(XML_Parser parser, - IMoniker *baseMoniker, - const XML_Char *uri, - StopHandler stopHandler, void *stopArg) -{ - if (!XML_SetBase(parser, uri)) - return E_OUTOFMEMORY; - HRESULT hr; - IMoniker *m; -#ifdef XML_UNICODE - hr = CreateURLMoniker(0, uri, &m); -#else - LPWSTR uriw = new wchar_t[strlen(uri) + 1]; - for (int i = 0;; i++) { - uriw[i] = uri[i]; - if (uriw[i] == 0) - break; - } - hr = CreateURLMoniker(baseMoniker, uriw, &m); - delete [] uriw; -#endif - if (FAILED(hr)) - return hr; - IBindStatusCallback *cb = new Callback(parser, m, stopHandler, stopArg); - XML_SetExternalEntityRefHandler(parser, externalEntityRef); - XML_SetExternalEntityRefHandlerArg(parser, cb); - cb->AddRef(); - IBindCtx *b; - if (FAILED(hr = CreateAsyncBindCtx(0, cb, 0, &b))) { - cb->Release(); - m->Release(); - return hr; - } - cb->Release(); - IStream *pStream; - hr = m->BindToStorage(b, 0, IID_IStream, (void **)&pStream); - if (SUCCEEDED(hr)) { - if (pStream) - pStream->Release(); - } - if (hr == MK_S_ASYNCHRONOUS) - hr = S_OK; - m->Release(); - b->Release(); - return hr; -} - -struct QuitInfo { - const XML_Char *url; - HRESULT hr; - int stop; -}; - -static void -winPerror(const XML_Char *url, HRESULT hr) -{ - LPVOID buf; - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_HMODULE, - GetModuleHandleA("urlmon.dll"), - hr, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buf, - 0, - NULL) - || FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM, - 0, - hr, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buf, - 0, - NULL)) { - /* The system error messages seem to end with a newline. */ - _ftprintf(stderr, _T("%s: %s"), url, buf); - fflush(stderr); - LocalFree(buf); - } - else - _ftprintf(stderr, _T("%s: error %x\n"), url, hr); -} - -static void -threadQuit(void *p, HRESULT hr) -{ - QuitInfo *qi = (QuitInfo *)p; - qi->hr = hr; - qi->stop = 1; -} - -extern "C" -int -XML_URLInit(void) -{ - return SUCCEEDED(CoInitialize(0)); -} - -extern "C" -void -XML_URLUninit(void) -{ - CoUninitialize(); -} - -static int -processURL(XML_Parser parser, IMoniker *baseMoniker, - const XML_Char *url) -{ - QuitInfo qi; - qi.stop = 0; - qi.url = url; - - XML_SetBase(parser, url); - HRESULT hr = openStream(parser, baseMoniker, url, threadQuit, &qi); - if (FAILED(hr)) { - winPerror(url, hr); - return 0; - } - else if (FAILED(qi.hr)) { - winPerror(url, qi.hr); - return 0; - } - MSG msg; - while (!qi.stop && GetMessage (&msg, NULL, 0, 0)) { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - return 1; -} - -extern "C" -int -XML_ProcessURL(XML_Parser parser, - const XML_Char *url, - unsigned flags) -{ - return processURL(parser, 0, url); -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp b/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp deleted file mode 100644 index cd71111e..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.cpp +++ /dev/null @@ -1,428 +0,0 @@ -#include <algorithm> -#include "aolxml.h" -#include "stl/stringUtils.h" -#include <map> - -#ifdef AOLXML_FASTLOOKUP -#ifdef _WIN32 -#include <crtdbg.h> -#endif -#endif - -using namespace std; -using namespace stringUtil; - -// stl helpers -static void ndelete(aolxml::node *n) { delete n; } -static bool matchNameVS2005(const aolxml::node* n, string name) - { return (n->name() == name); } -////////// - -aolxml::node::~node() -{ - // delete the children - for_each(m_children.begin(),m_children.end(),ndelete); -} - -void aolxml::node::deleteChild(childIterator_t i) -{ - // deletes child and all subchildren - aolxml::node *n = (*i); - -#ifdef AOLXML_FASTLOOKUP - bool found(false); - for(nameToNodeMap_t::iterator mi = m_nameToNodeMap.begin(); mi != m_nameToNodeMap.end(); ++mi) - { - if ((*mi).second == n) - { - m_nameToNodeMap.erase(mi); - found = true; - break; - } - } - _ASSERTE(found); -#endif - m_children.erase(i); - - delete n; -} - -bool aolxml::node::deleteChild(aolxml::node *n) -{ - list<node*>::iterator i = find(m_children.begin(),m_children.end(),n); - if (i != m_children.end()) - { - #ifdef AOLXML_FASTLOOKUP - bool found(false); - for(nameToNodeMap_t::iterator mi = m_nameToNodeMap.begin(); mi != m_nameToNodeMap.end(); ++mi) - { - if ((*mi).second == n) - { - m_nameToNodeMap.erase(mi); - found = true; - break; - } - } - _ASSERTE(found); - #endif - m_children.erase(i); - delete n; - return true; - } - return false; -} - -void aolxml::node::snipChild(childIterator_t i) -{ - // remove child from this node but keeps subtree in tact -#ifdef AOLXML_FASTLOOKUP - aolxml::node *n = (*i); - bool found(false); - for(nameToNodeMap_t::iterator mi = m_nameToNodeMap.begin(); mi != m_nameToNodeMap.end(); ++mi) - { - if ((*mi).second == n) - { - m_nameToNodeMap.erase(mi); - found = true; - break; - } - } - _ASSERTE(found); -#endif - (*i)->m_parent = 0; - m_children.erase(i); -} - -void aolxml::node::addChild(node *n) -{ - n->m_parent = this; - m_children.push_back(n); -#ifdef AOLXML_FASTLOOKUP - m_nameToNodeMap.insert(make_pair(n->name(),n)); -#endif -} - -void aolxml::node::insertChild(childIterator_t i,node *n) -{ - n->m_parent = this; - m_children.insert(i,n); -#ifdef AOLXML_FASTLOOKUP - m_nameToNodeMap.insert(make_pair(n->name(),n)); -#endif -} - -aolxml::node* aolxml::node::findNode(node *root,const string &path) throw() -{ - if (path.empty() || (!root)) - { - return 0; - } - - vector<string> v = tokenizer(path,'/'); - - node *current = root; - if (path[0] == '/') - { - // move to root of tree - while (current->parent()) - current = current->parent(); - - // make sure first tag matches first token - if (current && (!v.empty()) && (current->name() != v[0])) - { - current = 0; - } - else - { - v.erase(v.begin()); - } - } - - for(vector<string>::const_iterator i = v.begin(); (i != v.end()) && current; ++i) - { - string s = stripWhitespace(*i); - if (s == "" || s == ".") - { - continue; - } - else if (s == "..") - { - current = current->parent(); - } - else - { -#ifdef AOLXML_FASTLOOKUP - nameToNodeMap_t::iterator mi = current->m_nameToNodeMap.find(s); - current = (mi == current->m_nameToNodeMap.end() ? 0 : (*mi).second); -#else - list<aolxml::node*>::iterator ci = find_if( - current->childrenBegin(),current->childrenEnd(),bind2nd(ptr_fun(matchNameVS2005),s)); - current = (ci == current->childrenEnd() ? 0 : (*ci)); -#endif - } - } - - return current; -} - -list<aolxml::node*> aolxml::node::findNodes(node *root,const string &path) throw() -{ - list<aolxml::node*> result; - - if (path.empty() || (!root)) - { - return result; - } - - vector<string> v = tokenizer(path,'/'); - - node *current = root; - if (path[0] == '/') - { - // move to root of tree - while (current->parent()) - { - current = current->parent(); - } - - // make sure first tag matches first token - if (current && (!v.empty()) && (current->name() != v[0])) - { - current = 0; - } - else - { - v.erase(v.begin()); - } - } - - string last; - if (!v.empty()) - { - last = v.back(); - v.pop_back(); - } - - for(vector<string>::const_iterator i = v.begin(); (i != v.end()) && current; ++i) - { - string s = stripWhitespace(*i); - if (s == "" || s == ".") - { - continue; - } - else if (s == "..") - { - current = current->parent(); - } - else - { -#ifdef AOLXML_FASTLOOKUP - nameToNodeMap_t::iterator mi = current->m_nameToNodeMap.find(s); - current = (mi == current->m_nameToNodeMap.end() ? 0 : (*mi).second); -#else - list<aolxml::node*>::iterator ci = find_if( - current->childrenBegin(),current->childrenEnd(),bind2nd(ptr_fun(matchNameVS2005),s)); - current = (ci == current->childrenEnd() ? 0 : (*ci)); -#endif - } - } - // now do last - if (current && last != "") - { - list<node*> nv = current->m_children; - copy(nv.begin(),stable_partition(nv.begin(),nv.end(),bind2nd(ptr_fun(matchNameVS2005),last)),back_inserter(result)); - } - - return result; -} - -static bool isAttr(pair<string,string> attr,string name) throw() -{ - return (attr.first == name); -} - -aolxml::node::attributeList_t::iterator aolxml::node::findAttribute(const string &name) throw() -{ - return find_if(m_attributes.begin(),m_attributes.end(),bind2nd(ptr_fun(isAttr),name)); -} - -aolxml::node::attributeList_t::const_iterator aolxml::node::findAttribute(const string &name) const throw() -{ - return find_if(m_attributes.begin(),m_attributes.end(),bind2nd(ptr_fun(isAttr),name)); -} - -std::string aolxml::node::findAttributeString(const std::string &attr,const std::string &deflt) const throw() -{ - aolxml::node::attributeList_t::const_iterator i = findAttribute(attr); - return (i == m_attributes.end() ? deflt : (*i).second); -} - -std::string aolxml::node::findAttributeStringTHROW(const std::string &attr) const throw(std::runtime_error) -{ - aolxml::node::attributeList_t::const_iterator i = findAttribute(attr); - if (i == m_attributes.end()) - { - throw runtime_error("attribute " + attr + " in node " + m_name + " not found."); - } - return (*i).second; -} - -void aolxml::node::findAttributeStringTHROW(const std::string &attr,std::string &s) const throw(std::runtime_error) -{ - s = findAttributeStringTHROW(attr); -} - -void aolxml::node::findAttributeStringTHROW(const std::string &attr,int &i) const throw(std::runtime_error) -{ - i = atoi(findAttributeStringTHROW(attr).c_str()); -} - -void aolxml::node::findAttributeStringTHROW(const std::string &attr,double &d) const throw(std::runtime_error) -{ - d = atof(findAttributeStringTHROW(attr).c_str()); -} - -///////////////////////////////////////////////////////////////////////////// -////////////////////// Parsing (expat) ////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////// - -void aolxml::StartTag (void *parser, const XML_Char * name, const XML_Char ** atts) -{ - aolxml::node* parent = reinterpret_cast<aolxml::node*>(XML_GetUserData((XML_Parser) parser)); - aolxml::node* current = new aolxml::node(name); - - if (parent) - { - current->m_preserveSpaces = parent->m_preserveSpaces; - parent->addChild(current); - } - - int attnum = XML_GetSpecifiedAttributeCount((XML_Parser) parser); - for (int i = 0; i < attnum; i += 2) - { - string key = atts[i]; - string value = atts[i+1]; - current->addAttribute(aolxml::node::attribute_t(key,value)); - if (key == "xml:space") - { - current->m_preserveSpaces = (value == "preserve"); - } - } - - XML_SetUserData((XML_Parser) parser, current); -} - -void aolxml::EndTag(void *parser, const XML_Char * /*name*/) -{ - aolxml::node* current = reinterpret_cast<aolxml::node*>(XML_GetUserData ((XML_Parser) parser)); - if (!current->m_preserveSpaces) - { - current->pcdata() = stripWhitespace(current->pcdata()); - } - XML_SetUserData((XML_Parser) parser,current->parent() ? current->parent() : current); -} - -void aolxml::CData(void *parser) -{ - aolxml::node* tag = reinterpret_cast<aolxml::node*>(XML_GetUserData ((XML_Parser) parser)); - tag->m_preserveSpaces = true; -} - -void aolxml::PCData (void *parser, const XML_Char * s, int len) -{ - aolxml::node* tag = reinterpret_cast<aolxml::node*>(XML_GetUserData ((XML_Parser) parser)); - - string ss(s,s+len); - tag->pcdata() = tag->pcdata() + ss;//(tag->m_preserveSpaces ? ss : stripWhitespace(ss)); - // whitespace stripping moved to end tag because sometimes we get the PCData in - // multiple calls -} - -aolxml::node* aolxml::node::parse(const char *data,size_t len) throw(runtime_error) -{ - aolxml::node *root = 0; - - XML_Parser parser = XML_ParserCreate (NULL); - - // setup the parser - XML_UseParserAsHandlerArg(parser); - XML_SetElementHandler(parser, StartTag, EndTag); - XML_SetCharacterDataHandler(parser, PCData); - XML_SetUserData(parser, 0); - XML_SetStartCdataSectionHandler(parser,CData); - - if (XML_Parse(parser, data,(int)len, 1)) - { - root = reinterpret_cast<aolxml::node*>(XML_GetUserData (parser)); - } - else - { - // cleanup tree fragment - root = reinterpret_cast<aolxml::node*>(XML_GetUserData (parser)); - if (root) - { - while (root->parent()) - { - root = root->parent(); - } - delete root; - } - ////////// - - std::ostringstream o; - o << "[XML] " << XML_ErrorString(XML_GetErrorCode(parser)) << - " at line " << XML_GetCurrentLineNumber(parser); - XML_ParserFree(parser); - throw std::runtime_error(o.str()); - } - - XML_ParserFree (parser); - return root; -} - -aolxml::node* aolxml::node::parse(const string &text) throw(runtime_error) -{ - return aolxml::node::parse(text.c_str(),text.size()); -} - -aolxml::node* aolxml::node::parse(const uniString::utf8::value_type *data,size_t len) throw(std::runtime_error) -{ - return aolxml::node::parse((const char *)data,len); -} - -aolxml::node* aolxml::node::parse(const uniString::utf8 &text) throw(std::runtime_error) -{ - return aolxml::node::parse(&(text[0]),text.size()); -} - -static void out_tabs(ostream &o,int t) -{ - for(int x = 0; x < t; ++x) o << "\t"; -} - -static void outputXML(ostream &o,const aolxml::node *n,int tabs) -{ - o << endl; out_tabs(o,tabs); - o << "<" << n->name(); - for(aolxml::node::attributeList_t::const_iterator i = n->attributes().begin(); - i != n->attributes().end(); ++i) - o << " " << (*i).first << "=\"" << (*i).second << "\""; - o << ">" << n->pcdata(); - if (!n->childrenEmpty()) - { - for(aolxml::node::const_childIterator_t i = n->childrenBegin(); i != n->childrenEnd(); ++i) - { - outputXML(o,(*i),tabs+1); - } - o << endl; - out_tabs(o,tabs); - } - o << "</" << n->name() << ">"; -} - -ostream& aolxml::operator<<(ostream &o,const aolxml::node *n) -{ - outputXML(o,n,0); - o << endl; - return o; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h b/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h deleted file mode 100644 index f87e4789..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/aolxml.h +++ /dev/null @@ -1,372 +0,0 @@ -#pragma once -#ifndef xml_H_ -#define xml_H_ - -#include <string.h> -#include <string> -#include <stdexcept> -#include <list> -#include <numeric> -#include <functional> -#include "stl/stringUtils.h" -#include "unicode/uniString.h" - -#define XMLIMPORT -#include "expat.h" - -#ifdef _WIN32 -#pragma warning(push) -#pragma warning( disable : 4290 ) -#pragma warning( disable : 4996 ) -#endif - -//#define AOLXML_FASTLOOKUP 1 - -#ifdef AOLXML_FASTLOOKUP -#include <map> -#endif - -namespace aolxml -{ - class node - { - public: - typedef std::pair<std::string,std::string> attribute_t; - typedef std::list<attribute_t> attributeList_t; - typedef std::list<node*> nodeList_t; - typedef nodeList_t::iterator childIterator_t; - typedef nodeList_t::const_iterator const_childIterator_t; - - private: - std::string m_name; - attributeList_t m_attributes; - std::string m_pcdata; - node* m_parent; - std::list<node*> m_children; - -#ifdef AOLXML_FASTLOOKUP - typedef std::multimap<std::string,node*> nameToNodeMap_t; - nameToNodeMap_t m_nameToNodeMap; -#endif - bool m_preserveSpaces; - - public: - node(const std::string &name,const std::string &pcd = "") - :m_name(name),m_pcdata(pcd),m_parent(0),m_preserveSpaces(false){} - - ~node(); - - const std::string &name() const throw() { return m_name; } - std::string& name() throw() { return m_name; } - - attributeList_t& attributes() throw() { return m_attributes; } - const attributeList_t& attributes() const throw() { return m_attributes; } - void addAttribute(const attribute_t &a) throw() { m_attributes.push_back(a); } - attributeList_t::iterator findAttribute(const std::string &attr) throw(); - attributeList_t::const_iterator findAttribute(const std::string &attr) const throw(); - std::string findAttributeString(const std::string &attr,const std::string &deflt = "") const throw(); - std::string findAttributeStringTHROW(const std::string &attr) const throw(std::runtime_error); // throws if attribute not found - void findAttributeStringTHROW(const std::string &attr,std::string &s) const throw(std::runtime_error); - void findAttributeStringTHROW(const std::string &attr,int &i) const throw(std::runtime_error); - void findAttributeStringTHROW(const std::string &attr,double &f) const throw(std::runtime_error); - - node* parent() throw() { return m_parent;} - const node* parent() const throw() { return m_parent; } - const std::string &pcdata() const throw() { return m_pcdata; } - std::string& pcdata() throw() { return m_pcdata; } - - childIterator_t childrenBegin() throw() { return m_children.begin(); } - childIterator_t childrenEnd() throw() { return m_children.end(); } - const_childIterator_t childrenBegin() const throw() { return m_children.begin(); } - const_childIterator_t childrenEnd() const throw() { return m_children.end(); } - bool childrenEmpty() const throw() { return m_children.empty(); } - - void deleteChild(childIterator_t i); // deletes child and all subchildren - bool deleteChild(node *n); - void snipChild(childIterator_t i); // remove child from this node but keeps subtree in tact - - void addChild(node *n); - void insertChild(childIterator_t i,node *n); - - static node* findNode(node *root,const std::string &path) throw(); - static nodeList_t findNodes(node *root,const std::string &path) throw(); - - static node* parse(const std::string &text) throw(std::runtime_error); - static node* parse(const char *data,size_t len) throw(std::runtime_error); - static node* parse(const uniString::utf8 &text) throw(std::runtime_error); - static node* parse(const uniString::utf8::value_type *data,size_t len) throw(std::runtime_error); - - friend std::ostream& operator<<(std::ostream &o,const node *n); - friend void StartTag (void *parser, const XML_Char * name, const XML_Char ** atts); - friend void EndTag(void *parser, const XML_Char * name); - friend void PCData (void *parser, const XML_Char * s, int len); - friend void CData(void *parser); - }; - - ////////////////////////////////////////////// - ///// utility functions on nodes //////// - //////////////////////////////////////////////// - - template<typename T> // convert from text - inline T nodeText(node *n) { return n->pcdata(); } - - template<> - inline int nodeText(node *n) { return atoi(n->pcdata().c_str()); } - - template<> - inline unsigned short nodeText(node *n) { return atoi(n->pcdata().c_str()); } - -#ifdef _WIN32 - template<> - inline __int64 nodeText(node *n) { return _strtoi64(n->pcdata().c_str(),0,10); } - - template<> - inline unsigned __int64 nodeText(node *n) { return _strtoui64(n->pcdata().c_str(),0,10); } -#endif - - template<> - inline bool nodeText(node *n) - { - const std::string &s = n->pcdata(); - if (s.empty()) return false; - return (s[0] == 't' || s[0] == 'T' || s[0] == '1' || s[0] == 'y' || s[0] == 'Y'); - } - - template<> - inline double nodeText(node *n) { return atof(n->pcdata().c_str()); } - - - // get a subnode value. Returns true if value existed - template<typename T> - inline bool subNodeText(node *n,const std::string &path,T& value,const T defaultValue) throw() - { - value = defaultValue; - if (!n) - { - return false; - } - node *subNode = node::findNode(n,path); - if (!subNode) - { - return false; - } - value = aolxml::nodeText<T>(subNode); - - return true; - } - - // same as above, but you cannot detect missing value - template<typename T> - inline T subNodeText(node *n,const std::string &path,const T defaultValue) throw() - { - if (!n) - { - return defaultValue; - } - node *subNode = node::findNode(n,path); - if (!subNode) - { - return defaultValue; - } - return aolxml::nodeText<T>(subNode); - } - - inline void subNodeText(node *n,const std::string &path,char *result,int maxLen,const char *defaultValue) throw() - { - strncpy(result,defaultValue,maxLen); - - if (!n) - { - return; - } - - node *subNode = node::findNode(n,path); - if (!subNode) - { - return; - } - std::string tmp = aolxml::nodeText<std::string>(subNode); - strncpy(result,tmp.c_str(),maxLen); - } - - // this one throws if the value is not found - template<typename T> - inline T subNodeTextTHROW(node *n,const std::string &path) throw(std::runtime_error) - { - if (!n) - { - throw std::runtime_error("node NULL"); - } - node *subNode = node::findNode(n,path); - if (!subNode) - { - throw std::runtime_error(path + " missing"); - } - return aolxml::nodeText<T>(subNode); - } - - // throws and returns value as a param instead of a function value - template<typename T> - inline void subNodeTextTHROW(node *n,const std::string &path,T &result) throw(std::runtime_error) - { - result = aolxml::subNodeTextTHROW<T>(n,path); - } - - /// calls function 'f' with each node in the list and the value 'l' - // The purpose is to allow you to write a function which will insert - // data from each node into container 'l' - template<typename L,typename Func> - inline void XMLList(L &l,const node::nodeList_t &lnode,Func f) throw(std::runtime_error) - { - for(node::nodeList_t::const_iterator i = lnode.begin(); i != lnode.end(); ++i) - { - if (*i) - { - f(l,*i); - } - } - } - - template<typename L,typename Func> - inline void XMLList(L &l,node::nodeList_t &lnode,Func f) throw(std::runtime_error) - { - for(node::nodeList_t::iterator i = lnode.begin(); i != lnode.end(); ++i) - { - if (*i) - { - f(l,*i); - } - } - } - - template<typename L,typename Func> - inline void XMLList(L &l,node *n,const std::string &path,Func f) throw(std::runtime_error) - { - if (!n) - { - return; - } - node::nodeList_t lnode = node::findNodes(n,path); - for(node::nodeList_t::iterator i = lnode.begin(); i != lnode.end(); ++i) - { - if (*i) - { - f(l,*i); - } - } - } - - - //**************************************************************** - //* Various templates for constructing XML data - //**************************************************************** - - // embed a value in a set of tags (<tag>value</tag>) providing a function - // which will convert the value to a string - template<typename T,typename ConverterFunc> - std::string xmlTag(const std::string &tag,const T value,ConverterFunc func) - { - return std::string("<") + tag + ">" + func(value) + "</" + tag + ">"; - } - - // embed a string convertible value to <tag>value</tag> - template<typename T> - std::string xmlTag(const std::string &tag,const T value) - { - return std::string("<") + tag + ">" + stringUtil::tos(value) + "</" + tag + ">"; - } - - inline std::string xmlTag(const std::string &tag,bool value) - { - return std::string("<") + tag + ">" + (value ? "1" : "0") + "</" + tag + ">"; - } - - // helper functor to make lists of web taged values using accumulate - template<typename T,typename ConverterFunc> - class xmlListFunctor: public std::binary_function<std::string,T,std::string> - { - std::string m_tag; - ConverterFunc m_func; - - public: - xmlListFunctor(const std::string &tag,ConverterFunc f): m_tag(tag),m_func(f){} - std::string operator()(const std::string &accum,const T &val) - { - return accum + xmlTag(m_tag,val,m_func); - } - }; - - // template function so we don't have to use the entire accumulate syntax. - /* example: - - list<string> items; - items.push_back("foo"); - items.push_back("bar"); - items.push_back("narf"); - - string result = xmlList(items,"junk"); - - // the value of result is now - // <junk>foo</junk><junk>bar</junk><junk>narf</junk> - */ - - template<typename Container> - std::string xmlList(const Container &c,const std::string &tag) - { - typedef std::string (*tostype)(const typename Container::value_type); - - return std::accumulate(c.begin(),c.end(),std::string(""), - xmlListFunctor<typename Container::value_type,tostype>(tag,stringUtil::tos<Container::value_type>)); - } - - // similar to xmlList, but you provide a converter func to make your values into a string - template<typename Container,typename ConverterFunc> - std::string xmlList(const Container &c,const std::string &tag,ConverterFunc func) - { - return std::accumulate(c.begin(),c.end(),std::string(""), - xmlListFunctor<typename Container::value_type,ConverterFunc>(tag,func)); - } - - // similar to xmlList, but with auto indenting - template<typename Container> - static std::string xmlListIndented(const Container &c,const std::string &tag,const std::string &indent) - { - std::string result; - for (typename Container::const_iterator i = c.begin(); i != c.end(); ++i) - { - result += indent + "<" + tag + ">" + stringUtil::tos(*i) + "</" + tag + ">" + stringUtil::eol(); - } - return result; - } - - template<typename Container,typename Func> - static std::string xmlListIndented(const Container &c,const std::string &tag,const std::string &indent,Func f) - { - std::string result; - for (typename Container::const_iterator i = c.begin(); i != c.end(); ++i) - { - result += indent + "<" + tag + ">" + stringUtil::eol(); - result += f(*i,indent + "\t"); - result += indent + "</" + tag + ">" + stringUtil::eol(); - } - return result; - } - - // escape a string so it is valid inside an XML tag - std::string escapeXML(const std::string &s) throw(); - uniString::utf8 escapeXML(const uniString::utf8 &s) throw(); - /*static std::string utf8Header() throw() { return "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"; } - static std::string latin1Header() throw() { return "<?xml version=\"1.0\" encoding=\"latin1\" ?>\n"; }*/ - - std::ostream& operator<<(std::ostream &o,const node *n); - void StartTag (void *parser, const XML_Char * name, const XML_Char ** atts); - void EndTag(void *parser, const XML_Char * name); - void PCData (void *parser, const XML_Char * s, int len); - void CData(void *parser); -} - -#ifdef _WIN32 -#pragma warning(pop) -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/aolxmlutils.cpp b/Src/Plugins/DSP/sc_serv3/aolxml/aolxmlutils.cpp deleted file mode 100644 index df8ad66d..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/aolxmlutils.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "aolxml.h" -#include "stl/stringUtils.h" -#include <map> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -class xmlEscapes: public map<char,string> -{ -public: - xmlEscapes() - { - (*this)['<'] = "<"; - (*this)['>'] = ">"; - (*this)['&'] = "&"; - (*this)['\''] = "'"; - (*this)['"'] = """; - } -}; - -static const xmlEscapes gsXmlEscapes; - -string aolxml::escapeXML(const string &s) throw() -{ - string result; - string::size_type siz = s.size(); - for(string::size_type x = 0; x < siz; ++x) - { - unsigned char uc = s[x]; - if (((uc > 0x7f) || (uc >= 1 && uc <= 8) || (uc >= 0x0b && uc <= 0x0c) || (uc >= 0x0e && uc <= 0x1f))) - { - result += "&#" + tos((unsigned int)uc) + ";"; - } - else - { - xmlEscapes::const_iterator i = gsXmlEscapes.find(s[x]); - if (i != gsXmlEscapes.end()) - result += (*i).second; - else - result += s[x]; - } - } - return result; -} - -utf8 aolxml::escapeXML(const utf8 &s) throw() -{ - string result; - string::size_type siz = s.size(); - for(string::size_type x = 0; x < siz; ++x) - { - //unsigned char uc = s[x]; - xmlEscapes::const_iterator i = gsXmlEscapes.find(s[x]); - if (i != gsXmlEscapes.end()) - result += (*i).second; - else - result += s[x]; - } - return result; -} diff --git a/Src/Plugins/DSP/sc_serv3/aolxml/unix_build_expat b/Src/Plugins/DSP/sc_serv3/aolxml/unix_build_expat deleted file mode 100644 index a54a8b4c..00000000 --- a/Src/Plugins/DSP/sc_serv3/aolxml/unix_build_expat +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -cd expat -chmod a+x configure -./configure --prefix=$OLDPWD -make install diff --git a/Src/Plugins/DSP/sc_serv3/auth.cpp b/Src/Plugins/DSP/sc_serv3/auth.cpp deleted file mode 100644 index 021e0919..00000000 --- a/Src/Plugins/DSP/sc_serv3/auth.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/* auth.cpp routines for authenticating client details with external server */ - -#include <curl/curl.h> -#include <list> - -#include "protocol_shoutcastClient.h" -#include "uvox2Common.h" -#include "webClient.h" -#include "auth.h" -#include "bandwidth.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -#define MAX_AUTH_THREADS 20 -#define AMNT_ALLOWED_BEFORE_SKIPPING 1000 - -#define LOGNAME "[AUTH] " -#define DEBUG_LOG(...) do { if (gOptions.authDebug()) DLOG(__VA_ARGS__); } while(0) - -extern int xferinfo(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow); - -namespace auth -{ - using namespace std; - using namespace uniString; - using namespace stringUtil; - - class authService - { - public: - time_t restart_time; - utf8 main_post; - list<auth_info*> clients; - CURL *m_curl; - bool in_use; - - authService(); - ~authService(); - - static THREAD_FUNC process(void *arg); - - friend void schedule(auth_info *info); - friend void init(); - }; - - list<auth_info*> g_queue; - AOL_namespace::mutex g_qMutex; - authService * g_services = 0; - utf8 g_authURL = DNAS_AUTH_URL; - -#ifdef CURLOPT_PASSWDFUNCTION - /* make sure that prompting at the console does not occur */ - static int my_getpass(void *client, char *prompt, char *buffer, int buflen) - { - buffer[0] = '\0'; - return 0; - } -#endif - - static int handle_returned_header(void *ptr, size_t size, size_t nmemb, void *stream) - { - auth_info *info = reinterpret_cast<auth_info*>(stream); - if (info) - { - utf8 line((char*)ptr); - if (!line.empty()) - { - line = stripWhitespace(line); - if (!line.empty()) - { - // skip over the initial HTTP header and just look at key pairs - utf8::size_type pos = line.find(utf8(":")); - if (pos != utf8::npos) - { - utf8 key = toLower(stripWhitespace(line.substr(0,pos))); - utf8 value = stripWhitespace(line.substr(pos+1)); - - if (!key.empty()) - { - DEBUG_LOG("[AUTH sid=" + tos(info->sid) + "] Auth Header [" + key + ":" + value + "]"); - - if (key == "shoutcast-auth-user") - { - if (value == "withintro") - { - info->has_intro = true; - } - info->authenticated = true; - info->valid_response = true; - } - else if (key == "advert-group") - { - info->group = atoi(value.hideAsString().c_str()); - #if defined(_DEBUG) || defined(DEBUG) - if (info->group == 1729) - { - info->group = 501; - } - #endif - info->valid_response = true; - } - } - } - } - } - } - - int amount = (int)(size * nmemb); - bandWidth::updateAmount(bandWidth::AUTH_AND_METRICS, amount); - return amount; - } - - static int handle_returned_data(void *ptr, size_t size, size_t nmemb, void *stream) - { - auth_info *info = reinterpret_cast<auth_info*>(stream); - if (info) - { - // cap any intro content to a few meg - if (info->has_intro && ((int)info->content.size() <= gOptions.maxSpecialFileSize())) - { - vector <__uint8> &v = info->content; - __uint8 *s = (__uint8*)ptr; - v.insert (v.end(), s, s + (size * nmemb)); - } - } - - int amount = (int)(size * nmemb); - bandWidth::updateAmount(bandWidth::AUTH_AND_METRICS, amount); - return amount; - } - - authService::authService() : restart_time(0), in_use(false) - { - m_curl = webClient::setupCurlDefaults (NULL, LOGNAME, g_authURL, 4L); - //DEBUG_LOG("[AUTH] Starting auth instance"); - } - - authService::~authService() - { - restart_time = 0; - in_use = false; - if (m_curl) - { - curl_easy_cleanup(m_curl); - m_curl = NULL; - } - //DEBUG_LOG("[AUTH] Stopping auth instance"); - } - - THREAD_FUNC authService::process(void* arg) - { - try - { - authService* m_auth = reinterpret_cast<authService*>(arg); - if (m_auth) - { - if (!iskilled()) - { - g_qMutex.lock(); - - while (!m_auth->clients.empty()) - { - auth_info *info = m_auth->clients.front(); - m_auth->clients.pop_front(); - g_qMutex.unlock(); - - if (info) - { - if (info->url.empty() == false) - { - g_qMutex.lock(); - m_auth->main_post = info->post; - m_auth->m_curl = webClient::setupCurlDefaults (m_auth->m_curl, LOGNAME, info->url, 4L); - DLOG ("updated main post to " + m_auth->main_post + " and URL " + info->url, LOGNAME, info->sid); - g_qMutex.unlock(); - } - - if (m_auth->restart_time && (::time(NULL) >= m_auth->restart_time)) - { - m_auth->restart_time = 0; - DEBUG_LOG("Restarting disabled auth", LOGNAME, info->sid); - } - - protocol_shoutcastClient *client = info->client; - if (client) // if set to be kicked then no point in processing - { - if (client->m_kickNextRound == false) - { - if (m_auth->restart_time) - { - // auth is disabled for now, but assume client is ok - info->authenticated = true; - } - else - { - if (info->post.empty() == false) - { - utf8 post = info->post + "&" + m_auth->main_post; - -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG("POST body: " + utf8(post.c_str()), LOGNAME, info->sid); -#endif - - char errormsg[CURL_ERROR_SIZE] = {0}; - if (m_auth->m_curl) - { - curl_easy_setopt(m_auth->m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt(m_auth->m_curl, CURLOPT_WRITEFUNCTION, handle_returned_data); - - curl_easy_setopt(m_auth->m_curl, CURLOPT_ERRORBUFFER, errormsg); - curl_easy_setopt(m_auth->m_curl, CURLOPT_HEADERDATA, info); - curl_easy_setopt(m_auth->m_curl, CURLOPT_WRITEDATA, info); - curl_easy_setopt(m_auth->m_curl, CURLOPT_POSTFIELDSIZE, post.size()); - curl_easy_setopt(m_auth->m_curl, CURLOPT_COPYPOSTFIELDS, post.c_str()); - - // use progress/xfer functions to trap for the server kill case - curl_easy_setopt(m_auth->m_curl, CURLOPT_NOPROGRESS, 0L); - curl_easy_setopt(m_auth->m_curl, CURLOPT_XFERINFOFUNCTION, xferinfo); - curl_easy_setopt(m_auth->m_curl, CURLOPT_XFERINFODATA, info->sid); - } - - CURLcode ret = CURLE_FAILED_INIT; - if (!m_auth->m_curl || ((ret = curl_easy_perform(m_auth->m_curl)) != CURLE_OK)) - { - ELOG("[AUTH sid=" + tos(info->sid) + "] Request failed on auth with " + - (errormsg[0] ? errormsg : curl_easy_strerror(ret))); - - g_qMutex.lock(); - if (m_auth->restart_time == 0) - { - m_auth->restart_time = ::time(NULL) + 60; - } - g_qMutex.unlock(); - - info->authenticated = true; - } - } - } - - if (info->authenticated) - { - // we need to double-check that the client still - // exists as there could have been a delay with - // the processing of this and it's since dropped - // or been kicked - if so we don't want to crash - //stats:: - - if (info->group >= 0) - { - client->setGroup(info->group); - } - if (info->has_intro) - { - DEBUG_LOG("[AUTH sid=" + tos(info->sid) + "] Listener auth supplied intro of " + tos((long)info->content.size())); - client->setIntro(info->content, info->m_dataType); - } - } - else - { - // if we didn't get the required header responses - // but we did get a valid response from the server - // then we should just allow the client to connect - // as we don't know what's going on so assume "ok" - if (!info->valid_response) - { - info->authenticated = true; - } - else - { - DEBUG_LOG("[AUTH sid=" + tos(info->sid) + "] Auth failed, 403 returned"); - client->return_403(); - } - } - } - - // if we're re-processing the client then we - // musn't re-schedule it else it'll go boom! - if (!info->delayed_auth) - { - threadedRunner::scheduleRunnable(client); - } - } - } - - delete info; - info = NULL; - - g_qMutex.lock(); - } - - m_auth->clients.clear(); - m_auth->in_use = false; - g_qMutex.unlock(); - } - } - } - catch (...) - { - authService* m_auth = reinterpret_cast<authService*>(arg); - if (m_auth) - { - g_qMutex.lock(); - m_auth->clients.clear(); - m_auth->in_use = false; - g_qMutex.unlock(); - } - } - return 0; - } - - void schedule(auth_info *info) - { - if (info) - { - g_qMutex.lock(); - do - { - if (g_queue.size() > AMNT_ALLOWED_BEFORE_SKIPPING) - { - // what to do when under stress/timeout - DEBUG_LOG(LOGNAME "Heavy backlog of auth requests, skipping"); - threadedRunner::scheduleRunnable(info->client); - delete info; - info = NULL; - break; - } - - if (g_services) - { - int i = 0; - for (; i < MAX_AUTH_THREADS; ++i) - { - if (g_services[i].in_use == false) - { - // start auth thread processing - g_services[i].in_use = true; - g_services[i].clients.push_back(info); - if (!g_queue.empty()) - { - g_services[i].clients.insert(g_services[i].clients.end(), g_queue.begin(), g_queue.end()); - g_queue.clear(); - } - - // do what we can to make sure that if we fail - // to start the thread then we'll pass it on - DEBUG_LOG(LOGNAME "Starting auth thread #" + tos(i+1)); - SimpleThread(authService::process, &g_services[i]); - break; - } - } - - if (i >= MAX_AUTH_THREADS) - { - g_queue.push_back(info); - //DEBUG_LOG(LOGNAME "Unable to process auth requests, skipping"); - //threadedRunner::scheduleRunnable(info->client); - //delete info; - //info = NULL; - break; - } - } - else - { - DEBUG_LOG(LOGNAME "Unable to process auth requests, skipping"); - info->authenticated = true; - threadedRunner::scheduleRunnable(info->client); - delete info; - info = NULL; - break; - } - - // make sure that if things go arwy that we should be able to terminate - if (iskilled()) - { - break; - } - } while (0); - g_qMutex.unlock(); - } - } - - void updateServices (bool initial) - { - if (g_services == NULL) - return; - httpHeaderMap_t vars; - vars["server"] = "Shoutcast v" + gOptions.getVersionBuildStrings(); - vars["port"] = tos(g_portForClients); - utf8 main_post = encodeVariables(vars); - - for (int i = 0; i < MAX_AUTH_THREADS; ++i) - { - if (initial) - { - g_services[i].main_post = main_post; - } - else - { - auth_info *info = new auth::auth_info (g_authURL); - info->post = main_post; - g_qMutex.lock(); - g_services[i].clients.push_back (info); - if (g_services[i].in_use == false) - { - g_services[i].in_use = true; - SimpleThread(authService::process, &g_services[i]); - } - g_qMutex.unlock(); - } - } - } - - void init() - { - g_services = new authService[MAX_AUTH_THREADS]; - if (g_services) - { - updateServices (true); - } - else - { - WLOG(LOGNAME "Failed to start auth service threads"); - } - } - - void cleanup() - { - if (g_services) - { - delete[] g_services; - g_services = NULL; - } - } -} diff --git a/Src/Plugins/DSP/sc_serv3/auth.h b/Src/Plugins/DSP/sc_serv3/auth.h deleted file mode 100644 index 86e96e3d..00000000 --- a/Src/Plugins/DSP/sc_serv3/auth.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once -#ifndef _AUTH_H -#define _AUTH_H - -#include <vector> -#include "unicode/uniString.h" -#include "uvox2Common.h" - - -class protocol_shoutcastClient; - -#define DNAS_AUTH_URL "https://auth.shoutcast.com/AddShout" - -namespace auth -{ - using namespace uniString; - class authService; - - typedef size_t streamID_t; - struct auth_info - { - protocol_shoutcastClient *client; - utf8 url; - utf8 post; - std::vector<__uint8> content; - streamID_t sid; - int group; - int m_dataType; - bool authenticated; - bool has_intro; - bool valid_response; - bool delayed_auth; - - explicit auth_info(const utf8& _url = "") - { - url = _url; - client = NULL; - group = -1; - authenticated = false; - has_intro = false; - valid_response = false; - delayed_auth = false; - sid = 1; - m_dataType = MP3_DATA; // default - } - - ~auth_info() - { - client = NULL; - post.clear(); - group = -1; - authenticated = false; - has_intro = false; - valid_response = false; - delayed_auth = false; - content.clear(); - sid = 0; - } - }; - - extern utf8 g_authURL; - - void schedule(auth_info *info); - void updateServices (bool initial = false); - void init(); - void cleanup(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/banList.cpp b/Src/Plugins/DSP/sc_serv3/banList.cpp deleted file mode 100644 index ac9bf6a4..00000000 --- a/Src/Plugins/DSP/sc_serv3/banList.cpp +++ /dev/null @@ -1,431 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#else -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#endif - -#include <stdio.h> -#include "banList.h" -#include "global.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include <algorithm> -#include "webNet/socketOps.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include <assert.h> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[BAN] " - -#ifdef _WIN32 -typedef unsigned long in_addr_t; -#endif - -banList g_banList; - -class banList::impl -{ -private: - struct banEntrySave - { - FILE *f; - size_t stream_ID; - }; - - struct banEntry: public ban_t - { - in_addr_t m_ip; // ip as binary type. Old style, but that's how the old sc_serv did it and we'll - // continue to do it that way until we're ready to break the old software - - void save(banEntrySave entrySave) throw(exception) - { - if (m_stream_ID == entrySave.stream_ID) - { - utf8 s(m_numericIP + ";" + tos(m_mask) + ";" + m_comment + eol()); - if (fwrite(s.c_str(),1,s.size(),entrySave.f) != s.size()) - { - throwEx<tagged_error>(LOGNAME "I/O error writing " + (!entrySave.stream_ID ? "global" : "sid=" + tos(entrySave.stream_ID)) + " ban file"); - } - } - } - - bool validIP() throw() - { - return ((m_ip != INADDR_NONE) && (m_ip != 0)); - } - - bool validMask() throw() - { - return (m_mask <= 255); - } - - static in_addr_t stringToIP(const utf8 &sIP, utf8 &hostIP) - { - // default is to assume a raw IP address in the list - in_addr_t ip = inet_addr((const char *)sIP.c_str()); - if (ip == INADDR_NONE) - { - // though if that fails then attempt to - // get an IP address from a hostname... - string sHost; - try - { - sHost = socketOps::hostNameToAddress(sIP.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - ip = inet_addr((const char *)sHost.c_str()); - if (ip != INADDR_NONE) - { - hostIP = sHost; - } - } - } - return ip; - } - - banEntry(const utf8 &numericIP, const __uint32 mask, const utf8 &comment, const size_t stream_ID) throw() - :ban_t(numericIP, mask, comment, stream_ID), m_ip(stringToIP(numericIP, m_hostIP)) {} - banEntry() throw():m_ip(0){} - }; - - AOL_namespace::mutex m_lock; - list<banEntry> m_list; - -public: - bool load(const uniFile::filenameType &fn, size_t stream_ID) throw(exception) - { - if (fn.empty()) - { - throwEx<tagged_error>(LOGNAME "No " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "Attempting to read ban file: " + fileUtil::getFullFilePath(fn)); - } - - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"rb"); - if (!f) return false; - - try - { - int l = 0; - int count = 0; - while (true) - { - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), f)) break; // get a line - - ++l; // increment line counter - - utf8 s; - - // skip utf-8 BOM - if ((strlen(buffer) > 2) && - (((unsigned char*)buffer)[0] == 0xef) && - (((unsigned char*)buffer)[1] == 0xbb) && - (((unsigned char*)buffer)[2] == 0xbf)) - { - s = &(buffer[3]); - } - else - { - s = buffer; - } - - s = stripWhitespace(s); - - utf8::size_type pos1 = s.find(utf8::value_type(';')); - if (pos1 == utf8::npos) - { - throwEx<tagged_error>(LOGNAME "Parse error in " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban file on line " + tos(l)); - } - - utf8::size_type pos2 = s.find(utf8::value_type(';'),pos1+1); - if (pos2 == utf8::npos) - { - throwEx<tagged_error>(LOGNAME "Parse error in " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + "ban file on line " + tos(l)); - } - - banEntry e(s.substr(0,pos1),utf8(s.substr(pos1+1,pos2 - pos1 - 1)).toInt(),s.substr(pos2+1),stream_ID); - - if (!e.validIP()) - { - WLOG(LOGNAME "Line " + tos(l) + " of " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list has been ignored (bad IP)"); - } - else if (!e.validMask()) - { - WLOG(LOGNAME "Line " + tos(l) + " of " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list has been ignored (bad MASK)"); - } - else - { - if (this->find(e.m_numericIP,e.m_mask,e.m_stream_ID,false) == false) - { - m_list.push_back(e); - ++count; - } - } - } - ILOG(LOGNAME "Banned " + tos(count) + " IP" + (count != 1 ? "'s" : "") + " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban file"); - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - return true; - } - - void save(const uniFile::filenameType &fn, size_t stream_ID) throw(exception) - { - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"wb"); - if (!f) - { - throwEx<tagged_error>(LOGNAME "Could not open " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + - " ban file `" + fn + "' for writing (" + errMessage().hideAsString() + ")"); - } - try - { - banEntrySave entrySave; - entrySave.f = f; - entrySave.stream_ID = stream_ID; - for_each(m_list.begin(),m_list.end(),bind2nd(mem_fun_ref(&banEntry::save),entrySave)); - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - - if (!uniFile::fileSize(fn)) - { - uniFile::unlink(fn); - } - } - - bool add(const utf8 &ipAddr, const __uint32 mask, const utf8 &comment, const size_t stream_ID) throw(exception) - { - // skip loopback addresses as we treat them specially anyway - if ((ipAddr.find(utf8("127.")) == utf8::npos)) - { - banEntry e(ipAddr, mask,comment, stream_ID); - if (!e.validIP()) - { - throwEx<runtime_error>(LOGNAME "Invalid IP specified - `" + ipAddr + "'"); - } - if (!e.validMask()) - { - throwEx<runtime_error>(LOGNAME "Invalid MASK specified - `" + tos(mask) + "'"); - } - - stackLock sml(m_lock); - m_list.push_back(e); - return true; - } - return false; - } - - // true if removed - bool remove(const utf8 &ipAddr, const __uint32 mask, const size_t stream_ID, - const bool allStream, const bool fallback = false, const bool use_lock = true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - for (list<banEntry>::iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ( - (allStream || (!allStream && (((*i).m_numericIP == ipAddr) || ((*i).m_hostIP == ipAddr)) && ((*i).m_mask == mask))) && - ((*i).m_stream_ID == stream_ID)) - { - m_list.erase(i); - return true; - } - } - - // attempt to see if we've got a hostname which has not been detected from the loading mapping - if (!fallback) - { - string sHost; - try - { - sHost = socketOps::hostNameToAddress(ipAddr.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - return remove(sHost, mask, stream_ID, allStream, true, false); - } - } - - return false; - } - - // true if found - bool find(const utf8 &ipAddr, const size_t mask, const size_t stream_ID, const bool use_lock=true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - if (!m_list.empty()) - { - utf8 hostIP; - in_addr_t ip = banEntry::stringToIP(ipAddr, hostIP); - for (list<banEntry>::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (((*i).m_mask == mask) && - ((*i).m_stream_ID == stream_ID) && - (ntohl((*i).m_ip) & ((*i).m_mask|0xffffff00)) == - (ntohl(ip) & ((*i).m_mask|0xffffff00) - ) - ) - return true; - } - } - - return false; - } - - // true if found - bool find(const utf8 &ipAddr, const size_t stream_ID, const bool use_lock = true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - if (!m_list.empty()) - { - utf8 hostIP; - in_addr_t ip = banEntry::stringToIP(ipAddr, hostIP); - for (list<banEntry>::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (((*i).m_stream_ID == stream_ID) && - (ntohl((*i).m_ip) & ((*i).m_mask|0xffffff00)) == - (ntohl(ip) & ((*i).m_mask|0xffffff00))) - { - return true; - } - } - } - - return false; - } - - void get(std::vector<banList::ban_t> &bl, size_t stream_ID) throw() - { - stackLock sml(m_lock); - - for (list<banEntry>::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ((*i).m_stream_ID == stream_ID) - { - bl.push_back(*i); - } - } - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -banList::banList():m_impl(0) -{ - m_impl = new banList::impl; -} - -banList::~banList() throw() -{ - forget(m_impl); -} - -bool banList::load(const uniFile::filenameType &fn, size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - result = m_impl->load(fn,stream_ID); - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -bool banList::save(const uniFile::filenameType &fn, size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - m_impl->save(fn,stream_ID); - result = true; - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -// throws if parameters are invalid -bool banList::add(const utf8 &ipAddr, const __uint32 mask, const utf8 &comment, const size_t stream_ID) throw(exception) -{ - assert(m_impl); - return m_impl->add(ipAddr, mask, comment, stream_ID); -} - -// true if removed -bool banList::remove(const utf8 &ipAddr, const __uint32 mask, const size_t stream_ID, const bool allStream) throw() -{ - assert(m_impl); - return m_impl->remove(ipAddr, mask, stream_ID, allStream); -} - -// true if found -bool banList::find(const utf8 &ipAddr, const size_t stream_ID) throw() -{ - assert(m_impl); - return m_impl->find(ipAddr, stream_ID); -} - -// true if found -bool banList::find(const utf8 &ipAddr, const __uint32 mask, const size_t stream_ID) throw() -{ - assert(m_impl); - return m_impl->find(ipAddr, mask, stream_ID); -} - -void banList::get(vector<banList::ban_t> &bl, const size_t stream_ID) throw() -{ - assert(m_impl); - m_impl->get(bl, stream_ID); -} diff --git a/Src/Plugins/DSP/sc_serv3/banList.h b/Src/Plugins/DSP/sc_serv3/banList.h deleted file mode 100644 index 97cb781d..00000000 --- a/Src/Plugins/DSP/sc_serv3/banList.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once -#ifndef banList_H_ -#define banList_H_ - -#include <map> -#include "unicode/uniFile.h" - -// class that manages list of addresses banned from the system - -class banList -{ -private: - class impl; - impl *m_impl; - -public: - struct ban_t - { - size_t m_mask; - size_t m_stream_ID; // used to differentiate - uniString::utf8 m_numericIP; - uniString::utf8 m_comment; // hostname or other symbolic name - uniString::utf8 m_hostIP; // used to hold the converted IP from a hostname - - ban_t(const uniString::utf8 &numericIP, const __uint32 mask, const uniString::utf8 &comment, const size_t stream_ID) throw() - : m_mask(mask), m_stream_ID(stream_ID), m_numericIP(numericIP), m_comment(comment) {} - - ban_t() throw() : m_mask(0), m_stream_ID(1){} - }; - - // throws if parameters are invalid - bool add(const uniString::utf8 &ipAddr, const __uint32 mask, const uniString::utf8 &comment, const size_t stream_ID) throw(std::exception); - // true if removed - bool remove(const uniString::utf8 &ipAddr, const __uint32 mask, const size_t stream_ID, const bool allStream) throw(); - // true if found - bool find(const uniString::utf8 &ipAddr, const size_t stream_ID) throw(); - bool find(const uniString::utf8 &ipAddr, const __uint32 mask, const size_t stream_ID) throw(); - - bool load(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - bool save(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - - banList(); - ~banList() throw(); - - // for web administration reference - void get(std::vector<ban_t> &bl, const size_t stream_ID) throw(); -}; - -extern banList g_banList; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/bandwidth.cpp b/Src/Plugins/DSP/sc_serv3/bandwidth.cpp deleted file mode 100644 index b909eb8f..00000000 --- a/Src/Plugins/DSP/sc_serv3/bandwidth.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include "bandwidth.h" -#include "global.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.statsDebug()) DLOG(__VA_ARGS__); } while (0) - -#define LOGNAME "[BANDWIDTH] " - -static __uint64 g_bandWidthTable[bandWidth::ALL_OTHER]; -static AOL_namespace::rwLock g_bandwidthLock; - -const __uint64 bandWidth::getAmount(const bandWidth::usageType_t type) -{ - stackRWLock sl (g_bandwidthLock); - - if (type < ALL_SENT) - { - return g_bandWidthTable[type]; - } - - switch (type) - { - case bandWidth::ALL_SENT: - { - return g_bandWidthTable[CLIENT_V1_SENT] + - g_bandWidthTable[CLIENT_V2_SENT] + - g_bandWidthTable[CLIENT_HTTP_SENT] + - g_bandWidthTable[CLIENT_FLV_SENT] + - g_bandWidthTable[CLIENT_M4A_SENT] + - g_bandWidthTable[SOURCE_V1_SENT] + - g_bandWidthTable[SOURCE_V2_SENT] + - g_bandWidthTable[PUBLIC_WEB] + - g_bandWidthTable[PRIVATE_WEB] + - g_bandWidthTable[FLASH_POLICY] + - g_bandWidthTable[RELAY_V2_SENT]+ - g_bandWidthTable[YP_SENT] + - g_bandWidthTable[AUTH_AND_METRICS]; - } - case bandWidth::ALL_RECV: - { - return g_bandWidthTable[SOURCE_V1_RECV] + - g_bandWidthTable[SOURCE_V2_RECV] + - g_bandWidthTable[RELAY_MISC_RECV] + - g_bandWidthTable[RELAY_V1_RECV] + - g_bandWidthTable[RELAY_V2_RECV] + - g_bandWidthTable[YP_RECV] + - g_bandWidthTable[ADVERTS]; - } - case bandWidth::ALL_WEB: - { - return g_bandWidthTable[PUBLIC_WEB] + - g_bandWidthTable[PRIVATE_WEB]; - } - case bandWidth::ALL_SOURCE_SENT: - { - return g_bandWidthTable[SOURCE_V1_SENT] + - g_bandWidthTable[SOURCE_V2_SENT]; - } - case bandWidth::ALL_SOURCE_RECV: - { - return g_bandWidthTable[SOURCE_V1_RECV] + - g_bandWidthTable[SOURCE_V2_RECV]; - } - case bandWidth::ALL_CLIENT_SENT: - { - return g_bandWidthTable[CLIENT_V1_SENT] + - g_bandWidthTable[CLIENT_V2_SENT] + - g_bandWidthTable[CLIENT_HTTP_SENT] + - g_bandWidthTable[CLIENT_FLV_SENT] + - g_bandWidthTable[CLIENT_M4A_SENT]; - } - case bandWidth::ALL_RELAY_RECV: - { - return g_bandWidthTable[RELAY_MISC_RECV] + - g_bandWidthTable[RELAY_V1_RECV] + - g_bandWidthTable[RELAY_V2_RECV]; - } - case bandWidth::ALL_OTHER: - { - return g_bandWidthTable[FLASH_POLICY] + - g_bandWidthTable[RELAY_V2_SENT] + - g_bandWidthTable[YP_SENT] + - g_bandWidthTable[YP_RECV] + - g_bandWidthTable[AUTH_AND_METRICS] + - g_bandWidthTable[ADVERTS]; - } - default: - { - return 0; - } - } -} - -void bandWidth::updateAmount(const bandWidth::usageType_t type, const __uint64 amount) -{ - if (amount > 0) - { - stackRWLock sl (g_bandwidthLock, false); - g_bandWidthTable[type] += amount; - g_bandWidthTable[bandWidth::ALL] += amount; - } -} - -void bandWidth::getFinalAmounts() -{ - __uint64 all = getAmount(bandWidth::ALL); - if (all > 0) - { - ILOG(LOGNAME "Total: " + tos(all) + - ", Sent: " + tos(getAmount(bandWidth::ALL_SENT)) + - ", Recv: " + tos(getAmount(bandWidth::ALL_RECV))); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/bandwidth.h b/Src/Plugins/DSP/sc_serv3/bandwidth.h deleted file mode 100644 index a74c1c8b..00000000 --- a/Src/Plugins/DSP/sc_serv3/bandwidth.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once -#ifndef bandWidth_H_ -#define bandWidth_H_ - -#include "unicode/uniString.h" - -namespace bandWidth -{ - typedef enum - { - ALL = 0, - PUBLIC_WEB, // public facing pages - PRIVATE_WEB, // private admin pages - - SOURCE_V1_SENT, // v1 source connections sent - SOURCE_V1_RECV, // v1 source connections received - SOURCE_V2_SENT, // v2 source connections sent - SOURCE_V2_RECV, // v2 source connections received - - CLIENT_V1_SENT, // v1 client connections - CLIENT_V2_SENT, // v2 client connections - CLIENT_HTTP_SENT, // HTTP client connections - CLIENT_FLV_SENT, // FLV client connections - CLIENT_M4A_SENT, // M4A client connections - - FLASH_POLICY, // flash policy server - - RELAY_MISC_RECV, // relay connnections handshaking - RELAY_V1_RECV, // v1 relay connnections received - RELAY_V2_SENT, // v2 relay connnections sent - RELAY_V2_RECV, // v2 relay connnections received - - YP_SENT, // YP connections sent - YP_RECV, // YP connections received - - AUTH_AND_METRICS, // metrics based responses - ADVERTS, // advert data requests / pulls - - ALL_SENT, // consolidated sent total - ALL_RECV, // consolidated received total - ALL_WEB, // consolidated web page total - ALL_SOURCE_SENT, // consolidated source sent total - ALL_SOURCE_RECV, // consolidated source received total - ALL_CLIENT_SENT, // consolidated client sent total - ALL_RELAY_RECV, // consolidated relay received total - ALL_OTHER // consolidated remainder total - } usageType_t; - - const __uint64 getAmount(const bandWidth::usageType_t); - void updateAmount(const bandWidth::usageType_t, const __uint64 amount); - void getFinalAmounts(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/base64.cpp b/Src/Plugins/DSP/sc_serv3/base64.cpp deleted file mode 100644 index 358ed66c..00000000 --- a/Src/Plugins/DSP/sc_serv3/base64.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include <vector> -#include "base64.h" - -using namespace std; - -static const std::string base64_chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; - -static inline bool is_base64(__uint8 c) -{ - return (isalnum(c) || (c == '+') || (c == '/')); -} - -const std::vector<__uint8> base64::decode(std::string const& encoded_string) -{ - size_t in_len = encoded_string.size(); - int i = 0, in_ = 0; - __uint8 char_array_4[4], char_array_3[3]; - std::vector<__uint8> ret; - - while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) - { - char_array_4[i++] = encoded_string[in_]; ++in_; - if (i == 4) - { - for (i = 0; i <4; i++) - { - char_array_4[i] = (__uint8)base64_chars.find(char_array_4[i]); - } - - char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); - char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); - char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; - - for (i = 0; (i < 3); i++) - { - ret.push_back(char_array_3[i]); - } - - i = 0; - } - } - - if (i) - { - int j = 0; - for (j = i; j <4; j++) - { - char_array_4[j] = 0; - } - - for (j = 0; j <4; j++) - { - char_array_4[j] = (__uint8)base64_chars.find(char_array_4[j]); - } - - char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); - char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); - char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; - - for (j = 0; (j < i - 1); j++) - { - ret.push_back(char_array_3[j]); - } - } - - return ret; -} diff --git a/Src/Plugins/DSP/sc_serv3/base64.h b/Src/Plugins/DSP/sc_serv3/base64.h deleted file mode 100644 index 723cc6a1..00000000 --- a/Src/Plugins/DSP/sc_serv3/base64.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once -#ifndef base64_H_ -#define base64_H_ - -#include "unicode/uniString.h" - -// no decoding... yet -namespace base64 -{ - template<typename OUTT, typename ITER> - OUTT encode(ITER start, ITER finish) throw() - { - static const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - int shift = 0; - int accum = 0; - - ITER i = start; - OUTT result; - - while (i != finish) - { - accum <<= 8; - shift += 8; - accum |= *(i++); - while (shift >= 6) - { - shift -= 6; - result.push_back((typename OUTT::value_type)alphabet[(accum >> shift) & 0x3F]); - } - } - if (shift == 4) - { - result.push_back((typename OUTT::value_type)alphabet[(accum & 0xF)<<2]); - result.push_back((typename OUTT::value_type)'='); - } - else if (shift == 2) - { - result.push_back((typename OUTT::value_type)alphabet[(accum & 0x3)<<4]); - result.push_back((typename OUTT::value_type)'='); - result.push_back((typename OUTT::value_type)'='); - } - return result; - } - - template<typename OUTT,typename CONT> - OUTT encode(const CONT &c) throw() - { - return base64::encode<OUTT>(c.begin(), c.end()); - } - - const std::vector<__uint8> decode(std::string const& encoded_string); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/cache.cpp b/Src/Plugins/DSP/sc_serv3/cache.cpp deleted file mode 100644 index ea9fe2fa..00000000 --- a/Src/Plugins/DSP/sc_serv3/cache.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <map> -#include "cache.h" - -void AddorUpdateCache(cacheItem *item, const time_t now, const bool compressed, - const uniString::utf8 &header, const uniString::utf8 &response, - CacheMap_t &cache, AOL_namespace::mutex &lock, - const streamData::streamID_t sid) -{ - if (lock.timedLock(3000)) - { - // if we've already got an instance then we update - if (item == NULL) - { - item = cache[sid] = new cacheItem(); - } - - if (item != NULL) - { - if (compressed) - { - item->generatedGZIP = now; - item->responseGZIP = response; - item->headerGZIP = header; - } - else - { - item->generatedRaw = now; - item->responseRaw = response; - item->headerRaw = header; - } - } - lock.unlock(); - } -} - -bool GetFromCache(const cacheItem *item, AOL_namespace::mutex &lock, - const time_t now, const bool compressed, - const bool headRequest, uniString::utf8 &response, - const int limit) -{ - if (lock.timedLock(3000)) - { - if (item != NULL) - { - if (((now - item->generatedGZIP) < limit) && compressed) - { - if (item->responseGZIP.size() > 0) - { - response = (!headRequest ? item->responseGZIP : item->headerGZIP); - lock.unlock(); - return true; - } - } - else if (((now - item->generatedRaw) < limit) && !compressed) - { - if (item->responseRaw.size() > 0) - { - response = (!headRequest ? item->responseRaw : item->headerRaw); - lock.unlock(); - return true; - } - } - } - lock.unlock(); - } - return false; -} - -void DeleteCache(CacheMap_t &cache) -{ - if (!cache.empty()) - { - for (CacheMap_t::const_iterator i = cache.begin(); i != cache.end(); ++i) - { - delete (*i).second; - } - cache.clear(); - } -} - -void DeleteAllCaches() -{ - DeleteCache(m_xmlStatsCache); - DeleteCache(m_xmlStatisticsCache); - DeleteCache(m_jsonStatsCache); - DeleteCache(m_jsonStatisticsCache); - DeleteCache(m_7Cache); - DeleteCache(m_PLSCache); - DeleteCache(m_M3UCache); - DeleteCache(m_ASXCache); - DeleteCache(m_QTLCache); - DeleteCache(m_XSPFCache); - DeleteCache(m_xmlTracksCache); - DeleteCache(m_jsonTracksCache); - DeleteCache(m_xmlPlayedCache); - DeleteCache(m_jsonPlayedCache); - DeleteCache(m_htmlPlayedCache); - DeleteCache(m_streamArtCache); - DeleteCache(m_playingArtCache); - DeleteCache(m_crossdomainCache); -} diff --git a/Src/Plugins/DSP/sc_serv3/cache.h b/Src/Plugins/DSP/sc_serv3/cache.h deleted file mode 100644 index 72dfb9c5..00000000 --- a/Src/Plugins/DSP/sc_serv3/cache.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#ifndef _CACHE_H -#define _CACHE_H - -#include "unicode/uniString.h" -#include "streamData.h" - -struct cacheItem -{ - time_t generatedGZIP; - time_t generatedRaw; - uniString::utf8 headerGZIP; - uniString::utf8 headerRaw; - uniString::utf8 responseGZIP; - uniString::utf8 responseRaw; - - cacheItem() : generatedGZIP(0), generatedRaw(0) - { - } - - ~cacheItem() - { - generatedGZIP = generatedRaw = 0; - headerGZIP.clear(); - headerRaw.clear(); - responseGZIP.clear(); - responseRaw.clear(); - } -}; - -typedef std::map<size_t, cacheItem *> CacheMap_t; - -void AddorUpdateCache(cacheItem *item, const time_t now, const bool compressed, - const uniString::utf8 &header, const uniString::utf8 &response, - CacheMap_t &cache, AOL_namespace::mutex &lock, - const streamData::streamID_t sid); - -bool GetFromCache(const cacheItem *item, AOL_namespace::mutex &lock, - const time_t now, const bool compressed, - const bool headRequest, uniString::utf8 &response, - const int limit = 1); - -void DeleteCache(CacheMap_t &cache); -void DeleteAllCaches(); - -extern CacheMap_t m_xmlStatsCache, m_xmlStatisticsCache, m_jsonStatsCache, - m_jsonStatisticsCache, m_7Cache, m_PLSCache, m_M3UCache, - m_ASXCache, m_QTLCache, m_XSPFCache, m_xmlTracksCache, - m_jsonTracksCache, m_xmlPlayedCache, m_jsonPlayedCache, - m_htmlPlayedCache, m_streamArtCache, m_playingArtCache, - m_crossdomainCache; -#endif diff --git a/Src/Plugins/DSP/sc_serv3/config.cpp b/Src/Plugins/DSP/sc_serv3/config.cpp deleted file mode 100644 index 0b6cd64b..00000000 --- a/Src/Plugins/DSP/sc_serv3/config.cpp +++ /dev/null @@ -1,2867 +0,0 @@ -#include "config.h" -#include "stl/stringUtils.h" -#include <set> -#include "cpucount.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#ifdef _WIN32 -#include "win32/rezFuncs.h" -#else -#include "unixversion.h" -#endif -#include "banList.h" -#include "ripList.h" -#include "adminList.h" -#include "agentList.h" -#include "w3cLog.h" -#include "global.h" -#include <string.h> -#include <stdio.h> -#include <iostream> -#include <math.h> - -#define LOGNAME "[CONFIG] " - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -config::config() throw() -{ - #define OPTINIT(n) accessor_t(&config::assign_##n, &config::fetch_##n, &config::count_##n, &config::multi_##n, &config::def_##n) - - m_optMap["configrewrite"] = OPTINIT(configRewrite); - - m_optMap["log"] = OPTINIT(log); - m_optMap["screenlog"] = OPTINIT(screenLog); - m_optMap["logfile"] = OPTINIT(logFile); - m_optMap["reallogfile"] = OPTINIT(realLogFile); - m_optMap["logrotates"] = OPTINIT(logRotates); - m_optMap["logarchive"] = OPTINIT(logArchive); - m_optMap["rotateinterval"] = OPTINIT(rotateInterval); - - // networking - m_optMap["namelookups"] = OPTINIT(nameLookups); - m_optMap["alternateports"] = OPTINIT(alternatePorts); - m_optMap["portbase"] = OPTINIT(portBase); - m_optMap["publicport"] = OPTINIT(publicPort); - m_optMap["portlegacy"] = OPTINIT(portLegacy); - m_optMap["autodumptime"] = OPTINIT(autoDumpTime); - m_optMap["maxheaderlinesize"] = OPTINIT(maxHeaderLineSize); - m_optMap["maxheaderlinecount"] = OPTINIT(maxHeaderLineCount); - m_optMap["password"] = OPTINIT(password); - m_optMap["adminpassword"] = OPTINIT(adminPassword); - m_optMap["sslcertificatefile"] = OPTINIT(sslCertificateFile); - m_optMap["sslcertificatekeyfile"] = OPTINIT(sslCertificateKeyFile); - - m_optMap["buffertype"] = OPTINIT(bufferType); - m_optMap["fixedbuffersize"] = OPTINIT(fixedBufferSize); - m_optMap["adaptivebuffersize"] = OPTINIT(adaptiveBufferSize); - m_optMap["bufferhardlimit"] = OPTINIT(bufferHardLimit); - m_optMap["metainterval"] = OPTINIT(metaInterval); - - m_optMap["adtestfileloop"] = OPTINIT(adTestFileLoop); - m_optMap["adtestfile"] = OPTINIT(adTestFile); - m_optMap["adtestfile2"] = OPTINIT(adTestFile2); - m_optMap["adtestfile3"] = OPTINIT(adTestFile3); - m_optMap["adtestfile4"] = OPTINIT(adTestFile4); - m_optMap["introfile"] = OPTINIT(introFile); - m_optMap["backupfile"] = OPTINIT(backupFile); - m_optMap["backuptitle"] = OPTINIT(backupTitle); - m_optMap["backuploop"] = OPTINIT(backupLoop); - m_optMap["maxspecialfilesize"] = OPTINIT(maxSpecialFileSize); - - m_optMap["artworkfile"] = OPTINIT(artworkFile); - - m_optMap["uvoxcipherkey"] = OPTINIT(uvoxCipherKey); - - //// w3c logging - m_optMap["w3cenable"] = OPTINIT(w3cEnable); - m_optMap["w3clog"] = OPTINIT(w3cLog); - - m_optMap["pidfile"] = OPTINIT(pidFile); - - //// relaying - m_optMap["relayreconnecttime"] = OPTINIT(relayReconnectTime); - m_optMap["relayconnectretries"] = OPTINIT(relayConnectRetries); - m_optMap["maxhttpredirects"] = OPTINIT(maxHTTPRedirects); - m_optMap["allowrelay"] = OPTINIT(allowRelay); - m_optMap["allowpublicrelay"] = OPTINIT(allowPublicRelay); - ///// - - //// stream configuration - m_optMap["streamid"] = OPTINIT(stream_ID); - m_optMap["streamauthhash"] = OPTINIT(stream_authHash); - m_optMap["streampath"] = OPTINIT(stream_path); - m_optMap["streamrelayurl"] = OPTINIT(stream_relayURL); - m_optMap["streambackupurl"] = OPTINIT(stream_backupURL); - m_optMap["streamminbitrate"] = OPTINIT(stream_minBitrate); - m_optMap["streammaxbitrate"] = OPTINIT(stream_maxBitrate); - m_optMap["streammaxuser"] = OPTINIT(stream_maxUser); - m_optMap["streampassword"] = OPTINIT(stream_password); - m_optMap["streamadminpassword"] = OPTINIT(stream_adminPassword); - m_optMap["streampublicserver"] = OPTINIT(stream_publicServer); - m_optMap["streamallowrelay"] = OPTINIT(stream_allowRelay); - m_optMap["streamallowpublicrelay"] = OPTINIT(stream_allowPublicRelay); - m_optMap["streamriponly"] = OPTINIT(stream_ripOnly); - m_optMap["streamautodumpsourcetime"] = OPTINIT(stream_autoDumpSourceTime); - m_optMap["streamautodumptime"] = OPTINIT(stream_autoDumpTime); - m_optMap["streamautodumpusers"] = OPTINIT(stream_autoDumpUsers); - m_optMap["streamlistenertime"] = OPTINIT(stream_listenerTime); - m_optMap["streamsonghistory"] = OPTINIT(stream_songHistory); - m_optMap["streamuvoxcipherkey"] = OPTINIT(stream_uvoxCipherKey); - m_optMap["streamlogfile"] = OPTINIT(stream_logFile); - m_optMap["streamadtestfileloop"] = OPTINIT(stream_adTestFileLoop); - m_optMap["streamadtestfile"] = OPTINIT(stream_adTestFile); - m_optMap["streamadtestfile2"] = OPTINIT(stream_adTestFile2); - m_optMap["streamadtestfile3"] = OPTINIT(stream_adTestFile3); - m_optMap["streamadtestfile4"] = OPTINIT(stream_adTestFile4); - m_optMap["streamintrofile"] = OPTINIT(stream_introFile); - m_optMap["streambackupfile"] = OPTINIT(stream_backupFile); - m_optMap["streambackuptitle"] = OPTINIT(stream_backupTitle); - m_optMap["streambackuploop"] = OPTINIT(stream_backupLoop); - m_optMap["streambanfile"] = OPTINIT(stream_banFile); - m_optMap["streamripfile"] = OPTINIT(stream_ripFile); - m_optMap["streamagentfile"] = OPTINIT(stream_agentFile); - m_optMap["streamartworkfile"] = OPTINIT(stream_artworkFile); - m_optMap["streamw3clog"] = OPTINIT(stream_w3cLog); - m_optMap["streamhidestats"] = OPTINIT(stream_hideStats); - m_optMap["streamredirecturl"] = OPTINIT(stream_redirectUrl); - m_optMap["streammovedurl"] = OPTINIT(stream_movedUrl); - m_optMap["streamratelimitwait"] = OPTINIT(stream_rateLimitWait); - - m_optMap["requirestreamconfigs"] = OPTINIT(requireStreamConfigs); - m_optMap["userid"] = OPTINIT(userId); - m_optMap["licenceid"] = OPTINIT(licenceId); - - //// cdn - m_optMap["cdn"] = OPTINIT(cdn); - m_optMap["cdnmaster"] = OPTINIT(cdn_master); - m_optMap["cdnslave"] = OPTINIT(cdn_slave); - - //// flash - m_optMap["flashpolicyfile"] = OPTINIT(flashPolicyFile); - m_optMap["flashpolicyserverport"] = OPTINIT(flashPolicyServerPort); - - //// yp - m_optMap["yptimeout"] = OPTINIT(ypTimeout); - m_optMap["ypaddr"] = OPTINIT(ypAddr); - m_optMap["ypport"] = OPTINIT(ypPort); - m_optMap["yport"] = OPTINIT(ypPort); - m_optMap["yppath"] = OPTINIT(ypPath); - m_optMap["ypmaxretries"] = OPTINIT(ypMaxRetries); - m_optMap["ypreportinterval"] = OPTINIT(ypReportInterval); - m_optMap["ypminreportinterval"] = OPTINIT(ypMinReportInterval); - m_optMap["publicserver"] = OPTINIT(publicServer); - - /// agent - m_optMap["agentfile"] = OPTINIT(agentFile); - m_optMap["saveagentlistonexit"] = OPTINIT(saveAgentListOnExit); - m_optMap["blockemptyuseragent"] = OPTINIT(blockEmptyUserAgent); - - //// stats - m_optMap["hidestats"] = OPTINIT(hideStats); - m_optMap["minbitrate"] = OPTINIT(minBitrate); - m_optMap["maxbitrate"] = OPTINIT(maxBitrate); - m_optMap["maxuser"] = OPTINIT(maxUser); - - // radionomy metrics - m_optMap["admetricsdebug"] = OPTINIT(adMetricsDebug); - m_optMap["metricsmaxqueue"] = OPTINIT(metricsMaxQueue); - - m_optMap["authdebug"] = OPTINIT(authDebug); - - /// client behaviour - m_optMap["listenertime"] = OPTINIT(listenerTime); - m_optMap["autodumpusers"] = OPTINIT(autoDumpUsers); - m_optMap["srcdns"] = OPTINIT(srcIP); - m_optMap["srcip"] = OPTINIT(srcIP); - m_optMap["destdns"] = OPTINIT(destIP); - m_optMap["destip"] = OPTINIT(destIP); - m_optMap["dstip"] = OPTINIT(destIP); - m_optMap["publicdns"] = OPTINIT(publicIP); - m_optMap["publicip"] = OPTINIT(publicIP); - m_optMap["titleformat"] = OPTINIT(titleFormat); - m_optMap["urlformat"] = OPTINIT(urlFormat); - - //// banning - m_optMap["banfile"] = OPTINIT(banFile); - m_optMap["savebanlistonexit"] = OPTINIT(saveBanListOnExit); - - //// rip - m_optMap["ripfile"] = OPTINIT(ripFile); - m_optMap["saveriplistonexit"] = OPTINIT(saveRipListOnExit); - m_optMap["riponly"] = OPTINIT(ripOnly); - - m_optMap["adminfile"] = OPTINIT(adminFile); - - //// debugging - m_optMap["webclientdebug"] = OPTINIT(webClientDebug); - m_optMap["yp2debug"] = OPTINIT(yp2Debug); - m_optMap["shoutcastsourcedebug"] = OPTINIT(shoutcastSourceDebug); - m_optMap["uvox2sourcedebug"] = OPTINIT(uvox2SourceDebug); - m_optMap["httpsourcedebug"] = OPTINIT(HTTPSourceDebug); - m_optMap["streamdatadebug"] = OPTINIT(streamDataDebug); - m_optMap["microserverdebug"] = OPTINIT(microServerDebug); - m_optMap["httpstyledebug"] = OPTINIT(httpStyleDebug); - m_optMap["shoutcast1clientdebug"] = OPTINIT(shoutcast1ClientDebug); - m_optMap["shoutcast2clientdebug"] = OPTINIT(shoutcast2ClientDebug); - m_optMap["httpclientdebug"] = OPTINIT(HTTPClientDebug); - m_optMap["flvclientdebug"] = OPTINIT(flvClientDebug); - m_optMap["m4aclientdebug"] = OPTINIT(m4aClientDebug); - m_optMap["relaydebug"] = OPTINIT(relayDebug); - m_optMap["relayshoutcastdebug"] = OPTINIT(relayShoutcastDebug); - m_optMap["relayuvoxdebug"] = OPTINIT(relayUvoxDebug); - m_optMap["statsdebug"] = OPTINIT(statsDebug); - m_optMap["threadrunnerdebug"] = OPTINIT(threadRunnerDebug); - - m_optMap["songhistory"] = OPTINIT(songHistory); - m_optMap["showlastsongs"] = OPTINIT(songHistory); - - ///// misc nonsense - m_optMap["unique"] = OPTINIT(unique); - m_optMap["include"] = OPTINIT(include); - m_optMap["cpucount"] = OPTINIT(cpuCount); - m_optMap["clacks"] = OPTINIT(clacks); - m_optMap["startinactive"] = OPTINIT(startInactive); - m_optMap["ratelimit"] = OPTINIT(rateLimit); - m_optMap["ratelimitwait"] = OPTINIT(rateLimitWait); - m_optMap["usexff"] = OPTINIT(useXFF); - m_optMap["logclients"] = OPTINIT(logClients); - m_optMap["admincssfile"] = OPTINIT(adminCSSFile); - m_optMap["faviconfile"] = OPTINIT(faviconFile); - m_optMap["faviconmimetype"] = OPTINIT(faviconFileMimeType); - m_optMap["robotstxtfile"] = OPTINIT(robotstxtFile); - m_optMap["redirecturl"] = OPTINIT(redirectUrl); - m_optMap["forceshortsends"] = OPTINIT(forceShortSends); - m_optMap["adminnowrap"] = OPTINIT(adminNoWrap); - - // used to control the cache handling - m_favIconTime = m_styleCustomHeaderTime = 0; -} - -// return the streamConfig entries that reference relays -const vector<config::streamConfig> config::getRelayList() -{ - vector<streamConfig> result; - streams_t stream_configs; - getStreamConfigs(stream_configs); - - // get all stream configs and then make a vector list of only valid configs - // which ensures we're only getting known stream configs unlike prior to - // the behaviour with builds 24 which usually gave an extra config than was - for (config::streams_t::const_iterator i = stream_configs.begin(); i != stream_configs.end(); ++i) - { - if ((*i).second.m_relayUrl.isSet()) - { - result.push_back((*i).second); - } - } - - return result; -} - -// return the streamConfig entry that references the backup url asked -const vector<config::streamConfig> config::getBackupUrl(const size_t streamID) throw(exception) -{ - vector<streamConfig> result; - streams_t stream_configs; - getStreamConfigs(stream_configs); - config::streams_t::const_iterator i = stream_configs.find(streamID); - - if (i != stream_configs.end()) - { - if ((*i).second.m_backupUrl.isSet()) - { - result.push_back((*i).second); - } - } - - return result; -} - -unsigned short config::getMetaInterval(const size_t streamID) const throw() -{ - unsigned short metainterval = stream_metaInterval(streamID); - if (!read_stream_metaInterval(streamID)) - { - metainterval = metaInterval(); - } - - // don't allow less than 256 and - // due to overflow we don't need - // to do an upper check as it'll - // have wrapped around for this. - return (metainterval < 256 ? 256 : metainterval); -} - -int config::getBackupLoop(const size_t streamID) const throw() -{ - int backuploop = stream_backupLoop(streamID); - if (!read_stream_backupLoop(streamID)) - { - backuploop = backupLoop(); - } - return backuploop; -} - -int config::getRateLimitWait(const size_t streamID) const throw() -{ - int ratelimitwait = stream_rateLimitWait(streamID); - if (!read_stream_rateLimitWait(streamID)) - { - ratelimitwait = rateLimitWait(); - } - // just to make sure that we're giving a sane value - return (ratelimitwait > 0 ? ratelimitwait : def_rateLimitWait().toInt()); -} - -const int config::isBitrateDisallowed(const size_t streamID, const int bitrate, - int &streamMinBitrate, int &streamMaxBitrate) const throw() -{ - int ret = 0; - - // check that these bitrates are allowed (looking at both max and average values) - streamMinBitrate = stream_minBitrate(streamID); - if (!read_stream_minBitrate(streamID) || !streamMinBitrate) - { - streamMinBitrate = minBitrate(); - } - - if ((streamMinBitrate > 0) && (bitrate < streamMinBitrate)) - { - ret |= 1; - } - - streamMaxBitrate = stream_maxBitrate(streamID); - if (!read_stream_maxBitrate(streamID) || !streamMaxBitrate) - { - streamMaxBitrate = maxBitrate(); - } - - if ((streamMaxBitrate > 0) && (bitrate > streamMaxBitrate)) - { - ret |= 2; - } - - return ret; -} - -size_t config::getSongHistorySize(const size_t streamID) const throw() -{ - size_t songhistory = stream_songHistory(streamID); - if (!read_stream_songHistory(streamID)) - { - songhistory = songHistory(); - } - return songhistory; -} - -const int config::getAutoDumpTime(const size_t streamID) const throw() -{ - size_t sid = (!streamID ? streamID : DEFAULT_SOURCE_STREAM); - int dumpTime = stream_autoDumpTime(sid); - if (!read_stream_autoDumpTime(sid) || !dumpTime) - { - dumpTime = autoDumpTime(); - } - return dumpTime; -} - -const int config::getCPUCount() const throw() -{ - int cpu_count = cpuCount(); // check options - - if (cpu_count < 1) - { - int maxclients = gOptions.maxUser(); - if (maxclients < 1100) - cpu_count = (maxclients/350) +1; - else - { - int hwcpus = cpucount(); - if (hwcpus < 5) - cpu_count = hwcpus; - else - cpu_count = (((int)::log10 ((double)maxclients) - 2) * 6) - 2; // should be range of 4-12 - } - } - if (cpu_count < 1) cpu_count = 2; // eh? can never be less than 1 - return cpu_count; -} - -bool config::setupPasswords(const streams_t &stream_configs) throw(exception) -{ - // now form the per stream versions of passwords if there are any - bool passwordError = false; - for (streams_t::const_iterator i = stream_configs.begin(); i != stream_configs.end(); ++i) - { - utf8 tempAdminPassword = (*i).second.m_adminPassword; - if (tempAdminPassword.empty()) - { - tempAdminPassword = gOptions.adminPassword(); - } - - utf8 tempPassword = (*i).second.m_password; - if (tempPassword.empty()) - { - tempPassword = gOptions.password(); - } - - // follow legacy behaviour (just incase) - if (tempAdminPassword.empty()) - { - tempAdminPassword = tempPassword; - } - else - { - // otherwise if explicitly set as the same then we abort - if (tempAdminPassword == tempPassword) - { - WLOG(logSectionName() + "Stream " + tos((*i).first) + " should not have matching passwords for `adminpassword' and `password'."); - } - } - - if (tempAdminPassword.empty() && tempPassword.empty()) - { - ELOG(logSectionName() + "Stream " + tos((*i).first) + " does not have any passwords specified."); - passwordError = true; - } - } - - return passwordError; -} - -config::streamConfig& config::getPerStreamConfig(streamConfig& stream, const size_t sid, const bool useParent) -{ - // tweak the maxuser setting on the stream so it can be made to follow the - // per stream setting or for it to revert to the global server limit - int tempMaxUser = native_fetch_stream_maxUser(sid); - if (!tempMaxUser || (tempMaxUser > gOptions.maxUser())) - { - if (useParent) - { - tempMaxUser = 0; - } - } - - int tempMaxBitrate = native_fetch_stream_maxBitrate(sid); - if (!read_stream_maxBitrate(sid)) - { - if (useParent) - { - tempMaxBitrate = gOptions.maxBitrate(); - } - } - - int tempMinBitrate = native_fetch_stream_minBitrate(sid); - if (!read_stream_minBitrate(sid)) - { - if (useParent) - { - tempMinBitrate = gOptions.minBitrate(); - } - } - - bool tempAllowRelay = native_fetch_stream_allowRelay(sid); - if (!read_stream_allowRelay(sid)) - { - if (useParent) - { - tempAllowRelay = gOptions.allowRelay(); - } - } - - bool tempAllowPublicRelay = native_fetch_stream_allowPublicRelay(sid); - if (!read_stream_allowPublicRelay(sid)) - { - if (useParent) - { - tempAllowPublicRelay = gOptions.allowPublicRelay(); - } - } - - utf8 tempAdminPassword = native_fetch_stream_adminPassword(sid); - if (tempAdminPassword.empty()) - { - if (useParent) - { - tempAdminPassword = gOptions.adminPassword(); - } - } - - utf8 tempPassword = native_fetch_stream_password(sid); - if (tempPassword.empty()) - { - if (useParent) - { - tempPassword = gOptions.password(); - } - } - - utf8 tempPublicServer = native_fetch_stream_publicServer(sid); - if (tempPublicServer.empty()) - { - if (useParent) - { - tempPublicServer = gOptions.publicServer(); - } - } - - return (stream = streamConfig(native_fetch_stream_ID(sid), native_fetch_stream_authHash(sid), - native_fetch_stream_path(sid), native_fetch_stream_relayURL(sid), - native_fetch_stream_backupURL(sid), tempMaxUser, tempMaxBitrate, - tempMinBitrate, tempAdminPassword, tempPassword, - tempPublicServer, tempAllowRelay, tempAllowPublicRelay)); -} - -// return a streamConfig entry for the streamID -const bool config::getStreamConfig(streamConfig& stream, const size_t streamID) -{ - stackLock sml(m_lock); - - map<size_t, size_t>::iterator i = m_stream_ID.find(streamID); - if (i != m_stream_ID.end()) - { - config::getPerStreamConfig(stream, streamID); - return true; - } - - return false; -} - -// return all streamConfig entries organized by streamID -void config::getStreamConfigs(streams_t& streams, const bool useParent) -{ - stackLock sml(m_lock); - - for (map<size_t, size_t>::const_iterator i = m_stream_ID.begin(); i != m_stream_ID.end(); ++i) - { - streamConfig stream; - streams[native_fetch_stream_ID((*i).second)] = getPerStreamConfig(stream, (*i).second, useParent); - } - - -} - -// attempt to update an existing stream configuration with the new data -// and then attempt to pass it to the currently active stream based on it -__uint64 config::updateStreamConfig(config &readConfig, streamConfig update) throw(exception) -{ - if (!update.m_streamID) - { - return 0; - } - - stackLock sml(m_lock); - size_t streamID = update.m_streamID; - __uint64 updated = 0; - - if (native_fetch_stream_authHash(streamID) != update.m_authHash) - { - native_assign_stream_authHash(streamID, update.m_authHash); - updated |= AUTH_HASH; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AUTH_HASH"); - #endif - } - - if (native_fetch_stream_path(streamID) != update.m_urlPath) - { - native_assign_stream_path(streamID, update.m_urlPath); - updated |= URL_PATH; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("URL_PATH"); - #endif - } - - if (native_fetch_stream_relayURL(streamID) != update.m_relayUrl.url()) - { - native_assign_stream_relayURL(streamID, update.m_relayUrl.url()); - updated |= RELAY_URL; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("RELAY_URL"); - #endif - } - - if (native_fetch_stream_backupURL(streamID) != update.m_backupUrl.url()) - { - native_assign_stream_backupURL(streamID, update.m_backupUrl.url()); - updated |= BACKUP_URL; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BACKUP_URL"); - #endif - } - - if (native_fetch_stream_maxUser(streamID) != update.m_maxStreamUser) - { - native_assign_stream_maxUser(streamID, update.m_maxStreamUser); - updated |= MAX_USER; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("MAX_USER"); - #endif - } - - if (native_fetch_stream_maxBitrate(streamID) != update.m_maxStreamBitrate) - { - native_assign_stream_maxBitrate(streamID, update.m_maxStreamBitrate); - updated |= MAX_BITRATE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("MAX_BITRATE"); - #endif - } - - if (native_fetch_stream_minBitrate(streamID) != update.m_minStreamBitrate) - { - native_assign_stream_minBitrate(streamID, update.m_minStreamBitrate); - updated |= MIN_BITRATE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("MIN_BITRATE"); - #endif - } - - utf8 publicServer = readConfig.stream_publicServer(streamID); - if (native_fetch_stream_publicServer(streamID) != publicServer) - { - if (!readConfig.read_stream_publicServer(streamID)) - { - publicServer = gOptions.publicServer(); - } - else - { - updated |= PUBLIC_SRV; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("PUBLIC_SRV"); - #endif - } - native_assign_stream_publicServer(streamID, publicServer); - } - - bool allowRelay = readConfig.stream_allowRelay(streamID); - if (native_fetch_stream_allowRelay(streamID) != allowRelay) - { - if (!readConfig.read_stream_allowRelay(streamID)) - { - allowRelay = gOptions.allowRelay(); - } - native_assign_stream_allowRelay(streamID, allowRelay); - updated |= ALLOW_RELAY; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("ALLOW_RELAY"); - #endif - } - - bool allowPublicRelay = readConfig.stream_allowPublicRelay(streamID); - if (native_fetch_stream_allowPublicRelay(streamID) != allowPublicRelay) - { - if (!readConfig.read_stream_allowPublicRelay(streamID)) - { - allowPublicRelay = gOptions.allowPublicRelay(); - } - native_assign_stream_allowPublicRelay(streamID, allowPublicRelay); - updated |= ALLOW_PUBLIC_RELAY; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("ALLOW_PUBLIC_RELAY"); - #endif - } - - bool ripOnly = readConfig.stream_ripOnly(streamID); - if (native_fetch_stream_ripOnly(streamID) != ripOnly) - { - if (!readConfig.read_stream_ripOnly(streamID)) - { - ripOnly = gOptions.ripOnly(); - } - native_assign_stream_ripOnly(streamID, ripOnly); - updated |= RIP_ONLY; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("RIP_ONLY"); - #endif - } - - int autoDumpTime = readConfig.stream_autoDumpTime(streamID); - if (native_fetch_stream_autoDumpTime(streamID) != autoDumpTime) - { - if (!readConfig.read_stream_autoDumpTime(streamID)) - { - autoDumpTime = gOptions.autoDumpTime(); - } - native_assign_stream_autoDumpTime(streamID, autoDumpTime); - updated |= DUMP_TIME; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("DUMP_TIME"); - #endif - } - - bool autoDumpUsers = readConfig.stream_autoDumpUsers(streamID); - if (native_fetch_stream_autoDumpUsers(streamID) != autoDumpUsers) - { - if (!readConfig.read_stream_autoDumpUsers(streamID)) - { - autoDumpUsers = gOptions.autoDumpUsers(); - } - native_assign_stream_autoDumpUsers(streamID, autoDumpUsers); - updated |= DUMP_USER; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("DUMP_USER"); - #endif - } - - size_t listenerTime = readConfig.stream_listenerTime(streamID); - if (native_fetch_stream_listenerTime(streamID) != listenerTime) - { - if (!readConfig.read_stream_listenerTime(streamID)) - { - listenerTime = gOptions.listenerTime(); - } - native_assign_stream_listenerTime(streamID, listenerTime); - updated |= LIST_TIME; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("LIST_TIME"); - #endif - } - - int songHistory = readConfig.stream_songHistory(streamID); - if (native_fetch_stream_songHistory(streamID) != songHistory) - { - if (!readConfig.read_stream_songHistory(streamID)) - { - songHistory = gOptions.songHistory(); - } - native_assign_stream_songHistory(streamID, songHistory); - updated |= SONG_HIST; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("SONG_HIST"); - #endif - } - - utf8 uvoxCipherKey = readConfig.stream_uvoxCipherKey(streamID); - if (native_fetch_stream_uvoxCipherKey(streamID) != uvoxCipherKey) - { - if (!readConfig.read_stream_uvoxCipherKey(streamID)) - { - uvoxCipherKey = gOptions.uvoxCipherKey(); - } - native_assign_stream_uvoxCipherKey(streamID, uvoxCipherKey); - updated |= CIPHER_KEY; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("CIPHER_KEY"); - #endif - } - - // passwords are handled slightly differently as clearing of the - // password will lead to an invalid scenario so we check and block - utf8 streamPassword = readConfig.stream_password(streamID); - if (native_fetch_stream_password(streamID) != streamPassword) - { - if (!readConfig.read_stream_password(streamID)) - { - // clear what was being previously stored if possible - m_stream_password[streamID].clear(); - updated |= SOURCE_PWD; - } - else - { - // if empty then set back to the master password - if(streamPassword.empty()) - { - streamPassword = readConfig.password(); - } - - // if empty then set back to the master admin password - if(streamPassword.empty()) - { - ELOG(LOGNAME "'password' cannot be set to empty. Not applying this change to stream config# " + tos(streamID)); - } - else - { - native_assign_stream_password(streamID, streamPassword); - updated |= SOURCE_PWD; - } - } - - #if defined(_DEBUG) || defined(DEBUG) - if (updated & SOURCE_PWD) - { - ELOG("SOURCE_PWD"); - } - #endif - } - - utf8 adminPassword = readConfig.stream_adminPassword(streamID); - if (native_fetch_stream_adminPassword(streamID) != adminPassword) - { - if (!readConfig.read_stream_adminPassword(streamID)) - { - // clear what was being previously stored if possible - m_stream_adminPassword[streamID].clear(); - updated |= ADMIN_PWD; - } - // if empty then set back to the master admin password - else if (adminPassword.empty()) - { - ELOG(LOGNAME "'adminpassword' cannot be set to empty. Not applying this change to stream config# " + tos(streamID)); - } - else - { - native_assign_stream_adminPassword(streamID, adminPassword); - updated |= ADMIN_PWD; - } - - #if defined(_DEBUG) || defined(DEBUG) - if (updated & ADMIN_PWD) - { - ELOG("ADMIN_PWD"); - } - #endif - } - - utf8 movedUrl = readConfig.stream_movedUrl(streamID); - if (native_fetch_stream_movedUrl(streamID) != movedUrl) - { - native_assign_stream_movedUrl(streamID, movedUrl); - updated |= MOVED_URL; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("MOVED_URL"); - #endif - } - - utf8 artworkFile = readConfig.stream_artworkFile(streamID); - if (native_fetch_stream_artworkFile(streamID) != artworkFile) - { - if (!readConfig.read_stream_artworkFile(streamID)) - { - artworkFile = gOptions.artworkFile(); - } - native_assign_stream_artworkFile(streamID, artworkFile); - updated |= ARTWORK_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("ARTWORK_FILE"); - #endif - } - - utf8 adTestFile = readConfig.stream_adTestFile(streamID); - if (native_fetch_stream_adTestFile(streamID) != adTestFile) - { - if (!readConfig.read_stream_adTestFile(streamID)) - { - adTestFile = gOptions.adTestFile(); - } - native_assign_stream_adTestFile(streamID, adTestFile); - updated |= AD_TEST_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE"); - #endif - } - - utf8 adTestFile2 = readConfig.stream_adTestFile2(streamID); - if (native_fetch_stream_adTestFile2(streamID) != adTestFile2) - { - if (!readConfig.read_stream_adTestFile2(streamID)) - { - adTestFile2 = gOptions.adTestFile2(); - } - native_assign_stream_adTestFile2(streamID, adTestFile2); - updated |= AD_TEST_FILE_2; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE_2"); - #endif - } - - utf8 adTestFile3 = readConfig.stream_adTestFile3(streamID); - if (native_fetch_stream_adTestFile3(streamID) != adTestFile3) - { - if (!readConfig.read_stream_adTestFile3(streamID)) - { - adTestFile3 = gOptions.adTestFile3(); - } - native_assign_stream_adTestFile3(streamID, adTestFile3); - updated |= AD_TEST_FILE_3; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE_3"); - #endif - } - - utf8 adTestFile4 = readConfig.stream_adTestFile4(streamID); - if (native_fetch_stream_adTestFile4(streamID) != adTestFile4) - { - if (!readConfig.read_stream_adTestFile4(streamID)) - { - adTestFile4 = gOptions.adTestFile4(); - } - native_assign_stream_adTestFile4(streamID, adTestFile4); - updated |= AD_TEST_FILE_4; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE_4"); - #endif - } - - int adTestFileLoop = readConfig.stream_adTestFileLoop(streamID); - if (native_fetch_stream_adTestFileLoop(streamID) != adTestFileLoop) - { - if (!readConfig.read_stream_adTestFileLoop(streamID)) - { - adTestFileLoop = gOptions.adTestFileLoop(); - } - native_assign_stream_adTestFileLoop(streamID, adTestFileLoop); - updated |= AD_TEST_FILE_LOOP; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AD_TEST_FILE_LOOP"); - #endif - } - - utf8 introFile = readConfig.stream_introFile(streamID); - if (native_fetch_stream_introFile(streamID) != introFile) - { - if (!readConfig.read_stream_introFile(streamID)) - { - introFile = gOptions.introFile(); - } - native_assign_stream_introFile(streamID, introFile); - updated |= INTRO_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("INTRO_FILE"); - #endif - } - - utf8 backupFile = readConfig.stream_backupFile(streamID); - if (native_fetch_stream_backupFile(streamID) != backupFile) - { - if (!readConfig.read_stream_backupFile(streamID)) - { - backupFile = gOptions.backupFile(); - } - native_assign_stream_backupFile(streamID, backupFile); - updated |= BACKUP_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BACKUP_FILE"); - #endif - } - - utf8 backupTitle = readConfig.stream_backupTitle(streamID); - if (native_fetch_stream_backupTitle(streamID) != backupTitle) - { - if (!readConfig.read_stream_backupTitle(streamID)) - { - backupTitle = gOptions.backupTitle(); - } - native_assign_stream_backupTitle(streamID, backupTitle); - updated |= BACKUP_TITLE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BACKUP_TITLE"); - #endif - } - - utf8 banFile = readConfig.stream_banFile(streamID); - if (native_fetch_stream_banFile(streamID) != banFile) - { - if (!readConfig.read_stream_banFile(streamID)) - { - m_stream_banFile[streamID].clear(); - gOptions.unread_stream_banFile(streamID); - - // unload the IPs from the list - g_banList.remove("", 0, streamID, true); - } - else - { - // load the IPs from the list - size_t sID = (!banFile.empty() ? streamID : 0); - g_banList.load(banFile,sID); - } - native_assign_stream_banFile(streamID, banFile); - updated |= BAN_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BAN_FILE"); - #endif - } - - utf8 ripFile = readConfig.stream_ripFile(streamID); - if (native_fetch_stream_ripFile(streamID) != ripFile) - { - if (!readConfig.read_stream_ripFile(streamID)) - { - m_stream_ripFile[streamID].clear(); - gOptions.unread_stream_ripFile(streamID); - - // unload the IPs from the list - g_ripList.remove("",streamID,true); - } - else - { - // load the IPs from the list - size_t sID = (!ripFile.empty() ? streamID : 0); - g_ripList.load(ripFile,sID); - } - native_assign_stream_ripFile(streamID, ripFile); - updated |= RIP_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("RIP_FILE"); - #endif - } - - utf8 agentFile = readConfig.stream_agentFile(streamID); - if (native_fetch_stream_agentFile(streamID) != agentFile) - { - if (!readConfig.read_stream_agentFile(streamID)) - { - m_stream_agentFile[streamID].clear(); - gOptions.unread_stream_agentFile(streamID); - - // unload the agents from the list - g_agentList.remove("", streamID, true); - } - else - { - // load the agents from the list - size_t sID = (!agentFile.empty() ? streamID : 0); - g_agentList.load(agentFile, sID); - } - native_assign_stream_agentFile(streamID, agentFile); - updated |= AGENT_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("AGENT_FILE"); - #endif - } - - utf8 w3cLog = readConfig.stream_w3cLog(streamID); - if (native_fetch_stream_w3cLog(streamID) != w3cLog) - { - if (!readConfig.read_stream_w3cLog(streamID)) - { - m_stream_w3cLog[streamID].clear(); - gOptions.unread_stream_w3cLog(streamID); - w3cLog::close(streamID); - } - else - { - // could have just changed so update as needed - utf8 oldw3cLog = native_fetch_stream_w3cLog(streamID); - if (!oldw3cLog.empty()) - { - w3cLog::close(streamID); - } - size_t sID = (!w3cLog.empty() ? streamID : 0); - if (gOptions.w3cEnable()) - { - w3cLog::open(w3cLog, sID); - } - } - native_assign_stream_w3cLog(streamID, w3cLog); - updated |= W3C_FILE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("W3C_FILE"); - #endif - } - - utf8 hideStats = readConfig.stream_hideStats(streamID); - if (native_fetch_stream_hideStats(streamID) != hideStats) - { - if (!readConfig.read_stream_hideStats(streamID)) - { - hideStats = gOptions.hideStats(); - } - native_assign_stream_hideStats(streamID, hideStats); - updated |= HIDE_STATS; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("HIDE_STATS"); - #endif - } - - int cdnMaster = readConfig.cdn_master(streamID); - if (native_fetch_cdn_master(streamID) != cdnMaster) - { - if (!readConfig.read_cdn_master(streamID)) - { - cdnMaster = -1; - } - native_assign_cdn_master(streamID, cdnMaster); - updated |= CDN_MASTER; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("CDN_MASTER"); - #endif - } - - int cdnSlave = readConfig.cdn_slave(streamID); - if (native_fetch_cdn_slave(streamID) != cdnSlave) - { - if (!readConfig.read_cdn_slave(streamID)) - { - cdnSlave = -1; - } - native_assign_cdn_slave(streamID, cdnSlave); - updated |= CDN_SLAVE; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("CDN_SLAVE"); - #endif - } - - int backupLoop = readConfig.stream_backupLoop(streamID); - if (native_fetch_stream_backupLoop(streamID) != backupLoop) - { - if (!readConfig.read_stream_backupLoop(streamID)) - { - backupLoop = gOptions.backupLoop(); - } - native_assign_stream_backupLoop(streamID, backupLoop); - updated |= DUMP_USER; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("BACKUP_LOOP"); - #endif - } - - int rateLimitWait = readConfig.stream_rateLimitWait(streamID); - if (native_fetch_stream_rateLimitWait(streamID) != rateLimitWait) - { - if (!readConfig.read_stream_rateLimitWait(streamID)) - { - rateLimitWait = gOptions.rateLimitWait(); - } - native_assign_stream_rateLimitWait(streamID, rateLimitWait); - updated |= RATE_LIMIT_WAIT; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("RATE_LIMIT_WAIT"); - #endif - } - - int metainterval = readConfig.stream_metaInterval(streamID); - if (native_fetch_stream_metaInterval(streamID) != metainterval) - { - if (!readConfig.read_stream_metaInterval(streamID)) - { - metainterval = gOptions.metaInterval(); - } - native_assign_stream_metaInterval(streamID, metainterval); - updated |= METAINTERVAL; - #if defined(_DEBUG) || defined(DEBUG) - ELOG("METAINTERVAL"); - #endif - } - - if (updated) - { - ILOG(LOGNAME "Updates applied to stream config# " + tos(streamID) + " [code: 0x" + tohex(updated) + "]"); - } - else - { - ILOG(LOGNAME "No updates required for stream config# " + tos(streamID)); - } - return updated; -} - -void config::addStreamConfig(config &readConfig, streamConfig add) throw(exception) -{ - if (!add.m_streamID) - { - return; - } - - stackLock sml(m_lock); - size_t streamID = add.m_streamID; - - native_assign_stream_ID(streamID, streamID); - native_assign_stream_adminPassword(streamID, add.m_adminPassword); - native_assign_stream_allowPublicRelay(streamID, add.m_allowPublicRelay); - native_assign_stream_allowRelay(streamID, add.m_allowRelay); - native_assign_stream_authHash(streamID, add.m_authHash); - native_assign_stream_password(streamID, add.m_password); - native_assign_stream_publicServer(streamID, add.m_publicServer); - native_assign_stream_maxBitrate(streamID, add.m_maxStreamBitrate); - native_assign_stream_minBitrate(streamID, add.m_minStreamBitrate); - native_assign_stream_maxUser(streamID, add.m_maxStreamUser); - native_assign_stream_relayURL(streamID, add.m_relayUrl.url()); - native_assign_stream_backupURL(streamID, add.m_backupUrl.url()); - native_assign_stream_path(streamID, add.m_urlPath); - - if (gOptions.w3cEnable()) - { - utf8 w3cLog = readConfig.stream_w3cLog(streamID); - if (readConfig.read_stream_w3cLog(streamID)) - { - if (gOptions.w3cEnable()) - { - w3cLog::open(w3cLog, streamID); - } - } - } - - if (gOptions.saveBanListOnExit()) - { - if (readConfig.read_stream_banFile(streamID) && !gOptions.stream_banFile(streamID).empty()) - { - g_banList.save(gOptions.stream_banFile(streamID),streamID); - } - } - - if (gOptions.saveRipListOnExit()) - { - if (readConfig.read_stream_ripFile(streamID) && !gOptions.stream_ripFile(streamID).empty()) - { - g_ripList.save(gOptions.stream_ripFile(streamID),streamID); - } - } - - if (gOptions.saveAgentListOnExit()) - { - if (readConfig.read_stream_agentFile(streamID) && !gOptions.stream_agentFile(streamID).empty()) - { - g_agentList.save(gOptions.stream_agentFile(streamID),streamID); - } - } - - ILOG(LOGNAME "Added stream config# " + tos(streamID)); -} - -void config::removeStreamConfig(streamConfig remove) throw(exception) -{ - if (!remove.m_streamID) - { - return; - } - - stackLock sml(m_lock); - size_t streamID = remove.m_streamID; - - // clean up the per-stream files - if (gOptions.w3cEnable()) - { - w3cLog::close(streamID); - } - - if (gOptions.saveBanListOnExit()) - { - if (gOptions.read_stream_banFile(streamID) && !gOptions.stream_banFile(streamID).empty()) - { - g_banList.save(gOptions.stream_banFile(streamID),streamID); - } - } - - if (gOptions.saveRipListOnExit()) - { - if (gOptions.read_stream_ripFile(streamID) && !gOptions.stream_ripFile(streamID).empty()) - { - g_ripList.save(gOptions.stream_ripFile(streamID),streamID); - } - } - - if (gOptions.saveAgentListOnExit()) - { - if (gOptions.read_stream_agentFile(streamID) && !gOptions.stream_agentFile(streamID).empty()) - { - g_agentList.save(gOptions.stream_agentFile(streamID),streamID); - } - } - - // now clear out where possible the per-stream values - gOptions.unread_stream_ID(streamID); - gOptions.unread_stream_adminPassword(streamID); - gOptions.unread_stream_agentFile(streamID); - gOptions.unread_stream_allowPublicRelay(streamID); - gOptions.unread_stream_allowRelay(streamID); - gOptions.unread_stream_authHash(streamID); - gOptions.unread_stream_autoDumpTime(streamID); - gOptions.unread_stream_autoDumpUsers(streamID); - gOptions.unread_stream_backupFile(streamID); - gOptions.unread_stream_backupTitle(streamID); - gOptions.unread_stream_backupLoop(streamID); - gOptions.unread_stream_banFile(streamID); - gOptions.unread_stream_introFile(streamID); - gOptions.unread_stream_listenerTime(streamID); - gOptions.unread_stream_maxBitrate(streamID); - gOptions.unread_stream_minBitrate(streamID); - gOptions.unread_stream_maxUser(streamID); - gOptions.unread_stream_password(streamID); - gOptions.unread_stream_path(streamID); - gOptions.unread_stream_publicServer(streamID); - gOptions.unread_stream_relayURL(streamID); - gOptions.unread_stream_backupURL(streamID); - gOptions.unread_stream_ripFile(streamID); - gOptions.unread_stream_ripOnly(streamID); - gOptions.unread_stream_agentFile(streamID); - gOptions.unread_stream_songHistory(streamID); - gOptions.unread_stream_uvoxCipherKey(streamID); - gOptions.unread_stream_w3cLog(streamID); - - gOptions.unread_cdn_master(streamID); - gOptions.unread_cdn_slave(streamID); - - map<size_t, size_t>::iterator i = m_stream_ID.find(streamID); - if (i != m_stream_ID.end()) - { - m_stream_ID.erase(i); - } - - ILOG(LOGNAME "Removed stream config# " + tos(streamID)); -} - -config::~config() throw() -{ -} - -static void write_option(const utf8 &name, const utf8 &value, FILE *f, - const uniFile::filenameType &fn, bool &written) throw(exception) -{ - const char *delimiter = "="; - const size_t delimiter_size = 1; - size_t name_size = name.size(); - size_t value_size = value.size(); - size_t eol_size = eol().size(); - - if (written && (::fwrite(eol().c_str(), 1, eol_size, f) != eol_size)) - { - throw runtime_error("I/O error writing to file " + fn.hideAsString()); - } - if (::fwrite(name.c_str(), 1, name_size, f) != name_size) - { - throw runtime_error("I/O error writing to file " + fn.hideAsString()); - } - if (::fwrite(delimiter, 1, delimiter_size, f) != delimiter_size) - { - throw runtime_error("I/O error writing to file " + fn.hideAsString()); - } - if (::fwrite(value.c_str(), 1, value_size, f) != value_size) - { - throw runtime_error("I/O error writing to file " + fn.hideAsString()); - } - written = true; -} - -std::string config::logSectionName() -{ - return LOGNAME; -} - -bool config::rewriteConfigurationFile(bool minimal, bool messages, bool setup) const throw(exception) -{ - if (!cdn().empty()) - { - WLOG(LOGNAME "CDN mode prevents re-writing of the configuration file"); - return false; - } - - if (messages) - { - ILOG(LOGNAME "Rewriting config file"); - } - - stackLock sml(m_lock); - - // add any config options to be ignored when re-writing - set<utf8> ignore_set; - ignore_set.insert("streamid"); - ignore_set.insert("include"); - ignore_set.insert("dstip"); - ignore_set.insert("yport"); - ignore_set.insert("showlastsongs"); - ignore_set.insert("streambitrate"); - ignore_set.insert("relayserver"); - ignore_set.insert("relayport"); - ignore_set.insert("reallogfile"); - ignore_set.insert("clacks"); - if (flashPolicyServerPort() == -1) - { - ignore_set.insert("flashpolicyserverport"); - } - if (portLegacy() == -1) - { - ignore_set.insert("portlegacy"); - } - if (publicPort() == -1) - { - ignore_set.insert("publicport"); - } - - bool saved = true; - FILE *f = 0; - try - { - uniFile::filenameType fn = _confFile(); - // create a backup of the current config file and then use that - if (fileUtil::fileExists(fn)) - { - uniFile::filenameType fn_backup(_confFile() + ".backup"); - uniFile::unlink(fn_backup); - #ifdef _WIN32 - if (!::MoveFileW(fn.toWString().c_str(), fn_backup.toWString().c_str())) - { - throw runtime_error("Cannot create backup of the current config file `" + - fn.hideAsString() + "' (" + errMessage().hideAsString() + ")"); - } - #else - if (::rename(fn.hideAsString().c_str(), fn_backup.hideAsString().c_str()) < 0) - { - throw runtime_error("Cannot create backup of the current config file `" + - fn.hideAsString() + "' (" + errMessage().hideAsString() + ")"); - } - #endif - } - - f = uniFile::fopen(fn,"wb"); - if (!f) - { - throw runtime_error("Cannot open config file `" + fn.hideAsString() + - "' for writing (" + errMessage().hideAsString() + ")"); - } - - map<utf8, utf8> deferredOptions = m_deferredOptions; - bool written = false; - for (optMap_t::const_iterator i = m_optMap.begin(); i != m_optMap.end(); ++i) - { - const utf8 &optName = (*i).first; - const accessor_t &a = (*i).second; - - if (ignore_set.find(optName) != ignore_set.end()) - { - continue; - } - - map<utf8,utf8>::iterator deferred_i = deferredOptions.find(optName); - if (deferred_i != deferredOptions.end()) - { - if (!minimal || (!((*deferred_i).second == (this->*a.m_defaultFunc)()))) - { - write_option(optName,(*deferred_i).second, f, fn, written); - } - deferredOptions.erase(deferred_i); - } - else - { - if ((this->*a.m_multiFunc)()) - { - const size_t num = (this->*a.m_countFunc)(); - for (size_t x = 0; x < num; ++x) - { - size_t index = 0; - if (!minimal || (!((this->*a.m_fetchFunc)(x, &index) == (this->*a.m_defaultFunc)()))) - { - write_option(optName + "_" + tos(index), (this->*a.m_fetchFunc)(index, 0), f, fn, written); - } - } - } - else - { - if (!minimal || (!((this->*a.m_fetchFunc)(1, 0) == (this->*a.m_defaultFunc)()))) - { - write_option(optName,(this->*a.m_fetchFunc)(1, 0), f, fn, written); - } - } - } - } - - // remaining deferred options - for (map<utf8,utf8>::const_iterator i = deferredOptions.begin(); i != deferredOptions.end(); ++i) - { - if (ignore_set.find((*i).first) != ignore_set.end()) - { - continue; - } - - optMap_t::const_iterator m = m_optMap.find((*i).first); - const accessor_t &a = (*m).second; - - if (!minimal || (!((*i).second == (this->*a.m_defaultFunc)()))) - { - write_option((*i).first, (*i).second, f, fn, written); - } - } - deferredOptions.clear(); - - ::fclose(f); - } - catch(const exception &ex) - { - saved = false; - ELOG(utf8(setup ? "[SETUP] " : LOGNAME) + ex.what()); - if (f) - { - ::fclose(f); - } - } - return saved; -} - -utf8 config::dumpConfigFile() throw() -{ - utf8 streams, general, debug; - - stackLock sml(m_lock); - - // add any config options to be ignored when re-writing - set<utf8> ignore_set; - ignore_set.insert("streamid"); - ignore_set.insert("include"); - ignore_set.insert("dstip"); - ignore_set.insert("yport"); - ignore_set.insert("showlastsongs"); - ignore_set.insert("streambitrate"); - ignore_set.insert("relayserver"); - ignore_set.insert("relayport"); - ignore_set.insert("reallogfile"); - if (flashPolicyServerPort() == -1) - { - ignore_set.insert("flashpolicyserverport"); - } - if (portLegacy() == -1) - { - ignore_set.insert("portlegacy"); - } - if (publicPort() == -1) - { - ignore_set.insert("publicport"); - } - - for (optMap_t::const_iterator i = m_optMap.begin(); i != m_optMap.end(); ++i) - { - const utf8 &optName = (*i).first; - const accessor_t &a = (*i).second; - - if (ignore_set.find(optName) != ignore_set.end()) - { - continue; - } - - if ((this->*a.m_multiFunc)()) - { - size_t num = (this->*a.m_countFunc)(); - for (size_t x = 0; x < num; ++x) - { - size_t index = 0; - if (!((this->*a.m_fetchFunc)(x, &index) == (this->*a.m_defaultFunc)())) - { - if (optName.find((utf8)"stream") == 0) - { - streams += optName + "_" + tos(index) + "=<b>" + (this->*a.m_fetchFunc)(index, 0) + "</b><br>"; - } - else if (optName.find((utf8)"debug") != utf8::npos) - { - debug += optName + "_" + tos(index) + "=<b>" + (this->*a.m_fetchFunc)(index, 0) + "</b><br>"; - } - else - { - general += optName + "_" + tos(index) + "=<b>" + (this->*a.m_fetchFunc)(index, 0) + "</b><br>"; - } - } - } - } - else - { - if (!((this->*a.m_fetchFunc)(1, 0) == (this->*a.m_defaultFunc)())) - { - if (optName.find((utf8)"debug") != utf8::npos) - { - debug += optName + "=<b>" + (this->*a.m_fetchFunc)(1, 0) + "</b><br>"; - } - else - { - general += optName + "=<b>" + (this->*a.m_fetchFunc)(1, 0) + "</b><br>"; - } - } - } - } - - return "<div style=\"float:left;padding:0 1em;\">" + - (!streams.empty() ? "<br><b><u>Stream Settings</u>:</b><br><br>" : (utf8)"") + - streams + "<br></div><div style=\"float:left;padding:0 1em;\">" + - (!general.empty() ? "<br><b><u>General Settings</u>:</b><br><br>" : "") + - general + "<br></div><div style=\"float:left;padding:0 1em;\">" + - (!debug.empty() ? "<br><b><u>Debugging Settings</u>:</b><br><br>" : "") + - debug + "<br></div>"; -} - -int config::promptConfigFile() throw() -{ - if (!sDaemon) - { - #ifdef _WIN32 - vector<wstring> fileList = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"*.ini", L"", true, true); - vector<wstring> fileListConf = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"*.conf", L"", true, true); - #else - vector<string> fileList = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "*.ini", ""); - vector<string> fileListConf = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "*.conf", ""); - #endif - - if (!fileList.empty()) - { - #ifdef _WIN32 - // exclude desktop.ini on windows builds as that can cause other issues - for (vector<wstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - { - if ((*i) == L".\\desktop.ini") - { - fileList.erase(i); - break; - } - } - #endif - fileList.insert(fileList.end(), fileListConf.begin(), fileListConf.end()); - } - else - { - fileList = fileListConf; - } - - if (!fileList.empty()) - { - ILOG(LOGNAME "Choose one of the listed config file(s) to load or"); - ILOG(LOGNAME "enter `s' to enable the setup mode for the DNAS or"); -#if CONFIG_BUILDER - ILOG(LOGNAME "enter `b' to enable the builder mode for the DNAS or"); -#endif - ILOG(LOGNAME "enter `x' to close this instance of the DNAS:"); - ILOG(LOGNAME "Note: Press `Enter' after choosing the config file."); - if (fileList.size() > 10) - { - ILOG(LOGNAME " Only the first 10 config files detected will be shown."); - } - - int option = 0; - if (fileList.size() > 10) - { - fileList.resize(10); - } - #ifdef _WIN32 - for (vector<wstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i, option++) - #else - for (vector<string>::const_iterator i = fileList.begin(); i != fileList.end(); ++i, option++) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8().substr(1 + u32file.rfind(utf32("\\")))); - ILOG(LOGNAME " [" + tos(option) + "] : " + u8f + (fileUtil::getSuffix(*i) == L"ini" ? " [1.x config file]" : "")); - #else - ILOG(LOGNAME " [" + tos(option) + "] : " + (*i).substr(1 + (*i).rfind("/")) + (fileUtil::getSuffix(*i) == "ini" ? " [1.x config file]" : "")); - #endif - } - - string input; - cin >> input; - - while ((!input.empty() && (input[0] != 'x') && (input[0] != 's') && (!isdigit(input[0]) || !((size_t)(input[0] - '0') < fileList.size())))) - { - ELOG(LOGNAME "You have entered an invalid option. Please enter a number matching the config file required."); - input.clear(); - cin >> input; - } - - if (input[0] == 'x') - { - return -2; - } - - if (input[0] == 's') - { - ILOG(LOGNAME "Entering setup mode. Open 127.0.0.1:8000/setup in a"); - ILOG(LOGNAME "browser on the same machine the DNAS is started on."); - return 2; - } -#ifdef CONFIG_BUILDER - if (input[0] == 'b') - { - ILOG(LOGNAME "Entering builder mode. Open 127.0.0.1:8000/builder in"); - ILOG(LOGNAME "a browser on the same machine the DNAS is started on."); - return 2; - } -#endif - if (!input.empty() && isdigit(input[0])) - { - size_t index = input[0] - '0'; - // clamped to 0 - 9 (fileList can be larger but input is only 0-9) - if (index < fileList.size()) - { - #ifdef _WIN32 - utf32 u32file(fileList[index]); - utf8 u8f(u32file.toUtf8().substr(2)); - return load(u8f); - #else - return load(fileList[index]); - #endif - } - } - } - else - { - return -1; - } - } - #ifndef _WIN32 - else - { - // if running as a daemon then make checks just for the default - // if we've not had a configuration file specified to be used. - vector<string> fileList = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_serv.ini", ""); - vector<string> fileListConf = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_serv.conf", ""); - - if (!fileList.empty()) - { - fileList.insert(fileList.end(), fileListConf.begin(), fileListConf.end()); - } - else - { - fileList = fileListConf; - } - - if (!fileList.empty()) - { - load(fileList[0]); - } - } - #endif - return 0; -} - -bool config::load(const uniFile::filenameType &filename, bool load) throw() -{ - stackLock sml(m_lock); - - // set the option that returns the name of the config file - m_confFile[DEFAULT_CLIENT_STREAM_ID] = filename; - - // only need to set the filename when creating a new file - if (!load) - { - return true; - } - - // check for 'setup' and abort config file loading -#ifdef CONFIG_BUILDER - if ((filename == "builder") || (filename == "setup")) -#else - if (filename == "setup") -#endif - { - return false; - } - - // setup the legacy relay config options to cope with reloads, etc - m_legacyRelayServer.clear(); - m_legacyRelayPort = ":80"; - - bool result = _load(filename, (utf8)"", true); - - // if the server hasn't been read then skip over this as it's - // likely there wasn't any legacy relay config options read - if (!m_legacyRelayServer.empty() && !(m_legacyRelayServer == "http://")) - { - // make sure that the old relay url is added by force setting streamid=1 - optMap_t::const_iterator i = m_optMap.find("streamid"); - (this->*((*i).second.m_assignFunc))(tos(DEFAULT_CLIENT_STREAM_ID), DEFAULT_CLIENT_STREAM_ID); - - utf8 legacyRelay = m_legacyRelayServer + m_legacyRelayPort; - i = m_optMap.find("streamrelayurl"); - (this->*((*i).second.m_assignFunc))(legacyRelay, DEFAULT_CLIENT_STREAM_ID); - } - - // use this to map the v2.0.0 value to that from 2.0.1+ - if (hideStats() == "1") - { - optMap_t::const_iterator i = m_optMap.find("hidestats"); - (this->*((*i).second.m_assignFunc))("stats", 0); - } - - // detect a failed attempt to load a config file and ensure we follow defaults on fail - if (m_log.empty()) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = true; - } - if (result == true) - { - if (m_logFile.empty()) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = true; - } - else if (m_logFile[DEFAULT_CLIENT_STREAM_ID].size() < 1) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = false; - } - else if (compareStringsWithoutCase(m_logFile[0], uniFile::filenameType("none"))) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = false; - } - else if (compareStringsWithoutCase(m_logFile[0], uniFile::filenameType("/dev/null"))) - { - m_log[DEFAULT_CLIENT_STREAM_ID] = false; - } - } - return result; -} - -// load options from a config file. Generally only done at startup. -// Config file should be in utf8 format -const bool config::_load(const uniFile::filenameType &filename, const utf8& uniqueStr, const bool parent = false) throw() -{ - const utf8 unique_matching_token("$"); - utf8 unique(unique_matching_token); - if (uniqueStr.empty()) - { - unique = unique_matching_token; - } - else - { - unique = uniqueStr; - } - - int l = 0; // line counter - bool loaded = true; - - // open it. Use the deferred messages since this happens at startup - FILE *conf = uniFile::fopen(filename, "rb"); - if (!conf) - { - loaded = false; - m_deferredWarnLogMessages.push_back(LOGNAME "Could not find `" + fileUtil::getFullFilePath(filename) + - (parent == true ? "' - looking for config file to load..." : "'")); - goto no_read_conf; - } - - // parse each line of the file - while (true) - { - int subIndex = DEFAULT_CLIENT_STREAM_ID; // for items of form xxxxxx_# (multi-options) - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), conf)) - { - break; // get a line - } - - size_t offset = strlen(buffer) - 1; - while (buffer[offset] == '\n' || buffer[offset] == '\r') - { - buffer[offset]='\0'; // get rid of cr/lf - } - ++l; // increment line counter - - char *pbuffer = buffer; - while (pbuffer && (*pbuffer == ' ' || *pbuffer == '\t')) - { - ++pbuffer; // remove trailing whitespace - } - - if (!pbuffer || !*pbuffer || (*pbuffer == ';') || (*pbuffer == '[') || (*pbuffer == '#')) - { - continue; // blank lines or comments skipped - } - - char *tok = pbuffer; - while (pbuffer && *pbuffer && (*pbuffer != '=') && (*pbuffer != '\r')) - { - ++pbuffer; // look for = sign - } - if (!pbuffer || !*pbuffer) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Invalid statement on line " + tos(l) + " of " + filename + " -> `" + utf8(buffer) + "'"); - continue; - } - *pbuffer++=0; - - // skip utf-8 BOM - if ((strlen(tok) > 2) && - (((unsigned char*)tok)[0] == 0xef) && - (((unsigned char*)tok)[1] == 0xbb) && - (((unsigned char*)tok)[2] == 0xbf)) - { - tok += 3; - } - - utf8 stok = tok; - // see if it's a multi option and set the subIndex value - const vector<utf8> tokens = tokenizer(stok, '_'); - if (tokens.size() == 2) - { - stok = tokens[0]; - subIndex = atoi((const char *)stripWhitespace(tokens[1]).c_str()); - - // this ensure the subIndex has been specified even if there is no streamid - // this is to fix a load of config setup issues from people not setting it. - optMap_t::const_iterator sid = m_optMap.find("streamid"); - (this->*((*sid).second.m_assignFunc))(tos(subIndex), subIndex); - } - stok = stripWhitespace(stok); // cleanup some more whitespace just in case - - // look for the base option name in the option map - utf8 base_option_name = toLower(stok); - if (base_option_name.empty()) - { - // skip over empty values - continue; - } - - // used for mapping *autodumpsourcetime to *autodumptime - int autoDumpTime = 0; - if (base_option_name == "autodumpsourcetime") - { - base_option_name = "autodumptime"; - autoDumpTime = 1; - } - else if (base_option_name == "streamautodumpsourcetime") - { - base_option_name = "streamautodumptime"; - autoDumpTime = 2; - } - else if (base_option_name == "reallogfile" || - base_option_name == "autoauthhash") - { - // skip over as not pubiically exposed - continue; - } - - optMap_t::const_iterator i = m_optMap.find(base_option_name); - bool legacyRelay = false; - bool stream_bitrate = (base_option_name == "streambitrate"); - if (i == m_optMap.end()) - { - if (!((base_option_name == "relayserver") || (base_option_name == "relayport") || stream_bitrate)) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Invalid item on line " + tos(l) + " of " + filename + " -> `" + base_option_name + "'"); - continue; - } - else - { - if (!stream_bitrate) - { - legacyRelay = true; - } - } - } - else - { - // do we have a stream* entry and no stream id mentioned / working against default - // if yes then force streamid=1 to be set so that the options will be recognised - uniString::utf8::size_type spos = base_option_name.find(utf8("stream")); - if ((spos != uniString::utf8::npos) && (spos == 0) && (subIndex == DEFAULT_CLIENT_STREAM_ID)) - { - // this ensure the subIndex has been specified even if there is no streamid - // this is to fix a load of config setup issues from people not setting it. - const optMap_t::const_iterator sid = m_optMap.find("streamid"); - (this->*((*sid).second.m_assignFunc))(tos(subIndex), subIndex); - } - } - - // move tok to the value - tok = pbuffer; - while (tok && *tok && *tok == ' ') - { - ++tok; - } - - utf8 value = stripWhitespace(utf8(tok)); - - // if we're re-mapping *autodumpsourcetime then indicate in the log output - if (autoDumpTime > 0) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Deprecated statement found on line " + tos(l) + " of " + - filename + " -> change " + (autoDumpTime == 2 ? "stream" : "") + - "autodumpsourcetime_" + tos(subIndex) + "=" + value + " to " + - (autoDumpTime == 2 ? "stream" : "") + "autodumptime_" + - tos(subIndex) + "=" + value); - } - - // this is used in the mapping of the old ocnfig options to the new style streamrelayurl - if (legacyRelay == true) - { - if (base_option_name == "relayserver") - { - utf8::size_type check = (!value.empty() ? value.find(utf8("http://")) : 0); - if (check == utf8::npos) - { - m_legacyRelayServer = "http://" + value; - } - else - { - m_legacyRelayServer = value; - } - } - if (base_option_name == "relayport") - { - utf8::size_type check = value.find(utf8(":")); - if ((check == utf8::npos) || (check != 0)) - { - m_legacyRelayPort = ":" + value; - } - else - { - m_legacyRelayPort = value; - } - } - - continue; - } - - // check for yes / no values and map them to 1 or 0 to cope with legacy config loading - if ((base_option_name == "w3cenable") || - (base_option_name == "allowrelay") || - (base_option_name == "allowpublicrelay") || - (base_option_name == "riponly")) - { - if (toLower(value) == "yes") - { - value = "1"; - } - if (toLower(value) == "no") - { - value = "0"; - } - } - - // validation checks on the 'cdn' parameter to ensure we're all good else where - if (base_option_name == "cdn") - { - value = toLower(value); - if (!(value == "on") && !(value == "always") && !(value == "master")) - { - value = ""; - } - } - - if (stream_bitrate) - { - const optMap_t::const_iterator min = m_optMap.find("streamminbitrate"); - (this->*((*min).second.m_assignFunc))(value, subIndex); - const optMap_t::const_iterator max = m_optMap.find("streammaxbitrate"); - (this->*((*max).second.m_assignFunc))(value, subIndex); - continue; - } - - // validation checks on the port parameters to detect the 'any' - // case which is meant to be treated the same as an empty value - if ((base_option_name == "srcdns") || - (base_option_name == "srcip") || - (base_option_name == "destdns") || - (base_option_name == "destip") || - (base_option_name == "dstip") || - (base_option_name == "publicdns") || - (base_option_name == "publicip")) - { - if (toLower(value) == "any") - { - value = ""; - } - } - - // check for streampath values and fix to have / on the start to ensure it will - // work for client connections without impacting on client connection time, etc - if (base_option_name == "streampath") - { - utf8::size_type path = value.find(utf8(":")); - if (path != utf8::npos) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Ignoring streampath_" + tos(subIndex) + "=" + value + " as this will produce an invalid path."); - value.clear(); - continue; - } - - path = value.find(utf8("var/www")); - // catches var/www... or /var/www... style paths - // which are best just filtered as it gives away - // paths on the host machine which looks crappy! - if ((path != utf8::npos) && (path < 2)) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Ignoring streampath_" + tos(subIndex) + "=" + value + " as this will produce an invalid path."); - value.clear(); - continue; - } - - // check for empty as we can incorrectly end up - // setting streampath_xx=/ which causes issues! - if (!value.empty()) - { - path = value.find(utf8("/")); - if ((path == utf8::npos) || (path != 0)) - { - value = "/" + value; - } - } - - // additionally we check for specific 'default' paths and block their usage - // based on a match against the start of the streampath (might block some - // possibly valid streampaths but it'll avoid stupid configuration issues). - const char * disallowed[] = { "/listen.pls", "/listen.m3u", "/listen.asx", "/listen.xspf", - "/listen.qtl", "/listen", "/7.html", "/index.html", - "/played", "/played.html", "/admin.cgi", "/statistics", - "/stats", "/streamart", "/playingart", "/nextsong", "/home", - "/home.html", "/nextsongs", "/currentsong", "/shoutcast.swf", - "/crossdomain.xml", "/index.css", "/images/", "/favicon.ico", - "/robots.txt", "/images/favicon.ico", "/images/listen.png", - "/images/history.png", "/images/lock.png", "/images/noadavail.png", - "/images/streamart.png", "/images/adavail.png", "/images/v2.png", - "/images/playingart.png", "/adplayed/adplayed.png", "/images/v1.png", - "/images/relay.png", "/images/wa.png", "/images/chrome.png", - "/images/firefox.png", "/images/safari.png", "/images/ie.png", - "/images/vlc.png", "/images/fb2k.png", "/images/wmp.png", - "/images/icecast.png", "/images/html5.png", "/images/rtb.png", - "/images/ps.png", "/images/mplayer.png", "/images/apple.png", - "/images/roku.png", "/images/itunes.png", "/images/warn.png", - "/images/xff.png", "/images/radionomy.png", "/images/curl.png", - "/images/flash.png", "/images/synology.png", "/images/wiimc.png" - }; - for (size_t x = 0; x < sizeof(disallowed) / sizeof(disallowed[0]); x++) - { - path = value.find(utf8(disallowed[x])); - if ((path != utf8::npos) && !path) - { - m_deferredWarnLogMessages.push_back(LOGNAME "Ignoring streampath_" + tos(subIndex) + "=" + value + " as this contains a reserved path."); - value.clear(); - continue; - } - } - } - - // check for redirecturl and streamredirecturl and ensure there is a http:// - // otherwise we need to process multiple times on page hits which isn't good - if ((base_option_name == "redirecturl" || base_option_name == "streamredirecturl") && !value.empty()) - { - utf8::size_type url = (!value.empty() ? value.find(utf8("http://")) : 0); - if (url == utf8::npos) - { - value = "http://" + value; - } - } - - // check the passwords for validity e.g. they're not allowed to contain a colon - // as that can break the multiple-1.x source support as well as 2.x source join - if (base_option_name == "password" || base_option_name == "streampassword" || - base_option_name == "adminpassword" || base_option_name == "streamadminpassword") - { - if (value.find(utf8(":")) != utf8::npos) - { - m_deferredErrorLogMessages.push_back(LOGNAME "`" + base_option_name + - (subIndex > 1 ? "_" + tos(subIndex) : "") + - "' contains a reserved character and will be ignored. " - "Please remove all colons to resolve this issue."); - value.clear(); - continue; - } - } - - // special case to mimic old sc_serv conf file behaviour. In old sc_serv, the conf variable "unique" can - // be subsituted for $ in any value related to a filename - if (base_option_name == "unique") - { - unique = value; - } - - if ((base_option_name == "logfile") || - (base_option_name == "adtestfile") || - (base_option_name == "adtestfile2") || - (base_option_name == "adtestfile3") || - (base_option_name == "adtestfile4") || - (base_option_name == "streamadtestfile") || - (base_option_name == "streamadtestfile2") || - (base_option_name == "streamadtestfile3") || - (base_option_name == "streamadtestfile4") || - (base_option_name == "introfile") || - (base_option_name == "streamintrofile") || - (base_option_name == "backupfile") || - (base_option_name == "streambackupfile") || - (base_option_name == "banfile") || - (base_option_name == "streambanfile") || - (base_option_name == "ripfile") || - (base_option_name == "streamripfile") || - (base_option_name == "agentfile") || - (base_option_name == "artworkfile") || - (base_option_name == "streamagentfile") || - (base_option_name == "streamartworkfile") || - (base_option_name == "include") || - (base_option_name == "w3clog") || - (base_option_name == "streamw3clog") || - (base_option_name == "portbase")) - { - if (unique != unique_matching_token) - { - utf8::size_type pos = value.find(unique_matching_token); - while (pos != utf8::npos) - { - value.replace(pos, 1, unique); - pos = value.find(unique_matching_token); - } - } - - // attempt to convert \ to / and vice versa as needed for cross-platform sharing of configuration files - fileUtil::convertOSFilePathDelimiter(value); - } - - if (base_option_name == "include") - { - // get the current folder so we can load from include=common.conf if using full paths, etc - uniFile::filenameType currentPath = fileUtil::onlyPath(filename); - - // this will handle wildcard matching as applicable to what has been set in the 'include' - // value so will allow us to have individual configs via 'include=./stream/stream_*.conf' - #ifdef _WIN32 - vector<wstring> fileList = fileUtil::directoryFileList(value.toWString(), currentPath.toWString(), true, true); - #else - vector<string> fileList = fileUtil::directoryFileList(value.hideAsString(), currentPath.hideAsString()); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector<wstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector<string>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - _load(u8f, unique); - #else - _load(*i, unique); - #endif - } - } - } - else - { - (this->*((*i).second.m_assignFunc))(value, subIndex); - } - } - - // close the config file - ::fclose(conf); - -no_read_conf: - return loaded; -} - -bool config::editConfigFileEntry(size_t sid, const uniFile::filenameType &filename, - const uniString::utf8 &authhash, - const uniString::utf8 ¶m, const bool add, - bool &handled, bool &idHandled, - const bool parent = false) throw() -{ - bool loaded = true; - FILE *conf = NULL, *newconf = NULL; - char buffer[4096] = {0}; - char copyBuffer[4096] = {0}; - char *pbuffer = buffer; - int l = 0; // line counter - - // create a backup of the current config file and then use that - uniFile::filenameType fn(filename + ".backup"); - uniFile::unlink(fn); - #ifdef _WIN32 - if (!::MoveFileW(filename.toWString().c_str(), fn.toWString().c_str())) - #else - if (::rename(filename.hideAsString().c_str(), fn.hideAsString().c_str())) - #endif - { - loaded = false; - ELOG(LOGNAME "Could not backup original file `" + filename + "'"); - goto no_write_conf; - } - - conf = uniFile::fopen(filename+".backup","rb"); - if (!conf) - { - loaded = false; - ELOG(LOGNAME "Could not open `" + filename + "'(" + errMessage().hideAsString() + ")"); - goto no_write_conf; - } - - newconf = uniFile::fopen(filename,"wb"); - if (!newconf) - { - loaded = false; - ELOG(LOGNAME "Could not open `" + filename+".backup' (" + errMessage().hideAsString() + ")"); - goto no_write_conf; - } - - // parse each line of the file - while (true) - { - size_t subIndex = DEFAULT_CLIENT_STREAM_ID; // for items of form xxxxxx_# (multi-options) - - if (!fgets(buffer, sizeof(buffer), conf)) - { - break; // get a line - } - memcpy(copyBuffer, buffer, sizeof(copyBuffer)); - - size_t offset = strlen(buffer)-1; - while (buffer[offset]=='\n' || buffer[offset]=='\r') - { - buffer[offset]='\0'; // get rid of cr/lf - } - ++l; // increment line counter - - pbuffer = buffer; - while (pbuffer && (*pbuffer == ' ' || *pbuffer == '\t')) - { - ++pbuffer; // remove trailing whitespace - } - - if (!pbuffer || !*pbuffer || *pbuffer == ';' || *pbuffer == '[' || *pbuffer == '#') - { - fwrite(copyBuffer,1,strlen(copyBuffer),newconf); - continue; // blank lines or comments skipped - } - - char *tok = pbuffer; - while (pbuffer && *pbuffer && *pbuffer != '=' && *pbuffer != '\r') - { - ++pbuffer; // look for = sign - } - if (!pbuffer || !*pbuffer) - { - fwrite(copyBuffer,1,strlen(copyBuffer),newconf); - continue; - } - *pbuffer++=0; - - // skip utf-8 BOM - if ((strlen(tok) > 2) && - (((unsigned char*)tok)[0] == 0xef) && - (((unsigned char*)tok)[1] == 0xbb) && - (((unsigned char*)tok)[2] == 0xbf)) - { - tok += 3; - } - - utf8 stok = tok; - // see if it's a multi option and set the subIndex value - const vector<utf8> tokens = tokenizer(stok, '_'); - if (tokens.size() == 2) - { - stok = tokens[0]; - subIndex = atoi((const char *)stripWhitespace(tokens[1]).c_str()); - } - stok = stripWhitespace(stok); // cleanup some more whitespace just in case - - // look for the base option name in the option map - utf8 base_option_name = toLower(stok); - optMap_t::const_iterator i = m_optMap.find(base_option_name); - if (i == m_optMap.end()) - { - fwrite(copyBuffer,1,strlen(copyBuffer),newconf); - continue; - } - - // move tok to the value - tok = pbuffer; - while (tok && *tok && *tok == ' ') - { - ++tok; - } - - utf8 value = stripWhitespace(utf8(tok)); - - // this will attempt to check if streamid is present, otherwise we need to add otherwise - // when the DNAS is restarted then it will not find the authhash despite being in there - if (base_option_name == "streamid" && subIndex == sid && add == true) - { - idHandled = true; - } - - // this will attempt to update a dummy entry in the config or remove depending on the mode - if (base_option_name == "streamauthhash" && subIndex == sid) - { - // attempt to match the line breaks already in the file so it's consistent - if (add == true) - { - // default to the current platforms encoding so it'll at least have a line break - utf8 readEol = eol(); - if (copyBuffer[0]) - { - // determine if just \n or \r\n - size_t offset = strlen(copyBuffer)-1; - if (copyBuffer[offset] == '\n') - { - if (copyBuffer[offset-1] == '\r') - { - readEol = "\r\n"; - } - else - { - readEol = "\n"; - } - } - else if (copyBuffer[offset] == '\r') - { - readEol = "\r"; - } - } - - uniString::utf8 newEntry("streamauthhash_"+tos(sid)+"="+authhash+readEol); - fwrite(newEntry.c_str(),1,newEntry.size(),newconf); - } - handled = true; - } - // this will attempt to update a dummy entry in the config or remove depending on the mode - else if (base_option_name == authhash && !sid) - { - // attempt to match the line breaks already in the file so it's consistent - if (add == true) - { - // default to the current platforms encoding so it'll at least have a line break - utf8 readEol = eol(); - if (copyBuffer[0]) - { - // determine if just \n or \r\n - size_t offset = strlen(copyBuffer)-1; - if (copyBuffer[offset] == '\n') - { - if (copyBuffer[offset-1] == '\r') - { - readEol = "\r\n"; - } - else - { - readEol = "\n"; - } - } - else if (copyBuffer[offset] == '\r') - { - readEol = "\r"; - } - } - - if (param == "1") - { - uniString::utf8 newEntry(authhash+"="+param+eol()); - fwrite(newEntry.c_str(),1,newEntry.size(),newconf); - } - } - handled = true; - } - else - { - fwrite(copyBuffer,1,strlen(copyBuffer),newconf); - } - - if (base_option_name == "include") - { - // get the current folder so we can load from include=common.conf if using full paths, etc - uniFile::filenameType currentPath = fileUtil::onlyPath(filename); - - // this will handle wildcard matching as applicable to what has been set in the 'include' - // value so will allow us to have individual configs via 'include=./stream/stream_*.conf' - #ifdef _WIN32 - vector<wstring> fileList = fileUtil::directoryFileList(value.toWString(), currentPath.toWString(), true, true); - #else - vector<string> fileList = fileUtil::directoryFileList(value.hideAsString(), currentPath.hideAsString()); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector<wstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector<string>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - editConfigFileEntry(sid, u8f, authhash, param, add, handled, idHandled); - #else - editConfigFileEntry(sid, *i, authhash, param, add, handled, idHandled); - #endif - } - } - } - } - - // only save back to the first config file if nothing was done in any included files - if (parent == true && add == true && (handled == false || idHandled == false)) - { - if (sid && idHandled == false) - { - // look at and append a newline if there isn't one already at the config's eof - if (copyBuffer[0]) - { - size_t len = strlen(copyBuffer)-1; - if (copyBuffer[len] != '\r' && copyBuffer[len] != '\n') - { - fwrite(eol().c_str(),1,eol().size(),newconf); - } - } - idHandled = true; - } - - if (sid && handled == false) - { - // look at and append a newline if there isn't one already at the config's eof - if (copyBuffer[0]) - { - size_t len = strlen(copyBuffer)-1; - if (copyBuffer[len] != '\r' && copyBuffer[len] != '\n') - { - fwrite(eol().c_str(),1,eol().size(),newconf); - } - } - uniString::utf8 newEntry("streamauthhash_"+tos(sid)+"="+authhash+eol()); - fwrite(newEntry.c_str(),1,newEntry.size(),newconf); - handled = true; - } - - // for anything else, if it's at the default then no need to add, just remove it - if (!sid && handled == false && (param == "1")) - { - // look at and append a newline if there isn't one already at the config's eof - if (copyBuffer[0]) - { - size_t len = strlen(copyBuffer)-1; - if (copyBuffer[len] != '\r' && copyBuffer[len] != '\n') - { - fwrite(eol().c_str(),1,eol().size(),newconf); - } - } - uniString::utf8 newEntry(authhash+"="+param+eol()); - fwrite(newEntry.c_str(),1,newEntry.size(),newconf); - handled = true; - } - } - - // close the config file - ::fclose(conf); - ::fclose(newconf); - -no_write_conf: - return loaded; -} - -///////////////////////////////////////////////// -///// service template interface methods //////// -///////////////////////////////////////////////// - -const vector<utf8> config::fromArgs(const vector<utf8> &cl) throw() -{ - vector<utf8> result; - // only attempt to load a passed configuration file otherwise beforehand - // this would cause sc_serv to load and appear to do nothing so make sure - // that we let the defaults stay in effect so it will do work correctly - if (!cl.empty()) - { - load(cl.front()); - vector<utf8>::const_iterator i = cl.begin(); - ++i; - while (i != cl.end()) - { - result.push_back(*(i++)); - } - } - - #ifdef _WIN32 - if (_logFile() == DEFAULT_LOG) - { - // this will fill in the default log path as required - wchar_t m_fileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(DEFAULT_LOGW, m_fileName, MAX_PATH); - assign_logFile(utf32(m_fileName).toUtf8(), DEFAULT_CLIENT_STREAM_ID); - } - #endif - - return result; -} - -bool config::getConsoleLogging() const throw() -{ - stackLock sml(m_lock); - return (!sDaemon ? _screenLog() && _log() : false); -} - -const uniFile::filenameType config::getFileLog() const throw() -{ - stackLock sml(m_lock); - - static const uniFile::filenameType empty; - return (_log() ? _logFile() : empty); -} - -#ifdef _WIN32 -utf8 config::getSystemLogConfigString() throw() { return AOL_logger::systemLogger_element::panicConfiguration(); } -#else -utf8 config::getSystemLogConfigString() throw() { return "";} -#endif - -utf8 config::getVersionBuildStrings() throw() -{ - static utf8 version = ""; - if (version.empty()) - { -#ifdef _WIN32 - getVersionInfo(version); -#else - for (int x = 0; x < VENT; ++x) - { - if (x) - { - version += "."; - } - version += tos(PRODUCTVERSION[x]); - } -#endif -#ifdef LICENCE_FREE - version += " no-licence-check"; -#endif - } - return version; -} - -utf8 config::streamConfig::urlObj::parse(const utf8 &in_url, utf8 &out_server, u_short &out_port, utf8 &out_path) throw(exception) -{ - utf8 url(in_url); - - // quick out - if (in_url.empty()) - { - out_server.clear(); - out_port = 0; - out_path.clear(); - return in_url; - } - ///////////// - - utf8 server; - utf8 path("/"); - u_short port = 80; - - if (url.empty()) - { - throwEx<runtime_error>(LOGNAME "Parse error in url (" + url + ")"); - } - - url = stripHTTPprefix(url); - - utf8::size_type pos = url.find(utf8(":")), - pos2 = url.find(utf8("/")); - - if ((pos != utf8::npos) && ((pos2 == utf8::npos) || (pos < pos2))) - { - // port - server = url.substr(0, pos); - url.erase(0,pos + 1); - pos2 = url.find(utf8("/")); - port = utf8(url.substr(0, pos2)).toInt(); - url.erase(0,pos2); - } - else - { - server = url.substr(0,pos2); - url.erase(0,pos2); - } - - if (!url.empty()) - { - path = url; - } - out_server = server; - out_port = port; - out_path = path; - return in_url; -} - -uniString::utf8 config::getCrossDomainFile(const bool compressed) throw() -{ - if (m_crossdomainStr.empty()) - { - utf8 body = loadLocalFile(fileUtil::getFullFilePath(flashPolicyFile())); - if (body.empty()) - { - utf8 ports = tos(portBase()); - if (g_legacyPort >= 1 && g_legacyPort <= 65535) - { - ports += "," + tos(g_legacyPort); - } - if (!m_usedAlternatePorts.empty()) - { - ports += m_usedAlternatePorts; - } - - body = "<?xml version=\"1.0\"?>\n<!DOCTYPE cross-domain-policy SYSTEM " - "\"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">\n" - "<cross-domain-policy>\n" - "<allow-access-from domain=\"*\" to-ports=\""+ports+"\"/>\n" - "<allow-http-request-headers-from domain=\"*\" headers=\"*\"/>\n" - "</cross-domain-policy>"; - } - - m_crossdomainStrGZ = m_crossdomainStr = body; - - if (!compressData(m_crossdomainStrGZ)) - { - m_crossdomainStrGZ.clear(); - } - } - - // default to returning the non-compressed version - return (compressed ? (!m_crossdomainStrGZ.empty() ? m_crossdomainStrGZ : m_crossdomainStr) : m_crossdomainStr); -} - -uniString::utf8 config::getShoutcastSWF(const bool compressed) throw() -{ - if (m_shoutcastSWFStr.empty()) - { - utf8 body = loadLocalFile(gStartupDirectory + "shoutcast.swf"); - if (body.empty()) - { - body = MSG_HTTP404; - } - - m_shoutcastSWFStrGZ = m_shoutcastSWFStr = body; - - if (!compressData(m_shoutcastSWFStrGZ)) - { - m_shoutcastSWFStrGZ.clear(); - } - } - - // default to returning the non-compressed version - return (compressed ? (!m_shoutcastSWFStrGZ.empty() ? m_shoutcastSWFStrGZ : m_shoutcastSWFStr) : m_shoutcastSWFStr); -} - -uniString::utf8 config::getIndexCSS(const bool compressed) throw() -{ - if (m_styleCustomStr.empty()) - { - utf8 body = loadLocalFile(fileUtil::getFullFilePath(adminCSSFile())); - if (!body.empty()) - { - m_styleCustomStrGZ = m_styleCustomStr = body; - - if (!compressData(m_styleCustomStrGZ)) - { - m_styleCustomStrGZ.clear(); - } - } - } - - // default to returning the non-compressed version - return (compressed ? (!m_styleCustomStrGZ.empty() ? m_styleCustomStrGZ : m_styleCustomStr) : m_styleCustomStr); -} - -const uniString::utf8 config::getStreamHideStats(const size_t streamID) const -{ - if (!streamID) - { - return hideStats(); - } - else - { - uniString::utf8 hide = stream_hideStats(streamID); - if (!read_stream_hideStats(streamID) || hide.empty()) - { - hide = hideStats(); - } - return hide; - } -} - -const uniString::utf8 config::getStreamRedirectURL(const size_t streamID, const bool isStats, - const bool homeSet, const bool compress, - const bool force) const throw() -{ - utf8 url; - // check if hiding of public pages is enabled with some - // specific handling as required for 'all' or 'stats'. - bool all = (getStreamHideStats(streamID) == "all"), - //none = !(getStreamHideStats(streamID) == "none"), - stats = ((getStreamHideStats(streamID) == "stats") && isStats); - - if (all || stats || force) - { - // if no streamid then look at global redirect option only - if (!streamID) - { - // if not set then we look at the streamurl from source - // and if that is not valid then and return a 403 error - if (!redirectUrl().empty()) - { - url = redirect(redirectUrl(), compress); - } - else - { - // but we check if it's for a stats only hide on a - // stats method and then redirect to /index.html - if (stats && !force) - { - url = redirect("index.html", compress); - } - else - { - url = MSG_HTTP403; - } - } - } - else - { - // look for a stream specific - utf8 surl = stream_redirectUrl(streamID); - if (!read_stream_redirectUrl(streamID) || surl.empty()) - { - // see if it's a stats page and redirect to /index.html - if (stats && !force) - { - url = redirect("index.html", compress); - } - else - { - // otherwise attempt to use the streamurl (if available) - if (homeSet && !force) - { - url = redirect("home.html?sid="+tos(streamID), compress); - } - else - { - // and if not then try the global redirect - if (!redirectUrl().empty()) - { - url = redirect(redirectUrl(), compress); - } - // before reverting to a 403 error - else - { - url = MSG_HTTP403; - } - } - } - } - else - { - url = redirect(surl, compress); - } - } - } - - return url; -} - -void config::setOption(uniString::utf8 key, uniString::utf8 value) throw(exception) -{ - stackLock sml(m_lock); - - size_t subIndex = DEFAULT_CLIENT_STREAM_ID; // for items of form xxxxxx_# (multi-options) - uniString::utf8 stok = key; - - // see if it's a multi option and set the subIndex value - const vector<utf8> tokens = tokenizer(stok, '_'); - if (tokens.size() == 2) - { - stok = tokens[0]; - subIndex = atoi((const char *)stripWhitespace(tokens[1]).c_str()); - } - stok = stringUtil::stripWhitespace(stok); // cleanup some more whitespace just in case - - // look for the base option name in the option map - uniString::utf8 base_option_name = stringUtil::toLower(stok); - - std::map<uniString::utf8, accessor_t>::const_iterator mi = m_optMap.find(base_option_name); - if (mi == m_optMap.end()) - { - throw std::runtime_error("Unknown option " + base_option_name.hideAsString()); - } - - // first see if the value has changed. If not then we don't worry about it - if ((this->*(*mi).second.m_fetchFunc)(subIndex, 0) != value) - { - if ((base_option_name == "log") || (base_option_name == "screenlog")) - { - m_deferredOptions[base_option_name] = value; - } - else - { - // tweak things as needed with checking the type so we can use the sid or not - (this->*(*mi).second.m_assignFunc)(value, subIndex); - } - } -} diff --git a/Src/Plugins/DSP/sc_serv3/config.h b/Src/Plugins/DSP/sc_serv3/config.h deleted file mode 100644 index ab2bc095..00000000 --- a/Src/Plugins/DSP/sc_serv3/config.h +++ /dev/null @@ -1,710 +0,0 @@ -#pragma once -#ifndef config_H_ -#define config_H_ - -#include <string> -#include <vector> -#include <map> -#include <list> -#include <set> -#include <stdlib.h> -#include "unicode/uniFile.h" -#include "stl/stringUtils.h" -#include "threading/thread.h" -#include "metrics.h" - -#define DEFAULT_SOURCE_STREAM 1 -#define DEFAULT_CLIENT_STREAM_ID 1 -#define DEFAULT_YP_ADDRESS "yp.shoutcast.com" - -#ifdef _WIN32 -#define DEFAULT_LOG "%temp%\\sc_serv.log" -#define DEFAULT_LOGW L"%temp%\\sc_serv.log" -#else -#define DEFAULT_LOG "/tmp/sc_serv.log" -#endif -#define DEFAULT_FLASH_POLICY_FILE "crossdomain.xml" - -/* - -Each option has a map associated with a member. Let's take an option called foobar - - std::map<size_t,int> m_foobar; - -For single options (non-multi options) the map only has a single element. We use a map -so we can treat all options, multi or not, in the same fashion - -The value of the option is assigned via the assign_<name> method. subIndex is only used -for multi options (zero based). The value is always passed as a string and is converted -automatically internally - - inline void assign_foobar(int subIndex,const uniString::utf8 &value) - -The value of the option is retrieved as a string via the fetch_<name> method. The value -is fetched as a native type via native_fetch_<name> method. subIndex is used to select a -particular entry in a multi option. It's ignored for regular options - - uniString::utf8 fetch_foobar(int subIndex) - int native_fetch_foobar(int subIndex) - -A shorthand is provided via the _<name> method. It returns the same value as native_fetch_<name> - - const int _foobar() - -The number of elements for the option is returned by the count_<name> method. For single options -this is always one - - size_t count_foobar() - -The multi_<name> method returns true if the option is a multi option - - bool multi_foobar() - -The def_<name> method returns the default value for the option as a string - - utf8 def_foobar() - -All the proceeding options are private, and not protected by a mutex. -There are two public methods for accessing methods that provide mutex -protection. The value of the options is <name>() and the default value -is provided by <name>_Default() - - const int foobar() - const int foobar_Default() - -All of this is created automatically via the OPT and OPT_MULTI macros below - - -In the optMap table we associated all these functions with the actual name of the option -as it appears in the config file. In addition there is a change function associated with -each option that is fired when the option is changed. -*/ - -///////////////////////////////////////////////////////////////////////////////////// -///////// crazy macros to provide uniform assign/fetch functions for each option - -/* - Create a single option of type "tipe" with the name "name" and a default value of "def" -*/ -#define OPT(tipe,name,def)\ -private:\ -std::map<size_t,tipe> m_##name;\ -inline void assign_##name(const uniString::utf8 &value, const size_t subIndex = DEFAULT_CLIENT_STREAM_ID) throw() { assignMulti(m_##name, subIndex, value); }\ -uniString::utf8 fetch_##name(const size_t subIndex = DEFAULT_CLIENT_STREAM_ID, size_t *fetchByPos = 0) const throw() { return revert(fetchMulti(m_##name, subIndex, def, fetchByPos)); }\ -tipe native_fetch_##name(const size_t subIndex = DEFAULT_CLIENT_STREAM_ID, size_t *fetchByPos = 0) const throw() { return fetchMulti(m_##name, subIndex, def, fetchByPos); }\ -const tipe _##name() const throw() { return fetchMulti(m_##name, DEFAULT_CLIENT_STREAM_ID, def, 0); }\ -size_t count_##name() const throw() { return 1; }\ -bool multi_##name() const throw() { return false; }\ -uniString::utf8 def_##name() const throw() { return revert(def); }\ -public:\ -const tipe name() const throw() { return fetchMulti(m_##name, DEFAULT_CLIENT_STREAM_ID, def, 0); }\ -const tipe name##_Default() const throw() { return def; } - -// for options that can have multiple instances (like encoders and broadcast points) -/* - The option has the type "tipe" with the name "name" and a default value of "def" -*/ -#define OPT_MULTI(tipe,name,def)\ -private:\ -std::map<size_t, tipe> m_##name;\ -inline void assign_##name(const uniString::utf8 &value, const size_t subIndex) throw() { assignMulti(m_##name, subIndex, value); }\ -inline void native_assign_##name(const size_t subIndex, const tipe &value) throw() { native_assignMulti(m_##name, subIndex, value); }\ -uniString::utf8 fetch_##name(const size_t subIndex, size_t *fetchByPos = 0) const throw() { return revert(fetchMulti(m_##name, subIndex, def, fetchByPos)); }\ -tipe native_fetch_##name(const size_t subIndex) const throw() { return fetchMulti(m_##name, subIndex, def, 0); }\ -const tipe _##name(const std::vector<tipe>::size_type i) const throw() { return fetchMulti(m_##name, i, def, 0); }\ -bool multi_##name() const throw() { return true; }\ -uniString::utf8 def_##name() const throw() { return revert(def); }\ -public:\ -const bool read_##name(const size_t subIndex) const throw() { return (m_##name.find(subIndex) != m_##name.end()); }\ -void unread_##name(const size_t subIndex) { native_assignMulti(m_##name, subIndex, name##_Default()); }\ -const tipe name(const size_t subIndex) const throw() { return fetchMulti(m_##name, subIndex, def, 0); }\ -size_t count_##name() const throw() { return m_##name.size(); }\ -const std::map<size_t, tipe>& name##_map() const { return m_##name; } \ -const tipe name##_Default() const throw() { return def; } - -////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////// - -// global configuration -class config -{ -public: - // stream specifications from config file. -#pragma pack(push, 1) - struct streamConfig - { -#pragma pack(push, 1) - class urlObj - { - private: - uniString::utf8 m_url; - uniString::utf8 m_server; - uniString::utf8 m_path; - u_short m_port; - - static uniString::utf8 parse(const uniString::utf8 &url, uniString::utf8 &server, - u_short &port, uniString::utf8 &path) throw(std::exception); - - public: - explicit urlObj(const uniString::utf8 &url) throw(std::exception) - { - if (!url.empty()) - { - set(url); - } - else - { - clear(); - } - } - urlObj& operator=(const uniString::utf8 &url) throw(std::exception) - { - set(url); - return *this; - } - const uniString::utf8 &url() const throw() { return m_url; } - const uniString::utf8 &server() const throw() { return m_server; } - const uniString::utf8 &path() const throw() { return m_path; } - const u_short port() const throw() { return m_port; } - bool isSet() const throw() { return !m_url.empty(); } - void set(const uniString::utf8 &url) throw(std::exception) - { - m_url = parse(url, m_server, m_port, m_path); - } - void clear() throw() - { - m_url.clear(); - m_port = 0; - } - }; -#pragma pack(pop) - - uniString::utf8 m_authHash; - uniString::utf8 m_urlPath; // url that clients use to connect - uniString::utf8 m_adminPassword; // per stream admin password - uniString::utf8 m_password; // per stream source password - uniString::utf8 m_publicServer; // per stream source public flag - size_t m_streamID; - int m_maxStreamUser; // per stream user limit - int m_maxStreamBitrate; // per stream max bitrate limit - int m_minStreamBitrate; // per stream min bitrate limit - urlObj m_relayUrl; // if this is a relay, then this is set to the source url - urlObj m_backupUrl; // if there is a backup, then this is set to the backup url - bool m_allowRelay; // per stream relay allowed flag - bool m_allowPublicRelay; // per stream relay public flag - - streamConfig() throw() : m_streamID(DEFAULT_CLIENT_STREAM_ID), m_maxStreamUser(0), - m_maxStreamBitrate(0), m_minStreamBitrate(0), - m_relayUrl((uniString::utf8)""), m_backupUrl((uniString::utf8)""), - m_allowRelay(true), m_allowPublicRelay(true) {} - - streamConfig(const size_t id, const uniString::utf8 &authHash, const uniString::utf8 &url, - const uniString::utf8 &relayUrl, const uniString::utf8 &backupUrl, - const int maxStreamUser, const int maxStreamBitrate, const int minStreamBitrate, - const uniString::utf8 &adminPassword, const uniString::utf8 &password, - const uniString::utf8 &publicServer, const bool allowRelay, - const bool allowPublicRelay) throw(std::exception) - : m_authHash(authHash), m_urlPath(url), m_adminPassword(adminPassword), m_password(password), - m_publicServer(publicServer), m_streamID(id), m_maxStreamUser(maxStreamUser), - m_maxStreamBitrate(maxStreamBitrate), m_minStreamBitrate(minStreamBitrate), m_relayUrl(relayUrl), - m_backupUrl(backupUrl), m_allowRelay(allowRelay), m_allowPublicRelay(allowPublicRelay) {} - }; -#pragma pack(pop) - - /////////////////////////////////////////////////////////////////////// - ///// functions to convert types to and from unicode strings - template<typename T> inline static void convert(const uniString::utf8 &v,T &r) throw() { r = v; } - #ifdef _WIN64 - inline static void convert(const uniString::utf8 &v,size_t &r) throw() { r = atoi((const char *)v.c_str()); } - #endif - inline static void convert(const uniString::utf8 &v, int &r) throw() { r = atoi((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, unsigned int &r) throw() { r = atoi((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, unsigned long &r) throw() { r = atol((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, unsigned short &r) throw() { r = (unsigned short)atoi((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, short &r) throw() { r = (short)atoi((const char *)v.c_str()); } - inline static void convert(const uniString::utf8 &v, bool &r) throw() { r = (atoi((const char *)v.c_str()) ? true : false); } - inline static void convert(const uniString::utf8 &v, double &r) throw() { r = atof((const char *)v.c_str()); } - - template<typename T> inline static uniString::utf8 revert(const T &r) throw() { return r; } - #ifdef _WIN64 - inline static uniString::utf8 revert(size_t r) throw() { return stringUtil::tos(r); } - #endif - inline static uniString::utf8 revert(int r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(unsigned int r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(unsigned long r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(unsigned short r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(short r) throw() { return stringUtil::tos(r); } - inline static uniString::utf8 revert(bool r) throw() { return (r ? "1" : "0"); } - inline static uniString::utf8 revert(double r) throw() { return stringUtil::tos(r); } - //////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////// - -private: - mutable AOL_namespace::mutex m_lock; // api may write to config, so we need a lock - - //////////////////////////////////////////////////////////////////////////////////////////// - //// tables and functions so we can read and write options in a generic manner based - /// on the names that are used in the config file - typedef void (config::*assignFunc_t)(const uniString::utf8 &, const size_t subIndex); - typedef uniString::utf8 (config::*fetchFunc_t)(const size_t subIndex, size_t *fetchByPos) const; - typedef size_t (config::*countFunc_t)() const; - typedef bool (config::*multiFunc_t)() const; - typedef uniString::utf8 (config::*defaultFunc_t)() const; - - struct accessor_t - { - assignFunc_t m_assignFunc; - fetchFunc_t m_fetchFunc; - countFunc_t m_countFunc; - multiFunc_t m_multiFunc; - defaultFunc_t m_defaultFunc; - - accessor_t(assignFunc_t af, fetchFunc_t ff, countFunc_t cf, multiFunc_t mf, defaultFunc_t df) throw() - : m_assignFunc(af), m_fetchFunc(ff), m_countFunc(cf), m_multiFunc(mf), m_defaultFunc(df) {} - - accessor_t() throw() : m_assignFunc(0), m_fetchFunc(0), m_countFunc(0), m_multiFunc(0), m_defaultFunc(0) {} - }; -public: - typedef std::map<uniString::utf8,accessor_t> optMap_t; - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - - // takes an option map (container) and returns the value at the index (i) if it exists, - // otherwise it returns the default value (defaultValue). Value returned as native type - template<typename T,typename D> - static T fetchMulti(const std::map<size_t,T> &container, const typename std::vector<T>::size_type &subIndex, - const D defaultValue, size_t *fetchByPos) throw() - { - if (!fetchByPos) - { - typename std::map<size_t,T>::const_iterator i = container.find(subIndex); - if (i != container.end()) - { - return (*i).second; - } - } - else - { - // there's cases where we need to get the value - // effectively by it's position in the map so - // for the moment we'll just look through (bad - // for speed but it's not a commonly used mode). - typename std::vector<T>::size_type pos = 0; - for (typename std::map<size_t,T>::const_iterator i = container.begin(); i != container.end(); ++i, pos++) - { - if (pos == subIndex) - { - *fetchByPos = (*i).first; - return (*i).second; - } - } - } - return defaultValue; - } -private: - // assign map index. Expand with default value as needed. Value is specified as a string and converted as needed - template<typename T> - static void assignMulti(std::map<size_t,T> &container, const typename std::vector<T>::size_type subIndex, const uniString::utf8 &value) throw() - { - T vtmp; - convert(value, vtmp); - container[subIndex] = vtmp; - } - - // same as assignMulti, but you can provide the native type instead of a string - template<typename T> - static void native_assignMulti(std::map<size_t,T> &container, const typename std::vector<T>::size_type subIndex, const T &value) throw() - { - container[subIndex] = value; - } - - ///////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////// - - // radionomy metrics - OPT(bool,adMetricsDebug,false) - OPT(size_t,metricsMaxQueue,80000) - - OPT(bool,authDebug,false) - -public: - friend void metrics::metrics_apply(config &conf); - -private: - optMap_t m_optMap; - - // we can't log during startup because the loggers don't exist - std::vector<uniString::utf8> m_deferredWarnLogMessages; // log warning messages from startup - std::vector<uniString::utf8> m_deferredErrorLogMessages; // log error messages from startup - - // deferred options are those that weren't set because they can't take effect immediately - // they are used when writing out the new config file. - std::map<uniString::utf8,uniString::utf8> m_deferredOptions; - - OPT(size_t,configRewrite,0) - OPT(uniFile::filenameType,confFile,"") - - OPT(uniFile::filenameType,logFile,DEFAULT_LOG) // file for logging - OPT(uniFile::filenameType,realLogFile,DEFAULT_LOG) // file for logging - - OPT(bool,screenLog,true) // log to screen - OPT(bool,log,true) // do I log? - OPT(int,logRotates,5) // hwo many backups to keep when doing a log rotate? - OPT(bool,logArchive,false) // backup rotated files which would otherwise be deleted - OPT(int,rotateInterval,86400) // interval between log file rotations (24 hours) - // if set to 0 then we won't rotate any of the files - - OPT(int,portBase,8000) // listen port - OPT(int,publicPort,-1) // listen port for firehose - workaround for firehose hosts running on port 8000 - // but need to effectively be seen as bound to port 80 - allowing all to work ok - OPT(int,portLegacy,-1) // legacy port override/disable - OPT(uniString::utf8,alternatePorts,(uniString::utf8)"") // alternate port(s) for client only connections - comma separated string - OPT(bool,nameLookups,false) // do internet reverse lookups - - OPT(uniString::utf8,sslCertificateFile,""); - OPT(uniString::utf8,sslCertificateKeyFile,""); - - OPT(int,autoDumpTime,30) // how long before an idle connection is dumped (in seconds). Zero means no timeout - OPT(int,maxHeaderLineSize,4096) // maximum size of an HTTP header line. Default is pretty arbitrary right now - // but should be at least as big as a u-vox packet, since we have to anaylize - // initial data bytes to determine protocol and type of connectee (source or client) - OPT(int,maxHeaderLineCount,100) // max headers lines in HTTP style exchange - OPT(uniString::utf8,password,(uniString::utf8)""); // password for broadcaster to connect - OPT(uniString::utf8,adminPassword,(uniString::utf8)""); // administrator password - - // buffer configuration options - OPT(int,bufferType,1) // 0 - fixed, 1 - adaptive - OPT(size_t,fixedBufferSize,524288) // size of buffer if fixed (gives ~32 seconds ~ 128kbps, 44.1kHz) - OPT(double,adaptiveBufferSize,16) // size of adaptive buffer in seconds - OPT(size_t,bufferHardLimit,16777216) // no more than this give or take a factor of two - - OPT(unsigned short,metaInterval,16384) // metadata interval for shoutcast 1 - OPT_MULTI(unsigned short,stream_metaInterval,16384) // per-stream override - - // special intro and backup files - OPT(uniFile::filenameType,introFile,"") - OPT(uniFile::filenameType,backupFile,"") - OPT(uniFile::filenameType,backupTitle,"") - OPT(int,backupLoop,0) - OPT(int,maxSpecialFileSize,30000000) - - OPT(int,adTestFileLoop,1) - OPT(uniFile::filenameType,adTestFile,"") - OPT(uniFile::filenameType,adTestFile2,"") - OPT(uniFile::filenameType,adTestFile3,"") - OPT(uniFile::filenameType,adTestFile4,"") - - OPT(uniFile::filenameType,artworkFile,"") - std::map<size_t, uniString::utf8> m_artworkBody; - - OPT(uniString::utf8,uvoxCipherKey,uniString::utf8("foobar")) - - // w3c logs - OPT(bool,w3cEnable,true) - OPT(uniString::utf8,w3cLog,uniString::utf8("sc_w3c.log")) - - OPT(uniString::utf8,pidFile,uniString::utf8("sc_serv_$.pid")) - - // relaying - OPT(bool,allowRelay,true) // can other servers relay us. Based on Shoutcast user agent, not reliable - OPT(bool,allowPublicRelay,true) // relays can list themselves in yp - - OPT(short,maxHTTPRedirects,5) // max times we can redirect (http 3xx) - OPT(int,relayReconnectTime,5) // seconds to reconnect on relay failure - OPT(int,relayConnectRetries,0) // number of times we retry a relay request before throwing it away - // which if set as zero will keep retrying (excluding bitrate blocks) - - ////// stream configs - OPT_MULTI(size_t,stream_ID,DEFAULT_CLIENT_STREAM_ID) - OPT_MULTI(uniString::utf8,stream_authHash,(uniString::utf8)"") - OPT_MULTI(uniString::utf8,stream_path,(uniString::utf8)"") - OPT_MULTI(uniString::utf8,stream_relayURL,(uniString::utf8)"") - OPT_MULTI(uniString::utf8,stream_backupURL,(uniString::utf8)"") - - OPT_MULTI(uniString::utf8,stream_password,(uniString::utf8)"") - OPT_MULTI(uniString::utf8,stream_adminPassword,(uniString::utf8)"") - - OPT_MULTI(uniString::utf8,stream_publicServer,(uniString::utf8)"") // if "always" or "never" overrides public flag from source - OPT_MULTI(bool,stream_allowRelay,true) // can other servers relay us. Based on Shoutcast user agent, not reliable - OPT_MULTI(bool,stream_allowPublicRelay,true) // relays can list themselves in yp - - OPT_MULTI(int,stream_maxUser,0) // if set to a value greater than zero then we have per stream limits - OPT_MULTI(int,stream_maxBitrate,0) // if set to a value greater than zero then we have per stream limits - OPT_MULTI(int,stream_minBitrate,0) // if set to a value greater than zero then we have per stream limits - OPT_MULTI(bool,stream_ripOnly,false) // only addrs in rip file may connect - OPT_MULTI(int,stream_autoDumpTime,30) // how long before an idle connection is dumped (in seconds). Zero means no timeout - OPT_MULTI(int,stream_autoDumpSourceTime,7) // how long before an idle source connection is dumped (in seconds). Zero means no timeout - OPT_MULTI(bool,stream_autoDumpUsers,false) // if true, then users are dumped if source disconnects - OPT_MULTI(size_t,stream_listenerTime,0) // max time in minutes you can listen. 0 means no limit - - OPT_MULTI(int,stream_songHistory,10) // max song history to preserve - OPT_MULTI(uniString::utf8,stream_uvoxCipherKey,(uniString::utf8)"") - - OPT_MULTI(uniFile::filenameType,stream_logFile,""); // file for per mount logging - - OPT_MULTI(int,stream_adTestFileLoop,1) - OPT_MULTI(uniFile::filenameType,stream_adTestFile,"") - OPT_MULTI(uniFile::filenameType,stream_adTestFile2,"") - OPT_MULTI(uniFile::filenameType,stream_adTestFile3,"") - OPT_MULTI(uniFile::filenameType,stream_adTestFile4,"") - OPT_MULTI(uniFile::filenameType,stream_introFile,"") - OPT_MULTI(uniFile::filenameType,stream_backupFile,"") - OPT_MULTI(uniFile::filenameType,stream_backupTitle,"") - OPT_MULTI(int,stream_backupLoop,0) - - OPT_MULTI(int,stream_rateLimitWait,0) - - OPT_MULTI(uniFile::filenameType,stream_artworkFile,"") - - OPT_MULTI(uniFile::filenameType,stream_banFile,"") - OPT_MULTI(uniFile::filenameType,stream_ripFile,"") - OPT_MULTI(uniFile::filenameType,stream_agentFile,"") - OPT_MULTI(uniString::utf8,stream_w3cLog,(uniString::utf8)"") - - OPT_MULTI(uniString::utf8,stream_hideStats,(uniString::utf8)"") // hide /stats & /statistics as well as /index and /played public facing pages - OPT_MULTI(uniString::utf8,stream_redirectUrl,(uniString::utf8)"") // used with hideStats=all or if the stream version isn't specified - OPT_MULTI(uniString::utf8,stream_movedUrl,(uniString::utf8)"") // used to redirect a deemed dead stream (just in case) - - OPT(bool,requireStreamConfigs,false) // if true, then sources can only connect if stream configs have been defined - OPT(uniString::utf8,userId,"") - OPT(uniString::utf8,licenceId,"") - - // flash policy - OPT(int,flashPolicyServerPort,-1) // listen on port 843 for flash policy server request - OPT(uniFile::filenameType,flashPolicyFile,DEFAULT_FLASH_POLICY_FILE) - uniString::utf8 m_crossdomainStr; // used to hold a cached copy of the crossdomain.xml file - uniString::utf8 m_crossdomainStrGZ; // used to hold a cached copy of the gzipped crossdomain.xml file - uniString::utf8 m_shoutcastSWFStr; // used to hold a cached copy of the shoutcast.swf file - uniString::utf8 m_shoutcastSWFStrGZ; // used to hold a cached copy of the gzipped shoutcast.swf file - uniString::utf8 m_usedAlternatePorts; // used to hold a copy of the valid alternate ports in use - - ////// yp - OPT(int,ypTimeout,30) // yp timeout interval for requests - OPT(uniString::utf8,ypAddr,DEFAULT_YP_ADDRESS) - OPT(int,ypPort,80) - OPT(uniString::utf8,ypPath,"/yp2") - OPT(int,ypMaxRetries,10) // number of times we retry a yp request before throwing it away - OPT(int,ypReportInterval,5 * 60) // never touch any slower than this - OPT(int,ypMinReportInterval,10) // never touch any faster than this - OPT(uniString::utf8,publicServer,"default") // if "always" or "never" overrides public flag from source - - //// cdn behaviour - OPT(uniString::utf8,cdn,"") // if 'on' or 'always' then we enable all of the cdn modes (including YP pings for private streams) - // but use it to determine opt-in (via 'on') or opt-out (via 'always') - OPT_MULTI(int,cdn_master,-1) // this and the option below is used to control the behaviour of things - OPT_MULTI(int,cdn_slave,-1) - - //// stats - OPT(int,maxUser,512) // max clients - OPT(int,minBitrate,0) // min bitrate of source connections - if zero / not set then there is no limit - OPT(int,maxBitrate,0) // max bitrate of source connections - if zero / not set then there is no limit - OPT(uniString::utf8,hideStats,"") // hide /stats & /statistics as well as /index and /played public facing pages - OPT(uniString::utf8,redirectUrl,"") // used with hideStats=all or if the stream version isn't specified - - /// client behaviour - OPT(size_t,listenerTime,0) // max time in minutes you can listen. 0 means no limit - OPT(bool,autoDumpUsers,false) // if true, then users are dumped if source disconnects - OPT(uniString::utf8,srcIP,"") // bind addr for sources - OPT(uniString::utf8,destIP,"") // bind addr for clients - OPT(uniString::utf8,publicIP,"") // public address to use for the YP listing if the bind addr is not appropriate - OPT(uniString::utf8,titleFormat,"") // modifies icy-name - OPT(uniString::utf8,urlFormat,"") // modifies icy-url - - //// banning - OPT(uniFile::filenameType,banFile,"sc_serv.ban") - OPT(bool,saveBanListOnExit,true) // save on exiting - - //// rip - OPT(uniFile::filenameType,ripFile,"sc_serv.rip") - OPT(bool,saveRipListOnExit,true) // save on exiting - OPT(bool,ripOnly,false) // only addrs in rip file may connect - OPT(uniFile::filenameType,adminFile,"sc_serv.admin") - - /// agent - OPT(uniFile::filenameType,agentFile,"sc_serv.agent") - OPT(bool,saveAgentListOnExit,true) // save on exiting - OPT(bool,blockEmptyUserAgent,false) // if true, block the client connection if there is no user agent specified - - //// debugging - OPT(bool,webClientDebug,false) - OPT(bool,yp2Debug,false) - OPT(bool,shoutcastSourceDebug,false) - OPT(bool,uvox2SourceDebug,false) - OPT(bool,HTTPSourceDebug,false) - OPT(bool,streamDataDebug,false) - OPT(bool,microServerDebug,false) - OPT(bool,httpStyleDebug,false) - OPT(bool,shoutcast1ClientDebug,false) - OPT(bool,shoutcast2ClientDebug,false) - OPT(bool,HTTPClientDebug,false) - OPT(bool,flvClientDebug,false) - OPT(bool,m4aClientDebug,false) - - OPT(bool,relayDebug,false) - OPT(bool,relayShoutcastDebug,false) - OPT(bool,relayUvoxDebug,false) - OPT(bool,statsDebug,false) - OPT(bool,threadRunnerDebug,false) - - OPT(bool,logClients,true) - - OPT(int,songHistory,20) // max song history to preserve - - /// misc nonsense - OPT(uniString::utf8,unique,"$") // subsitution string for file names to mimic old sc_serv conf file behaviour - OPT(uniString::utf8,include,"") // include file placeholder - OPT(int,cpuCount,0) // cpu usage. zero is default - OPT(bool,clacks,true) // need i say more...? - OPT(bool,startInactive,false) // used to not start the relays on startup - OPT(bool,rateLimit,true); // if we do frame rate limiting or not - OPT(int,rateLimitWait,5); // if we do frame rate limiting, how many seconds before we enforce it fully - OPT(bool,useXFF,true); // if we use XFF (if available) for the listener address (and related actions) - OPT(bool,forceShortSends,false);// used for debugging streaming issues by introducing forced delays into sends - OPT(bool,adminNoWrap,false); // used for defaulting the admin listener page mode for wrapping or not - // wrapping the listener output list which might be handy for some users - - // used for customising the css of the index.html and admin pages - OPT(uniFile::filenameType,adminCSSFile,"v2") - uniString::utf8 m_styleCustomStr; // used to hold a cached copy of the custom css file - uniString::utf8 m_styleCustomStrGZ; // used to hold a cached copy of the gzipped custom css file - uniString::utf8 m_styleCustomHeader; // used to hold a cached copy of the gzipped custom css file - uniString::utf8 m_styleCustomHeaderGZ; // used to hold a cached copy of the gzipped custom css file - time_t m_styleCustomHeaderTime; // used to control the cache handling - - OPT(uniFile::filenameType,faviconFile,"") - OPT(uniFile::filenameType,faviconFileMimeType,"image/x-icon") - uniString::utf8 m_faviconBody; - uniString::utf8 m_faviconHeader; - uniString::utf8 m_faviconBodyGZ; // gzipped version - uniString::utf8 m_faviconHeaderGZ; // gzipped version - time_t m_favIconTime; // used to control the cache handling - - // used for returning robots.txt - OPT(uniFile::filenameType,robotstxtFile,"") - uniString::utf8 m_robotsTxtBody; - uniString::utf8 m_robotsTxtHeader; - uniString::utf8 m_robotsTxtBodyGZ; // gzipped version - uniString::utf8 m_robotsTxtHeaderGZ; // gzipped version - - uniString::utf8 m_certPath; - uniString::utf8 m_certFileBody; - - const bool _load(const uniFile::filenameType &file, const uniString::utf8 &uniqueStr, const bool parent) throw(); - int promptConfigFile() throw(); - - bool editConfigFileEntry(size_t sid, const uniFile::filenameType &filename, - const uniString::utf8 &authhash, const uniString::utf8 ¶m, - bool add, bool &handled, bool &idHandled, bool parent) throw(); - - // used for legacy handling of the relayport and relayserver options to sid=1 - uniString::utf8 m_legacyRelayPort; - uniString::utf8 m_legacyRelayServer; - - streamConfig& getPerStreamConfig(streamConfig& stream, const size_t sid, const bool useParent = true); - -public: - config() throw(); - ~config() throw(); - - static std::string logSectionName(); - - uniString::utf8 getCrossDomainFile(const bool compressed) throw(); - uniString::utf8 getIndexCSS(const bool compressed) throw(); - uniString::utf8 getShoutcastSWF(const bool compressed) throw(); - - const uniString::utf8 getStreamRedirectURL(const size_t streamID, const bool isStats, const bool homeSet, - const bool compress, const bool force = false) const throw(); - - int getRateLimitWait(const size_t streamID) const throw(); - - const int isBitrateDisallowed(const size_t streamID, const int bitrate, int &streamMinBitrate, int &streamMaxBitrate) const throw(); - - unsigned short getMetaInterval(const size_t streamID) const throw(); - int getBackupLoop(const size_t streamID) const throw(); - size_t getSongHistorySize(const size_t streamID) const throw(); - const int getAutoDumpTime(const size_t streamID = DEFAULT_SOURCE_STREAM) const throw(); - - const int getCPUCount() const throw(); - - const std::vector<streamConfig> getRelayList(); - const std::vector<streamConfig> getBackupUrl(const size_t streamID) throw(std::exception); - const uniString::utf8 getStreamHideStats(const size_t streamID) const; - - typedef std::map<size_t, config::streamConfig> streams_t; - void getStreamConfigs(streams_t& streams, const bool useParent = true); - const bool getStreamConfig(streamConfig& stream, const size_t streamID); - - // handle updating stream configs on the fly (as applicable) - #define AUTH_HASH 0x1 - #define URL_PATH 0x2 - #define RELAY_URL 0x4 - #define MAX_USER 0x8 - #define SOURCE_PWD 0x10 - #define ADMIN_PWD 0x20 - #define PUBLIC_SRV 0x40 - #define ALLOW_RELAY 0x80 - #define ALLOW_PUBLIC_RELAY 0x100 - #define RIP_ONLY 0x200 - #define DUMP_TIME 0x400 - #define DUMP_USER 0x800 - #define LIST_TIME 0x1000 - #define SONG_HIST 0x2000 - #define CIPHER_KEY 0x4000 - #define INTRO_FILE 0x8000 - #define BACKUP_FILE 0x10000 - #define BAN_FILE 0x20000 - #define RIP_FILE 0x40000 - #define W3C_FILE 0x80000 - #define MAX_BITRATE 0x100000 - #define BACKUP_URL 0x200000 - #define HIDE_STATS 0x400000 - #define MOVED_URL 0x800000 - #define AGENT_FILE 0x1000000 - #define CDN_MASTER 0x2000000 - #define CDN_SLAVE 0x4000000 - #define ARTWORK_FILE 0x8000000 - #define BACKUP_LOOP 0x10000000 - #define BACKUP_TITLE 0x20000000 - #define MIN_BITRATE 0x40000000 - #define AD_TEST_FILE 0x80000000 - #define AD_TEST_FILE_LOOP 0x100000000ULL - #define RATE_LIMIT_WAIT 0x200000000ULL - #define METAINTERVAL 0x400000000ULL - #define AD_TEST_FILE_2 0x800000000ULL - #define AD_TEST_FILE_3 0x1000000000ULL - #define AD_TEST_FILE_4 0x2000000000ULL - - void addStreamConfig(config &readConfig, config::streamConfig) throw(std::exception); - __uint64 updateStreamConfig(config &readConfig, config::streamConfig update) throw(std::exception); - void removeStreamConfig(config::streamConfig) throw(std::exception); - - // deals with configuring all of the per-stream passwords, etc - static bool setupPasswords(const config::streams_t &) throw(std::exception); - - void setOption(uniString::utf8 key, uniString::utf8 value) throw(std::exception); - - bool load(const uniFile::filenameType &file, bool load = true) throw(); - bool rewriteConfigurationFile(bool minimal = true, bool messages = false, bool setup = false) const throw(std::exception); // throw on I/O error - uniString::utf8 dumpConfigFile() throw(); - - ////////////////////////////////////////////////////////////////////////////////////// - - const std::vector<uniString::utf8>& deferredWarnLogMessages() const throw() { stackLock sml(m_lock); return m_deferredWarnLogMessages; } - const std::vector<uniString::utf8>& deferredErrorLogMessages() const throw() { stackLock sml(m_lock); return m_deferredErrorLogMessages; } - - void clearDeferredWarnLogMessages() throw() { stackLock sml(m_lock); m_deferredWarnLogMessages.clear(); } - void clearDeferredErrorLogMessages() throw() { stackLock sml(m_lock); m_deferredErrorLogMessages.clear(); } - - /////////// interface for service templates - const std::vector<uniString::utf8> fromArgs(const std::vector<uniString::utf8> &cl) throw(); - bool getConsoleLogging() const throw(); - const uniFile::filenameType getFileLog() const throw(); - static uniString::utf8 getSystemLogConfigString() throw(); - static uniString::utf8 getVersionBuildStrings() throw(); - //////////////////////////////////////////////////////////////////////////// -}; - -#undef OPT -#undef OPT_MULTI - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/cpucount.cpp b/Src/Plugins/DSP/sc_serv3/cpucount.cpp deleted file mode 100644 index fc2a1156..00000000 --- a/Src/Plugins/DSP/sc_serv3/cpucount.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "cpucount.h" - -#ifdef _WIN32 -#include <windows.h> - -int cpucount() throw() -{ - SYSTEM_INFO sysinfo = {0}; - ::GetSystemInfo(&sysinfo); - - return sysinfo.dwNumberOfProcessors; -} -#endif - -#ifdef __APPLE_CC__ -#import <sys/param.h> -#import <sys/sysctl.h> - -int cpucount() throw() -{ - int count = 0; - size_t size = sizeof(count); - - if (sysctlbyname("hw.ncpu",&count,&size,NULL,0)) return 1; - - return count; -} -#endif - -#if (defined PLATFORM_LINUX || defined PLATFORM_ARMv6 || defined PLATFORM_ARMv7) -#include <unistd.h> -int cpucount() throw() -{ - return sysconf(_SC_NPROCESSORS_ONLN); -} -#endif - -#ifdef PLATFORM_BSD -#include <sys/param.h> -#include <sys/sysctl.h> -#ifndef HW_AVAILCPU -#define HW_AVAILCPU 25 -#endif - -int cpucount() throw() -{ - int numCPU = 1; - int mib[4] = {0}; - size_t len = 0; - - /* set the mib for hw.ncpu */ - mib[0] = CTL_HW; - mib[1] = HW_AVAILCPU; // alternatively, try HW_NCPU; - - /* get the number of CPUs from the system */ - sysctl(mib, 2, &numCPU, &len, NULL, 0); - - if( numCPU < 1 ) - { - mib[1] = HW_NCPU; - sysctl( mib, 2, &numCPU, &len, NULL, 0 ); - - if( numCPU < 1 ) - { - numCPU = 1; - } - } - return numCPU; -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/cpucount.h b/Src/Plugins/DSP/sc_serv3/cpucount.h deleted file mode 100644 index c11e40ec..00000000 --- a/Src/Plugins/DSP/sc_serv3/cpucount.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once -#ifndef cpucount_H_ -#define cpucount_H_ - -// platform independent function to return number of logical processors -int cpucount() throw(); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/deps/win32/include/sched.h b/Src/Plugins/DSP/sc_serv3/deps/win32/include/sched.h deleted file mode 100644 index ad0fb2ec..00000000 --- a/Src/Plugins/DSP/sc_serv3/deps/win32/include/sched.h +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Module: sched.h - * - * Purpose: - * Provides an implementation of POSIX realtime extensions - * as defined in - * - * POSIX 1003.1b-1993 (POSIX.1b) - * - * -------------------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2012 Pthreads-win32 contributors - * - * Homepage1: http://sourceware.org/pthreads-win32/ - * Homepage2: http://sourceforge.net/projects/pthreads4w/ - * - * The current list of contributors is contained - * in the file CONTRIBUTORS included with the source - * code distribution. The list can also be seen at the - * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#if !defined(_SCHED_H) -#define _SCHED_H - -#if defined(_MSC_VER) -# if _MSC_VER < 1300 -# define PTW32_CONFIG_MSVC6 -# endif -# if _MSC_VER < 1400 -# define PTW32_CONFIG_MSVC7 -# endif -#endif - -#undef PTW32_SCHED_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_SCHED_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_SCHED_LEVEL_MAX 3 - -#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_SCHED_LEVEL) -#define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX -/* Include everything */ -#endif - - -#if defined(__GNUC__) && !defined(__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * The Open Watcom C/C++ compiler uses a non-standard calling convention - * that passes function args in registers unless __cdecl is explicitly specified - * in exposed function prototypes. - * - * We force all calls to cdecl even though this could slow Watcom code down - * slightly. If you know that the Watcom compiler will be used to build both - * the DLL and application, then you can probably define this as a null string. - * Remember that sched.h (this file) is used for both the DLL and application builds. - */ -#if !defined(PTW32_CDECL) -# define PTW32_CDECL __cdecl -#endif - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#include <stdlib.h> - -#if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include <errno.h> -#endif -#endif /* PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX */ - -#if (defined(__MINGW64__) || defined(__MINGW32__)) || defined(_UWIN) -# if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -/* For pid_t */ -# include <sys/types.h> -/* Required by Unix 98 */ -# include <time.h> -# else - typedef int pid_t; -# endif -#else - /* [i_a] fix for using pthread_win32 with mongoose code, which #define's its own pid_t akin to typedef HANDLE pid_t; */ - #undef pid_t -# if defined(_MSC_VER) - typedef void *pid_t; -# else - typedef int pid_t; -# endif -#endif - -/* - * Microsoft VC++6.0 lacks these *_PTR types - */ -#if defined(_MSC_VER) && _MSC_VER < 1300 && !defined(PTW32_HAVE_DWORD_PTR) -typedef unsigned long ULONG_PTR; -typedef ULONG_PTR DWORD_PTR; -#endif - -/* Thread scheduling policies */ - -enum { - SCHED_OTHER = 0, - SCHED_FIFO, - SCHED_RR, - SCHED_MIN = SCHED_OTHER, - SCHED_MAX = SCHED_RR -}; - -struct sched_param { - int sched_priority; -}; - -/* - * CPU affinity - * - * cpu_set_t: - * Considered opaque but cannot be an opaque pointer - * due to the need for compatibility with GNU systems - * and sched_setaffinity() et.al. which include the - * cpusetsize parameter "normally set to sizeof(cpu_set_t)". - */ - -#define CPU_SETSIZE (sizeof(size_t)*8) - -#define CPU_COUNT(setptr) (_sched_affinitycpucount(setptr)) - -#define CPU_ZERO(setptr) (_sched_affinitycpuzero(setptr)) - -#define CPU_SET(cpu, setptr) (_sched_affinitycpuset((cpu),(setptr))) - -#define CPU_CLR(cpu, setptr) (_sched_affinitycpuclr((cpu),(setptr))) - -#define CPU_ISSET(cpu, setptr) (_sched_affinitycpuisset((cpu),(setptr))) - -#define CPU_AND(destsetptr, srcset1ptr, srcset2ptr) (_sched_affinitycpuand((destsetptr),(srcset1ptr),(srcset2ptr))) - -#define CPU_OR(destsetptr, srcset1ptr, srcset2ptr) (_sched_affinitycpuor((destsetptr),(srcset1ptr),(srcset2ptr))) - -#define CPU_XOR(destsetptr, srcset1ptr, srcset2ptr) (_sched_affinitycpuxor((destsetptr),(srcset1ptr),(srcset2ptr))) - -#define CPU_EQUAL(set1ptr, set2ptr) (_sched_affinitycpuequal((set1ptr),(set2ptr))) - -typedef union -{ - char cpuset[CPU_SETSIZE/8]; - size_t _align; -} cpu_set_t; - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -PTW32_DLLPORT int PTW32_CDECL sched_yield (void); - -PTW32_DLLPORT int PTW32_CDECL sched_get_priority_min (int policy); - -PTW32_DLLPORT int PTW32_CDECL sched_get_priority_max (int policy); - -PTW32_DLLPORT int PTW32_CDECL sched_setscheduler (pid_t pid, int policy); - -PTW32_DLLPORT int PTW32_CDECL sched_getscheduler (pid_t pid); - -/* Compatibility with Linux - not standard */ - -PTW32_DLLPORT int PTW32_CDECL sched_setaffinity (pid_t pid, size_t cpusetsize, cpu_set_t *mask); - -PTW32_DLLPORT int PTW32_CDECL sched_getaffinity (pid_t pid, size_t cpusetsize, cpu_set_t *mask); - -/* - * Support routines and macros for cpu_set_t - */ -PTW32_DLLPORT int PTW32_CDECL _sched_affinitycpucount (const cpu_set_t *set); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuzero (cpu_set_t *pset); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuset (int cpu, cpu_set_t *pset); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuclr (int cpu, cpu_set_t *pset); - -PTW32_DLLPORT int PTW32_CDECL _sched_affinitycpuisset (int cpu, const cpu_set_t *pset); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuand(cpu_set_t *pdestset, const cpu_set_t *psrcset1, const cpu_set_t *psrcset2); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuor(cpu_set_t *pdestset, const cpu_set_t *psrcset1, const cpu_set_t *psrcset2); - -PTW32_DLLPORT void PTW32_CDECL _sched_affinitycpuxor(cpu_set_t *pdestset, const cpu_set_t *psrcset1, const cpu_set_t *psrcset2); - -PTW32_DLLPORT int PTW32_CDECL _sched_affinitycpuequal (const cpu_set_t *pset1, const cpu_set_t *pset2); - -/* - * Note that this macro returns ENOTSUP rather than - * ENOSYS as might be expected. However, returning ENOSYS - * should mean that sched_get_priority_{min,max} are - * not implemented as well as sched_rr_get_interval. - * This is not the case, since we just don't support - * round-robin scheduling. Therefore I have chosen to - * return the same value as sched_setscheduler when - * SCHED_RR is passed to it. - */ -#define sched_rr_get_interval(_pid, _interval) \ - ( errno = ENOTSUP, (int) -1 ) - - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#undef PTW32_SCHED_LEVEL -#undef PTW32_SCHED_LEVEL_MAX - -#endif /* !_SCHED_H */ - diff --git a/Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp b/Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp deleted file mode 100644 index d335a5e4..00000000 --- a/Src/Plugins/DSP/sc_serv3/filenameMetadata.cpp +++ /dev/null @@ -1,681 +0,0 @@ -#include "filenameMetadata.h" -#include "metadata.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include <functional> -#include <algorithm> -#include <string> -#include <list> -#include <assert.h> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -/* - Overview of how it works: - - The setPattern() method looks at the pattern string and builds a stack of parseState objects. - Each of these objects are responsible for finding their associated pattern within a text range. - - parsing is done right to left. - - the parseState_optional object is used to encapsulate other state objects that are - optional (bracketed by [] in the pattern). -*/ - -class filenameMetadata::impl -{ - // to make unicode compatibility easier, we're just going to store things as utf32 - utf32 m_pattern; - utf32 m_data; - - // put the map will be in utf 8 - typedef map<utf8,utf8> tokenMap_t; - tokenMap_t m_tokens; - - class parseState; - typedef list<parseState*> parseStack_t; - parseStack_t m_parseStack; - static void clearparseStack(parseStack_t &ps) throw() - { - while (!ps.empty()) - { - delete ps.back(); - ps.pop_back(); - } - } - - void clearparseStack() throw() { clearparseStack(m_parseStack); } - - ///////////// parse states ////////////////////////// - class parseState // virtual base - { - public: - typedef utf32::const_reverse_iterator range_e; - typedef pair<range_e, range_e> range_t; - - virtual ~parseState() throw() {} - virtual range_t findRange(range_e rbegin, range_e rend) throw() { return make_pair(rbegin, rend); } - virtual void setFromRange(range_e /*rbegin*/, range_e /*rend*/) throw() {} - virtual void reportValue(tokenMap_t &/*tm*/) const throw() {} - virtual utf8 describe() const throw() = 0; // for diagnostics - virtual void reset() throw() {} - virtual bool optional() const throw() { return false; } - virtual bool finite() const throw() { return false; } // fixed width match - }; - - class parseState_optional: public parseState - { - parseStack_t m_parseStack; - - public: - parseState_optional(){} - ~parseState_optional() throw() { clearparseStack(m_parseStack); } - parseStack_t* stack() throw() { return &m_parseStack; } - - virtual bool optional() const throw() { return true; } - - virtual void reset() throw() - { - for_each(m_parseStack.begin(), m_parseStack.end(), mem_fun(&parseState::reset)); - } - - virtual utf8 describe() const throw() - { - utf8 result("["); - for (parseStack_t::const_iterator i = m_parseStack.begin(); i != m_parseStack.end(); ++i) - { - result += (*i)->describe(); - } - result = result + utf8("]"); - return result; - } - - virtual range_t findRange(range_e rbegin,range_e rend) throw() - { - const range_t NOTFOUND(make_pair(rend, rend)); - range_t result; - - reset(); - if (m_parseStack.empty()) - { - return NOTFOUND; - } - - parseStack_t::reverse_iterator s_cur = m_parseStack.rbegin(); - parseStack_t::reverse_iterator s_nxt = s_cur; - ++s_nxt; - - range_e data_start = rbegin; - range_e data_end = rend; - range_e last_restart = rbegin; - - bool first(true); - while (s_cur != m_parseStack.rend()) - { - if (data_start == data_end) - { - reset(); - return NOTFOUND; - } - - range_t curR(NOTFOUND); - range_t nxtR(NOTFOUND); - curR = (*s_cur)->findRange(data_start,data_end); - if (curR.first == data_end) - { - reset(); - return NOTFOUND; - } - if ((!first) && (curR.first != data_start)) - { - // must abut. Try moving forward again - reset(); - s_cur = m_parseStack.rbegin(); - s_nxt = s_cur; - ++s_nxt; - ++last_restart; - data_start = last_restart; - first = true; - continue; - } - if (first) - { - result.first = curR.first; - } - first = false; - - // don't do this if we have a single character state followed - // by anything (in particular, a string which eats all - if (curR.first + 1 != curR.second) - { - if (s_nxt != m_parseStack.rend()) - { - nxtR = (*s_nxt)->findRange(data_start,data_end); - } - if (nxtR.first < curR.second) - { - curR.second = nxtR.first; - } - } - (*s_cur)->setFromRange(curR.first,curR.second); - s_cur = s_nxt; - if (s_nxt != m_parseStack.rend()) - { - ++s_nxt; - } - data_start = curR.second; - } - result.second = data_start; - return result; - } - - virtual void setFromRange(utf32::const_reverse_iterator rbegin, utf32::const_reverse_iterator rend) throw() - { - findRange(rbegin, rend); // resets to restricted range if necessary - } - - virtual void reportValue(tokenMap_t &tm) const throw() - { - for (parseStack_t::const_iterator i = m_parseStack.begin(); i != m_parseStack.end(); ++i) - { - (*i)->reportValue(tm); - } - } - - virtual bool finite() const throw() - { - bool result = true; - for (parseStack_t::const_iterator i = m_parseStack.begin(); i != m_parseStack.end(); ++i) - { - result &= (*i)->finite(); - } - return result; - } - }; - - class parseState_char: public parseState - { - utf32::value_type m_char; - - public: - explicit parseState_char(utf32::value_type c) : m_char(c){} - virtual pair<utf32::const_reverse_iterator,utf32::const_reverse_iterator> - findRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - for (utf32::const_reverse_iterator i = rbegin; i != rend; ++i) - { - if ((*i) == m_char) - { - return make_pair(i, i + 1); - } - } - return make_pair(rend,rend); - } - - virtual utf8 describe() const throw() - { - utf32 u32; u32.push_back(m_char); - return u32.toUtf8(); - } - - virtual bool finite() const throw() { return true; } - }; - - class parseState_stringSymbol: public parseState - { - utf8 m_symbolName; // can be empty for any string - utf32 m_value; - - public: - parseState_stringSymbol() throw(){} - explicit parseState_stringSymbol(const string &s) throw() : m_symbolName(s){} - ~parseState_stringSymbol() throw(){} - void reset() throw() { m_value.clear(); } - void setFromRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - if (!m_symbolName.empty()) - { - m_value.clear(); - m_value.insert(m_value.begin(),rbegin,rend); - reverse(m_value.begin(),m_value.end()); - m_value = stripWhitespace(m_value); - } - } - - virtual void reportValue(tokenMap_t &tm) const throw() - { - if (!m_symbolName.empty() && !m_value.empty()) - { - tm[m_symbolName] = m_value.toUtf8(); - } - } - - virtual utf8 describe() const throw() - { - if (m_symbolName.empty()) return utf8("*"); - return utf8("%") + m_symbolName; - } - }; - - class parseState_digits: public parseState - { - public: - parseState_digits() throw(){} - virtual range_t findRange(range_e rbegin,range_e rend) throw() - { - range_t result(make_pair(rend,rend)); - - bool got_start = false; - for (utf32::const_reverse_iterator i = rbegin; i != rend; ++i) - { - if (uniString::is_a_number(*i)) - { - if (!got_start) - { - got_start = true; - result.first = i; - } - } - else - { - if (got_start) - { - result.second = i; - return result; - } - } - } - return result; - } - - virtual utf8 describe() const throw() { return utf8("%#"); } - }; - - class parseState_year: public parseState - { - utf32 m_value; - - public: - parseState_year() throw(){} - ~parseState_year() throw(){} - void reset() throw() { m_value.clear(); } - virtual pair<utf32::const_reverse_iterator,utf32::const_reverse_iterator> - findRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - int count = 4; - - pair<utf32::const_reverse_iterator,utf32::const_reverse_iterator> result(make_pair(rend,rend)); - - bool got_start = false; - for (utf32::const_reverse_iterator i = rbegin; i != rend; ++i) - { - if (uniString::is_a_number(*i)) - { - if (!got_start) - { - got_start = true; - result.first = i; - } - count -= 1; - if (count == 0) - { - result.second = ++i; - return result; - } - } - else - { - if (got_start) - { - got_start = false; - result.first = rend; - } - } - } - return make_pair(rend,rend); - } - - void setFromRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - m_value.clear(); - m_value.insert(m_value.begin(),rbegin,rend); - reverse(m_value.begin(),m_value.end()); - } - - virtual void reportValue(tokenMap_t &tm) const throw() - { - if (!m_value.empty()) - { - tm[utf8(metadata::YEAR())] = m_value.toUtf8(); - } - } - - virtual utf8 describe() const throw() { return utf8("%YEAR"); } - virtual bool finite() const throw() { return true; } - }; - - class parseState_fixed: public parseState - { - utf32 m_value; - - public: - // fixed string - explicit parseState_fixed(const utf32 &val) throw() : m_value(val) {} - ~parseState_fixed() throw(){} - - virtual pair<utf32::const_reverse_iterator,utf32::const_reverse_iterator> - findRange(utf32::const_reverse_iterator rbegin,utf32::const_reverse_iterator rend) throw() - { - assert(!m_value.empty()); - if (m_value.empty()) return make_pair(rend,rend); - - for (utf32::const_reverse_iterator i = rbegin; i != rend; ++i) - { - if ((*i) == (*(m_value.rbegin()))) - { - utf32::const_reverse_iterator t_i = i; - utf32::const_reverse_iterator v_i = m_value.rbegin(); - utf32::const_reverse_iterator v_i_end = m_value.rend(); - bool match(true); - for (; match && (v_i != v_i_end); ++t_i, ++v_i) - { - if ((t_i == rend) || ((*t_i) != (*v_i))) - { - match = false; - } - } - if (match) - { - return make_pair(i, i + m_value.size()); - } - } - } - return make_pair(rend,rend); - } - - virtual utf8 describe() const throw() - { - return m_value.toUtf8(); - } - - virtual bool finite() const throw() { return true; } - }; - - static string stringify(utf32::value_type v) throw() - { - if (v >= '0' && v <= 'z') return string(1,(string::value_type)v); - return tos((int)v); - } - -public: - - impl(){} - ~impl() throw() - { - clearparseStack(); - } - - void deleteToken(const utf8 &token) throw() - { - tokenMap_t::iterator i = m_tokens.find(token); - if (i != m_tokens.end()) m_tokens.erase(i); - } - - const tokenMap_t::size_type countTokens() const throw() { return m_tokens.size(); } - utf8& operator[](const utf8 &key) throw() { return m_tokens[key]; } - const map<utf8,utf8>& getTokens() const throw() { return m_tokens; } - - void setPattern(const utf8 &pattern) throw(runtime_error) - { - parseState_optional *opt = 0; - parseStack_t *stack = &m_parseStack; - - try - { - utf32 fixedAccumulator; // fixed string value - - #define DUMPACCUMULATOR { if (!fixedAccumulator.empty()) { stack->push_back(new parseState_fixed(fixedAccumulator)); fixedAccumulator.clear(); } } - - clearparseStack(); - m_pattern.assign(pattern); - for (utf32::const_iterator i = m_pattern.begin(); i != m_pattern.end(); ++i) - { - if ((*i) == ']') - { - DUMPACCUMULATOR - if (!opt) throw runtime_error("Unmatched ']' in pattern"); - stack = &m_parseStack; - stack->push_back(opt); - opt = 0; - } - else if ((*i) == '[') - { - DUMPACCUMULATOR - if (opt) throw runtime_error("Optional sequences cannot be nested in pattern"); - opt = new parseState_optional; - stack = opt->stack(); - } - else if ((*i) == '%') - { - ++i; - if (i == m_pattern.end()) throw runtime_error("Bad pattern. Trailing %"); - switch (*i) - { - case 'N': DUMPACCUMULATOR stack->push_back(new parseState_stringSymbol(metadata::NAME())); break; - case 'G': DUMPACCUMULATOR stack->push_back(new parseState_stringSymbol(metadata::GENRE())); break; - case 'A': DUMPACCUMULATOR stack->push_back(new parseState_stringSymbol(metadata::ALBUM())); break; - case 'R': DUMPACCUMULATOR stack->push_back(new parseState_stringSymbol(metadata::ARTIST()));break; - case 'Y': DUMPACCUMULATOR stack->push_back(new parseState_year); break; - case '#': DUMPACCUMULATOR stack->push_back(new parseState_digits); break; - case '%': fixedAccumulator.push_back('%'); break; - default: throw runtime_error("Unknown symbol %" + stringify(*i)); - } - } - else if ((*i) == '*') - { - DUMPACCUMULATOR - stack->push_back(new parseState_stringSymbol); - } - else - { - fixedAccumulator.push_back(*i); - } - } - if (opt) - { - throw runtime_error("Unterminated optional sequence in pattern"); - } - DUMPACCUMULATOR - } - catch(...) - { - delete opt; - throw; - } - } - - static utf8 describeStackRange(parseStack_t::const_reverse_iterator begin,parseStack_t::const_reverse_iterator end) throw() - { - parseStack_t stck(begin,end); - reverse(stck.begin(),stck.end()); - utf8 result; - for (parseStack_t::const_iterator i = stck.begin(); i != stck.end(); ++i) - { - result = result + (*i)->describe(); - } - return result; - } - - static utf8 describeRemainingData(utf32::const_reverse_iterator begin,utf32::const_reverse_iterator end) throw() - { - utf32 u32(begin,end); - reverse(u32.begin(),u32.end()); - return u32.toUtf8(); - } - - void parse(const utf8 &data) throw(runtime_error) - { - m_data.assign(data); - - // beginning and end of data string - utf32::const_reverse_iterator data_start = m_data.rbegin(); - utf32::const_reverse_iterator data_end = m_data.rend(); - - // current and next object pointers from the parse stack - parseStack_t::reverse_iterator s_cur = m_parseStack.rbegin(); - parseStack_t::reverse_iterator s_nxt = s_cur; - ++s_nxt; - - while(s_cur != m_parseStack.rend()) - { - // if we haven't finished the parse stack, and we're out of data then it's an error - if (data_start == data_end) - { - throw runtime_error("Premature end of data (" + describeStackRange(s_cur,m_parseStack.rend()).hideAsString() + ")"); - } - - // we do one lookahead. Get the range match for the current parse object and - // the next parse object. Note that there is some added complexity due to optional objects - pair<utf32::const_reverse_iterator,utf32::const_reverse_iterator> curR(make_pair(data_end,data_end)); - pair<utf32::const_reverse_iterator,utf32::const_reverse_iterator> nxtR(make_pair(data_end,data_end)); - - // find widest possible match for current state - curR = (*s_cur)->findRange(data_start,data_end); - - // if no match, and the object is optional, just move on to the next (continue) - if ((curR.first == data_end) && (*s_cur)->optional()) - { - s_cur = s_nxt; - if (s_nxt != m_parseStack.rend()) - { - ++s_nxt; - } - continue; - } - - // if no match, but object is not optional, then we have an error - if (curR.first == data_end) - { - throw runtime_error("Parse error, symbol not found (" + describeStackRange(s_cur,m_parseStack.rend()).hideAsString() + ") (" + describeRemainingData(data_start,data_end).hideAsString() + ")"); - } - - // if match was not found at our current starting point, then we have an error - if (curR.first != data_start) - { - throw runtime_error("Parse error, data skipped to find symbol (" + describeStackRange(s_cur,m_parseStack.rend()).hideAsString() + ") (" + describeRemainingData(data_start,data_end).hideAsString() + ")"); - } - - // restrict match range by one lookahead. Do not do lookahead - // if our current state is a single character match - if (!(*s_cur)->finite()) //curR.first + 1 != curR.second) - { - // we must loop in case the followup objects are optional and we must - // continue to look ahead - while (true) - { - if (s_nxt == m_parseStack.rend()) break; - // to handle the case of two optional string elements in a row, we - // repeat this if the range of the current and follow up objects match by - // incrementing the start - nxtR = (*s_nxt)->findRange(data_start,data_end); - if ((nxtR.first == curR.first) && (!(*s_nxt)->finite())) - { - nxtR = (*s_nxt)->findRange(data_start+1,data_end); - } - if (nxtR.first < curR.second) - { - // lookahead object restricts range - curR.second = nxtR.first; - break; - } - if ((nxtR.first == data_end) && (nxtR.second == data_end) && (*s_nxt)->optional()) - { - // lookahead object not found and is optional. try the next - ++s_nxt; - } - else - { - // no restriction - break; - } - } - } - - // set value and advance to next parse object - (*s_cur)->setFromRange(curR.first,curR.second); - s_cur = s_nxt; - if (s_nxt != m_parseStack.rend()) - { - ++s_nxt; - } - data_start = curR.second; - } - if (data_start != data_end) - { - throw runtime_error("Data extends beyond pattern (" + describeRemainingData(data_start,data_end).hideAsString() + ")"); - } - - m_tokens.clear(); - for (parseStack_t::const_iterator i = m_parseStack.begin(); i != m_parseStack.end(); ++i) - { - (*i)->reportValue(m_tokens); - } - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -filenameMetadata::filenameMetadata(): m_impl(0) -{ - m_impl = new filenameMetadata::impl; -} - -filenameMetadata::~filenameMetadata() throw() -{ - forget(m_impl); -} - -void filenameMetadata::setPattern(const utf8 &pattern) throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - m_impl->setPattern(pattern); -} - -void filenameMetadata::parse(const utf8 &data) throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - m_impl->parse(data); -} - -void filenameMetadata::deleteToken(const utf8 &token) throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - m_impl->deleteToken(token); -} - -const size_t filenameMetadata::countTokens() throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - return m_impl->countTokens(); -} - -utf8& filenameMetadata::operator[](const utf8 &key) throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - return m_impl->operator[](key); -} - -const map<utf8,utf8>& filenameMetadata::getTokens() const throw(exception) -{ - assert(m_impl); - if (!m_impl) throw logic_error(string(__FUNCTION__) + " internal impl object is null"); - return m_impl->getTokens(); -} diff --git a/Src/Plugins/DSP/sc_serv3/filenameMetadata.h b/Src/Plugins/DSP/sc_serv3/filenameMetadata.h deleted file mode 100644 index 4b23f4cc..00000000 --- a/Src/Plugins/DSP/sc_serv3/filenameMetadata.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef filenameMetadata_H_ -#define filenameMetadata_H_ - -#include "unicode/uniString.h" -#include <stdexcept> -#include <map> - -class filenameMetadata -{ - class impl; - impl *m_impl; - -public: - filenameMetadata(); - ~filenameMetadata() throw(); - - void setPattern(const uniString::utf8 &pattern) throw(std::exception); - void parse(const uniString::utf8 &data) throw(std::exception); - void deleteToken(const uniString::utf8 &token) throw(std::exception); - const size_t countTokens() throw(std::exception); - uniString::utf8& operator[](const uniString::utf8 &key) throw(std::exception); - const std::map<uniString::utf8,uniString::utf8>& getTokens() const throw(std::exception); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/global.cpp b/Src/Plugins/DSP/sc_serv3/global.cpp deleted file mode 100644 index 8671e227..00000000 --- a/Src/Plugins/DSP/sc_serv3/global.cpp +++ /dev/null @@ -1,1177 +0,0 @@ -#ifdef _WIN32 -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0601 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "global.h" -#include "aolxml/aolxml.h" -#include "threadedRunner.h" -#include "w3cLog.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#ifndef _WIN32 -#include <sys/time.h> -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -config gOptions; - -unsigned char appname_tmpbuf[] = -{ - (unsigned char)~'B', (unsigned char)~'a', (unsigned char)~'n', (unsigned char)~'a', (unsigned char)~'n', (unsigned char)~'a', (unsigned char)~'r', (unsigned char)~'a', (unsigned char)~'m', (unsigned char)~'a', 255, 0, -}; - -void tealike_crappy_code(unsigned long v[2], unsigned long k[4]) -{ - unsigned long y = v[0], z = v[1], sum = 0, /* set up */ - delta = 0x9e3779b9UL, n = 32 ; /* key schedule constant*/ - - while (n-- > 0) - { - /* basic cycle start */ - sum += delta; - y += ((z << 4) + k[0]) ^(z + sum) ^((z >> 5) + k[1]); - z += ((y << 4) + k[2]) ^(y + sum) ^((y >> 5) + k[3]); /* end cycle */ - } - v[0] = y; v[1] = z; -} - -const utf8 bob() -{ - static utf8 _bob; - if (_bob.empty()) - { - char* app_name = (char*)appname_tmpbuf; - tealike_crappy_code((unsigned long *)(app_name += 12), (unsigned long *)appname_tmpbuf); - for (int x = 0; x < 12; x ++) - { - appname_tmpbuf[x] ^= 255; - } - app_name -= 12; - _bob = app_name; - } - return _bob; -} - -static int gs_kill = false; -static int gs_postSetup = false; - -const int iskilled() throw() { return gs_kill; } -void setkill(int v) throw() -{ - gs_kill = v; - threadedRunner::wakeup(); -} - -const int isPostSetup() throw() { return gs_postSetup; } -void setPostSetup(int v) throw() { gs_postSetup = v; } - -utf8 MSG_ICY_HTTP401; -utf8 MSG_ICY200; -utf8 MSG_ICY_HTTP200; -utf8 MSG_UVOX_HTTP200; - -int MSG_ICY_HTTP401_LEN; - -const utf8::value_type* MSG_INVALIDPASSWORD = (const utf8::value_type*)"Invalid Password\r\n"; -const int MSG_INVALIDPASSWORD_LEN = (int)strlen(MSG_INVALIDPASSWORD); - -const utf8::value_type* MSG_VALIDPASSWORD = (const utf8::value_type*)"OK2\r\nicy-caps:11\r\n\r\n"; -const int MSG_VALIDPASSWORD_LEN = (int)strlen(MSG_VALIDPASSWORD); - -const utf8::value_type* MSG_HTTP_VALIDPASSWORD = (const utf8::value_type*)"HTTP/1.1 200 OK\r\n\r\n"; -const int MSG_HTTP_VALIDPASSWORD_LEN = (int)strlen(MSG_VALIDPASSWORD); - -const utf8::value_type* MSG_STREAMMOVED = (const utf8::value_type*)"Stream Moved\r\n"; -const int MSG_STREAMMOVED_LEN = (int)strlen(MSG_STREAMMOVED); - -const utf8::value_type* MSG_BADSTREAMID = (const utf8::value_type*)"Bad Stream ID\r\n"; -const int MSG_BADSTREAMID_LEN = (int)strlen(MSG_BADSTREAMID); - -const utf8::value_type* MSG_STREAMINUSE = (const utf8::value_type*)"Stream In Use\r\n"; -const int MSG_STREAMINUSE_LEN = (int)strlen(MSG_STREAMINUSE); - -const utf8::value_type* MSG_200 = (const utf8::value_type*)"HTTP/1.1 200 OK\r\nConnection:close\r\n\r\n"; - -const utf8::value_type* MSG_NO_CLOSE_200 = (const utf8::value_type*)"HTTP/1.1 200 OK\r\n" - "Content-Type:text/html;charset=utf-8\r\n"; - -const utf8::value_type* MSG_STD200 = (const utf8::value_type*)"HTTP/1.1 200 OK\r\n" - "Content-Type:text/html;charset=utf-8\r\n" - "Connection:close\r\n\r\n"; - -const utf8::value_type* MSG_HTTP400 = (const utf8::value_type*)("HTTP/1.1 400 Bad Request\r\nConnection:close\r\n\r\n"); - -const utf8::value_type* MSG_AUTHFAILURE401 = (const utf8::value_type*) - ("HTTP/1.1 401 Unauthorized\r\n" - "Connection:close\r\n" - "Server:Shoutcast DNAS\r\n" - "WWW-authenticate:basic realm=\"Shoutcast Server\"\r\n" - "Content-type:text/html;charset=utf-8\r\n\r\n"); - -const utf8::value_type* MSG_HTTP403 = (const utf8::value_type*)("HTTP/1.1 403 Service Forbidden\r\nConnection:close\r\n\r\n"); - -const utf8::value_type* MSG_HTTP404 = (const utf8::value_type*)("HTTP/1.1 404 Not Found\r\nConnection:close\r\n\r\n"); -const int MSG_HTTP404_LEN = (int)strlen(MSG_HTTP404); - -const utf8::value_type* MSG_HTTP405 = (const utf8::value_type*)("HTTP/1.1 405 Method Not Allowed\r\nAllow:GET\r\nConnection:close\r\n\r\n"); - -const utf8::value_type* MSG_HTTP503 = (const utf8::value_type*)("HTTP/1.1 503 Server limit reached\r\nConnection:close\r\n\r\n"); -const int MSG_HTTP503_LEN = (int)strlen(MSG_HTTP503); - -void constructMessageResponses() -{ - MSG_ICY_HTTP200 = utf8("HTTP/1.0 200 OK\r\n" - "icy-notice1:<BR>This stream requires " - "<a href=\"http://www.winamp.com\">Winamp</a><BR>\r\n" - "icy-notice2:Shoutcast DNAS/" SERV_OSNAME " v" + - gOptions.getVersionBuildStrings() + "<BR>\r\n" - "Accept-Ranges:none\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Cache-Control:no-cache,no-store,must-revalidate,max-age=0\r\n" - "Connection:close\r\n"); - - MSG_UVOX_HTTP200 = utf8("HTTP/1.0 200 OK\r\n" - "Accept-Ranges:none\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Cache-Control:no-cache,no-store,must-revalidate,max-age=0\r\n" - "Connection:close\r\n" - "Server:Ultravox/2.1 Shoutcast v" + gOptions.getVersionBuildStrings() + "/" SERV_OSNAME"\r\n" + - "Content-Type:misc/ultravox\r\n"); - - // this is only used for WMP which won't play the stream correctly when the in-stream - // metadata is being provided and we use the now standard HTTP response (added 2.4.3) - MSG_ICY200 = utf8("ICY 200 OK\r\n" - "icy-notice1:<BR>This stream requires " - "<a href=\"http://www.winamp.com\">Winamp</a><BR>\r\n" - "icy-notice2:Shoutcast DNAS/" SERV_OSNAME " v" + - gOptions.getVersionBuildStrings() + "<BR>\r\n" - "Connection:close\r\n"); - - MSG_ICY_HTTP401 = utf8("HTTP/1.0 401 Unauthorized\r\n" // Service Unavailable - "icy-notice1:<BR>Shoutcast DNAS/" SERV_OSNAME " v" + - gOptions.getVersionBuildStrings() + "<BR>\r\n" - "icy-notice2:The resource requested is currently unavailable<BR>\r\n" - "Connection:close\r\n\r\n"); - MSG_ICY_HTTP401_LEN = (int)MSG_ICY_HTTP401.size(); -} - -utf8 g_userAgentBase = "Ultravox/2.1 ""Shoutcast Server "/**/; // user agent for sc_serv2 - // comment out for testing -utf8 g_userAgent; -time_t g_upTime = 0; - -const bool isUserAgentRelay(const utf8 &user_agent) throw() -{ - if (!user_agent.empty()) - { - return ((user_agent.find(utf8("shoutcast")) != utf8::npos) && - (user_agent != utf8("shoutcast directory tester")) && - (user_agent != utf8("relay")) && - (user_agent != utf8("icecast"))); - } - return false; -} - -const bool isUserAgentOfficial(const utf8 &user_agent) throw() -{ - if (!user_agent.empty()) - { - return ((user_agent == utf8("shoutcast directory tester")) || - (user_agent.find(utf8("shoutcast-to-dnas message sender")) == 0)); - } - return false; -} - -const utf8 redirect(const utf8 &url, const bool compress) throw() -{ - utf8 header = "HTTP/1.1 302 Found\r\n" - "Content-Type:text/html;charset=utf-8\r\n" - "Location:" + url + "\r\n"; - utf8 body = "<html><head><title>Redirect</title>" - "</head><body>Click <a href=\"/" + url + "\">here</a> for redirect.</body>" - "</html>"; - if (compress && compressData(body)) - { - header += "Content-Encoding:gzip\r\n"; - } - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - return header + body; -} - -const utf8 urlLink(const utf8 &url, const utf8 &text, const bool embed) throw() -{ - // so the pages have a better chance of wrapping - // we'll attempt to insert <wbr> to give a hint. - utf8 wbrUrl = stripHTTPprefix((!text.empty() ? text : url)), fixedUrl; - vector<utf8> parts = tokenizer(wbrUrl, '/'); - for (vector<utf8>::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - fixedUrl += (i == parts.begin() ? "" : "/<wbr>") + aolxml::escapeXML((*i)); - } - - wbrUrl.clear(); - parts = tokenizer(fixedUrl, '.'); - for (vector<utf8>::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - wbrUrl += (i == parts.begin() ? "" : ".<wbr>") + (*i); - } - - return "<a target=" + (embed ? "\\" : (utf8)"") + "\"_blank" + - (embed ? "\\" : "") + "\" href=" + (embed ? "\\" : "") + "\"" + - utf8((url.find(utf8("://")) == utf8::npos) ? "http://" : "") + - url + (embed ? "\\" : "") + "\">" + wbrUrl + "</a>"; -} - -const utf8 http302(const utf8 &url) throw() -{ - return "HTTP/1.1 302 Found\r\n" - "Content-Type:text/html;charset=utf-8\r\n" - "Location:" + url + "\r\n\r\n" - "<html><head><title>Redirect</title></head><body>Click <a href=\"" + url + "\">HERE</a> for redirect.</body></html>"; -} - -const utf8 addWBR(const utf8 &str) throw() -{ - if (!str.empty()) - { - // this allows browsers to word break the string on small displays - // and is aimed for user agent strings, hence / and ( to break on - utf8 wbrIdent, fixedIdent; - vector<utf8> parts = tokenizer(str, '/'); - for (vector<utf8>::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - wbrIdent += (i == parts.begin() ? "" : "/<wbr>") + aolxml::escapeXML((*i)); - } - - parts = tokenizer(wbrIdent, '('); - for (vector<utf8>::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - fixedIdent += (i == parts.begin() ? "" : "(<wbr>") + (*i); - } - - return fixedIdent; - } - return str; -} - -utf8 getfooterStr() -{ - return "</body></html>"; -} - -const utf8 randomId(utf8 &temp) -{ - temp.clear(); - - // construct a secondary temp id for this - // action for use after the check happened - for (int i = 0; i < 8; i++) - { - temp.append(utf8(tos(rand() % 10))); - } - return temp; -} - -utf8 getStreamListeners(const size_t sid, const bool nowrap, const int fh) -{ - return "<script type=\"text/javascript\">" EL - "function $(id){return document.getElementById(id);}" EL - "var registerOnWindowLoad=function(callback){" EL - "if(window.addEventListener){" EL - "window.addEventListener('load',callback,false);" EL - "}else{" EL - "window.attachEvent('onload',callback);" EL - "}" EL - "};" EL - "function getHTTP(){" EL - "if(window.XDomainRequest){" EL - "return new XDomainRequest();" EL - "}else if(window.XMLHttpRequest){" EL - "return new XMLHttpRequest();" EL - "}else{" EL - "return new ActiveXObject(\"Microsoft.XMLHTTP\");" EL - "}" EL - "}" EL - "function getListeners(){" EL - "var xmlhttp = getHTTP();" EL - "try{" EL - "xmlhttp.open(\"GET\",\"admin.cgi?sid="+tos(sid)+"&mode=listeners&server="+randomId(listenerId)+"&nw="+tos(nowrap)+"&fh="+tos(fh)+"\",true);" EL - "if(window.XDomainRequest){" EL - "xmlhttp.onload=function(){$('listeners').innerHTML=xmlhttp.responseText;};" EL - "xmlhttp.onerror=function(){$('listeners').innerHTML=xmlhttp.responseText;};" EL - "}else{" EL - "xmlhttp.onreadystatechange=function(){$('listeners').innerHTML=xmlhttp.responseText;};" EL - "}" EL - "xmlhttp.send(null);" EL - "}" EL - "catch(e){" EL - "$('listeners').innerHTML=e;" EL - "}" EL - "}" EL - "registerOnWindowLoad(getListeners());" EL - "</script>"; -} - -utf8 getHTML5Remover() -{ - return "<script type=\"text/javascript\">" EL - "var registerOnWindowLoad=function(callback){" EL - "if(window.addEventListener){" EL - "window.addEventListener('load',callback,false);" EL - "}else{" EL - "window.attachEvent('onload',callback);" EL - "}" EL - "};" EL - "registerOnWindowLoad(function(){" EL - "var audio=document.getElementsByTagName(\"audio\");" EL - "if(audio.length){" EL - "var canPlay = !!audio[0].canPlayType && audio[0].canPlayType('audio/mpeg; codecs=\"mp3\"') != \"\";" EL - "if(!canPlay){" EL - "for(var i=audio.length-1;i>=0;i--){" EL - "var parent = audio[i].parentNode;" EL - "parent.removeChild(audio[i]);" EL - "var parent2 = parent.parentNode;" EL - "parent2.removeChild(parent);" EL - "}" EL - "}" EL - "}" EL - "});" EL - "</script>"; -} - -utf8 getIEFlexFix() -{ - return "<script type=\"text/javascript\">" EL - "function $(id){return document.getElementById(id);}" EL - "var registerOnWindowLoad=function(callback){" EL - "if(window.addEventListener){" EL - "window.addEventListener('load',callback,false);" EL - "}else{" EL - "window.attachEvent('onload',callback);" EL - "}" EL - "};" EL - "registerOnWindowLoad(function(){" EL - "if(navigator.userAgent.match(/msie|trident/i)){" EL - "$('hdrbox').style.display = 'block';" EL - "}" EL - "});" EL - "</script>"; -} - -utf8 g_IPAddressForClients; // address clients will connect to -u_short g_portForClients = 0; // port clients will connect to, generally portBase -int g_legacyPort = -1; // port legacy v1 sources will connect to, or not - -// attempt to compress everything in one go though -// only use if its smaller than the original data. -const bool compressData(utf8 &body) -{ - if (!body.empty()) - { - z_stream stream = {0}; - - const uInt size = (uInt)body.size(); - stream.next_in = (Bytef*)body.data(); - stream.avail_in = size; - - char *m_outMsg = new char[size * 2]; - stream.next_out = (Bytef*)m_outMsg; - stream.avail_out = size * 2; - - // set windowBits to 31 to allow gzip encoded output - if (deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY) == Z_OK) - { - int ret = deflate(&stream, Z_FINISH); - deflateEnd(&stream); - if (ret == Z_STREAM_END) - { - // if it's bigger than we started with then there's no - // sensible reason to return the compressed data block - if (stream.total_out < size) - { - body = utf8(m_outMsg, stream.total_out); - delete [] m_outMsg; - return true; - } - } - } - delete [] m_outMsg; - } - return false; -} - -const bool compressDataStart(utf8 &body, z_stream *stream, Bytef* name, const bool local) -{ - if (!stream || body.empty()) - { - return false; - } - - stream->zalloc = Z_NULL; - stream->zfree = Z_NULL; - stream->opaque = Z_NULL; - - // set windowBits to 31 to allow gzip encoded output - if (deflateInit2(stream, (local ? Z_BEST_COMPRESSION : Z_DEFAULT_COMPRESSION), Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY) != Z_OK) - { - return false; - } - - if (local) - { - gz_header head = {0}; - head.text = 1; - head.name = head.comment = name; - head.time = (uLong)::time(NULL); - deflateSetHeader(stream, &head); - } - - return (compressDataCont(body, stream) != 0); -} - -const int compressDataCont(utf8 &body, z_stream *stream) -{ - #define CHUNK 1024 - static utf8 body2; - body2.clear(); - static unsigned char out[CHUNK] = {0}; - int ret = Z_OK; - uInt start = (uInt)body.size(), have = 0, pos = 0; - - do - { - if (start - pos > 0) - { - if (have == 0) - { - stream->next_in = (Bytef*)body.data(); - pos += (stream->avail_in = min(CHUNK, (int)start)); - have = start - stream->avail_in; - } - else - { - stream->next_in = (Bytef*)&body[pos]; - pos += (stream->avail_in = min(CHUNK, (int)have)); - have = have - stream->avail_in; - } - } - - do - { - stream->avail_out = CHUNK; - stream->next_out = out; - ret = deflate(stream, Z_PARTIAL_FLUSH); - body2 += utf8(out, (CHUNK - stream->avail_out)); - if (!stream->avail_in) - { - break; - } - } while (stream->avail_out == 0); - } while (ret != Z_BUF_ERROR); - - if (!body2.empty()) - { - body = body2; - } - return stream->total_out; -} - -void compressDataFinish(utf8 &body, z_stream *stream) -{ - if (stream) - { - #define CHUNK 1024 - static utf8 body2; - body2.clear(); - static unsigned char out[CHUNK] = {0}; - stream->avail_out = CHUNK; - stream->next_out = out; - deflate(stream, Z_FINISH); - body2 = utf8(out, (CHUNK - stream->avail_out)); - if (!body2.empty()) - { - body = body2; - } - } -} - -const bool compressDataEnd(z_stream *stream) -{ - return (stream && (deflateEnd(stream) == Z_OK)); -} - -const utf8 loadLocalFile(uniFile::filenameType fn, const utf8& logPrefix, const size_t sizeLimit) -{ - utf8 body; - if (!fn.empty()) - { - size_t fileSize = uniFile::fileSize(fn); - if (fileSize && (!sizeLimit || fileSize <= sizeLimit)) - { - FILE *f = uniFile::fopen(fn, "rb"); - if (f) - { - size_t alloc = fileSize + 1; - utf8::value_type *buf = new utf8::value_type[alloc]; - memset(buf, 0, sizeof(utf8::value_type) * alloc); - ::fread(buf, 1, fileSize, f); - ::fclose(f); - - body = utf8(buf,fileSize); - delete [] buf; - } - } - else if (fileSize) - { - WLOG(logPrefix + "Unable to load `" + fn + "' as it is over the allowed size limit (" + tos(sizeLimit) + " bytes)"); - } - } - return body; -} - -#ifdef _WIN32 -static const char *abb_weekdays[] = { - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - NULL -}; - -static const char *abb_month[] = { - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - NULL -}; - -/* - * tm_year is relative this year - */ -const int tm_year_base = 1900; - -inline int match_string(const char **buf, const char **strs) -{ - for (int i = 0; (strs && strs[i] != NULL); ++i) { - size_t len = (strs && strs[i] ? strlen(strs[i]) : 0); - if (len && strncmp(*buf, strs[i], len) == 0) { - *buf += len; - return i; - } - } - return -1; -} - -// stripped down version which only processes against '%a, %d %b %Y %H:%M:%S' -// which is only used on the Windows builds as it's native for other targets -char *strptime(const char *buf, const char *format, struct tm *timeptr) -{ - char c; - - for (; (c = *format) != '\0'; ++format) - { - char *s = 0; - - if (isspace (c)) - { - while (isspace (*buf)) ++buf; - } - else if (c == '%' && format[1] != '\0') - { - int ret; - c = *++format; - if (c == 'E' || c == 'O') c = *++format; - switch (c) - { - case 'a': - { - ret = match_string (&buf, abb_weekdays); - if (ret < 0) return NULL; - timeptr->tm_wday = ret; - break; - } - case 'b': - { - ret = match_string (&buf, abb_month); - if (ret < 0) return NULL; - timeptr->tm_mon = ret; - break; - } - case 'd': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_mday = ret; - buf = s; - break; - } - case 'H': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_hour = ret; - buf = s; - break; - } - case 'M': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_min = ret; - buf = s; - break; - } - case 'S': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_sec = ret; - buf = s; - break; - } - case 'Y': - { - ret = strtol (buf, &s, 10); - if (s == buf) return NULL; - timeptr->tm_year = ret - tm_year_base; - buf = s; - break; - } - case '\0': - { - --format; - /* FALLTHROUGH */ - } - case '%': - { - if (*buf == '%') ++buf; - else return NULL; - break; - } - default: - { - if (*buf == '%' || *++buf == c) ++buf; - else return NULL; - break; - } - } - } - else - { - if (*buf == c) ++buf; - else return NULL; - } - } - return (char *)buf; -} -#endif - -const time_t readRFCDate(const utf8& str) -{ - struct tm tmdate = {0}; - if (strptime(str.toANSI().c_str(), "%a, %d %b %Y %H:%M:%S", &tmdate)) - { - #ifdef _WIN32 - return _mkgmtime(&tmdate); - #else - return timegm(&tmdate); - #endif - } - return 0; -} - -const utf8 getRFCDate(const time_t use) -{ - char buf[1024] = {0}; - const time_t now = ::time(NULL); - struct tm tm = *gmtime((use ? &use : &now)); - const size_t size = strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S GMT", &tm); - return (size > 0 ? utf8(buf, size) : (utf8)""); -} - -const utf8 timeString(const time_t t, const bool slim) throw() -{ - __int64 sec = t; - __int64 min = sec / 60; - sec -= min * 60; - __int64 hours = min / 60; - min -= hours * 60; - - if (slim) - { - char buf[24] = {0}; - snprintf(buf, sizeof(buf), "%02lld:%02u:%02u", hours, (unsigned int)min, (unsigned int)sec); - return buf; - } - else - { - utf8 result; - __int64 days = hours / 24; - hours -= days * 24; - const __int64 years = days / 365; - days -= years * 365; - - if (years) result += tos(years) + " year" + (years != 1 ? "s" : "") + " "; - if (days) result += tos(days) + " day" + (days != 1 ? "s" : "") + " "; - if (hours) result += tos(hours) + " hour" + (hours != 1 ? "s" : "") + " "; - if (min) result += tos(min) + " minute" + (min != 1 ? "s" : "") + " "; - if (sec) result += tos(sec) + " second" + (sec != 1 ? "s" : ""); - return stripWhitespace(result); - } -} - -class jsonEscapes: public map<char,std::string> -{ -public: - jsonEscapes() - { - (*this)['\\'] = "\\\\"; - (*this)['/'] = "\\/"; - (*this)['\"'] = "\\\""; - (*this)['\b'] = "\\b"; - (*this)['\f'] = "\\f"; - (*this)['\n'] = "\\n"; - (*this)['\r'] = "\\r"; - (*this)['\t'] = "\\t"; - } -}; - -static const jsonEscapes gsJSONEscapes; - -const utf8 escapeJSON(const utf8 &s) throw() -{ - string result; - const string::size_type siz = s.size(); - for (string::size_type x = 0; x < siz; ++x) - { - jsonEscapes::const_iterator i = gsJSONEscapes.find(s[x]); - if (i != gsJSONEscapes.end()) - { - result += (*i).second; - } - else - { - result += s[x]; - } - } - return result; -} - -void rotatew3cFiles(utf8 files) -{ - // w3c logging (global) - if (gOptions.w3cEnable()) - { - if (files == "w3c" || files == "") - { - w3cLog::rotate_log(gOptions.w3cLog()); - } - } - - // w3c logging (per stream) - if (files == "w3c" || files == "") - { - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if (gOptions.read_stream_w3cLog((*i).first)) - { - w3cLog::rotate_log(gOptions.stream_w3cLog((*i).first),(*i).first); - } - } - } -} - -utf8 &fixSongMetadata(utf8& metadata, int& trigger) -{ - utf8::size_type pos = metadata.find((unsigned char *)"Advert:", 0, 7); - - if (pos == utf8::npos) - pos = metadata.find((unsigned char *)"Advert!", 0, 7); - - if (!metadata.empty() && (pos == 0)) - { - trigger = 1; - - // got a first matching block - metadata.erase (0, 7); - - // look for an end block - metadata = stripWhitespace(metadata); - - // check for it being empty after stripping out non-alpha - // characters so we can show what is sent to the listener - if (stripAlphaDigit(metadata).empty()) - { - metadata.clear(); - } - } - return metadata; -} - -const utf8 getCurrentSong(utf8 currentSong) -{ - int trigger = 0; - utf8 &song = fixSongMetadata(currentSong, trigger); - if (trigger) - { - if (song.empty()) - { - song = "<i>" + utf8(trigger == 2 ? "Test " : "") + "Advert Trigger</i>"; - } - else - { - song = "<i>" + utf8(trigger == 2 ? "Test " : "") + "Advert Trigger: </i>" + aolxml::escapeXML(song) + "</i>"; - } - } - else - { - if (song.empty()) - { - song = "<i>Empty Title</i>"; - } - else - { - song = aolxml::escapeXML(song); - } - } - - return song; -} - -const utf8 stripHTTPprefix(const utf8& addr) -{ - if (!addr.empty()) - { - utf8::size_type pos = addr.find(utf8("://")); - if (pos != utf8::npos) - { - return addr.substr(pos + 3); - } - } - return addr; -} - -const bool isAddress(const utf8& addr) -{ - if (!addr.empty()) - { - if (addr.find(utf8(".")) != utf8::npos) - { - return true; - } - } - return false; -} - -const bool extractPassword(utf8 &dj_password, utf8 &dj_name, int &streamID) -{ - if (!dj_password.empty()) - { - const vector<utf8> tokens = tokenizer(dj_password, ':'); - // if 2 or 3 then we've got user:password or password:#sid or - // user:password:#sid so we need to check for which version - if (tokens.size() >= 2) - { - if (tokens[1].size() > 0) - { - // this is user:password:#sid or user:password - if (tokens[1].find(utf8("#")) != 0) - { - dj_password = tokens[1]; - dj_name = tokens[0]; - - if (tokens.size() == 3) - { - if (tokens[2].size() > 1) - { - if (tokens[2].find(utf8("#")) == 0) - { - streamID = atoi((const char *)tokens[2].c_str()+1); - } - } - } - } - // this could be password:#sid - else - { - streamID = atoi((const char *)tokens[1].c_str()+1); - dj_password = tokens[0]; - } - return true; - } - } - } - return false; -} - -#ifdef _WIN32 - -const utf8 errMessage() throw() -{ - LPVOID lpMsgBuf = NULL; - ::FormatMessageW( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL - ); - if (lpMsgBuf) - { - utf32 u32((const wchar_t*)lpMsgBuf); - const utf8 result = stripWhitespace(u32.toUtf8()); - ::LocalFree(lpMsgBuf); - return result; - } - return "Unknown error"; -} - -#else -#include <string> -#include <ctype.h> -#include "stl/stringUtils.h" -#include <errno.h> - -const utf8 errMessage() throw() -{ - const int e = errno; - const utf8 b = strerror(e); - return (!b.empty() ? utf8(b) : tos(e)); -} - -#endif - -#ifdef _WIN32 -#define _WS2DEF_ -#define _WINSOCK2API_ -#endif -#include "threadedRunner.h" -const int getStreamBitrate(const httpHeaderMap_t &headers) -{ - const int bitrate = mapGet(headers, "icy-br", 0); - if (!bitrate) - { - // try to find a bitrate if not provided by looking at the possible Icecast info header - const utf8 info = mapGet(headers, "ice-audio-info", utf8()); - if (!info.empty()) - { - vector<utf8> blocks = tokenizer(info, ';'); - for (vector<utf8>::const_iterator i = blocks.begin(); i != blocks.end(); ++i) - { - vector<utf8> pairs = tokenizer((*i), '='); - if (pairs.size() == 2) - { - utf8 key = toLower(stripWhitespace(pairs[0])); - if (!key.empty()) - { - // should just be "ice-bitrate" but seen some servers use "bitrate" - if ((key == "bitrate") || (key == "ice-bitrate")) - { - return atoi((const char *)stripWhitespace(pairs[1]).c_str()); - } - } - } - } - } - } - return bitrate; -} - -const int getStreamSamplerate(const httpHeaderMap_t &headers) -{ - const int samplerate = mapGet(headers, "icy-sr", 0); - if (!samplerate) - { - // try to find a bitrate if not provided by looking at the possible Icecast info header - const utf8 info = mapGet(headers, "ice-audio-info", utf8()); - if (!info.empty()) - { - vector<utf8> blocks = tokenizer(info, ';'); - for (vector<utf8>::const_iterator i = blocks.begin(); i != blocks.end(); ++i) - { - vector<utf8> pairs = tokenizer((*i), '='); - if (pairs.size() == 2) - { - utf8 key = toLower(stripWhitespace(pairs[0])); - if (!key.empty()) - { - if (key == "samplerate") - { - return atoi((const char *)stripWhitespace(pairs[1]).c_str()); - } - } - } - } - } - } - return samplerate; -} - -const int getHTTPRequestDetails(const string &firstLine, string &request, string &url, string &protocolAndVersion) -{ - const vector<string> parts = tokenizer(firstLine, ' '); - if (!parts.empty()) - { - int state = 0, partsCount = (int)parts.size(); - switch (partsCount) - { - case 3: - { - request = parts[0]; - url = parts[1]; - protocolAndVersion = parts[2]; - state = partsCount; - } - break; - case 2: - { - request = parts[0]; - url = parts[1]; - // this allows things like old v1 sc_trans to send - // title updates without failing (like v1 allowed) - protocolAndVersion = "HTTP/1.0"; - state = 3; - } - break; - case 1: - { - request = parts[0]; - state = partsCount; - } - break; - default: - { - // if we're here then it's likely that it's an - // incorrectly encoded request and we'll need - // to re-combine to make the 'url' not cludge - // the expected data for 'protocolAndVersion'. - request = parts[0]; - for (int i = 1; i < partsCount - 1; i++) - { - url += (i != 1 ? " " : "") + parts[i]; - } - protocolAndVersion = parts[partsCount - 1]; - state = 3; - } - break; - } - return state; - } - return 0; -} - -const utf8 fixMimeType(const utf8& mimeType) -{ - if (mimeType.empty() || (mimeType == "mp3") || (mimeType == "audio/mp3")) - { - return "audio/mpeg"; - } - if (mimeType == "audio/aac") - { - return "audio/aacp"; - } - return mimeType; -} - -const int detectAutoDumpTimeout(time_t &cur_time, const time_t lastActivityTime, - const utf8& msg, const bool debug, - const size_t streamID) throw(runtime_error) -{ - const int autoDumpTime = gOptions.getAutoDumpTime(streamID); - cur_time = ::time(NULL); - if ((autoDumpTime > 0) && ((cur_time - lastActivityTime) >= autoDumpTime)) - { - throwEx<runtime_error>((debug ? (msg + " (" + tos(cur_time) + " " + - tos(lastActivityTime) + " [" + - tos(cur_time - lastActivityTime) + "])") : (utf8)"")); - } - return autoDumpTime; -} - -const utf8 sampleRateStr(const int sr) -{ - switch (sr) - { - case 88200: - { - return "88.2 kHz"; - } - case 44100: - { - return "44.1 kHz"; - } - case 22050: - { - return "22.05 kHz"; - } - case 11025: - { - return "11.025 kHz"; - } - case 7350: - { - return "7.35 kHz"; - } - default: - { - // 96, 64, 48, 32, 24, 16, 12, 8 - return (sr > 0 ? tos(sr / 1000) : "unknown") + " kHz"; - } - } -} - -const __uint64 time_now_ms() -{ -#ifdef _WIN32 - FILETIME ft = {0}; - ::GetSystemTimeAsFileTime(&ft); - - __uint64 t = ((__uint64)(ft.dwHighDateTime) << 32) | ft.dwLowDateTime; - - t -= 116444736000000000LL; // convert epoch as there's this - // many 100ns between 1601 & 1970 - t /= 10000; // convert to milliseconds as this is - // based on the number of 100-nanosecond - // intervals since January 1, 1601 (UTC) - return t; -#else - struct timeval now; - gettimeofday(&now, NULL); - return (((__uint64)now.tv_sec) * 1000) + (now.tv_usec / 1000); -#endif -} - -const bool isRemoteAddress(const utf8 &addr) -{ - return (!addr.empty() && - (addr.find(utf8("127.")) != 0) && - (addr.find(utf8("10.")) != 0) && - (addr.find(utf8("192.168.")) != 0) && - (addr.find(utf8("192.0.0.")) != 0) && - (addr.find(utf8("198.18.")) != 0) && - (addr.find(utf8("198.19.")) != 0) && - (toLower(addr).find(utf8("localhost")) != 0)); -} diff --git a/Src/Plugins/DSP/sc_serv3/global.h b/Src/Plugins/DSP/sc_serv3/global.h deleted file mode 100644 index 6f2065f0..00000000 --- a/Src/Plugins/DSP/sc_serv3/global.h +++ /dev/null @@ -1,218 +0,0 @@ -#pragma once -#ifndef global_H_ -#define global_H_ - -#include "config.h" -#include "versions.h" -#include <limits.h> -#include <stdexcept> - -// #define INCLUDE_BACKUP_STREAMS 1 -// #define INCLUDE_SSL_CERTS 1 - -#define EL "\n" - -#ifdef _WIN32 -#define getpid _getpid -#define MAXHOSTNAMELEN 256 -#endif -#ifndef MAXHOSTNAMELEN -#ifndef HOST_NAME_MAX -#define HOST_NAME_MAX _POSIX_HOST_NAME_MAX -#endif -#define MAXHOSTNAMELEN HOST_NAME_MAX -#endif - -extern config gOptions; -extern size_t gFF_fix; - -// manage killed state -const int iskilled() throw(); -void setkill(int v) throw(); - -// manage post-setup handling -const int isPostSetup() throw(); -void setPostSetup(int v) throw(); - -// helper template to throw an exception with a utf8 stream -template<typename T> inline void throwEx(const char *msg) throw(T) { throw T(msg); } -template<typename T> inline void throwEx(const uniString::utf8 &msg) throw(T) { throw T(msg.hideAsString()); } -template<typename T> inline void throwEx(const std::string &msg) throw(T) { throw T(msg); } - -// subclass used to distinguish between error messages that are already labeled -// with [<subsystem>] and those that aren't -class tagged_error: public std::runtime_error -{ -public: - explicit tagged_error(const std::string &s):runtime_error(s){} -}; - - -struct parserInfo -{ - unsigned long m_mask; - unsigned long m_pattern; - unsigned int m_samplerate; - int m_version; - int m_bitrate; - unsigned m_frameCount; - unsigned m_reduce; - float m_duration; - bool m_inUse; - std::string m_description; - - virtual int verifyFrame (const unsigned char *buf, unsigned int len) = 0; - virtual const std::string &getDescription() const { return m_description; } - virtual const char *getVersionName() const = 0; - - parserInfo(unsigned long mask = 0, unsigned long v = 0) { m_mask = mask; m_pattern = v; m_samplerate = m_bitrate = 0; m_inUse = false; m_frameCount = m_reduce = 0; m_duration = 0.0; m_version = 0; } - virtual int getUvoxType() = 0; - virtual ~parserInfo() {} -}; - -/////////////// various strings ///////////////////////////// - -void constructMessageResponses(); - -extern const uniString::utf8::value_type* MSG_INVALIDPASSWORD; -extern const int MSG_INVALIDPASSWORD_LEN; - -extern const uniString::utf8::value_type* MSG_VALIDPASSWORD; -extern const int MSG_VALIDPASSWORD_LEN; - -extern const uniString::utf8::value_type* MSG_HTTP_VALIDPASSWORD; -extern const int MSG_HTTP_VALIDPASSWORD_LEN; - -extern const uniString::utf8::value_type* MSG_BADSTREAMID; -extern const int MSG_BADSTREAMID_LEN; - -extern const uniString::utf8::value_type* MSG_STREAMINUSE; -extern const int MSG_STREAMINUSE_LEN; - -extern const uniString::utf8::value_type* MSG_STREAMMOVED; -extern const int MSG_STREAMMOVED_LEN; - -extern uniString::utf8 MSG_ICY_HTTP401; -extern uniString::utf8 MSG_ICY200; -extern uniString::utf8 MSG_ICY_HTTP200; -extern uniString::utf8 MSG_UVOX_HTTP200; - -extern int MSG_ICY_HTTP401_LEN; - -extern const uniString::utf8::value_type* MSG_AUTHFAILURE401; - -extern const uniString::utf8::value_type* MSG_200; -extern const uniString::utf8::value_type* MSG_NO_CLOSE_200; -extern const uniString::utf8::value_type* MSG_STD200; - -extern const uniString::utf8::value_type* MSG_HTTP400; - -extern const uniString::utf8::value_type* MSG_HTTP403; - -extern const uniString::utf8::value_type* MSG_HTTP404; -extern const int MSG_HTTP404_LEN; - -extern const uniString::utf8::value_type* MSG_HTTP405; - -extern const uniString::utf8::value_type* MSG_HTTP503; -extern const int MSG_HTTP503_LEN; - -extern uniString::utf8 g_userAgentBase; // user agent for sc_serv2 -extern uniString::utf8 g_userAgent; // user agent for sc_serv2 - -extern time_t g_upTime; -const uniString::utf8 timeString(const time_t t, const bool slim = false) throw(); - -const bool isUserAgentRelay(const uniString::utf8 &user_agent) throw(); -const bool isUserAgentOfficial(const uniString::utf8 &user_agent) throw(); - -const uniString::utf8 redirect(const uniString::utf8 &url, bool compress) throw(); -const uniString::utf8 urlLink(const uniString::utf8 &url, const uniString::utf8 &text = "", const bool embed = false) throw(); - -const uniString::utf8 http302(const uniString::utf8 &url) throw(); - -const uniString::utf8 addWBR(const uniString::utf8 &str) throw(); - -uniString::utf8 getfooterStr(); -uniString::utf8 getHTML5Remover(); -uniString::utf8 getIEFlexFix(); -uniString::utf8 getStreamListeners(const size_t sid, const bool nowrap, const int fh); - -extern uniString::utf8 g_IPAddressForClients; // address clients will connect to -extern u_short g_portForClients; // port clients will connect to, generally portBase -extern int g_legacyPort; // port legacy v1 sources will connect to, or not - -const bool reloadConfig(int force); -void reloadBanLists(); -void reloadRipLists(); -void reloadAdminAccessList(); -void reloadAgentLists(); -void rotatew3cFiles(uniString::utf8 files); - -const uniString::utf8 loadLocalFile(uniFile::filenameType fn, const uniString::utf8& logPrefix = "", const size_t sizeLimit = 0); - -const uniString::utf8 escapeJSON(const uniString::utf8 &s) throw(); - -// creates GZIP (RFC 1952) encoded output as -// either one go or in blocks for logs, etc -#include <zlib.h> -const bool compressData(uniString::utf8 &body); -const bool compressDataStart(uniString::utf8 &body, z_stream *stream, Bytef* name = (Bytef*)"sc_serv.log\0", bool local = true); -const int compressDataCont(uniString::utf8 &body, z_stream *stream); -void compressDataFinish(uniString::utf8 &body, z_stream *stream); -const bool compressDataEnd(z_stream *stream); - - -// used for getting and setting modified dates on relevant http responses -// set use = 0 for current time, otherwise pass in a time_t as needed -const uniString::utf8 getRFCDate(const time_t use); -const time_t readRFCDate(const uniString::utf8& str); -#ifdef _WIN32 -char *strptime(const char *buf, const char *format, struct tm *timeptr); -#endif -const uniString::utf8 getStreamPath(const size_t sid, const bool for_public = false); - -const bool isCDNMaster(size_t sid); -const bool isCDNSlave(size_t sid); - -#ifndef _WIN32 -#define localtime_s(x,y) localtime_r(y,x) -#else -#define snprintf _snprintf -#endif - -// return system error string -const uniString::utf8 errMessage() throw(); - -const uniString::utf8 bob(); - -void printUpdateMessage(); - -extern uniString::utf8 listenerId; -const uniString::utf8 randomId(uniString::utf8 &temp); - -const uniString::utf8 getCurrentSong(uniString::utf8 currentSong); -const uniString::utf8 stripHTTPprefix(const uniString::utf8& addr); - -const bool isAddress(const uniString::utf8& addr); - -const bool extractPassword(uniString::utf8 &dj_password, uniString::utf8 &dj_name, int &streamID); - -typedef std::map<uniString::utf8,uniString::utf8> httpHeaderMap_t; -const int getStreamBitrate(const httpHeaderMap_t &headers); -const int getStreamSamplerate(const httpHeaderMap_t &headers); -const int getHTTPRequestDetails(const std::string &firstLine, std::string &request, - std::string &url, std::string &protocolAndVersion); -const uniString::utf8 fixMimeType(const uniString::utf8& mimeType); - -const uniString::utf8 sampleRateStr(const int sr); - -const int detectAutoDumpTimeout(time_t &cur_time, const time_t lastActivityTime, - const uniString::utf8& msg, const bool debug, - const size_t streamID = DEFAULT_SOURCE_STREAM) throw(std::runtime_error); - -const __uint64 time_now_ms(); - -const bool isRemoteAddress(const uniString::utf8 &addr); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/icy.ico b/Src/Plugins/DSP/sc_serv3/icy.ico deleted file mode 100644 index ba0bb6d7357c6a3e63b140fb8ce7409ba33fa047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40585 zcmX_o1yoe+_w}W_1VI{<k{szCM34^Y?(UF=0YO?irBOmex*McB1*CiEp?lyP-~YFM zvleTZVP@{V&$G`y`|NWD06+pzfqyq7fDVW@2Y~m8-$9`Nd;EhD045R7(b4_?$Akdj z6A1u>i2Hx9w?Vv>J_7(ERh4D%uqm(+Z^e_7l~Vin*MC2l=!iQ5w;xsjV6G-7^;W}s z;jj%Oi+bBbz(2=&C-q3FW&c@TFd-eiM!Zx4U=Bj}a$t_l?%^AC&9V}Kz|GFuV&M=- z<WXaf3040obc;_AU0vxpGCfxQ3Q?j2+U1eo{m8lh)A`8AGUrjb=k>82^no{{iO1dA z3f2Y<yb}tR#C~1yM&a880ioJk*^z7!0W}Q`3;k3}h1W+Pg&n0|5=9ei)Zr^@$bVgp za9kX6r6Q}y)?qL5ZiB$@sPKhCAI&8x1VaH3y6w)$*Q%(fs8f>*VNd{dx=+@uFO^Z6 z35NtOfP{&8n50u&Ib&|yd1}Ru_f>Icw@4{-jN}f6WxGa#+!?C!K&@}$%SI9NerRY& z{=`=_HM+BBy7MBbYmK-{v9sOn$^Xwb92bzw3dBB8*O^1%RW|txZ9Yb_AyQ&i$r*{I z6c|IJYcyP;ox&_41UOwX!~=X=%gde6HEwiG=56Qs(1saOA9d0`eKj|MP%ciTU4&Jx z{;C=`wv7yMcxlrr5It8mZzUlZbM#7ww$m4^7&+JAxHzk^+aXfW{s9vp11V(*RyEew zdty7l?Ymm%Oy{<BIDf0*F~tU%*37Sd_TahVGs`|%9kL3#bu^(>a5s{_O?)t-iZZWi z>&|%c!&%Hk0v%NS5)Zh$pbW>Sw#!!~esPMpb~M>J1NTvH(1r%+mZ~)i$0|Gg64%NA zWRJecF>f_!7<WmI4j6wcPGA3vF@Xf=Y!GX}&3@URR6jdlJqrplp1WIki+n(=1M6<P z-h5aVgwk~aIxZ}RyW<Q6Ij>QJaK4xvq-kqwbM@?~fi_2V%6op}4u9z&7`8W=a5UL4 zL~Mqm=WbWnczs>nYa49r`qn;s>PV?C$GOAXsJvJSicFTGG!1%sdM_Cn8S4ba(QpIb ztbi$t4Z|)Ab>jMkgD>TP&S;&E2zM>#`O5WC$v{r}OGSFXfUeeM{kPftZBmsFdFnxx z0UA>-7P>_-t;q3}c^ghegJ~P|=5*8fg6?bY+4isk61sFFX*ilL<(jIo9sKUHB$jzB zQ=o!@B1XAOhzv=U(-P?9jz;<f+p|aUtAvmbhdJ>3Sq!Ig^kc(?LTA280*w+jli#G% zg4S2jidv9{xwXct?j6}hI)k`2=7sxRl_mBOTUuWhBisYyYP*=K-q<kn#GLIhtFonf z4ygC1-=4OU%AO~A2T;JkO&$lc=&ikYE5n^3n~dJHJaEPd8ZDCmJleDFsQap4{RjPd zVxnz+*T)X|;L`X7#6o{iW{=Fz(EfB<j`2N!P*H@orL?NjumkCUZ~l6t+2g<y9cCI9 z{#7+*lh4F%4CBYvXF8D2>oH3i+HkDzg2!t*lvlZ?>PYu`m7_wy<pd!`*UjOP^KKrs z6e*WcEACt~>7oOqlHeQW+`3Iyk~i#C<LcvRra*2H=#!0<DkktfE0tZBn@n*??THk$ z5Thfa!*6o030g#_@}oXz5O7@R`Pu49XvP;;hnnS%7Hb^L=XXO{RrxBO+P6Lz>4yjd zT5qMs8ecdzId1G)0OhG~fV=y-vg{T5lg|(mkaPl>MJF{0D29C&4LhGRy(dq95eJ*E z`d&4WYbZ+(e9;Tur$&0!J3KVx6i)s4c17AK{n&%OV`$rLJXg@w3_AH;M%|zD2kt#{ z2$FRW5jj9=Dn@KShGF9T<oZi_!y~af1ahNtqukaAleM5lVa9ngFteF;q{CmOPE^#( zIg1VOjy}Fx078b5K)F3lurB*{f{-5dzYbSOqO0Xciw!k9gkjh?|4v2u**SDPw`Wky z<dEPVx2W@rNM#%T&s%rzHoxvLJgR8xl8%XMoJt>1x5|TU=N<2hWH@TEAjv?!D2PV} zN9PiHfMpPUfc64aC#9kjg8$^YTS0oiU&+~jK>CZotPM-zghaz1o!Hz?LqmhT&#%0{ zYSCp3`PcOZ4S{JJ`T<85PngCFY$OwsspQw{QA|o1J<t5n($B@%N2~lOjh?6w@mEKg zDA;7yi_LlVHF(p@#D~m>C>Wax{AI2*0J?OiZ5(h}*1kfyASKOC+VTR{mZ*e(sJCN} z;UM0Mz4w?~R#rxNb+p*e+CKa>qOPuv2T3b1;yiF%fL_O42aRKG4u}q!G4dju0;wZ# z5ntZ85p{})-oT*I>vzp#vqtU5(>li}>PHrQR3o$)=f*IF$HJ}cM_LRCkSbN@fq<Z? z^=4lThF>Gv9R7U#3hN2=M~15h6x5;(J*vAF)D|nVrWXpRb6Z>AvUPIwIv{YZLv?rP z7)NNy?|ivfHTFL46eSFHa76#+fmVf4cEJP*3nn5-+zlAj+DxXX!aKek5!~6`m+C-p zKsQ{VY}Y;x{rWFrC%H&T%TXRFxu@5ws*{23mcyyvx8#<c6utgvYP%+?Q1jxH-)^6+ zq6eY&!<IRVqfB%wO}e(d$CVnN<d;H_!q4#`xQ=UY0L<0sw|UL2tyz5WtNm4Avs{$f z)&7HG;>ex^1W=e+3QUU$f%imJ!eXYsQODXhmma}r-G+GY7m(#16xg{weK0<c4%`W% zPh01pMMmKvJhaZFJb=!X>0e8_h^21*dMhCYMW)x<jCO$#kzrQ-jCDlEO2YhnJ_W&y zuX(_4y;`tm4nDYH8uX{qkKLx8*BpG^)t(%P&(ufr1le?{XmL3luS&jQ8nEkk&DoPC z#<Gq0M<7xo5|cI;h9*6kUGW0$M&d8_$h_g%cXxN)_t&s-cHQbNGpc(+<&LiLA@hpI zr`|KVt6WU8t0m&R=4M~~VjOd@3?XNiCu4c9oaEu4b>w&l!5H4!eL>ScLBAI=p!GIs ze&$Vbe<zQ}{)`;xE$KTyoiFYc-M{A=X?K2e<?pyJtp;2D7DDcb+h%273OC^@hmTW# zdR?&o{oiUKxW?Jj)%DbRK%v@{OO$#3fn?;I_?J7x_n2GuY257x!M(EC-{5Ui(4*ZG z_cNv*X_Gr29nP}~^`j81{yTl$sm=6FvRju}Ad_$jEusy+MDqC+h71yFcomH0@cunW zu=u$`I!an+x%JVe`c?|fQxp<Qiahl?w`tHkujnTBq4o4<>ZGj73l+gfdmD_%9DjUz zJZc24d<TL*8sqQX5o~SWxx?YZI$-1-tG(Bq1~o1Z{2(qK+Wv#UPwq53hb?sCu*HoL z@7%Q);L=^eKsE+}#Ur`ZW3S+PlSZ0rpfVu0Q_$&UFrUa7(^{LK%ZlFEt#OMdhX`p5 z6EJGVU+@S$Ib)?V|MSQv+O3z4M;S0`{_H9cfWcpelU6-oLPgURnFzwLB)b(5G=v`| z(X9QcWCiK<ttM#P0JP4d^MrknW@_HimGEh5YU(+Je=SDG-5+j5b?<yO<-|AxD>3O| zbH!7pv?4UMeKc-7R)}Ad8NVcqCgUncny!8Yqt-d+DR8MknO{klWtc^ektlCH8)CI# zg>^q}dkYO>q=xJ3=|PU>kY$7ZW(z*@Ik=OoyBeK1P`)$nJW)e%LD0^4t}#~KEjMUH zq*F04IP?HcyM|VOLvxj9jPkoA@Utc9*zo#`#aXK7Yra5Ivbv_`CFJm)aB=4_ulx8& zb<-;~IhpEQ^QPvRHOa=pFI~k>U*XwbL+9?UJn_bV=H_TEz^Fb6*iHhTF%>Z`a%U=4 z{=^x`P#l+`6E&)P_p^*-s*PGR8~Sm_mDbxol7TDck&?g*G}K68G(}&O^v~}cvo5Vo z?~OnsaEQ7x(&H2G;t*Cjy4}I`iT>}w(^(iEWo)&cxa&rbt~dM*J1(+_>%;v&KBP}r zL_br6+`ch}iDfB8*o%KvF82ELsYxuo<fdi+XX#Gg=4s&X9qO&GudXFtnJRU6oxAOU z!cm11KYR|5se0s#1?%pP`>`X$-uEDXD<4`?twl1E^=He0PWJZqXr(hFUnU42U)*<K zGud_fTz?|ZMKz~Emaxcc<^pPrHs_ACH(EI+s30{6)_Mm$H)uS5X%JWVfQnC9%>|5K z;PO86R8DkGeGub!hPqiSJ%QCrW@yr}ow;->O`dhG^B-=uBF!S}pxnOZO*JOHJEu`V zh(i`cW#M=DG*D4ff!0lh3_K7{!HLAjMo>i_r{|v<AR%LZv9#bv7J&zoJuu|qhCn~n z1LsO$JwV^Jj9Rds7|PJHqHylK;l$ojHPSm=;Vx}5UefHKH8V4#_?u5CdEhi~OrVj= z1=G#z+rq*^ocZ~Cuy3aj4yCc*Q5}bOc{LU>lS}QI@3DEO9*_!qi*hsfzb&i%xHrXU z@~fkVsdSj!0fzhvP6AX8aW$_06j83cWr^*G-KOo5<vQ~d;?*%Qct{hxGU6oayN4i6 zuTRXD>Hqz>+c(d#%2F01eIX^I>sltQ9HkgAS#+_uk?-_1NYSh}>N#WlJ}uDcpM?{g zr|VCdf#yZ~(wL`-I&*GA=Z*C%;n<qvnG*GJ*Ws$4KUuHvmLjg*vH@)z2r)&c7dG4{ zj`3d(o=9X=D8KFw)DHU47!TEqEvpG}etfu1YC5QZ(dz6o?=Q8uZoZFwqI_+rt9#3* zjK85_0y+@L3wD>Sq&zndSA?`URLxWl%O%S(PQ|L-Pkl|T+dR%+`FZu_32E+$7fh)b z_k`l&6G8wq>ijegu_VgLEhQ96zL7`Br;v({N8i%i+K<GKIURj_1|}CzYtDC8`CwR; z6oMg;_39n|j_L%U3{!yytw1BJ4&V_(h)MYP&M%2Wa}HC|SZA~(IOYP9*ESxo#%9ua z{q9a2l@cE4;W%6fW71cl(pC@>6Ux>SNSspmPQ<DeJ78&0rzz`OAT^AVY^NCE*X(ts zTWdoU&KyX4?R3V2fBh*zKMx60)>m12=Me=Lb;;>)+k*SnnF<EoeJ@JWfdpM0ja1MH zBv=@H`V=;SN*wwf%QR(;@Slzd>fCDh)OFm;#B+mVa<cj<KWFU*9BYWS17VJJ^~x14 zzv{lT2EyAOjLLgZ0#+Joa{Uj=8rlQTwg#0$1@;#;UjF>KvsYWko2do+NY(aBP&w68 zwz#_XZPMe{gP)g?uQ>XdS5=lD&`mBFy~QEuk7BNM>yPIBv28vVyOX>HqAE1aS#jp0 za7-gR8=ITS_JI3&)P&(QE^FvkLuCL*P6Blh7#;Hv0o^%4dX`^=RA&DGK&Wx(RrQgf z;%oo3NjfwAXwzvQ(pAsqd>KTSlkCi)|4el)f)WhzAH3L`e!_)T_QSp6e}VV$fTdc4 z^@2b5=BYZ8jEO8|EMF%wc}r+@@XN%PC;ZJ8yjcER-oE(k0)L(*KazlPC_FJUQ=9hg z%bcN?A%{d{Quy&nb~;y=;tg3kRx$jVTd;C@TyLxb$qI}F90HARBpOMk;{W4hf53!k zz4_j{Ye2<yiQ4Y!5da44w+3-*C~>b_VkiaNc!TWh?G?D1cfWx#l9tgYZm4;KXmi8^ zn$-`D!LlFhICG2K6BzeC-*q=KuDq5%nYNiu9<WKL90R9C%xcptD00vqcadWfn;@Y8 zsVq4MN}{V>8mx75DykdMjV2`6)na@V)=3DRhWF(k?eU2B-@#isVLCKD<@c^*oHn3K z1QW&ohX7<?jRxX<%R8%bqX>zAh3Y-JFVL`WcImIel%)IoV(q#Gy$0Qd?Zx?C4le)% zNyijwHW^sNCOr$3kna$nA!COpsXpb#B;1u4PE{L1x^T(%-Y;RL^WmO3T#Z)VUnASZ zR$>9qbM?QBUy3~A*s9)k;J*);1q5pdpXFv|tVD0J1w3`BAToyde_IO#5!<%+CwW(j zMj6Jru7Xp~Ao3iUK+1f-ZM|QfWW_NiVDNUp)fcqk4g}q|^gSsZKD~{a(C__Y%l7C5 zbjlBJ<V$?~LJ7fc@KKVBRgUuWtsf-M6D*Cp$KDVpF!RGvBy^9vJ%_5G0i(S;j`QP& z!P>5^wEPe;0oqR&1lU=EJ-39sDS<djLI0^FBo7zlGm;$UPT4qfICAl=Bue7~i~#hB z(%Yo1-?`FM5s2-5_cCybi%<{k^4_}5V|CIi$$_o3aq?x8j(r0Cx@5K&ek#+m`_6~9 zS?o3Pl{ovrRQ=fXZ32@FhbtI063giC8h4~;b9g5&s>q&2_H?+B0G+N0;PykD`SD3) zPvl2bir?)@nf$KS-zTsHd;UuzvOck=tD~{vpanK|=_=7-rp{nAoT7J8)ubST`}BN4 zqTLQb$xhf&Jd=MCn0|LPBsi<Q#|PMh%`DL+>;2*_s8Ey9NW~|a6M!X%2|ghs11_*9 zaPQ6{kPDM+hHbzN?({V^J@}ya=1sq8S?``H#v9X!dRO`&>Tz{?I63e*>uhw!1(f=^ z(p-~ab_aD!{9`}l@9g2I@RvTy5>6GpDB`(0Ivuo7Ys$>F-4R9Spacl!>(-Ffg9f5| zmh^q$R%@OY$3y_2uzwsW;ib-NsO$Hg(6_|1PF2W*YWRS>e?jy(C(MZWQ!0mk-(Sem zHuOl5$(>e)`6h@!99MMirmROdTIYTz(^<R=f{B0>5$644SgTatQz-PY_<vb#>-zGE zoxh1CqUH4Pb3p(_Vrt9r0-_${Tbx>=yNDB_CbPR1crf1*Ss<;h!MpdFU3G1}##H<y z;3tb2Wo7ph))}|KBp{=<ePJrFd8jJiuI8cQu0971w*76{<)PC!V8ic)fr#e&<*{s$ zCSs!7<sjGwCK3T9eT9|@T$r#HopQWe2zN;@>j2F=bsfPK?fU<dC3#2&NbhgO0!ah} z)&&RT#NL*HefAn@yM>H5a-K|nwKUx;yBsDeaISyL67HagAN|~2tdeUqYUka5|6^R8 zU7+Rcd+=7v@)vaAhrm)+i(J!L=#ZZtMYCus0E}3hbX_*utG=3*$;`;O!eH!cbe1+W zT!ubWSvudn>TY^rLn{Joo(l3jVS|x7=WaM3i)hLIr&GXMV_*H#&I$3ITJWqMl~hl< zYb^#75i;qC0?NBK-_dE|?TAPOgW)v31H9K+0?srdC}ieOf4oPDf;GLt%$r-(juXH} zldEQK=N@btzr;ZPC`G=5Vtfy3=>@E<1dAf2Py1(9|2=ea$i32!``Qj!>LIy)cow@l z_K0Ca^E9^BO9WgQBJ3OyIC*GVqJYlUr%Ebs?|+4r1P~N?xQk+bZo@IwY_5L?&XWVv zWTB*Fw4k|4(?IvZqm~^hDJjn2`@@<~{l=0CYevYpz@^~hLSGDJQ=L~kRxwggMuy6U z_9-NLTABa5r@VFr*U+A(7!tq>IEfDF4Mz6$^_3yYG^pS9JFoU6SfE=hkaLjMA4mH% zoBu96ebP`A$LrZ0=9RmQ87IX?7#)El!YzyZAMSdHy}GED>NB%#Y0v!jpD>?2JmHL; zj-oofP&*pm7x_F#IahAz$1d1U&@zg8&YXuu1q6ZAq0xRbZ5mrr_Fy@^Kvfap%+alS zIqfnory3)YRlDPbU+Qa3oWBE@Oj>BvvcKbhGM~%<2SUg-9>{U!y~X0bwwRZJ!?|1! z$18o%NRK&N$tiy0OwjSG%67m1SHM(rB78D4*^2`@z7BaK@y;g^$AwzjJ61^isWwK@ z2F1OlU`}_2zJntH=SBlM+t{|76E>=Tc4446MLY&DMLQvsGHA8r$PI1R%c|A727sa^ zvbiWTp8gul5V${qC?)iXXHBtJ4*-n1Yg(Tz5$tr;0r`F>*Djx?%@3#7Y`e1-Rd)&g zPn1UpLTUIf=l+rfZ6h7t>Dt@do69(hdl4W{FNbaxX7Qyf7YnS3{cXQk9M1%Bfmqe1 zFEui(ZJaAVb5mCB%3ufXcf>(XojV$!o7Xl}&SnT!$$a&KiaH`WIe7^cZ~MSohzNS3 z*lldh{k5T+$n?J&?&X=LH;Bb>$LrD%1wGJxvEK354&~tf;xgMq<Gm?pRv+O%*$`%k zQ2Ho$y5^b?OKkt>85NdEdB*jw^Qrl;G}65tOy_y>mePlopV`!>sj11w5phctAvm9y zN=;4O*J1BF8usxtr8<DEXY~UXSq>ycPx!A8Rc#a|tANUhu3XOMXrCHE3;FK=;_!zr z0=bzEB+s9ZUOAqd$*wYt{jKph&~lpgm>m%|NA9tEl(o5w$o$SKaFp|#(uh!N2g+zH zPyO9JsgtMAwS#;Dn18K{1#HxA)pcP#dh<Xa<+xk7sO+b-K|Ym56S***f`6qxn!3kB zPo{pCsHoL_LhP8tkGT&ZW5$_BJJ5n6$o!2bOkLg;A|^xNJ6aKru9`)ueeRR9a$u#| zl=;EgR$2uo`_^{wNwzJZ9E#$uEpgvCK%mJjQJ5D%wbbf!e!50=^>}~#l=N_m8h-j~ zyh68zi3(E<_?OTVR~2A5>~EXyj_0e)S2yuHsmIsf(@hsCnZrc9h^)BoGXX$(Vo$SI zYn8@$gS4c=<XlBlxfcm&sXGvTt95|FXk6qj3~j^{)VTKnkdXKS`&Zih;=IJH|5jTb zQm#FIes<siA?R)hp0uRL<3g-5w(afNwxvl1fg7<ZLLEoWnhT+8X1bq*ROaX)%qo&B z^{~*drKSi&+Q4MG6x{@%J9bk)8E+Ay{y<)*DRgY!E6qVL(2?(M2T+yw*kJ<_*$9hY zDNtTjf}i*EGoVLal#M{Z_V*o;=ptu2R@u7h#P5G*ZM<MdE*na|@c4xvszz{vC)2Y? z>lW`x-JvtDk@_bg1$%PfW0har)P*){abc#b0GqZL>qi{LAa|6YK(0M!uPI*d_Y#_# ze^6<tW33Ip81}1`kPt8nNtpgI?qWeup8TUIkTcuz8N&k^6~A)@YDIYot-kbo1rJ$J zW89-D+>QSI=Vhi_gKZ&1f%`rwk*gS;D%ZHmEOdE(-Ub-1Ke9WlZel4ZD|37&h}T$& zkP*9#SS1vQCkzKT>IR1kp`IqpdiweYEk9NRUZMcO?f6?a-?r_(DmGTwm(h$_azE(> zsN9`M&?YO91`+$gE7pqWCp3)Ey!mboLw;8pBmE<0<@R^+Eokn4ohfIFyG&%z6IHvH zKY5%swxo~-I_g_k>Sde9q5v*?D?cmvI)sAyiHVt&*)u?<l8iYq#iT01%Yi@4bwCBb z|H<eqLFze=WwY|(a9=U;%+WKKi2zD|2b(=uogje(84{3uqu-Lw-Y}`eJiXtr;L)LV z3f5nJ(YfiW)QS4zQPZFR)r^C&3eh1bLNZ`0pwC0Jkq9>!=z-2&lWO+EqXzE_t-y+W zSm{qy)-%oR{f_$K&(blRb&P+^hg=`=fs;FcW>^ma83s{x@_H4F8bFdl2(fHvl2qhD zq^dO0y&9}3c9gO@N`Vb_8N_vuvB@{;EhNAMDj@qqCgtD(4j^@2&<DML_DMI9BEtA( zL4F}2AbGYB9GL1L)^N-%@C_Vim|GkDxxfmL7z&WGOf>%4$lOvfF-|_UhEV793GLDB z&CTBo(xl60)coJu-oX)PRhcOV57-v_3J-;h#iQp+0+?9!U};&+Ia|hxDaptDsk@LP zAP-VX1yw-dMUtdgCqb5wr2z^``|b7FCoBRa6CQ)8tpS%80K^*Wns&2lw(MIdcbgIh zMQH(Fq@i&xWmA^tqIIIhA4ulikv|7RC_tz-P7y=^MArI#n7>$lnV`?SBFh_f|9a%_ zwJmg+B%9yXvnl2I2Rm_gDOSelj<+({a07Tg;#xPjO)~qQBc!>wvHg7<-3HjA|MSeK zki69e#p_*Txd=YyYu=pZ8)#b`CM8>e*Q0KUxUZe$&U`yL_aEL+gJLBMZVXNSX^JPi z#T7}gaUdcN;zfaU9fQ)Es?u7=cPM!+XF&X{{V7}1D*dJWMp>$P60CUZcGdM`lJB0m zdv<E-fd+g%CE2FY;OCN4{!+NZS232yZ$9?<xfS4l3zLHtUz#QLTQBePrK|SAwe&Xz z%^HQ0FM3eBTM4a5?W~=<@5HdeH*+;A2Q7?Z4K0epOM=Wv<tclIFPXFTn0R6o${Y?D z7Y5tp%O4X+>>3{Y;eF>Fn<og<i9X?xyw{`LF3iP|2HQ8Sbgw=ZkdS=rVZ4>EejHge zCjw?(!Crs=HeetVrO%S7Clym%R8k+-9Fbj?n9QanWF13yYwk8fb9>8^i34x_Z$ZuQ z@^lXN*}8TW>eyCr2z5+lYG=x@nSxqUdEq^p`ziI`%beq$6R(|Aq>?IeP-uVKY-UYL zQhz0dBP-(7`1NASrdnLt5l`yFaoe{DH{UuYSFj}j7z@@EPK>Y6Vk6NpOo8*%`paA1 zV+V*q#$g&!<yDS=1SLSX+5WBWrt13zTN&Ocb5XXX;!UX3*VPsN@hIInY<jLxTVACt z?xf|^u;`D~b)4TmeR4wd!gnzASb-o+B)Wo0`F+1X+fJ?*!h1g{>5sJS3M=Z_(*egm zR2>xtT2%%kIo=uCCRHT>PN(~EP_jftS9)tUR{Mib2pwD;*zhl#VNkGU_t-(*&Y+Z) zPh<aq%H2nsLq`VCMIIMtEl_3v^fAKR0AaKNSD}%dlL*iV1Sx7cGndh5CC=`Wdg<Q^ zEOHJ+iC=Cxs#860lhU)}JiHy2P7q6~wkyw+Q>v|r#I)3pT*w$4l(@r@o=T(#K7TY- zH9}FfV`Nx~K>`GE0rEOy%sTA*S=nrT&4;>+AMziC$XuCnAs0o$)f+gUEjdEf0>3jg zzwaxHP;U9H#GAC}5+&6vEjt`~0lf<KP9ps8Gvn`8`7E94TD4eh0Qn_U!bUwki)}r_ zA*;)`92W|byJ>~5a=0G#rt>AiFq3$rx^KKmwamIN#itY9_~(7`J;#yk$Lq|#r7p35 zFeesr<S0nwsJxwyzf-;Eh_ieFpsGk)2n3xXeFg}pSQt@&lnr6os^`l9T`@r?sSz5w z?yEu_&4=wiq-%7l*9Ej$l%pCdnXjp;WLXdRE6@Hg^a?&?_Yxix4Ou!g6ecY7B{5`? z3`T%P#+ROf6cL~{1Qm2hKUdaVjsYP#1%GLw*?$z}cg;r41bo3**JxRF@0+ipdyVa> z>X;-B0$0_v)iij&I(Yqb>n+sVXDdvdv*EDPeG}oi{fsdw+1{23&Cj@)LN4(gw;g$A zZu*{x0T&|1IWece-&p6$n+#b_m5-wAEA2_=-wMmo0+;~ZdjViKw=6=0&vH(W$TjmN zUv6zWlcO$Pr14LZ-ol{#q+!YZTz;Gq_P<2Z!NpXvxu@>{%soklOL#Sfr3@Ig?#fUv zvb6S_EkEQy2$0|`#!sB(>PGd}{W;>^Ypf7QK^ru<R<q=m=*jo-wnT5p@<!ijGMKZ* zp)`x`Z&z&rw-CGS{2kU5hqWv-qN5vi*r@dTY$xlYhvnb)zKy>#vMr111>@%g63jda z0iT2^J7OH7kUGVpM(5_S(x><OS)WWleng)t)tYazIMtl0uOQ7JwNcU@i1?)`<RuEZ zv`pO+#8Cdo*Hl6xq+~7Ibxg*J_lck`mk;v(Ejfa-$OKDZvoYFl;Br4&U?CT|`G!C1 zO<!26MH$Fs_f%LgLs+<kgrNCnPk-x+C&m{ktK8%4?7uJ6$+J*q7bUkT>YFt&R7v%1 z^^zd*6dNKByd|0d-I|`iJDMBhccV}tV$8^6x2ZPkL=ORSYAOT}tWbaxe1;f*0h)OL z!C1S`SpEQ0r-J-8#OUfz&y^(D*|{LM`SN9d-A>RRnLfkL22?D@I%#bHmAocuK8#t$ z2MFp_VwU5Zd$;Y3PFRpfxb>yMc%FOw=HH5SCEZ=!2y5;<ydg1~1+2_Us!~YzNYZ;W z%ho=<y2<}lFZ;xBm9j&Wbl}uX4)!LKy5wZj^q=f$l-9OQ9Ikva6!b?s^dI~x9wv9| ze>6(>2fKo59v(^RcA!F7m@ycIDGOP2znlC^p3Bu8{tpVld7=R3sgdlH?lKUx%K|yU z1+L>*0Pl-fGsoz!YXif{Gc}>4X>WbUO~7Ga^tQtk43C~4R?Y|nvhxD6kcPrY-WR#t zSn~)MB#42$>Z~UD9u;`=bgpnvCwXwM_-4ZRPlwj-c;SEf<+~cnMCmc>pORTy`FR0M zrNh4+$Y7}46sfd{Z;2?=@x}ct6?FXVSp$EfdSK$m`caU$LLj{ePe2E6&@afK4PXim zihuvAiXdoXUp=D-gAUG#l&dkXr!bDOR=+0WHedrd9T!(UC9vxZvjqsqwLOgOF<kIs zo+%WN@(iT9*L~kX0hsiO*xqOT9L^V;)4o0rWVk9ME?Cr)W6q4ZAY-*p^fzH8B+p&d zO<#E$2emsh+2r#8!@l`5Jl?lFdE1$1<1*SgQi#w$)j7c;$p<6F`D23JtjZJ10ia!v z0~-$*Z?EVZ6^0S2EdfRb5n?=rj=jmH-@KhD)%5Qu{O|p0pJ<tHd2`={ift9Ox*3($ zY=KK>uAg`SlO*O_Lk}vEdK4h%o9qU?D}#sp(mUmR@!U@cNll;Nn`f2ia@6t3<ALaH zbKhuW`p1-kB6_|Q`QX4Y9kmWjkvj~=rwMKc{_>I;zvCUdq4)Mwrhon>TA8kLgO(+K zan;EmK07BKYwnx1u3H89pOl8Ney7Ix2|<5GI|ZJU`dK#FbF1_tjuD)#zkEG*%Gkl5 z2re^R#@*|{@-s@-bI!Z?ig)Jx-nb_DpPDJ@oQ`<;^n>G$rSa7UlMsg%7ISGjN~d&k zw=ZAg9%Zkwqo2=w&Oz7n!ltOi(!#`Oy3#b;GUytH{`XLpZmx!b#3HGF?`sdbZ*6OB zWc$NK`B%(xbwQ`ZIYZ8JX`c(b9s+PK(Et+-92>l3^SsIaN<T7wn(^&wm7dL6a^cx| zVT$k~1hGHk4I0|pdjHfA5fN93cU1rOa-78t2_ULK537#VV=jEOn@r2l#@nkA^`X3< z9p=$7vlw?l<>-3F!NgIK@Ih$h!Ay4s%GiF~(|M~(s{u)IK-=uzf&R|<NT~r)K1=Y~ zfz@o0t>6O|@1Y-wb4+=R%DR|qS?`!*4zS_yYyyNLOvC_`FZ6++I0`_v7DZxYrjxh< zeG!#-ec0027UJ|H$NbMS+hL&sTk-smA?EfIMdfbcTKk?_lrYFMrq*I6YhdJusLv`E zkoUc&*chs_t&+H?1CxVfGroTQ!q|I+>z@8r_b7Zzn;ftAT}O-vj6@HdGdgwtW>M(% z<FBTwiPhEHe-P<HjZm3x-pG6@*+C0P;E%wHo<Fau!Tpk?SW+f$@zj1e9BGYlxk8Xw zcsa$QnM}65^ldP8#=Y~`9GkR2@H?)m0v0CD0oUY&n<M87F}K^aqeSE4g)duPnfsAC zXZLdAQ(ITpZ_m7b+++B%a11ia2&}DXaqK?-IxI#HUKRcMJD}}9sdv|KqcNoAe~<-8 z{Ow@7mp4=81KRAQ3zd^cG^d(zpIu?QKrKzCUd!*5s71J$3ZJ-0syG8{uBD!T*VFi( z2RQL~^Zk|lJ=p0PK000nNqx|wW$ZX{gbdF8A(w@#&vzsx`yww42<N*w$9fLZ{=4*B z@t^^LP>w(@XJio2i5sCW4ip&L0N4}~!#?%^)p&6VTi#e&%6>9W(&qrNiv!Dvy^635 za5j7DmN4zuw0I2;Oqy)a`SIEjBKufRN_<TGl|lDI>H|^tjUjPBvzR(`xO!`jrgB$Z zun{lu$#Tw>HWn_uSuPo993qEcZmIqLZJyeQ0F<j!nK5)A*5xUGW4KHud#){~l_S-? zOjm7}TykD#Nq4RFZ^l-yNyDI4!qMN`#=x~@7!ly_#Fw~QvAfA{#QJBS?5YuA1Hg`~ zA%X4CGz_+_{m~)Kj?`4&Li$&pG53=16!JSNx)4r=WH7p_Tc~GLJLjue3_lFOx`l1I zWw>MJYQSgtU~tij#c{bH)BrsU!9phfQ6c9Hg33`ejkVgq1mp)-3UA$m!?`^(T3>_c zPJ`6SdjE_y0NO?ojxJLVzJPsx2QFxy7TN7yLTOabnf!s6DCq<3wG2!}+eJw?)u=}9 zu1cbK3zV)psX>wG(D!WrN=1HIK&iV~RFW4HZYrvi_K$T7Xdmx}l@-VyzpUPtE-!@! zzpj|lGYB(YWz-sB<!8=jtc4mDEbj>Py>0(ik+L+)WCN4|A*iv!7B$`DX%E)scd==g z%I8#o{2p$-asP1L5}{^+`*;KwzrgdmdkSoXr-DoDa4M+u^XK%C9yb0>R^_(R;f<U6 z5dgfEug3uHk$~&ha{=7u4b&y@XLVQGG{v+&D!M+3qt(gnN;+rRCO@OQI=2ZgT`NIp z>pIKRUgO9>*4Cy1gm~ZH3B(64a5M6);5c7_6p5n%nOH?Cz_tl2x93xTsAr(^hbje8 z!(0-AuA)W&QSQG{+&5x<R<$sA)5V2B33;~vgq>&tK>_0X$hnAE%<SbY_JH~ARl35! zwBgCFpMJh+5sxOL3t8K<Sk*=ET5?gCT9k1-%AQvZ2Pf)p{sr3~XI+K5VGI)B|1p?M zyLjfmR8I=LWplt#@~p~^JHO_uSVbkm#jaG#SDzo3XuxX8N#L-iNee)2o|H$}o2J}= zs)hg&P>GxPG;NZVVvPp8C6M42PkFvkw$CNNf9<(E<LuldNE*4C7pn8S?#_GlBcK?n z_H*i)(Or4dlTg_nK0pU&$o&O963B0#eLw#o)crtp&|n^bdwKihk^HbkhdF-7e+53o zhSKZHtP&zdRmo%a+WysMeIO5H#0YRDIpE8KbO8bNqv%=Z$}dI=h-3i1o4+xsUvtQP z_%#wMwO_!vgUunBVEtz1@~c)PwSYmI>$&18$Kh;(@XmT743#%=HTt|}d0bk|;rjfw zQKE|K+-k#xQDEE$_Sy~Cj*l<68rHK`bvBiswEWYnLmwewA&CB2_slDxk{DFhrm^;s z3?RH9KC;Sn5K0ylyoJc4&rQayig#7@JimEk$SFJ4?NigKnABxdH?M6ad}MPZuz9gM z%?!lnY=tL7ImLfn`Qdk<t_$Urv>35f{Mhcjlcr7dA5b|v&4vsObNLbro<zj&4{FH6 z*ls1eCnW;~x~2bHe&x=LsK|wSB;aiN<x6J<eV1r9AV>ip03M_b_%cUW(}Dd@S)?jB zc97DI)KJIfc41cTDhg^%_d3!;S%c4)lEcr4kwuK};Ws~+`;8hf_FoTTB<A{EHTX{Z zdh0M-PKT|N>j*Ac|Ai~SEHjPC(~ucDNSR$sh|{0QHh8RaOlZyXJJQw>M9~K-fqhWi z{dp>E#nG#>j%XHU`XU3QYmv3WvO~AzSM7vlKSVfp3~c+81De#1&5q<A_EbBVKQ;8d zdnpramBoH}j|Uh%jK!V08zDZim<KEAm@SCaC^63XuUEN~IQ6t&h+s$XorEuKeJ+V) z#ml*6@rCAFTy%s38TQ&4*+vil&y#xmPd2Q5@#0QF+cY--$kab_;WN>q)slxdP{*~i z+7<Ij_bL4(sjpLGyHs}BVwit$#ljb9Ft5PaXT1&J<a_hD;~RIYj`i%<RVFCca>{?Z zi2>{Z|8yVOEni$E91~K3Sx7_3d|=!<k^NsDGEcwo`k~fu&&7;CX?sUlu=lMTpsV9g zoSyvl$*ihO%XZsTmrq%@P}5QnL<xZUqXyE`L>6;KraLeueN;LU#tg=W`N0~H=@FF0 ztsR%BtLg{3+qM!h=<((pea+n55g%u{aep6c<-_m|%G?lG$h~!9RXQJG%OIGbg>h5! zmrZE=89JzUbSlxkRWi#Hm?%GkFc68bMGY?;P7P6|Xg(j@n0irAfd+s~#axx)kL)u< zfFR8rdJz;g_cQZtottPT?bK?lZ=^WVr6$VBU4(a{G3F%|;Wm=%FV|N_BIcTR7`Y0v z=E*bQxXd5&+e(seFUjuEU-vjv^By`RU;x|RSS~Lq{(LJ4erfsqrJA9VhT72RX``m< zs-)lYk9S{I$B#E>j683e%3|K1)sW`JY*}Zn^7D6C=8DZgjfGs!YWl}*a7H%DzZ0x& z4@)+WtADt9eH&hO8TyEit@ID(8%~{0Qsq5yCTK>>m_TDKGjPHi^dq(Kc~7*V)@ut_ zET6X*o&kZK038RYd9&o9OvxwHxHK!_1c4sQD8Dhjit!FN5uj3rp4EFnpr4*rz1%%_ z+d?3+PYP~xuqHx+Fd1JkT^=P0YZ|p8b9+cvFiDItatKXxI;F3&meS3lT6~ZrP_7qO zO|$Z|QcQDeJ6+<yLk9%=SH16rx(WC@5*`juVIf-rY4|}A9N60S^m_%Kw&2eF4}Yhw zjL(Kk-Vj5<WdD#V2Pgj1`1}uBK{A_MRAyC<A14rBn4&X;fdn*;sQUWABdv&`UZ&^7 z3J@EV_irjgZC4$sAWUE8RDg(#DnlXq%cREL?ycRJk9ntg4`aLbt701e&Yp1^w)3b^ z)U0(yEy-pB9M_rjBZl6E(}9H#?bOtvTU-Jo&MBG+?3|->TLdSMOQYR2x0z$!k>Xz& zu)=v<TstD5M^Nv;_G%c_9P!)gI8fp$S|6{iG)BIhsMO!Xir&vV-5cFxR+_64|I(1W z@22&uCU|B=wOa{6VrEm0TghLw?LKnA#SZ|6nTXiVfIPRXNmO)H0P-zv!<4$n(F@1n zk!gA+L|7hT^*}c$bAbXVk{QoGyiVynSbcpY&Q@3RHp>A*%^z5;GA<bQ58_gHT`lZC z#hy=UIg&GOGo%RD$y#K<3LM<%Qz_O9q6ZW^5~zO%z1Ik-YGen=R~LNwwSQ`nqJ3}L zA}%$7d^}^c7G#|HEoX-(XESc|A(jjZeNR&q4HIGrG=Y5lDC%3m=f^P}|4^~%`^5SA zT>o3&CfwG9JN3Uq@0aK^Hw$xX&tF;U?XhuWx9T*^j2C>grv~Uamws)-UydOIy+BX~ z5)hQT)h%|f$@*j0{;U<we%nNw{^7Q%GW=m9ryT|82<J)Fc+V$+<Nd+*vbtbNA=!3? zu|wjkWZ>1S6hsz5u{ebD!O9Ex^?t~fGbnIQ>#^6f7{2EymSd*CT5{UiMKi5e1^`#= zi6BE7M%FW4pyeBPZlilWB~%PPQdoYVdEt7l?6jM3<p=?l*Ru1}g);`m*Uu%5SGa!x zH{uZ-ff_b_H%Ea642C+fSIWgIl1D0trZer}KWANWKVjQax5X{WGE&#%O-`v-2~$8x z{4C>CJyW9WTM==&o*2G)Ca-${_=Ti#iP*7M1m(L52(oRPUDi=l;7Wa%m~Z;Y#e$fX zy}cv?zHC|VcwM~d?0ld9hfPS}UXgdIl}+P*91+C^d5HdOb%NI@+Bm0MXsafs4~OR* z;jsQ|$E1y11#CMJG%A}gyqqIMn4+t$XyZv_IEeq*irLZHOLo1oZD;bjLql<ArX^2+ z43_Vvp?4~Sw_Sc2cLYHn1oE>kE%<Wt#y{*!{{LV`le!yRG+X+N;vgz5`$m_=9{<Ib z+sT3%o7pJC{G6y+w3sXQmogs59)K<YSgSN3lsPy?338-~jAuFCK%Hs30T3hXIq;$a zGEay?$Om{+X<U_D0l1jpi!<UJ7VTF8l~p?Sa9Mc4v9AS~0#Hdijap$oh;ja?g|GnA z9~H2FYb$wo+`?$sU>lV*i!)e6*`;^h1ycXa$QoK?22wJ(`yk?p_2PR|2LOmH1D%an z2rMCzCa+cK;>U%9)igQ6Z7Q{)%bLJ8WpVBe?aM(3vc%`&fP*Z;yVq1V9gSU9^0hQ6 zfij5xH`(`p1EAXlv#rI7wNV)cW7%f?+w4DPap;ID7&)Li_3ZqHV$`wFhPVZ8J&_m6 zR>U)ts6m{|JiyJpV#D$`wQ4)&1Vc?|Cg5~U1ChUdCrpeEDEd|)y?{~e5m3IdZLim! z@H^Hr5_aZ(am)F!Ms0&5|I+!h>{DWFL#t3~=^gq%G3cf?zEUqCbaiQxh-NY|T*!Dp zXI0u6Qb_tMKz*b_cy5;f6L{#$dTAti_1V^9PH~qUnBT(?$%USO{Y^7=V2$zpYA8zS zT)D%qf;X|F;(K$QHV&cnXlRSi-dyMLxcN2COE<f=n~TupcE2Bp82#{GR9{6ZtI_k< z2GwLwgeBLU{0eGV<52al=#l~MWv|8JLvPr@fbqgAJ$D-r6pyfESr&*+&8nG|i!p0~ z?k=a6CdV;X`debhE#4g7y|zP)6A!QML#8$X(u-r5KJoaKoXI>f5mxpeJnvgnnq4gV zCF%|Lm~b3;+ZQcFU67n`ca%-m@&@XbUsl?P!`0pu-AS5ssu>$HWZY8&A2<~`Q8NbC zEHD5U3``&g+OF<N%X}|!hVx|Pa4`IkevH4@7O=N5Y!|4wb|)Vlp+i7y65?{ndem6) zp}zgYqms@Nk1FCgpOeT71E7)zJ;(dIH_aP%a~^53`dojOdfrX@vzbXF!^P7}tq(72 z{A(6yBVSETWaz7S18Z&r2G>r=>CqxNSO8GjuXKnGh!)CZLlzN}9KelT$KLT#@in^n z+p{mZaR(kp=u1eo44f9xS;_}VlDjekQ!3_dn*Pm?I{6*Blgfzgby16JEgq>_{;M_= zdNVoRSFT_(r_z7-a{m5LU!RwlVQ%QhCm=8M$1S3Lk(4&In4eW12&{qG<}P^7i;1m* z<BBycgsNT?H@9ywKi!^<-uj^dwwoOhulJO26deA<uCN<k>rzirzW(DPtavIGh`4an zB%{lfAqRP5+_FdC);l2e_GU=FkfdHnypxyAQGVwI(0LOh0{}5wm!tJ(a)M&QNFwQg z7?OkuQ#vNV{9qxp$1FFcl(fc#Vo*Gtq%?)&a|{1MpMl}^5XOFhCJ(J28V^qltVDo` z=)LbBZ2jV&MIrW_NO1<ZIT>iL!DLHystdE;=9`&a84C>OTdOhwPu%A~=a*F?z#HGY z0>~QyseC{MUVu~BW07@IC#j^utw9zNbWkX%g<Pdi7yf&v)856UmBm(1(b4X4#*=TK zA6rc}y(VJ3X9P~_%YtW;B!6<$mYg;=f)!7x+5cU0f@xi`Q+A$*Lul%q)nR&g0FMcn z>>WHN<6_yU)v6mCs7o6BS^lc})s8O$(catPu#rY*o|l+Fyh0`_LxRGol0VNUB#B#q zPEHEm0KMRBy?wK^Yx#^rU&`Z*Bp^Nf?(^&RkbmU^Fcr7*Mp?#fbJ@V6y7Cei)b+A* z^ySH2FSk{iYZCrYJ@fg+yXfOv2+A8IZ)Ow;c4g9;z|x<jS3V=>C-=Jk**`*JXcadt zX@gC@K^-pK?}<TUGIP`DsMa@?=M!pj>DWqJKhl;Aj=^O`cb8|SADbsur$Z56FCt0T z*=BC|_%$=%QZh=~Bx|^`LCgMw-INgniP<{Vn#AFADnwOSCJzAhw_;+*68-nv0<E=X z;|?dxk7u-fqY^qIs&d~xQj9}s`q$gkCV6a`;U<&C__XX7*B|o{ooqBZ_}bDB&TOr> z^;A${x1WrE)XKKaMoq=^l`p5f?xBBSb8rk3WN&w2`odR8z?WC#Y}{5spt*xmtz$0~ z{CcHs$Xq&xTA@;$#KRxv(Aw2_tqaZKf(J|eUII(ENX3z;g1k2clu3Uzo{P<qlESmV zp@1r2cMsEN?)!FSR^2N?Ckl0W88=}@)gI&a;`TIeF6U}=mk0$g=%5ud22OJGze79c za2o}JR!v#TLS<!b`Rs=6fXv+A>kR;IxJym<kO#rvvk@Af`><5Wz_jn#2!==J9u#HM zCOL4Z6@<=j7S?hl=o!b+-nN|LjfBmlg|+<Y6uXDhZ!bc*mzVH?1=`VV6p3;iARW2} zqC){1P*DIv6bV|zAn`!u$CyTVgO3zXra}B-#^&;UB^2OanHgH<l5@mBK6;hyIlwuz zVd~ybz4%pQHsiTKIn6l=_zuDHxF~xvWTfgAzn@h;BYi`R?3_`#MFM*GXgfUhuqAK2 zJ>C%)Mgh=CWX9e_N;nluAr4#u0JVE{&QYH_FLH=0V_AGjnb#!5na_?n;7ftTXIqTL zdHyV%=Z<})q`U7WI0GoGrm?d868(??-W5+O4^ah2=d_ioyPk=FOfpi0hDNop*a`8H zlh2B()zC;uPTS&iOKCN<x#X;zDkQZ&LHHK5p8ZX}iXnwNxtq5G>40tpX^<L6j*QVQ zN2iD-a-v)xmfIa3Fr!FUicBHFFtz>_<Ecv|1qmaM&cD_ow_vzi{L*yEmuqakB1Jrp z!#a?2^N{1)4Y?!Cqqp?_mP^&N#AO_j;R)k?-K^L%vt2*%+KsE~8PR{QJny>M+WmXe z(?6KLIuMK0DHF7g0i02|Sv465?1k<ueSz+x%!!b1Z=c$%^C6q+)9!<1kQ#YF)~IR| zJ?02LTN<Jy*dk+3kP8d8>TG)ylG2GY#EaS@uP##u7B^=Wyd|;)eJk@%dnU1rm9nVr zR6H*bc4&wqQxX?(i)_;*<IN<ey517IBTe%l3ajSh`EkaCIw5d!gm?V6UxLm}H0zal z^(EDJPlcp7d%aK6n^qL@AiIvki@a_m!0-vVti_KSPT&22&S-G$*wAF^SpK*>{I&kh zL(^E!iGVnw88IdiA~ia`VnD22Rgzk5_3n!i_Weiv&wmPUK0}A5Y!W6fdCIkmC^e3- zKBRNe8A}m<+0ilzj(vk7NCWc~LrIzQNa6!FkHRmYSZ|NMilKRbw0oNLO$qxw@}i&< zZ#|<cEV<O#RYQN6zqrt}%#%1ytnT&c?{He|?l40{>G3wNFI-zAwI^yvLZwaF?tt_# z<JD(Q4EN_m4V8qFo*YZ$<bZ@v)gJ9hIOfN-)7U9POyN13WBS00HCy2r)U!wQ^`P5n ztZ%dEL$$n?9{ldXRMsu3e~sJk6gTDs%JKU@c_D^I&}9(?PPE52Q_+Gu@7Csd%`wZV zMC~qrBeTC#YzwAt!r@oVAL!dZ1+|E96V=H8%_+NHqJagf6M^yS;Z21;qzX*Z$N-%h zN2Sd({3a)qne=SQy<C|1(w%Yi@0Z`45a<D9om;uS=^N*iXVp`Fw(XQty}u+e9d=8Z zwp5Ffm06jzwxoK4yDFJRncix)T)Juc<9A$$e2#X!hVToXSxMo)lF6g-Xi8w{S|*)G z7|Bs(@?+exj2;axQl3c64a}z?zCG^cDBiTZIp67!j_x+ebFL;u*#kX}Ej7>tFPl~G zXdL$e#W-X&v~aGyw5{#RB#@DshQXU9=VF*2PS*<ykNw!5<Wk(huqy(j7#A+!p7UVZ zIN;3D4{wk%1lNQsZ<dLi92*}(D)+jiGbMpt1U+0NWORT_n7)0}p0AqskLpd+JKd!M zO$f?F+Uex>5-r+0AFx(D)K!RcSA^DsQ=@H89346`xkTve<gOBm8afPh%|-9qt}bbb zW{`m3J0z<|gV_U-f$zOOTRKeUok8Gtku?tK#<8SA<oVN6sUjz34`%&=pMeSDP+&qv z9^&`=qv_uURbIE6h#sxJAv5CilB{23!`CBQkBbB7fVXnaCY(PU7xCo)G^RtA!D`lO z`+WeAenkZYgS&XNaf4hN=s|6EPQ25hnw*Q``ST-Gi2p>8^b!E#i}Mc;=}H2tJQM<K zkS`F^*B1$T?H_nBz(sKzWLNk=SBkW>rx1z+6IAX&S+WC)PcD{ZTet0fRBLkr(4B~E z9USW%alPgl8SfUeXr0H|i`klJ++$)LnK8>@aCraa)aApm(12!0)0fo`1C)Gyo4xG% z=^xB-f#1)HLuW)>L{Wo`5JE*<?La_&M|bKmIkhL-w@5y58^XP?rV5sL=jEfI(vR%e zGk<GPNzC<9S7>bOB$GaudW<~v@O#bU+id1f`>{UQhpz^$L{q>zQ*uvL(&A$2j2&~H zSuF%OeQ28~os-mp57DD{Ga=ExZM&BLJKRoY@3{y2m2Li>)dNE@01QdB(>upcs2pWi z{-C8j7J30XdA;RK4Dup?9gs{ze^dN;V87)^eaQO#|El{6uqw88|DmM2q#Kkj0ci;d z3B^D`iKCzh0)liJfOKpc1Q8Gs5TqNFQVbNZKnVe9>DZf@z5i>Yp6hq+`QqIF(d(V( zS<gE&d(B$EH&(sto!OR0J_@a83Q<VU^-J6~%|gZI``16qkZfnyRG!W_5MwQVW|ZeZ zpe%`j{Q#X*wU3J2mIDJHlo<_7Nx-hzQkM3&RaC+rh@mf!Zej;?M5WJX$X_Zb%i+b$ zMl?}rTL1>cyX;ij*B)VT?3Hhaig2W9jUP^rABtlgq~#27c5hnxTyeE$^8kD}gi4s2 zJgD`~M&MyX@yC6T7NjJCHyAUG;>^j2M<O9FZa}Sy`>3n@aHPZW1r6ufn?4AS(1~d= zNeGFGikz_6$Kcu0#pXQ9)-1LpXxn#<_w1Z+heSv8Gur8Fr?veN8HT#+c8jj`LG^J| zg3XUMWa4&gZua!o?u0Z$Ay)-<+m>tb2YjHo4+J)E^|Qxp=w!zTZoFi;m7v_)!K|9x z#q^ToM(BP{NdJlVX7p7lg2Em-lC&k`y}zl;)Sdb`Xf^A~HxL#X3cj21rKlMZkCn<I zjc`+OT1b$BN%x5g)z!=<n)SwbxFheholeJ|<0+}`Iyr3tr(VG$8Zp7HRN3<Z0!xFB zCi1e3dL1<hD?)^tFRs4BemoE)6<)q#`nHh*;*}?O4mO%r<M%T`#Qic0yw}$_9&5zN z9|<atRBg!K-^%(ydx@sVw6pHbz?8^Zo^hB>lKa!))86ls)yMoynoW`(0sSd5!(K8L z=X3}(MLIXQu8OnF-w{C*K<%2XRj};AoUpB;&(m3f(=sZnO4U7VafQTn64d(<+Ju~^ zX-<PrJPV}&Pg9&h24oNd-kQbe3$Q|s(~Vi()*&9d4_y;#VV!0DO%Mux<VE{2e$;80 zgEafl+F@W_YPjO%tr#`Qf{%1OMFg_LB*1(hfKOR~5(pvXSMwG98*M&iTONm!q|lK~ z{y6%PDM!=Tb*{ws=i2YU##!C5A!)-Ir01$cR?GThDSC25FezLh`~!Dqu_fV<mH-X( zHqgE*`zUhD&~(}TZO`hu)WO{N7^Z9MCri)wL{Wv+yCnE3rSPOfU6|;8MbG95nIM}< z%lRP$3-19^jitb<ut~`CL%dU?BFF>2;!mt^G?%yBF%TI^5<I}e|8Y|5oPufj3A5r) z75$SRZ#WH@Z&a~%Rt((m&kDoASsKK_STNWJ<biplji~AJR!+0G(4k^gjaLO_)^{{s zXXL9F%*l>bpkm!O4jW{nZ}`JQN*E`p!Y;v$M=MgH6a+VeKnNa>gAPG3iG#I;c6}{- zLd)AcI6)(;XoMXS!*b28`55Fk?z=f&xZ$%9*q*Y<H3!o{p(*$#$;<@7ELQfnc~oHj zvaJI}YSTU88dsGR%Z8cSS5M4LHa7bYn2xPcc$*35_K3Zqp7Wo6hiPsawpPIv$F}V} zbDjW{LWys7qPw77QaZOU=wrP}9K@NzFg)R?H?$4G3E2d#cVISDjZ1`A0(q%g&GNv_ zjJfyv4eg3Hyt*k*u0aRM028rC=peH4tw%+3at=+LpCf&qO6757>bG&t(%vS?c&ZjN zUr{+JKlIw3zk1EUXH;!^5WSCGYK)nvl~==&j#sAk;Y91+im(EL3#`2e?UE-_+OB46 zxp)sRn?hcwH6i=Ld9gUyE^B;}$(pa>4$?*jiLdRYa!_8a^z~HFYnE-IKGhfUh>D#i zb*NhPX!aF!;MIcVNgU{qHr1V&CyZ3qQMIG?Ij^MJ!{xx{{R=RApAw+vfG#~+ma{y$ zyK5=Hb2Cj`18n`CPr<acZKCtIcL+(>*?P9YB}2;ddoig*#`-<yO9#f@JkZ@yqNkPO zn0BF=dc!2HKh)!@=QQ;l@Lik@hb4a`l0TEGf4j$|7K4cIY8=3L?}i|=mg_=6jbY*~ zwqTcchTLsa&cQ8ULEUyxeqwb#z;wnE?cIEK_OMC;4FNPxn(F#V&h?Op(!kAXa$}B* zy-)Ub4X}g@#YXlBnuJskG=M2zKwb_h#AQU!=hB?7D{AE|*s?CvlDLntCs2`Vb`bHa z%~~gTd};hKrbFd@ydr@mc%|p!NA!L!E9+)|g<)Q0VZW<;OP-3$vGSP5h~Ib}qkgZ_ z;<Uk9`N8Rw_Q~Eb(k1Qs5&USAKmh3lu!~NpEIMY=R8_zA_q|F2VO{CkTpkM3hsR6a z6%;MxV_tF!obJMeaYF-g5k^KD^Bdz=Z<Jn*Y2+L@eY5;39FVs0nbz}MX;^_=jCw`9 z95-%<|Ct78KgYG)jlCwHgPHrn&bd9I_ffIi@q4|PixWu}mM@_8XR736Jg4f0Z6@JY zhQ_zFS*;)3RriCbp~Z*0TQcP|+GheM>FuqWF7F<aF;Hu6$~N}%z}!|fuU4EcBMovr z=ORJ5l*!JJEf>A?cv?>LDbewkU7TxVT*bo@3;FGF0s5>vw?`hFg_=2PO$L79+$!Zp zp|0G={8q4*`ue38l{~^?ROk34%K7sj#xT35ns#;DZn0|j`s~GO(?DDz3z{D`@|w*X zPY<}dpO<1?44xJDT-FsYJyN5s)pO8i9eJQRlpQlz-cS0OyW{mf)dgpvcF&Sm+$!@< z%+^lM?CG>q55ayNMt{byO74i!a5xW|-~T*gSyB6w3tTtpZ9bjgV2Z1~V(giBjbE2h zr#LS?Ld-x9B6M1*K=E0VY9z92#=T6Dd*|;=Ip;4fT+zeCw|jXY3N`)YtnQhx!qKa! z&Ot<g;@<FRsY1ZcJ={?WWQFFGA~nZUj4gGDgr;Z5cPO!#4R33^x%5)zSm!5lOB0k~ ziZ*xGquDYwY3Sg+qHAu~PRYm2m5c4NkUuc^a(8dc(Qt3_I@!;POYJv8%i{}p`X*x< zMOm2^1)G}v?cWNwUuf2OGy5o`bYR6Vnrc8^U<SU*bh+Jpz7BcoK{weH({o1bgl|S! zuU|*OfC=rhF!xcsSqmb(fzDyOBs-7lT*@fdIg&kmcCxyzK8Z8EYLkMi1g?F(Y@gtk zz;r8-?b)k&lwTMp^!8<!LZEDFd4{w^L#og_jEw`2(w2_iMb&<&m50Dmqj=fTg8}E# z#;9t-*0h7xC(12c;pP4`=?7=QcbYT_4Cb+J(SCCyZquKznv?-*o<}K-W%#bdk7~DV z&R45%jBXqO`}u(cwEGyPjdk&zH^qRf<<;zmj#&kcMjFFY;44rcAfYK@tH$R`0S6){ z9bToC*qZf>fCv>5{-&9G<jSZ9#^OMtz^ONyC0U_7zQh`<o-Z|~ppn>j#{yHhKezR8 z`S?65sXP8bF#vt3d0!a$Y<Ld&yayt;5~GfKdG<Fr3?eQSop4SxYc#BOzdlp41D%g~ z&4=~vqyo$Dr+FaSM3}R|NUwj7#UM|cVp-~0YOQB6E3rdsU6D6<hBp%Wa}&*Tx<oa) zmiOky5(MWrds63e?8(k=E?p<3(n#zGeNdGo>)ayF-NIa>Ms9pgWgHgs{uKT3QX9)1 z%)1=Fi2Gm`LM2z&<&u3bFW?66hO$I)(!<+@d6(#&f*#WZjUD22g2)(Hj=xfDQ)Jjb z<JcFL?bE%dx_Q;oC6YH<QN#G0{wX>uGuj}96Z0eYhdZg?Q0ht%++R-+i=hznvVc#x zkG%*|IUNg}D#G}%(0&UR52q$Gidmw!6~z8~o<wLZH>97e*|?ldRG*FRDHXFR(b^j* zODnQg$wu4a(9>b$Vu^hu@$TLXt+^R3H{BK|r|APG<(PT3vbF4Lv+#m;>kx-VZLsY@ z#h4%HHEEQw>Yw^XY)^PnS!uyJbMxS7;@8F4^pzbUOGZmE>jPnS6<H-Noc`pw7)m+! z9=^vuaG>6h&D+}>SU&ML)K31RO$SdTh1_kSmD;Gaa3SHHE2~uJJ<q-#NgF1LI|wYf zO%rog?BnzH^1+**hRNe=h@VOiMpzu0-<7>Y+S^-Hbfa`-O-Hye?1|@tDPdG;-GfWx z69%fBX7V$E?dMHLle8HfrhL3Fb`5<R9|_X;Su1~Wo;ui}Wb;XNlQ!&et^YC*mDX>4 zdy)Q<zA>hZLjB>GH#NtrQw=SSxVk;NNf;bNaJVYvvG;oO^s~vevB?)%!6j0~G#x5e z`@=U*nx1`~`Jydh*fvt9W*=JVnt6l%OA~XIhT`jir=~g;J0^GSEw=962?BsZ<NAZ% zn`wD0aqz7;6COB8dpni%vEyuJcg@O6-!ggVyw_@#&l*NJLn`B=2tl8vs?htln9J=v zcbSH=vSN&>R?^0gFle@pHdO`Z3@13h6F+k|K4#yCmaz9__CfeJ8Tt4@MEb<I1#3g{ z=1sfDUL&Y1l1`4UOd4S&+D_VC`o6Tv%l3`3r>a-#oD@;gNq%$i%FL>SMztx|dCJfn z@38!4$IJj~rBPxluGZmZ%CKsR(R+;9j#OL$B%oUj4PJfTaO+Z@U2@U5?Dgi@;HBhv zCK<QNlEI4iQ;iU>>*{V7GSZYew_F<T23`B^dk5^_XYsrqqiD`C9DRoS05&SRXEN!0 z#mLtp=+56Tsmsu*yHik;j<R)X!M{Spn^3smcTqRogxUD;nNuQ8_raTBhHO;@8Fz=H zM9@94OIPRzZTw9p_Hg+yT3s(Kc^5ew$s0C|!l20;t|A*|+y@52Hmc7q+1+m;X_(<d zXb+SqqMnwB#19FpXZTdm4V&tJz<XH)*NXCW>$=O?k~!=;aluiR=D{j=LvHc+O&xgY zLl~Uh{Uk=+`N6XswZrXgG65~xu}9FiGkr*h>Dt%Q>ItAh^!rkIM<x_%Gl({8R4B!* z^hAs|C8<gHEuF~C(}t{5Vibj7Dkx2MMwA4^2__x2D$c9wPx!dQJbbVuL0{s*ke8g* zhi*;q!GPNQ0hMKYB&M-3&mvrQx9N<YQ!E;3_WzWny|m%^i0UcpVk)9cNqv(!_C)O1 z?K9@bXGpsHU6_LQU1-DPU+WhEPIbCRUYq;o3uYfDcy-q{9+_M{BK=$Y8T4MOC&7V4 z!DNEXvUi&t9y$0f)};9dq8=BxA6z(<`!SL?$vlE4rujjENr%eqGjIBcj)cmgR}Xj( zlqB?jK54=o!<0XiY}<sr4m?KBQL7(pF57uM^{lcGeN<1<crolK`|g6uL9fn*!WpS^ z3Xjyf++r?%zPJ=K*lW`t)TjT#<+-h{T@7ExRg9vUiw094D&??``&+}2;^-^=F2ToV z+aGr#AF~d=;+Y1D_ero=$&!8bv6;hcBbTXaGNM@JaQlO#6L+wmA%b9zIZ~MbROb@} zZDwVZ&FIU!_AK!fs$n5z-VF-4)9q2H4P92`$6~2gId6@<IOIuIqHun<SF6!G?f6iE z<vyn5xfntqr{FV!xbB9C-5ECuD>1~L0TwKJ-Mi*ftvHBU%4m1IPelm@9&Wn7W<0^I zI3BgB5cndw2x@<>K9L$urdKvcd_+xR{(bIppK%z)vL+vOD(EwKr@KmvdduBp@`eok zBNQLbSsCgo9O|A9vg7GmT_IOHAu#Qc(6A)jcvlUytXajGGG*2UszXC33qIbUscz0V zL}A!9o43lL<S0e+S@<;+ll_h&DM-m)C`|tPwi8XGzD$XOO|k3tqb}R<AbpGSV|C6t zT09$}TT~GAwyj5?dhcx)<z<DmQ4YbYsm)XNle821i`*#RT7lABleA|4ysQV>3pW!& zwfS{V(8mmMCxKB~!$8BgOG$60i1%{JW$-b)-HlQFEIZ%K9w_vC_Ib9%yDJ5g*_p8< zyy$v87UgG@8*^R5sc&5s{#2rUZgTQ8#y(0h?IYKmW1q#12c3Mu&n1iB#AO5;>sZi) zL}}E6_7xas(NL*hd93Gf46H5DUK01nBQ7z&clM~u^JxyK(yR69#)ymKbH(xT+c$e( zH>XQAiL1ZFuG<no_t<PKH9ENUl&=eLgt&1RTyLP)W8d{IfzCR3oHo*H{~rA8^0&vP z3ePTvG+U9O`Siz&-dUDb+$&g)Y>t{=?DIyZRc_0ObgkDN<1x$5q#~CbvUT988pv>? zdHJUQ!eZzPG>c98B}$V!U1R0BE{d8CD7p(h*V+`M!1mP5STOp#7Zy#A*(7lAp+z#L zTUA-^Xm5S4APiPid2-tK`S^j#gu#JvgMcKtDok(9hQm(fC0UP(m3LPkR1xhp?mlX{ zsHk3$)IePmbmOE)LT2aTWy;aAXOv(ITZ#03n`tCDYPVL6=!JmJh;AR@S!yGO@ii}d z__OrL(Rp-|pK5?ek~E*XoNr`)v&ON(<#}X8R(oP>HnDrq>IRvApF^-QLzgMxyJKT@ z+yy5GJ<;g?`&vP?eALt-kSk5MYQPibLyDfHwWoz@?c$kh&Znj&^?~3$;X;vJLo&>M z_Kltq*PhI%3$`2taRx54q(}YQz!yu~t|z?77b&p3*h5r{Siq-BKjv(VUZx2jJ3G^s z@PQJ)JPxUiEOo9FbL&|0vNVKcl<d`a<~=PB3Am?|?LVk8f8$Z~USnK<$(Ws#MqV@d zyl#oV$WRW=v`4f5kV}F76@<C!<Dud96B!|{Jk0mydcv6fPJ<xBsgVAKA+=$qjdK@? zc1~IBo*+){5gfQM`FWgmL3&Ij=FJ^}X`z*=;)T(${;r_?1C!c*zyjqwM2GIfA-jvx zFP@7$_M4)nV=PN$kJ}Bk<sOb$Cd>-0gEyFdbL(qhKa0L$;OYF-#V0;Fa#)lUdTVbr zyjQnsk=?`fq{h3Mg5~PX9JNuY4^ncO?2ty}m1nU5gErl&S0;Vp8+SLHeONa1_7)wa z9M|k(E2!cFPb6QkE=j6q&UDKa(k)@-XSBB|VEw%Cwm&z(;vQRF(mJDW?f&87LH)Aa z*jF$Oxmp|F64JFUyg=5ME*7Gv0Ya*-w2afa21j}+9DMqY19VHq!03ny3x=%=-aqZS zDbT`GYJb(S=;mF$o7|IiC%uTE<yxcNhwHi+tP3pEpkSX1m(kw!&T)@W3oqm{q1G7n zH%geHhp&C1R<Sd7*7PTQXG>7e3L`xaOJ-K9DC{PNmPNN#scTF<`rIxjuF{unlpHrF zAHF?#JSc7s^=60nyw}v@g5~r&KZ&vulvSi;VSrxto-@%(D?!>_sexPmwyL+DQ$)r% z=<#&rTri9@HmkSP^+48LmrcM%XK=s3lP5<iKQ(PiJ3kO92cP{jEUKt!VTANs1WIke zFnvMRD)9L@>OIPo*r9QrA*dG8+!3SB_@0#t65(CS7Lc%}yH~+DD^P#3I>I#5D0Dqg z|1>+K)c@u+T}cdchke^?+%DQhD99va!1}zPMnUJLi#ORiCoKY;o1UEyR5p;DTq;O6 zSZq{F-b{9xr7b!g+sN{sW{&wmhe|!0pXpe8fEE!%T*9*a)Y5jzM4!vSh)A=qbm+t> zGv`vl3#Y^+EH1~6nMs?{kKdZez^GSkyglua&6XvH-U&rrHLa*$@GZFL?Lwxqw4?vo z^GQiH1x+#A<p?h#it6+EipR|^bj7#nM4x?l-;&QGUxpkKek^kI$lNZU5W7g)E5oHV z`aQR=AAR7A_1C6d77CQM&zMJydhfu><OCVUerDN@Yq?f__j2Ha4KZ(N+~}D7c1xgY zQT_LnuP`c%ykCnkDGkRt%yNWa8@1W%<b?@t&V!&Wmcy6GnP9uJ*Dg%SspJ(+oV|ng zp^D`G`<6^b#>e0Q@F{_bNqMV}q9-Q23zmL+%s1cur2p~DvxodpF~y!C{SAxfZ@4)W z^q*JM9k<Of;i1eA)IXamLjqaxv@px2+&S+24s&&L1&j+)6}QS0qqMCL72Ngii&vbb zeShu7u!V~%tZM%RwV9ZL(Oz!E)(@tfSq&1{<Z^QL7&16VRCIrmp7*uF#k*k7KP(e` zyn-*<pZzd&lNZg!l_nvd*PQ3IZ@Gug&^(e%v7ygO&h#<4M)&N)C%IL|B39xL2Ks0H z92$j1r4v1yTb^$a+7{bd4(}<cn|VCG&}XIk(1dT*)3C1L4%t&4WsKI0Kr|a<lUB&% zx8X66T=UzO@|?vkf%0pdcD=rhD7ZdQWO8G|QF<?|W!DsMnf$ct?I4$H8xe%|8yLY+ z`EjkWG@cZzv@rJcZBj~CGTumiK4N=LDo?#H6@u1QC4|zh?crmn_{@8t+4QYj^`$kz zh=*~Wl?51g;3eLwi(2|Td#Q-+zQog~YKp^Q!?W)+F6Gx7p;NKA;h{QQ=f$HJ;Y^i= zz!AZ`#F6U6Bh<_-2g9}E&Y6W!>?(~|HtUum%i%xBcZY&laFZT;jsKeA7SZ+LZYli$ zh@1g<sxkyUvts7o`XscMdRHub@Okg9<h5?gSRh(BcB%*C&tK|guQ!wy{&^!)WkYp_ zWM6s(!>7!sMRFQ+qpngGq55UItOq<3lGR(>VvqC2NO-H^Af%Utzaoh`@bITO>rTl9 zHM%%+v4%16K&A$GynLPF1jGghAIdDZ<hZ8Tfz^&Afj&-$7quvguE6H)q)NMP$rA`G zit&WbEQ>89$FKw!Y6LX9jBV9p`a)|sPJ715462>x4wWQ2>G?qQ&`ICH{Q1`m-rZ0V z;mxOOrz5i!o~ipuSoV2It%<-)^<n;*1RHTZwN?IUlUw#02hp|fN*=3pFHavQaOLtt zhD56KZu*J&E>au$sPN8T2#&)jRb#4Odx}Z+j-EvBzNfm6xu-?@I-5eAeN}>bX8LZ^ z=-nGBv7sFVN>SWAgd9<)NhWRO%^$M9nh|?aFh<O4GKc<{`ysV%%PMkpmv3R$nIl0D zE){UQJ@KvH*`CZ(%#$+x@i*aWcxfb7WubO|#?Z3q_>Jc)pRQzjTz~r;yBpobV=-)Y zBm0)LX#`00T+Ki4Z&)bpJ#i@uYHX}XQDjm$oQM&;z2qo6j3c(0;Xd=(eFeUAknnDI zYiYe|z}Yoz>5IbRigMF*=FS&de6k`@US^bAyFcE_?Be59y8b%L{&sl6bh_mRHq8f4 zzC9=El^nwWndhRcgWM{j?p~Pl$xc?YmT4-atrI~G6&{OL{9He_yjB!a%b7L3e!fF# zxH_kcOQl9AsO8vxUXvm6)H;5@h!F~pxObGDSn7%u#?1puJDBW3ro;)};=E}|y&ks~ zENGd|(5EeETzB%TOAV9GjwSNReC74IrKn?}*YknnnfWRcDE+8!@6@f0j<+j!lz7jc zdA*R}-O1Z7v-*&-Of2P<M}VEsG#SBlqSH9oo5#r_2z<J=^hquD{`7$l3(9Mu&nLY2 z8uOhvUz~o?&6z#>O!3(3S1xCmh7wIU7m`bb7lW0qu`OBBT<2L#9<_n|%Ev6?%^jGz z_#nv_q-L`<-4p&agh8ZetY>Ltecf@oH!Vjfr!FQB+kJk8@_PToQ2m{kI7_g7h4I~^ z)A3%DG94mzEV7a~N|A?TBE2u?bSpTP=bN*;2l$o<HKi8jIyR2+lufBgB;!<eVrchw zTp<l4$VouSSVtdlml&TDCtj;O0?k+pT^*jFGku(O^<y+l;&dtDKpk5eVlJO(?yx7E z1!6~rFjH>pW1(=DG?_Yhl}NzuigSh+7clihd!N6F<#6()ocFLaOX+F4cx&tvM)L6^ zx974aNgf*LsPGqfbgw)lNPT{))0(JhR_bV?UEFbkn-x7CZL9rZb)5bgxi$rb;|r8- zioR-=>#g-W)6P9+_glGTxf}YhJl0j%S+H}7I;GmNObJRFQe8hI%HCO2iPE8f7J__F zrKSZOpZlcH^Ww14%d@JY+Ly-mKbuIQ%^X~CTeGacJskC+bd4bCfmN`)k$Y<&@ukEl zHo-{krUv_-nk{b82!VJ)&7h!}9BDs<E$T|CZ}sxNS#yQkd^(P~O75keb|q<(D(QqT z&Nb*>)HFRxJR-jHy~qlz9V|~C*dy<pDmisH(5@;@iC_`8cwetE5xH)+a#b=<q&1mW zlx1vZ;9{dvOwb|nXl7dj-J$(@E)jzln8TF>)^QrLQ>NVx^CYvhsgv(5@@^GNGKfG) zlM8;_)XuUF@Db$;)wKiu3fI#gt56bEkUUfPus^q>IzC)4ErL#DVKL5$MtWs$)FS)S zXQ$pUoa#O=c#&`f_lfAVTknU?#SfihYtfQwV%+`ihjp!LEGB2dx;Y-oZ+=|ga`HJD zqoip>+BAa6sJ~rW><OwJUBFPvE~{S6OqSs(cqv`%)Eo$N)ff)tC?#u568gk>Ur*H| za}}qW%WwXWCN|$}9<gj9XaY@bAUMWdeW^>s4z<{@i;uCjJ2WDzyd;}uo81ppuivUF zwY9eA%(|SpV`Y~C-$lY!skJwpE}@;J%&d^p>Y)3nK%zJNnWf!N@;LWAv@v132|^=H zGO{P+=9@Jl+*Cjf0}}-8(Ms)W1r$lT^h0NEEAA@C8NH0QeHt8Meffes^|8dfIB$a5 z!|%lf-;&LYDg_RE45bm!O1ZYOwv+5NB<^~$Gwc1GqrQp6xr7JL-iPEV-L+IVZxCO1 z?9n?j(&D@`1~R{=c|W0p^yXcVOR(ZLiH*UW`fJwB-IDF65~7RYW>F3lmFMwKm@Qj( z=XTZUTU*RR=sQsBtxF$#LwG43bu5_%=bYA2)jy;}cUken;cojy)`R^8uwg;jZQ_w* zv{d)id(PIBk)BLa+xxCo_&3*d8D)OC;0K?1K7|eje26G#D0U!d-QV2o(Q)ODxIIo) zn)^)54(dJ<{XQnMK$`4V4>JwVmJ5TTn0;omkDIe*hM%Is+1<y8T%UTyG)QD|)%pZw z@os{1!VB`fJNTc|ucUIi?x3czEFZH<fBtc!BE=)Cw3tNM407h;Y+r+KV0P4@)uZ^9 z19_E+13g;jcAHjhVVLrhE;T~(ZQdWSyN*HTjzL;OnfxE=i7v6fG<kUMJxLX&+aebX zr_K5z(42*n`!RJ@mpI&m<^blauACGd{QgW@)KiCE^K%J62i~kYYAF1su*1H6B0FKe z!r6zGK2}R+XM6Ui^7&?NT?dgH63{(EQ+*#|b@AjNO&WHHsOv!i!%)WV!dK?6mBX2X zg`5LVzd-plljd;7X%qDssfIt*3!dI}4NJa)>NRR8-FN61CFm@dTv%U>C2w4*efKGo z)73EM-Pz!F%oy`^n97rR*&@vP5Q}~$^p+LlbMchAIYn`DLyzRX0`X5l$@I@3>*>)? z?`c#BGNN=7?JhAWhQv*V2v|E@&<RdFXDLNq<mSXZ&6lK+bkxbd)u<NE7#tE7EZZQ$ z_Br@@eow90`*WMnwNJy|0iOEBfiFJ0A5DB^@{u?gj4)j+8i_%zhusLef?f5Cal0&1 zubrQuz&3g}eV8oVWx(r0xM-%q*s+2*pxNRny-EDvld8H?duiW%=^wF-Ln#s5WK~2W z$(L=sqa<Q>E<vuo&N@7+ySwL6ngq3uv9<8Zvhz+EKNHW8MRA?;Xy%D^127hs1#;}{ z9(&ch_daI8&iqjFJ^&_&a`r80q~FcE9-GW|KA<r%>DIZ!tV%tS1`80EAo!CF$UxUb z=bo0$m0jQ*{Cfvv0}}o(I{v2zRVE@y>VyRwng2HrmNcY+35C5yheEjiFLJ<=inIV8 za4c!q5&9JDu^nFjw{)?MKNaA|r!)j+N=9;NVql*CE4l!3Z`sEFI}cbKa~d*En+V&G z-NKUm>U?mdZsq+0{@?ikx<Dbtpk46($~+j=!z_w-;4b#mtuHq84gVK=!ncc03@NY; zsXy||>O!pq%c)xl_X^#>;8;@NKjQ;tN=5F|MI$1=sxH)WwuBB;!vl&17#w>t;NyEe zZ0iDxZ{Jh&Nr(ff@2}Y|bSk!FjBAmPdgWU<;Y>7+CHbG~qKY;d!4ILo+@X6PRx_?a zW{qoLoDyCaNq~=(ul?)yI!VJ$GoTPha$hvruf~LaHLMHtu#D$n|9zl~^i3Rd;-9r| zES5P1X{1ZSijgKD1ium=dez85lUigI&%?GZZliH*D8R=b+xM5Tdx1Uy>qeP`kpD_N z=u{%7P3n;KZ#?V=?Lq{vi-bRI-&ip2HG*~_O_qlJC3K<Ofe`AKA+ErdFyDB<Q{_9L zT_kMan3Mj{zQ5{%Ar<RKb{R|gE9gR}940cVK>`5}Ti^4bU$KST1$4m_|0nGm@WGsl zbkZdwd#GZ5zAmWJv4r#~h!I07auT1|Zy?r+MR32-*S7FIAIf(?yNKJsF(v-Nrqb}^ z1$L1!5eXpAz=B=ipLZ~&Av=IAzXanI@_R}}uu`{S+@JBFhu1|K;30PNzmMN(2o{Xp zoiwqC;?LrMIei;{?|&PELH{pP@TEWcUI*XKw{;P_j$`_7?Hh|@OhJS1mi?ULU*X5| zw5RZ&^MG#`q8UIJ(ciUiU`vc?8$S&{eKL@L3ewArpFez;@cqs9I0nWtr9#a1xbRK( zf268+K_3Nl!59Z@3h>OB`t$J9My?Tap*HLIlQ*&aNgFtP;)-9#amL}(+BU^ss{xFE z#QpuXK_$Gc3&yB*9DU5%Pm@31N)5_kTEp5cAJA{ke2?jm=LS_UP8ZBE{&@fUYt<sq zH-#?V{yEnFkF{tP!a|_W$p>=@4B+J-aN_$S?o80vN3Y|gvp0YL&E#7@TZgO})go1f zH5hBrbTsQfmi+UsG^-H8{r3<Zfd2{L1N%+3M%6Hm6^vC3k?T0I%#CgQ`oL!P7Q;A^ zTL_jn8%f}dhe>}P(tlmkzA_Befg0G^xDNRQ_}Cr`I5NKAmjd#~uNyc(8)5o3S4~5< zm{PHU<Vjefe_is={nexr<^^-?44{v7E?_@+`OD{`x8<*nxAmwsFgN---v&I;rC`qy zx*~)>7v;aNO{W%7<;+CJ@%R<<zu?E)mexHCjt%sk%*ns68PIe|h$CqX_Lt&;A{t8! z<`->v{3?Z*mG9fP*1fH-Jbay_reQaMFUE>I;^)uj{;4J+v4qU2*dm4~^cGLjnxSD0 z91q&X3chXN^`H&(z>$F0!|(I#HTn$X*gq}rXa5k0B>?R+58%g8g)MKd=MPk3<iLEp z9_Rwb^MGG}a-ufAo7Z7i=~0OJ&xZQX>SM~lCIS3t>aZ2|Z+X=2A*6bhm=l19cX(ak z$2YFT@8+gy$UH+btp6?l|0ZQhK|<&wHfE_q)|vi@L#qL1HmpXjfi>tNzHjAC{cf!T zc%Vx}_WtpipMA}g2>a1TZjMrgtb$jJ|NPLaL`1<jTngqIXufYeqys;33gZ0dPyD>Q z3`wvZ!2gow+S<QdV;S7T66sfO8Sk%xdj&GV7=d47{tEb0U<>-F%@#7>x&O$&t6GoH z=~r&~2xr6dzXE<56rw{Pjjkr~UiwRO1kHP!f{Y0pdw!m!{8vp13JMfbQc~MK9-2^O z4}Hugc%%Hw!Ozc6Dj^~9OO3PNu;D4dO)DoSr^w04xos~D39vYA#0L1^F9_n`;2;td z6eO3Ckx>;80AG~(1rH#53o$V<CV)|aot>S4I(kch_WHU%9x9MK`JO#{<iT&+va+%g zzZ!gLX=!>zMa2sMn-S0h8{k8XGIEQDHf;Sg4-XG1xD)}pIRbu@0r|kEKYy(Q$X*yE zHz4D)^78Tkrj!6h5Qc|3Z2bftDY$P2bRYwG&{I-UiU9igrP=|IsW3?XfCn#NBTAy+ zqX<+HTPif+o6*GQUlIbIOu&69koJRoAuKE`zZ8C8KMVj@0+8=nAm_b++VC1BlMr9u zA_kbbz_lsh!B$dIQUT=q<?IJ<BLHIvz^(;!a9vznTngZ{0(Nr-v<U-%TM?YwgFLQ) z%HZ?=Y6rl~0x)L*{HlNk0BQ$heiGQb55W8z;Ncj+@4>{x^h@@iczFW60swas!0CXu zb#QG4&JTin;o#f}w2S{}F7dyq8$LchQh<Fg(19~Z9zgadf$TZ{ZcI2095{xHa6Dfr z=~qhhl|tWW5I6z(Af7KYnDz^8#b*TfM+m-9@S4N+^(H<exDP`hBcNCaWZb48BcM14 zWCU~*f;7HTp8tfx5GeS|^IvH2mvV3;U&;Xmez}hY731?^A<}=ObVS?NxSa%FC^z(l z@&tdStzYTlR|;=av>a}mF7bV#i(e_8aeO@^yk9Ah*!K0;`-^{|n_uLBgSX{^UzGBK zqzTerjnksbK-6fiV*l6teqfCd3=)XHz#av0Nk4roVNJsZ<Nb@ke~txlMR%y;;osND zK%77PU{8hJ@xFV2W82ROWHHT<j95~~{v26=*cggEx8Z8`v@iY_JPv>X3--54s6!FX zA1(k;fl3ujt5X8E31<Oc9Ed~MmIaUr*xQ?9OhIfxEXWVH3!Ta>77&~AVlUWpVNdzu z6Wq3oFMD$pbn)099&ZNrLb!lmX+XaM2C*ez{fzgC0o!E#B8z!O6mpg#{>S=>_g5i; zzz;Eo_iOD1d*EzI00-Vaw=v+`2(}LF-wXUmyU?mYq<~*)J3a+33lR`!^Uc@%6~_YD ze|HA^?|=IkjE_s8O2ZLqlp*Q>!*+ZLUKaRx0Jg+`@GaqE_*&=_{@!>iuqS^R=zJWX z__B}<{N5A5fy4Xgwq=2jtw8;QPL}D@k&9IB$lnrQ3+j#g(iee#0KC4%pN-%^yV$P( zo6mMz774&t_|-naGg~ytOMi<^0RH2)<J(ez?Sq8(3k!mN0lyCfVwSdX7}vr${J!C? zjIXf`si6L}`M;%p;WV_ROb&Wk`X(ADabpuF{xzwBe!&FPi<iN-gtrU)eYW_GEvhRs ze@p%NcBNCY#Rv9~ia<RGzK(Bl-*s~fC!6zS4-bz8*aa4(!Tl9mA(WTq{?=F&^$IM3 zK{>J?;ONEIkKaec>sugcecRtH4dNVlvygT6RPY~?KkzW9hRF_8BW|Gnc`#PuL{c}t z?4g0!oNYS+K3<vxEIv&AhaM_52<Ofe_|xxukf2}U27BK4@e0`N6!6hW{YU^rQD7e> z34Y3(yiox9=f`-R;M)LiGTvvujo~9*`rq3Z{gEH0q^%a(@C^sO@{JvaRq$D0dy|0T z`0@Vg)NKr-bkQ*1AD{cXu7Mx@KJWu=`%&;^?yEvGAE-eR0ftS%jIS8dkaxi6|3l_* zj3_vlCS+CbkNoIYBeI~6YzDEpSkM;&pEnkK(E9H`7?Y3$>MKife^#<a^%jv%4Q#n9 z2Ob4JYlA<_^Z$E~E*1%<3|{8{SLNtdZqfmt^Ui;j=db(*{2-*jr^5~Wt^^DTTP{@B zR#+Jr7zn|=A7*FY;{$8vZ9l1qhzK2R6#6K=V>>;-!~xdT8o&=A_I=(TaSqn)HlUvU zVBIcF9g5bab?Tx8K1Dfj?-1}uSp0}Ozb_Nie*ySBjsl)FsYAB(DZO4Z13#29sM`e4 zAHK&4>aYRH8tD4~z@i1})dJ_n;GPx0^~3$wz~4*(>h%V8a0<x$2&nTI9uL6r+xK$% zk>`M4{C<Nuz~Bgy6R2Mk_@Dl=?+gvRE1STxvZ(<Q@EmNC;&3qVEMW2e8Q}TA1@qu= zt>9)ba4!Udo8PBaa6JO<Z+?9Mi}%ssACd+Sse+^ql1BFL1>+0<J%P%As{-$*z;A%^ zg7lyGDVWj`DaIu15s>|VbnHw;)V9Z^6r>2eQ}CC49AIrsD3cH0Vo%?G?`Q_}zZPIE z`j_Mm)|Djt%i(hT-0kZaSq5SQ{*n(4tjWm1IM<?lcMFG~1A%hpK}>=TSpWP-SQt|g zKJF~!%D(#uW_#Y81=bH=<_y&!=H=hM(+1`@`grW%#c!Ne*_XIV<*(~xrc`w7zf%sF zQ?r6KLn(*_#A=po;na%1#L@vQ>w+n3PXF%tZ@(K>A^Kn*_=YD1jZ*;cEwH5{kHFmT zU+zhNd-fZZC`L%RQ!%f>dSXcgyh{Vd%4RTcqWJdve?l4JFwtPn!C_bp=k30^g@7`u z!JGs9Df@qR(8r*E=NZgz)kJdO=b#LsfA=)#g9*VnKt>ydF$C@Z_xAw6m`e=C+<#j? z=(~1<u|t9;Xi^gNCrY3X<NJ4Ye*Zh@d*r}#2L+CXD1ko6_^&<>`cnM<kufL--=}MS yU-tLsJ-Fh1Z6LLRG!j(2Z;=Ni+W$&0ILDF}@52#+bh>ySEC&+Evz;`G_x(RM6s?W` diff --git a/Src/Plugins/DSP/sc_serv3/libcurl_building.txt b/Src/Plugins/DSP/sc_serv3/libcurl_building.txt deleted file mode 100644 index 2cd06c23..00000000 --- a/Src/Plugins/DSP/sc_serv3/libcurl_building.txt +++ /dev/null @@ -1,43 +0,0 @@ ------------------------------------------------------------------------------------------------------- - -OpenSSL -------- -Linux / BSD / Mac OS X / Raspbian - -./config no-ssl2 no-ssl3 no-unit-test no-shared - - -Windows - -Note: Use "Visual Studio 2008 Command Prompt" -build-openssl.bat build x86 static release -build-openssl.bat build x86 static debug - -Note: Use "Visual Studio 2008 x64 Win64 Command Prompt" -build-openssl.bat build x64 static release -build-openssl.bat build x64 static debug - -The generated lib files are created in build\openssl-x[86|64]-static-[release|debug]-vs2008\lib - ------------------------------------------------------------------------------------------------------- - -libcurl -------- -Need to ensure that --with-ssl is set to the correct version of openssl being used otherwise we'll have inconsistencies in the generated libraries :o( -(and not to use my folder path) - -Linux / BSD (SSL) - change the openssl path as needed - -./configure --with-ssl=/home/dro/Desktop/sc_serv3/openssl --disable-shared --disable-rtsp --disable-verbose --disable-dict --disable-file --disable-ftp --disable-gopher --disable-imap --disable-pop3 --disable-smtp --disable-telnet --disable-tftp --without-libidn --disable-smb --disable-dependency-tracking - - -Mac OS X (SSL) - change the openssl path as needed - -./configure --with-ssl=/Users/dro/Desktop/sc_serv3/openssl --disable-shared --disable-rtsp --disable-verbose --disable-dict --disable-file --disable-ftp --disable-gopher --disable-imap --disable-pop3 --disable-smtp --disable-telnet --disable-tftp --without-libidn --disable-ldap --disable-ldaps --disable-smb --disable-dependency-tracking - - -Raspbian (SSL) - change the openssl path as needed - -./configure --with-ssl=/home/pi/sc_serv3/openssl --disable-shared --disable-rtsp --disable-verbose --disable-dict --disable-file --disable-ftp --disable-gopher --disable-imap --disable-pop3 --disable-smtp --disable-telnet --disable-tftp --without-libidn --disable-ldap --disable-rtmp --disable-scp --disable-sftp --without-libssh2 --without-librtmp --disable-smb --disable-dependency-tracking - -Note: may also need to do 'apt-get install libcurl4-openssl-dev' first so that libcurl will see that there's a valid OpenSSL setup, otherwise HTTPS support will not build. diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv6/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv6/libexpat.a deleted file mode 100644 index 6ca029f7b8aab8ef6c5cd0619048249a1fcdaf6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476516 zcmeFae|%I|o&SID{D8?Y)(ZrU5%p41O*OWIMMW3aP|^x6tplVj)vTRBLcxY)8iJ*6 zbq5F}rD1m{&{7NSRN4Kq%G%VeyIsFlhZb$EUB%kgTC2{F+(J`oQLCa>`95D~?uCHV zb=}A3`}qFx&Es)$?ma)>=l$!v&-<KvX4>rb-eoKPI)1);>fekDX3n}`#;jS%_qcA- zWR3mry6>3r?srvdq~n%lEwrrIf&V{%gV4^Q|8W?1P0S)Jxn#jrsrKI0oxO`XS9kVV zdSBexcTxAUo{p8>SDW{0{>8nWonv0-_I9@SbzXJJC4ZE5>Eb_1G6@&0?d$CAZtuFN zyKiOR_0>kJt(fe~R(Dp@=B%FA-rdpF**mAV+CMoL_w;tIyt=!kwZ)VL!bP2ZYkIpc zUEJEcGShVuaLV?!wD+|K#V%}LU4{Asoqc1U7iT(`tz5pcvtv$QU+>DLYx+9p_N?iy zj-R6QPo~fB?&w?_G<Q)~=c>-`J|Dm!b#Y&NZ{L}-F6!<$bH>~i?Y-^Gz=)tdt-Vxl z&$7<dtHJ;L?$v$0YnJt`?CCzO%-o(;XMkjG2dypcJW~Y&<e$g~(m#>g(z(2SP1orI zKQ;BDwHXK(Af=^eS>N@U&X&$)U8jL=AbI6%0D0xi%eph-){ZI@ouTndd-~dit}|t| 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 J?LqfO|1YmbvOxd< diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv7/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/ARMv7/libexpat.a deleted file mode 100644 index 91505b28a112883e5e183630eb9dc5af55abce17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512028 zcmeFaeRy0)dH+3UUo3eol2t6XLI^k_0t5)MCI(DusGKOl0Tb3Q2_~qpvZcgsWN9PI z#k4M6OR}vbQoBy<#3VM^6kq)rYKkbKO=+NO5+Dr$3^+6mDeQ|6b`%F38X!Qx&*wYm z99a=gO8fM8UC$qnE|2G&dA;X;n|tn=GuyJHdvM+Qw<j)epZm9P(S?f^UbyH@i{Ik9 zDVsI(f7gBE!neHHuaQX@V^$bbd;k9*z(M4nANy~IIrr5W!kTw4|6sa%a8vK#%HB=A zLq_kbdWSCUUpLURq5oR@?&n`N*xNhf^^(Ef?xEffzWd$3mG)Z+SFEy0mu?yA9qjM! zyR?63!_bHQM*UW7_LZA@{j{Z<mUZ{{^z{xd9rXJr=dyvp-VN9GcdqWVWr1*I@6hJK z{wr3k9^8=aI|Ddn2Rplmy2D}@cW?5cen;=n%;#0v-gO(U+0fgwbZBUB!`jV5y_XDZ z?)S$}(aX=IU*6x-yCrPy(!Sn}z5PQ0fMM#Yq3*$<vu9n}-*fhiOV)P}cCP~?f_7GW z>A`_@y_+_H|I7O~4GnHyH?(1(e^!}G1~#4rl1qAMZB_5tDp(+2ARkCyAh)ykn(obg zvj_g%)JwNyAzX-*&VhA9AI|o6_O9!j1-gag`LhA!`7^KV&x%`nd?q?e<5vs}bqif* z%j(|PyD8hf?s;Ll;spu-)eB|QEyL>X>Fyio@0~T?=Q94v-fMox{E+|Q_Epzy$Y#S) z&#Hc9|8@NXAL<W9c2;h{eP=-joZq)$)6iLRo)@`mHujyRIAYtq@r+c5Y6GyBb#Gd~ zs=Ln@D=Xa>Z@%W5-a*SFlE^b}HrMB!p@FP@^NXREHg616Ls(DQbOXkRHg5_OFC82l z7`$YlXIkDb**rLiuwMM(q24n>Os_N2pDXnJ+08?j4D=86ZkbjDLD}US`g^a~ym9Rr z(1VOi2KqK{?4OY(HEG-EA9^>i^jYZM-MjJK-F<xn>%zB{z0Y}_)~$g+1&!O%c37)W zQh_#>lnq_g3jzlE{Q@%*F7Ll)z$P-x%TUmp2YZ)8V*}x?9J*$)<q_~>-xj|4%<HNR zf7<(=Yi4nh%3a>SVdyN$G_Uq92UosI52uTbeSX%$H=iv}t%ZE5)-9Qd#Z-EKo@O<H zgqgqHu%A1#X+LFV<7dju8ca}haG-C%vJ;%L!J-QtJTvLJGHlG2jeS`uqBjiqR!nHS zyb%j!VJd~;GX4LX7cJuLEpJ}@W^2x55`S^&^2;2@!G!Vu9MfjbyczRQYeX6GMK-(5 zyv)4BG&_0kWv4GF$2wl`nbZ-_m{rxe#w1=8#7-(#p^d2*nU&Qz=}}WCJMMRm8Qy<! z`gBvQWB)PLSGgCtg=(UspmI}=dx__`YHwxLF|?5ysnpqaS5~9RLiuOZbvh_hJmMux zSGCS9l>d{o2z698LLJrp32DYX?1lZDTKf9OophnREcq?3@yNR?rlU~CWTXCs7tIvP zFEgeopUQi2v#NaFM{<$&>+=gP|EpXimfLw=ySv*<rFMG_lr^ad$`r~=ihI1e<V0l- z{Wqj0DoYqkU1~r1W0c$PwI_FbY3fAW?o!O`_AZ>x-|4B`9Qru{jEzSoDyO!6;Y5V7 zMcuWfG%&<W-j)yZPQB;#j|<*B>CM3Im~^>w@;|)x?%fL_`9k@;{?UkWZ}v34%l~3D z63gy5FIr%HsY2Cl8I5a<#@zvIH+V^4tp#?Cp)R@KO8~!MPg>Y_(s!=XZqilr)Sb7D zK#xZt{WDQxo+Z|El4rfo4y~l^J4^cPa{ssA_W|Q_@GgGrg>ORKmz>>R2Xu)rHjVXs zQvlk+eBs2ThQTXz_^U6RFy{T$2J(J+`gB6&Elo|KI=jpq%7_=kdTKLf%k7wMYe`OU ztf{^gIF_XzwlE<RiDlr`q;^;y5nm<gM|{<gobbd~K5Zr{Azy{G3HeH65??J2cuMsn z@YCbKgA7hB3C8~t`hvdI2KVd02LC1}Dh}`BMYUOK+0FPSsJoK!?eHXLQJy!`j>c~L zoi%o){r;?Rg3D@%2l2dcAEPbsQI5mcbwOJ%J$?EK+wbYqQ(?Ki;8|r<HY_)vayL^( z{Hd|c9IxshA@9^Xkmn9$BANG0=4Q&Qn3mf}u28O(j3?p$?p*xxJ980}+37`HWFk4{ z#gGAmtke~Ei)Q6H>OYU17yiSOEX3$Td?8tQLm&$*?xyPI7_)@XO3?E&asORu|6dN1 zz?n|%IYSr5E4?K?(^&uUH>aN{IeWY|;hJ~J$Qk(<v+_|Z`Plh|6Uz7be5V(t8FO_t zf;>=vft9Ju@PeO1Bc)4D+EQWq$bzRxR~tSL&1i!;Bx}%f@J=hdWA!sIqSLBwrcj+H z{1=^)LFb>Ne6zBQ04JQ(O3$T^$$V*n;|`zaq@K3pq(CB(yri<cc&B%L^2a~?J#_to z`a=21)2DAYsV^~CJnd1wqW+$S-_;(fW4b-Zy*MKMsj^w~g%g^q4Dc{_P0ckOrWQS& z?eO6R*7@S6Sf)^~evP{a+1ca8oSTo=rf#viTxqpR>mEMtbc|MF$SeKcs6Oga+r4b= z3nvz<J=#&*f=lhz(w^G#>)&GAl>Dl#upRW!jkb(YAAWy}XS8RSH{gJ3oVFU&R!4ri zoH45_c0Q)A%22QN`O2tGJ7!?)S(^9m$w=0(s$N99lgRy{<ZjPlT<02d(E;?0+It;& z+v>YZf^Qr67wk%Z6X}PjGm<Kl52Z#u)kj{-2h1q-%+vwex|=peTGo}E;s|s~S0gRk zN|VJ=kM<MyAiFhAN5we%j^~_A$vE3e$)d*DRUJRvm#nMbmTXLIThM@hNTzb6uc$i7 zZI!xIF5Zyj9o-N$g>qwZ7`-^`B?)x|(V-4l&v}urC)KZL>Ov>Mc@+8|#r9Dd<D41K zJ%T%vTX3)CrBYSxNJnYxJ$L23NCsYJ{0H3Iy=ac-)Nsjh;ScGly!0Qml^$lEj+q@^ zTXw(KLca~r)3|$qe^oU}Uep;W>AenpZ59rfWN#cu-40C)^PS{KsV=?C;wPE9)r+-^ zmZV!FE!4?QK=VR*E@OTK{knZcZ%Os)+*>Ul#aE1Ar>rbDruTS14*0T`KBi^dz0LAW zt?US%og}i8+zB4PL--PD#K13pReqFy9V7YL={e><$wTJcZ`m@MH+{a}0d3CoAv>oX zeAMQ5c@8)-=6%(qVSbuKS2Iuj0XCZO@ECn0Q@fbY3srP?HI{t9t97NPZt<MDGjucH z+?X-1){MnpL!G&Tsl8DB4dXYd??H3)Jnfxo*@Zo363e4^dh;lgk3>ol_xzHRddlWw z3pCXxp+Rad<6c^ET=JJncaD^jqJ^Oy>@UsXZxnx{-;5ct<)Q0w@zAGfU-O&z&hMXk z)Qu%?Id1jP<Tfvsx#f5r<3MMY+e3RK`EB1mfPYV2f3sIZI|m}b>57MdwWg+2lNGE# znTFMIFRz%wUhfqPHU2_1lCCLjO8xkU5%;U*T5Lh)KQG>W`|&tqko?9{H<n&ZyQX+6 zFh2&pR>3F2^@{5En4fK5$fR)fZ@jB7r{h`pbd~fW;$d}5Q_MU99sD`OF&&jRnrI0d zzG}>s<+<tYsdze5Dj`3b*VXnP(`U?m1pEoF7gtiwWcib7AHD443)MmQ$3IMh^B3O? zoX~cza1L%{hf9w*1;&|9SJv2e{CQlst)-4&y^8eLwiL?Elpkacs7+2_@0Q99w*S3e zSNTrQ%}#i&ldJ)<$jKx)g}#l#5oPBr%|pA@Rn`UxYono)PA!Da0UyUm|5!9yil$zH zEQ?oGR>dnZa4@eJE!EObA{8wy`4aOMyy_IkWfy_Rm0Gtrve`^(Z7P~t>qhJM9G`2D zQ}7b4-(LEuWTayoZGxN3j!KQWs{ANvZgxNL$~N0Ot-~8r;G90Arl!<PpAEdHB94#y zwCtS+n8O%<e#}c`Yb-1w9KZz}?=3sowW*ryTDNB5p5rx^FIdkdca~zQ?Iq2RozM+= z(tJM6o5G{;n@E)`-UO>~-I((6_b_!Xx%gaT=Zua*d21%`E&V?F4xXD2?p_4{I$y&U zb4%5j`*HYSRry(sJB>`ctW#Fg4xx_l40FMop?RFO4>HhHw@5s+iZvoU6x(n4;XHVK z>GvlpR)=SHd*X$#&MEZsd6Yd_JnCiKJH1TmPU?46BgKLfEf(sbccr!!JkqXgK=HH( zFUCkyUwP_3?T&hJ#{Vqyz%lVL=~^#3*f{X@G#tEF9}~WUzh^YBGyWL!dXo7_aCZWW zXniSht*bTPEuL(8*&*nv&l|=o7$VANjU2_keFx7C%#+T%mDS-);V$RT3ZJbtJN|l& zbLZzIA9J#WyJ|9p&)7K@xzM`9P`=J(jREg2Guux%v~SX*@Xq#1oP6~eWlX}A%BU>5 zxvccs?9NIpvKVo<muk}6;U{bra8OJABsh46InETBpDe5+UTt#pM6DUA`1(!j8rmZd z9Y>k9rCRLiT6d(v+`+uXTtyqyq1-4sr%+XU!iD<&qVPxC!b{Y}CQ{qU;bW}B(7A$t z6j;yHlb%z3;b%Cl^4lvhaAI+hN>`Y35_WvW-RLNM3Pr|O948)Ojubq8Te0+rS64g( zmxT#oIRy>1zOI9Q4Vtr|ooE{R55&)P*-`utW@=dT3$&{ztri@FYdV8$gg%2BaBO`B z(wE?W4s<yM?<c`mgLFS*$p-DnPoVLI>B)ef{yoT-JzU4Q)t7WioOf&i<O+I$U*q2A zsof-Ps;{eqdem9q+rEXW@<Knu$;l($BF0$yYstv_s~Y!t=j1AFxrs`1cB0~DCMxZv ziArmJqLPPa?){R=p<9uo+8kp<rzSJ3XG^}X#FUWd{DfyRrD`*2E}@mso?&j!;rGb; zxDd`jHDkRJom+^$ob~x4;li%Vuaqn_wWHgZpQ`U-jN=)}$W_(1^W2=4KDe^_BA)Z4 z%kGh`a<PNN198`%9}N1e|J>2ar-TD!<o<=b7d)_VbitL>YlRll&8yW0<7zYey-w^5 zlUir%6jUdZuDp}{@uJp_yFINP)wbXgJx@Rf$+zqc!2^8qGeqI<`Co$v@2%hM-Lp_- zR`|A(ufv+KKc*rn<~bKxNsd@JWJAd|zjq-tg#Pz9quv9A`w2xth?_KU2zRfg&sty+ zZ;8$tL&vX9KQSk5ZN8}<*89V(XHL?;aCmaXXdFCDxxg-%U#fAtyS+~2wG(?Lg3b|N zH<Le~{$1d>o$~oKwl}az7rNNN7QejL(6>qLw79x5z%TS@V(is%>P0ez@}%k`YyU`W zct_WlKf`l#RxrG`%Cp6rbgyWrarCo3{U75kRj8f^Ztekg=<MB3C=wV`obkl35gfta zsY}q)z@xQ|WIUZ4t#m=>H5R{J<qN=tW5z4u=PrYe05(&4$ZOJA^XbY$<!5fNK0)E8 zEjh}1qflM;Yx1+{iscDxW63&vp2)x}HI(ZDA6B+UzHmbQWzat-1AkFcZKnR++Y->n zq`qxw1(FgMkrpw9dXp^7muy@N4=L^Sw$3SRs%;g~RXn7A!0D7=MhBrQm|K~r-wSSK zkA-%d_=q{x>KpXSl;Al`907)nwDo=3it^mYGqzz<jOTuySyME{dEUe`^M2DDo}J_- z`Cu*-48S%2o1}~H@gpbpY7N}M+5r5_O?}nk;S2QR<cCY*6Ul><8m|a9PU^eI=3@Vt z)I*-&(Hdh7xQm*uvg{;{>6MH_u;Uv_s0?eEsj!UZeaD4v^wq_jA=;>|CD4a8Q8nZ4 z_I~i}=_f=FW9MRgMbHSGIbEsUabQ@GNsY#Nuis6(>Thn)-`zofKO|l4s?8er2HWm~ zv>9Xl^JVg+TU+6&o^5$=c?Z0nWsc3G`!dK-0oxG1OPjGu|I2q)8Vvdq8YPRqFHkyW z8M+C(%KDk*mwFvzm5+88cp7WO|3o;75uYX86FlpEX4p;ovLJ7qyd%$3Zf2eT?PvAh ziOz^-c9a^?|61c|?ux^6vKKUeN#{83D$hk1i~lvRi5~lHI&(KPG==*-)+oqsq1qbE z5p!H$Ur2ArCaw=?w3~X3nf)GX3v|zI^tGz|5z^2t({<Z{DGvRFYil!r-@VvjuJCN$ z7lj|21ZN226m)k|f^k*#IM2<=3E%Fa{Ef8zlFY=H%;b(D^&b2I{W|W?kOyFAKAtCD zW==-Fo-=QYm!<Cpr7vjb8ro5x;^h!-w|i%tGErpG!v78OgwIC!Bbwa7x^-Pi<46U1 zIXn5|A8HPl&qQs7HUj=ka2()r@;>h$X7%y=^l^|rh^KL6`$1Pk-5sT*VIF2)6s{i? zyl%R35pB*(F%QsxE$IpPUq0&x7TyM3SC{W!xYIL}h4Ny`ZA(33^_XjQ&HJnGCG8cg z$)zh+^6UoBmyq9Fyo2;E`I*o+dR|o}9lp4Od5ra~J5qAZ*Q^dXmb}eFeooAF(Q`#? z4Rmu|alhvlzec@ubt_{UWUO}0L|qq{`gtD~JgHmQZ^D;H`_Kkm^?up$O#|eME_DH2 zz~h20($)6|gS>c<hpx4F{y(HA8MoRxNt$h+XT}|GUwGRBCxvcI6)vn&ZYFKd0q=zQ zm(NN+mvqAXOJ=3lkxrQZwpr;((h2k5LV6=`zKM7q@rA_FMUkvO&pDIWmAmrZdSp!c zN%oKCKqrH4$`#7%3!{~W&*Z$n1K&+=*j^b;jaHJ(9qdhb4fqRWW62hf-7!-?S-C+! z-HwbNYc^(*u$P5&J4Qw$LC>?p)0DY4D5vM<vy_=#=XZJUq`yw=z-V@7sWCg@4Iu~F zK&NbHT#|z!bc*&$B$tiYB3}hh(k%_Uwu6@mYlF(ZNibgN2=UJ^;BWDi_8P?t>_bA! zJ>X<jc|Gk)zx-%MntT0rE4!r6$EKe;vG8HbADX+vdLN*kU~RN=wsTs})TasL44z?K zr~OiVA(TsD<4rEy;~iSK9r;REuB8pPC|T;N0!LFaE17w3HBEXJ_{5W%6Gw{o(+@I4 zTW;!WUIX$pgdaGGjAgTwV-AuG)zSA`ux%wr8t?mT`(N`$Qb%oDf6w@bdCsNo_dd<I z+JQghi%^#?L6^?dk<tM#Nl8bJ6r<U~Vd+WiYxJZ~3&;IAdh)$iPhxW>X3|W0Qgmnw z@PB8J@9Rk)|H8F&7-9Yd?W%lpP<}b}k%jUY>1Xu7c5j4t>anj}sOEw?=LU6l1bu8G zz0Tb6xRV5D$*+0Q)UegJ$CB)ypljT$uV*$=UV0;>tKbP`djsjhmtYXidS{gjWm>vL zdTjylpl_yRpVlFxwQ2V8vhYI=8^6Q%El2arec4w+4>J{mCrmNe+j6nfQ)kv!?8`iO zY@x4v!8tmP`7L|Hf~f3B=~w!y6Tf4NIwmU~vwNW`N8Ln(G-w-z1_{|gF?d6AF^4`* z$d(N1hOn9rbOY-}!5c~YI>pIj^VE;x7kHJ0SL=#A@Tv{QUY4KM6!&>?+70*PS}7wK z*rR;3j<^B-Ifq!|M#h?=_!!Z%O~)MZWV))oP=oI)gy+~opI6zS3dTHU$1Gp;%rR@; z;Js|1??nOapQKEQH50ap-4~<nM3iR`#(V^>@xjX<6ymE)zF<Jcr}4!+B7I<SC3<LW zwr>W$M6*W2IyyOK$KA;KPX2n;fft{6i1xKiv3o=v=;w4`BZqUii!MQTIjM(_Nxrd- zo-^NTov*gukFF4Gi`nOqJs|z0*!l;swMn=8P-?$xA@I;w<H8(%^;}@zTq&NwXJ``f zWTD)2&S-_XlC^Z9dct5^yBgbQW&Mg#Z?_q>b*}kC{34vqknJJ4k^d=1SVUM%SVHI^ zbP|>kmJ`y1)r2*KE<%RTLs(DfBV-9%2sy$iVT>?NXeG1}*3f?!VF{swFw`-Mjl{Z- z(8>EU!g4~Iu$quralhA1*h}~*!AakDY<4i|`@Ck#x`b9j8=;-Bn9xTUBIF3C=>J*5 z(}c%(FA+}A=Hmp`+}<g|qWb$Su0>PpcgYs2wQ1J=9k<xErzs#W8Dw|GXsIUWui0Yq zql0%diEOiel6``60XanGQ@btQV^)T*EdLUEYfiH3O8h6$N%4#L`VJ4>WbL(gQdfFW z>%Z1iq5833kj^@`lk_Czv{rjH&#ISE9r)&Lyf-jEB+U)vud;h%QL_e{kFx{tgUZ%o z8?2^$tz?6BZ%TPN=Bn%scD_-&z-ilkXV9+tX{62Opx-e6;voO!<TsPwlKh@0JFzAC zuf+fA{gdTi_PT7nRn=N-Ma%}|ud9lzKU!DZRzlAqo7lSSt2yRd$LjEF7;_(cXt&~@ z6#m%vV9wUOBKRZ8iN|;S^7Ipt<o?GsX38y)j<NPYU<)LZx7xicjpZ3+yB3@z%ngr! z19-wVax>asZbBY!^;jp{vkRthOU2D$Ll=B|lXD_bllAScNFJJ`^L8IkKBRe!qoJ5b z&+G&KRb`#)(EN`KPSthX%Urv<{ClM7{FBx;*r33Ab+rXvNCxX2t)m+7J#5F1t2I}A zh2{n3uFUZ9+T4g2%S(3@qP3~7#OtUd-tm33J3a0D>s_(n!FFhpuS{#_WNN3Ev1M=e zeXZcDfi>^%3r1JtxXnW!PSw(;_~lVxo16NseXh;yjDMFr&JB3mJAkKt6hAEInCjsb zbK7)#;sv#%_L3btvF~?!zCQF}3jLuclSjP8`1TiD-~NhfB*l82wX*cl33N|ri#UP} zm_vW)33PF?;|nK_{$hqN2pd`Rlu7Pl4v}4qzqbHyOcLzazJ*U_CAyHdir-;8oJH#> zIP6i{w()ySX}@zLWi-b`c<$pF8<Dx{Tlh@U)xQktGH=kn{3Kn~b)<E?;!e-W6sm3P zvCe@f=H%Q`Gz}~r&;&aUeonNqF9p9y{vV8Fj~=g+t(0XCI13HU?;(dK@lutc9hGr1 zlqp_SGMTNFy39YYr~Xq<=LgiM=E|Tw>eobS*kcjS#rqdS>o#y@=TY=X(B^z6GY2$W zC7Yn>k(NijEi2fAW_+{>dt6!Vq<*8zc?Z_*i?ID-JSVX&x3t{IIu-hMZ1-Z&Q$8r| z7pM(8m(oTuxo1JFV_VX3I~T;<k9sD*-K(42&f0Z5JRn@JwEIV~^bKAL-6cI}++DOs zetMhy0*RiY;OVlsQX4Vj!xwe2bKFAIBtIJL^PCx5PyOxQUVLVbd0#o^-Vn#9(<Hx+ z@Br?e`;p;S&A>%tMr)zl?YLy0Yb@IT^~b?EGqZg`V`lq;f1w?RdUnr<^36PlW#xmG zU8T09H|ofr)rO}w@QXGzuwNgijQAM;!&D5O+5|2>Kwg|@;pNrXW)ITd`z+l4+#+9Q zPq*~Px4g8w!=8O)-B(_c-%)YktERuqRm4l$%lM-Uv_~^RTdS&D!~^&t*_VUwR?SE6 zG#$bYI*1=xewt0>%U(a!!h8-~CVQXthf6n2QYP_?KWCs<=DVrl0=1=fo%HteCTS-Q z42Kqu0+*lOHLE|ZbKXXI^~oHU2>boujD8&#dk4Em`}yBu%<5OL?JewxV4qFbSu>+f z2&?Q&m6sm-!OwxUkjAgZn3K1Af=_#HS~CeoC;71FOm1fmK@XS}^JRZV(%UPVd*#<T zRIf5udM0_s1_N*N1-tn1V7)(H>2IwUWjj9;;79v6Du?|#rE==`BGSTkg;&92&sxxb z96AU_=_G^@IXyGa%a5C2T-s~0<8%wvuLXWE*??-t$GO&r%$Kw!-VE&o!S(F`F4?bw zYddf`>6`G4e9zMCL%gfp13@`_!nWK;gY+*2>CAODUF$l@yv|8n5%@`rxl!l%5`yP% zf_irc^~AsG_lu<ad#5YJpJmNw*a=gzBil;QIkUZ_^};#DKH{tFx*VE6YM5)Ru1}^b z@f7oaW?M;fW~=e{H(QhN9C}H<Jp6I-2pdz99kpu==ZMVcg0_s-C!&SFHySh4=}`V^ zt5X`&_)Ch|v+zKSdhyhFNqqNj;8^(7z9Dg0vFtlLhfMDBw6_o`Kp$`^*)tgebXek! zo|n#|JM)G4?0vH~F-_P_Q%>qvmQM2N%eODP&gAy6c3dMJ--KV!@?RHYa*~f6Q@VIi zJcsYvTf-Q{bFyt}fam=Ij&ZNpe65*nImRIPaSL0SmY-bu$mH(>5Bu3O_vM6xebx?? z-4y!E<(rj{T)uMo$wk``Ze-HpBb-0PtKqZYc}oC~Y$(C;gOKLnMz~6w(Te3K>`3O+ zg!Es7^|8wbQ>Z@mGvHxQPV=3?zKSvr0)T~0@N54-G*G{a)rZ;uPOGb8=)+qB8&hjq z)ls<=d#s{a1UMRt`@QB4<{5k;v5pCE9(JAP1OyK|>q_gt7QV$l!iD77xU$c%=K`Ov zbd<)OqV3R!j2-~jzMtDkT@qnGJkDCv`Wl}K@C*+{Pf<>5H0J54p2K-h{L~3-4Vm#u zGjooU!zSs#PDny8?H_^{)?;NCct0Wh0BfU}@ZRn)Co`5Yd_|Jqy6iq^iyx)9*W22% z$IgdayZ2CkCpPmc<aNS(mt!6r`wVB@si*nW6tSCV_v(mwRKDK23?a`P@{R442GZwT ze9LjQt#)0`s7MZDuI~??^Vh(a;!GO(=WDIe!P)?rbVfmVkPKez`1;5(mjDO4^DzE^ zg*P1+%!z`|3_MD?Rn{)4b&uLQ@@>m5f<GRW->ku~XRC7r*u`~j?mWrTPmz<l<juz% z(tbjD*~&GHQ8a@0njGj=i%xAYI=_T&O-g^VPsTU|Z!Kf{Fnm&L@sO7N(KHFp>QXnA zVlMV`QhF8Kp_3=^!@Y(+<_7*TfJ@XBDTn<Y+ArS`?_jfN%ty$VP0$&xEz}2NkK}Kt zaAt@z1wPJ&6VXBEfu!$P-z0>WyWopDbNl0hUGNIlpTa+aHO3yA=pQvV9e<eev*CQ0 zvCnK%eaapbpVR_x4*#d{O(P70^L44TegD3Ff1lPS(C-fTK3$$C+lskf_&zU!o=*Nf zx+h&eN*S&H=Ynt6CZ89r-Yh-cQK&ZNpjUdrLuRIok!@$sydYP?4g0phvL0A8HpyRO zFn@ejG{b(afu66R{RYk+jTT2sbuIbhb=|p=NwbbfF&_iF=Dk{UgPxy4mSV}9y}5Vc z%Pri5-sc;T!i4uJ+L&9=-s;uX=O0P3Czrg`t6P{qo}_<!#xKSA=~Miu_Cy=?FL@B& zVw^M8enCT;^I6ofa)`{Re1Z0N<L@1ZK6&_N#r(-~y?C8|!~^y73*}aLt`&LU>~TeB z+#1vdYqk90?Vjql>OHG-WXmgU^x4k&zPe(myo6_$Je~1t1E$5iOCH<N4U2e=fZGUX zdFG-US#x}{X4@UdYmh7XcAeB3>3v{e?O>Mq=Rtt!)KcjI;b563{$Gq-$;ZFvr|fBR zj)}91z;;!29`H5<xIGL_;eoO#6sk3o=zuJ|NZ-r9!g>Zhc&L86x38wAWIFC+|KL`y zCfiy{z!Q_yOR@%+{2Z)D&O44A*PP`PZmcjrH7zpgd%`<}E|YyDz7Wk-p1rrJ7~lS! zODsN#sei^52j+>uf42~tznXmEC~eT0#3s4Vd!2k?>|05HNO!7^=9DhRs6M1Kfj<%M z#ee!Y*y-Rw<znu(N^M|Qed0I%95*e$jCCtxP2y{J&cn~__-7<cDqVpW(FM}M+nHax z%F)TfxBky>PCpvzVXK#2|13%2H@^S47F-+x4)UgTgh`dEqqOll#w8xIybABng(sru zB%Mc{+XA1uxB9$^j(Q_y#g}vGm-+jXj^X^I>0`}Zs1_KL!&<rS@J*$hLmS{D>h6Qj zIY%T~Bro=4dkDw!Lr9iPvM@gmTy>gr=uc&I=1O_UdDBVru%*=l!W;Fh{v$62&&0AS z_ulHCQQy)dgKvX<e%UzBQuoOmb*;}}4gK6==^$Bkas@|yI;o`<lVjZOe|k=C3>a5d ze?>jDB|nFgx=ibwYAiF(p6xh#aolUjjRPa)kzuu^^0C5jsgZta3pbXc=ISzg8xP87 zg1+M2pHpM5Zv*OE9&lBD5dEfpR1UczZQT1SXjRiuD9?lE<s)!XkJzzjpCx=2PNe6= z&%X$GEDJw~kNtJjcH%W&Gv|<fU+x+&AB&ZQ&sfK6OUr4?$_V<yDLisa_8PW9lh%UT zqfr|xE}Sgu+-w9mMK68Z<D?2ByIa2O&3{E<TdO;<eb^n&MN@@aYKw(ib}#($o=AOR zTP9h!Mf^GrueKH^_JqEYWxzM?um{F?HUHND!+3JMG!6`$Z7Dk~!zGg}(Z?$GwqN0i zc22QWl`ZfMa1z)W)kNx+<1YMqDQPbOXO|E+BHsycth4mCzkIsVPJfMsot%GQ9~U~x zH_!)ulK6v!hdBLPe#6eH%a6o$?lI&yeYc=?RBtY@CG$JIad5N5-S4#_w-Gm1ispd1 z7%Pq6wZ}`LQ;-AZoi%E=Y4^5=y%e;uXUuZTDycEfFXzTsBOx!v^@Y~t{?9q7^^?)! z_~bbDzUHK8%k9Ub$Q=BKyxdsA567Os&CG|Z?e~4P$i*Z&%^2nu*58^ZwdRt3i4e~P zKEYqZxOLv#F+b6GG*2d!uJwcwee;F#i^18G^7BK}M)3kPc%=Se&yES%GswEWg~Ap_ zCk$JCYm)fdIG^vh-#w;!vQt%0dRAvaH8+YMuMGI{A!Jqg+85CNgY<>oonlu-^PF^- z#xvQ1PbPWOaq)}hsi>PPMT@!PoYBNa9`@Fv6C=f)6%M;kJ<{^9=X7-P%}cHnbMHGY zxz=1FeIwZxjbBTD($D*{(k<_`{^3wB{E9ZDqrOC}HN)M%_Rke};1hjDXSQUQcF<lL z*~_4}a)t6+8D}T<mCN}(hdRTV9VO{_@ki4~@U^(;d)|%G8K>GkC>+3pZNd@jPnDl! z?H?zvHQ+6sfl$4X)G~CeU+;F+OQ$OkHF42Xr=O5tp#%FZPQK0vs?P)UyS)N!O7Cb+ z5p5mlFIq`f&vx$bfc1@_n~4R7*6jxgjHmhx`*S9U)A9|21NbS?N&jJf7<UR!Ix`yL zDI4G^ZP(NmPfeWf98Td6=1fPVWk;zu7?b?&aoW_FI~mjewehen3dbSe<9XpYNEiOK zCbQ!q*0;Q(x9F_zXHKwB6=6&!!+gM)w6~}|EA6qxGT1oOH^p6EjqB4K-<yAq3Z2kO z*>mB;mm!ZjPqh|$6xifg|MuT4<b$$HD8HKU*ngw$nxO2-AWl*rU0wG1#@{2nG+3Lq zf|FQ!zo&gj?LWz86OU^j62By@r!^nnx@Zl-_r&4%mEyJ8ZT|BqzW1XYwIN=&`^D@# zstw6~j954f+nQbfj{}(G%NI@L-%l5Peix5XpZU+qqw{U_nCS2^`V{=y9|`wpS!>TH z-|o}m3z|-c-t+PAH?c08noIltN_;+X2#?`UYhVYO>-$fgRj$Ej)>Gu0=xzB0YbN)5 z2S0eH*K-$g(c$y@d4HLU=sVC@e(bzf?BeEvY~~5{<(Su%(%gm*nQuNX#}>8kS@@<7 zJK^wd`%RGah4!Ky&f=Rwp)9{-6n@zXzck|{+_%!0t%Or6j42V0zQ>r8IKhuB!@?r$ zdzUdo9mYIBnS+FeRq)EioW~=axPos=snb9>LR*Uoi{8mI!0aRR5gwuZLxhuryD3-H zv)X#MF>Vl^;r&^Rgt2${A$=LM3}G>S+)bG*{U|)ka~JTfCe+bR9dPETQ@WIA%05F{ z`VwOf@%{+mZbFehw=jkV!u`Oe;1*;Ha<-W@pVm$ObM!pvHWSA;mAVPr+Q-xNlB=ck z{X2$3LAkBOV}v{*#k?UsExp|3`rmxWXG_2HmvDv~-<7q?a(u%i7;cK0gzWtq%8P!Y z>jh7vt0&VH{0s^4slJz)M_w!Q%Ljf!9(rI2d+!&KZ&>GO4vL!hm*>xsPiY^#GVU$8 zi+y8sq56=nQrl`v{iu)XkI%@L>?O%4a@driFQ3<BGj4-#kyZ9o#M|NXYIKt+GCyWM zJ3UtIwTbu4WTCtgSwL>4%Ofi~Uxp74`<iE+MZj-s-_M;aRG0Id2UhvT&Sebk$bCbw z&b}G^*fa0&x}AgIb@6-@d(QGYXFXnu|0y%$yI%R&Tj|S8UdP#7)|b2=!G|8B-DvXL z$G0-SeJ<|X^zBLZo|0cWUI^&%8FWD|z}r6{-=CuHV#Yd?rm{KgSfRr>?Kp)(RWt}` zD!=;@`V#KzdG3TKy1=W>B#PELlPEfT?mvAxKR}t|=pMB(h8|i1tX+2fvZC5JIm~xJ z<K8XOLGbS`;2Q&`*?nq%X31yN=lkVLc-}tu(x+fcnwwa2$Sz%3JxKqyZ+wI6>($0e z&LHpOo6`||s^i`eeaq(=fmSLP;_4du5szzp5ym9`(sxxaV_wvmCGqJlov9LToJ>hP zcp!=GgkK|8gbxmHJDx~xv-M(pTPU0y4E&ZO0Zaznc>r8E?$U~UYse8kFnqVkpRj%! zsf25!<^p{H|3SOwz&#xJ)DNa^^q8BPmIz<&b76lAu!nU1P{0fFZ{1zk=iQ_J3h%7k zT^RQg3vW4YVFvg4`RAA9M@!LW4>+uYR+HfHpt;3<PZnw6T)2}fEkq9N_>o~$Qev`r z3wLvHS3>e8)~@5Fc9-wClIMF`$A)_#+7FS8x1;Z04E{{!25$|tP@094J>Jl+5k7^7 z0_VdI!W&x{pG|`g(R0<u@4DaHM&4@hk-&a_D*9X=)OnbY2OHpr1onO>`s7u>Dw|Sv zoZ1@>WMVFQ;UwweXKcZyzCb>rln-GNt$Wc&ArHP69H|ZQ#AtH7a&Oz6_WZ^hG`2v0 zC8*yxne!z74!m_O@oYWyhQOEhoxp$bDE2k}2z%CSrcAdZ(?xWJ_@H3qe@$0+FmCb3 zXw)>_UA*19$K3AK99~{I0FTr;dH<X2!@G`iM!))Jl+6{e58z9u@TZzTFBE@nP5S!b z<pGXE8OI;u%b3Am!}yF@SIV>;^`faAC4Fb4Z!<M^@pOZDI+d<`CFbk?y3%N6jf0FM zW0^?;GL|fkR#d+Wnww=4C*&X9ANbdc@akxQ^Bd@Qc|eODJj++xhP=Lov0p*_Mq=^K ztBO}w)<}=2Y=Qms!sl57>kbOu;aRm2D_~npPI#k5bk6^>{eP|Kgv_<f!rS`<GdR{* zyE*S>@xYjc6Zyo1hgb=p7SDeaj6XMH{Fl!d|7A1Ae{L{-7}AcvwKQ}5AE}(9@t4p! zXTgESZ|HM24!%mi;&}(2|1#rvzBQ1(30bW+;G-5`ioX>3qOWtzF1}@ZZrhSu?VWZY zV_Iwd-HbjCy+9ua0zAT(R=z{I>UpIvS8JF*B*(G~nD4AUmoBh+0N#-gb2+d*-(04; z|Na7cA|bm2ea8JLi6z($(i6)*<FEPt5L!RbivN`UmbZ+0nT7XbyJ|l4_dy=}^%?#x z|C+NHtc^q2ki5$-cp$KAx`00>oY0oqSq`4MiRC|fKG-Gep9J<aFo|A8`kOiD&eV60 zSlybgJOM5e!8lfT`{VdLaIFs7`0GfpcSw78@+_HBp6HpbXP!j1^ew%G6WUvQ0NVU- zuAw8~RXQ}J<4N_2j1Nal)3E!P7cDS1xDVO1pM%#>FF(!rXX@os<o%v0RBvK@FJu#b z;7PtOqCaahBY)BlA)UIIvt(0U{v%(1Z=uaDbf0kF$MZvPyp#3psK<99(>mNqqNk~| zE71AZQ7)h5+cC;?fJ5nKr%;Gu6I-3IEWmH4#!3H@so64#jXEup%tg;Dlh!W*JqmY0 zTf!m2K|&{eh(~ro(`npJK4$03aE^O5ePjcD+sd=%FX7>t7GKu>9KJEdbmeMz=y7yd zv+%%J)$V$})oe(OFBnM{y$1Aq5?i9NxQ{dI{+O~MuYk8r%$I^;B$#Kjz!c88FEr2I z6v)Tp$c4TiQ@<aYLGxPh8`3S5ua&_b_8Mo@`+er-*9E*4&S(Gm>=_w7#dA2vJX5%H z!PmwA$a2#c(b4pUZFC-MhNcVIKMT*+IPNc*S9Gq#m-%+;NJoU{VX#T<dG;Rklz3(y zxKqB?@_Unadduray{CXFw8_2+41zrzhxn*v#u$FZc!fL3pKQCkv4bWF1?1s@XOWwN z>{K6?dui)#=KOouGp(s#TFF5RM|K_On4-{aWZ^pIZ1x}PhmZf$vz$Mne#ZEJ%ZT<8 zSVJ4m{+K*rl+Z_5PZ%QTk0q@UJfUrTCw+!vISrk)H{O5@S|2j|IbQ?**I-j3+w-N< znOmZ@g<-EYHhiLvI7tX?K(%A%5o|!!563P0kMBF|SVLXAjef(m$47V`3;5&DcvgE$ z4#O|t%x`a>*Mc6g_j;AsXJ-yf64w%oXSs*X)Bf97z_Ww&#e%xpF8+dcN0C$c_m?>4 zwMXiATboh&QTMQ2Pbu$@=vOp+aiBLQetr7$qK%~o_}Bd|jx&5*w!6}_PVm18U0H?x z)w{9vP0PsfRnX;~^uIb7&mV$Q>2=vxA&++lyww4ZZvwyKFX2}9>@s9u<L>175be~l zPO4|!cp30D^PJ#0f=}mS^1^xK<@AvW`fKL-`R0^M)GzkkRrG1+32^+Jc>)|}Lb(T? znRCQnAO}{akf%R~|DVss*i4?zw`dGHzp<KeqzQ50*Z4zRNKRfJ;2{kj76y0_4kC;# z9M9=roo@Qsul)HX)B!*F6})p7eZZGL=2>mc^i9mAUGY{kXJ?v&J&hOBzUZklD_zi2 zW68KTdY#}a<Tv4>5x&xXW~dWoZ#BbXF>s@AVWsCE1)l7MFSm34k7mpxqOoAv9IOqG z0Q;|I@WMm9-$z~PV)c)VTA1v-nSK=A{-FJyTzNOl(Cs^T7H^IwZ>$_U|K)alGDm!h zZm)t@bh*{*=yPu*`QS9{&!^Afk){QvQ2h+Bgt|-ff?z+QIRhQ@cIf>H^3Q?iJ_e5W z@I2F2+C^F@v$ry?3FV_#LK=M*K2iA$xb6ba_>{a+$`oSY4SE;A+syKRPJ4Hf7D1NY z4$fxw^(W-b<Z0m|To=9!do0u=W|DJG&~pp&IYhr>&@+Z_K;wxdxub&TEx_V1m%j*{ zTDq69k&pw)UyJ*F_RBwJZDG+{w3kk)EudcrNrJVXz{!_^N#7i07*qC5J}+Q5Ol=9C z*Yliv<;$68d|Okt;X2atLB4DYjWN{yZ=*fopD|RwOPlg<nannC8PC95-65F(zXrOQ z%(!<k>B8T(^g~{WHs!~YT_Yb<OmNZGx8mlB#gvmR#vG6srp(d$QSXR@Uj;d^IzE}M ztdwq{t$WNq?+E$Am+Y6L=t`B-8FE{e^mnLi0X`w`9^^~<^^?fFVEjoCU(48J^Xc1= z-ve&t{VRDP4b|6dA5(K+t6ZS=8H4o4DEn?2i|!?DEKYcrWA`OnkWuPuOrp1Jnhd_h zF3yX@HOAon)W71nU2+k~nfy)1NDIG(Jq>@xf^T83A$>{e>WXnURif_SmvnEH`d#Q4 zD+}NM<>|x^e~G@G<^TM#WDuVz`pV)@b!3AjfVUO+Ukbd!rPeyXfWGp9YG3?s=}$P+ z7-!1Iz4YNi-=mb*JRIWu2=9+mU${n2%U6I)o%Ph%*m$>mC^-)G&))=d*kk0WoYp3v zqU})c+<`9K0F6Q$6MDqAO+FOAg*4GBN&922+Fx0{jj_+vkF1r;(vNm7#%9#nYuS$a zPNk7}EW;X^XX#AM5!&a}y+IT7KN8qEY3#z`;Q2k+Tj6>D|4KqSI2<>+Gw}}WuF%Ha z7T`^Gl=kRHiVxD~9iHoc&4-6?F0%#ktiHVzpG<fc(YMbp>FPfQ_4WO72n%q;bEya8 zy^K>d8Fn8<)(hqDNCzQ<+t_Cop8J7QJam9I!f&guBTe4}e~_^`sqc92q1?Zs3uoGs z8!4~zI<Em{ookluIWym$zb0SyNSH609fHqAx5<`K?{4XUp#7(2wZHDaX#dI}|ApFz zPo~_&%RQI*G?vs|!v+2o%CCbT#E-9Le3Dt|GV2S%57d$>dXE8PIM2%$+=vWbYVq?W zFPt0B{UzT4h4l-C>K1rph<WN$@ECSXHK{xopFDjJb00^JJ5_%9i_=Y8;D6!$=fB{L zkCjKAYxM0>@+~}CgXFL+f5f}|(DFaG6o3o-H5PKVzUBsfNAiloebX>a(LRR)u&p?o zMJ$_SeITpnA~T}TN8vlAuMN`Y2I;J6rlO`$=AuWNe|3=W1o<Bi>a7mae+6Huy*;G2 z6Nlfbe~$MPfgJ!0e8*C#ew{YOgUv;)6Icf@k8zf@ayS0rsIv?Iu5Y*OOZxuZN$N>n z4}e4FqUsl@Z@=9Kx9xY)SKuGyn+g9rsWf*Pa1PjIk56Z>olK!DdewsKl)g)ZzHaI( zUOQ(J7BA$SMHV^Ba;IRDZ}XOJ_Zr;$y*kcv>%J<J#s5KQ(f3EuTOZf?&$;=r5@#uz zn$1LIF>M^<JC(U+;&GGr&yZ<9;zHx=)H;=8j*9YqNCX&4oQuF-tm<sJVJxos3g;RG z*B-B(^AWnEDg_L#_Idbr>KJDS*muM~t^H{3vvb+QhAs*E&>XF{^&PR!Mo355IXpXI z&$7tx8K-QKbsG1sOfBL&r)X|{sV=v}YoxERk2>_V&JIe(rIU33g3j6Ajoc$3y0eA3 z)!#pjfZIIhWS4{6ICihj7Poij7wGKH7WPuLPkLT|E@Jn4I&`-*`={J3t#wP&H*yu- zQ6hb%yMs9!<F(<3j}`e2nsmXMm5cxb_rFqRCuzBg?&8rt`%fJ+b&5sbu?%~T-RwDj zz!(?BvWU<bgzO)&UrBIL7+cr!%PPd{DSJPmf%i3pJZ<bFu->RH7oOQq)0`Fu$FeKb z_ZI_SXFqn9-gWP>#unat{5{e|$FGB<p`ecF$z5aM#&1*SUgU!uh6k1ea^Ax_d|7ZF z=Z*M{!h6DXu1Ir@aKM?)itwO43f%)HeCTfQ6lrQlcb$dvhdnb&AFS`2vg)tMeV@Sb z05t1_FI#iMBkS4R7<QrVobvk!?_d(&Xx!`p!qfY`r%#@KLUVb_On4VCM#*$L{HOJb z-S;c_J}A`@eAjAkl=ApWn-&3^^ttqz^!bmdFF5tR)fnmGt;GQz@K+=j!S~j_N!`YG zK06kWw;(L9vNP9ZveVSA11|B!Jny<pex~+d%=*T3_Bj|fniJ~-7@}&^<vvYdlpk7s z>KxY=2YZ_JlyIeddygl5$G8`C%eGNu2wCII(n-d=82kvX%{+^TL^quq8={?Vc!)i@ zsgMumu%=zh+&@IVl@H4=+kT5*;DP8G%HgA#67SJ2e6_<{#d~&}`dd>K|LJbgEaSCw zhIW1R<cZdtt8(EReHY%&-fje1^#QkdE6IBUA;z7d;;UGGueS{PY8=fOo$ckDYsQ(% zbFP@NoBR!>X7{yT8_$dBD>8|l3jW(B_p)Efei+};jFTo?(%xeVFU*_FmFA>!r8~iI zD{Zw+3J%(yd{@Ox`ur!pPQmBWW727YCB;}<i+j1_T<1;oEdlGFOkas_x;TrCUx9uk zV~w;|SNu45I80g2aV7<;za9`@HfQ#GhqadrEOP?B6piHHt4sRy4*Bta%45RwY~FgB z`6#3{-#;~lve|U{^rOPB?yBVcebYx~@Wh`{&X?PrR<;Fa2XHPEZd}Idc3b{*cou(# zZN}jbwW)WtizSnI5x98}7?uV6{ax@M>Iw0jg$-P3%?D3exo>mPHQ@ax$9;T#o_#&5 zdx7IH&zfsWZ}ol2pQUY`WwUx4d`H<U{;j)%a=JTcO*NJKy7w>iAL>1SZ7*GL=05p@ zn!j~6jy}|;#wVH$I_C4?J@{K_Lv><#|87n_W8?8nJLk(Oe;aLtV+nP4JotVkAM8<X zr%c#h5AB8b>Z3;z;aG$x=~cBkOnJ$h)w$qO-x^Cd)A#hfjMC9oKU3byGIN#mv+B%j zOL?j<-<!UX=o2gfeU{R{Xq@7%{eOffX3|qW<-T3qtC#cfZTKEF3%$p3+e&@tR%;J% z_DHysF3;{7wfL(|eH8tlE}wwUgeR4YnUC7@lEQ6;^u_36>0x~{Abwj+d!GZAlYASK z<QrG%<X2Hn<EZ1^*NaN$Tu!b~hA$H9k$shmQBQhEWpyr7I-ngG?3r$KhIDDDKih%# zY&ujnayr1t`LsQop3U&)ODS_c{2k7%+N<C@aQglh{Qps}8T<%7=|1UoC-tRc;a$wX z0`E`qT}^`>+bZ1$!d$Y#-b3&RwyC{y8hc!A31@bkXK6z+ue;raJJBnI`PINN8|EMX z@bnYfYn8lcJ`ivEXI_V=&zwkCH9mpd<<phbv>_cQU8uHnN6$MR=Ps-wYcqVpI!7dY z>nxF(ER<gZeBs`NXeHXtMF)iIe*Cf6op)HAT*PyXHKXeHQg0D^y?S0ly)6OWKPFrz z@33?fy$`b{(l~_+&JZ_+W99j`#(FnnoezB^OVVYQZ;&Om^Ih7}dh(^f7Op4t{g7-; z`N5>WLfxpke=OQy!|?s-G=9Zz!j<qMJW5~PMxXyYqs;hO;QC9-uqQv=&b!Y-r|p!{ z+B+QIC-E7~?rSS$4gjls6)E7hdMcN$9H&pExnUYK(0q4{F}T>RZ9M-z{cCQF26X*y z@O=q>iNptm8*K3!>UZ&+4e<R3!09Ae8*o=p&t2U4!Wv0*xPW$LkA-_U-{f6u?zg#T z*3>Hd2=r~p`)7%q{N<QD@2i?z;XcldJor-P?tS<S{cmen<8aoz*8TQzeGf5L-+{7j z*LkU#{rtqzYrpsJ@T2(b<3T?5&y?mB1N^4A&C@zs@1kRv_A1iOA-|Pa>#k1vUXtT` zc5IDE3pQznvzB>uSeowuSt9`>HW_zw@V%ONRI>aAV2-)Bg4UJ#Z2;`Q_u20hYH7#N zp62`7ZNnuuO<bTod{4HW9Oo<Y!?d%;wzEg=<UUF}YpOTX&Rojrdxx20mG1-{Pz~`T zd`#9uV|*{V+w_m2c_aQb`CWAPm3%PT8=bk2cz`ynZv%Vj$M{$D?U>e0(m9-4K=*KV zpE9;z+SYeV@>{A;e1Oyb5q-03f;;b=+%mhz$GUUs%pTt}j9+_v{@qME+ctA7+T)W= ze_cSgHwF3H;|t}U?}ap8dw-JTR=oWsV4ew^{0f%OiUDjzzVAh^JyH*!u_m?q#>M6E zSyvTB^r(Ea@LM$wZR;2}w!7%ZIQgE-c`nbz1D=~V3-*xbbpQGv0Ke`<7w^S_ayoyY zb-j2h%d>Q|?jzG4J$K$!#~6eB9`Yy8BOWELHRx4jOk;FN`wP;9pYsF!@Exti-)m@3 z=`Rh^j|b^GSEBUa57IfqY|H0Kce#^Z{AuqnnMq&fTFw31Q@8iYxZn^Rh;Amg7uh#H zu7h&o+cWfC6Vex+^}k8fcr`~{8o=`O3123^7{H=$vjyXif^@!xv@q(tp!PzvpQijD z2Kkdg{!;R_#@D?lN!Iqq%16Asz7cS-+e;s*m{Q?F`KN0;CLRX{e51&G2X_qzcSAYA zojfv8(fufV3t!P%q?!FGC%C6%I`4OEU;0n&mtUa$*jd^?Mf<wD;@I^^u#G1w`BL6< zvLDi202fB##Ym=5E^ybQe73P<yLV0!9%WqWYoX`k5?*Wye{VqRMfur6neE`dtvQs} zU0ZRrVG3o=nm=LhLSXEzXUYG>jC}Y`zddGgEqsUHCFq+3{Z<#}tSZqg?PmC168Lnc z-hMNc2KHQ`EFW_$g*}080k_px0$+HyS%mil?}Z{~f1veZ!N~Zu#;*a^#>4)d8~cGL zJQp9{amLzozP>fHdOIEb#tz>E#Hp(>iXPE`@AZ9U_$>f7S@a2bC_Jw$*yOkQA!7{N z#zxiMg^93Fo$1F0usAsD_!+0hE*wmc9h_+F8nb+7y2nlWPGgpDU@LgnSVfl_V3sW< zxc}xXV@*<?@mBRs#7vlKX59zJw-IsRZj!zX$3mS28joywA6I9-pO{Hc{a&2tiLcAj z)8u@5PLC(!uV0Rpr9=6xfF$!kAZN8%*2s)u4r8b*A%DpU>!11tYuf4Gcl&?A=Su=U zN7qdAIsD?p!He#bdm;Wl>lo9FF^3ElHO5z3xo{X?1e$4GFTIT%Jt~^Lf<A;x`G@zF z?zCe!+-a)ut6%M@$Zx4T;VsXWeV)~t^)F|PKct6fFP?xV(VxR(>PvI0_yQV7nMV@% z58yR?h#CL>KJ>hNHC6a_DzAAw!}q!1TJUS`68{M9qaly--H7fv#n0(UPv{$Fr@;6o zHJ?myZ&e|Rjlz9Xw|ZldJ&(5(ANJ<vM@pIxYqBGy*MR5d9J(=it9Q)heggW+)lZ!G zWUzn!a^)j8I&UAL9r+sNTfB^CaKpUzWo)!t@e$*TYk_B3o2I(ulh${AtE2;(jvYSg zJ%-MG8u~fKt^5uga#-ZdY;sp6PoK!|eEEmvf6-Y^`CTL{l94gsXhnC+4|<IGQLxSh z5Art)7g5Sco`e(aj|iq?&`a}>=p|Z-KBAXBYfJg_q19Id{Pwta0<(`_ovUtS4D+a~ z_Qd~cQ}BlTFJ53>OrPvWm$*BFx}glbh;~C*bw3opgTnm|+wC_(;!XY8-)+qLx;~nw z-wvLGeG0yFY7~!a4^iV6&xLyY)Y31U(0S(PYvZZFH~L?-@#`08qco$99_Z<~oOi+& zXgD*+G%bDs`0Tmo7s!A86KCd@@Q$-n4txv$OIA(>_e(HeTi<?opIIAczI312Up#qw zO5avWrl9kM%=PCRGg4BT!YOcu{7fAHN#SplJhqTIR(OUNX%`vv?@j3o`i+(f_1Tu) z3pAIuv)7<+2vpX%Id9A1-3#Q0iE#!xRvaN6o4;5nZ()AZ9L@J!=-Cz3_EOHv(zoHh z2y|7we6Q^R&QkTe7vvbvQ1HHm_vtq6xd{JvKxeioJMdIs?>@_O2>a7P+W*uqsNWor zeCSN^Z2#arz$Y36eZ8O`+x~t7?PyNB2VBhj9RkVhEASiibR(<TTe%B^dl9bZ_g0v{ z_*9E_3*~jkuw|$}!amoi*-`l*?+wI%MBGOFe&Qv>?;~D~UJ{O}n@FehY=3K}sZZ&_ zSkma6455p#hOnM;zw21~C~wk*>iYB!?%&+u4H2@0y@Y*)Li#J5v0xm~LALolq#c;? z4!x@fNV}VGh%iYwNZ3ZbVM2~QG=1wSeyN3zbpFNi5xA30lLCJ;d4umWtPi%qaBpVN zXB^!tTbOl?wY6Cn^7~Ex8d~#;Y&Nxjwr_4%r*?RsC11GHGwn>3kO|3OBy}G$0k3y3 zuUOizu=A6?o!vWi`U%~C%8r!wqUTE%B|C~wB>iu8^=!Xa&ZH}RzgydPJv7N<8}q$0 z-;LXQG+OnYd(OYVs=Y(sysx(3Y{%00hv8@4n<2c4Z^CEYK@<n3pMr~;AiXvlo_~3- z?xAhUsxSJ<?%J{781L<l?n>g0mJap{XS6BZV)0DAo>SNFSfF;dEY<se50;_-L7k>^ zc2tg3Pe0Lr?vBbgh)*p1F8x}6NmI`X!Ej}@9b7eM`R=@9kN4O%$qRR+^1VItZIkvh zV$dJKg#NqFN`IeMLOj0LegluqQT`bHjhgM1eZ&pKw-dJ!?<HPBd@FI9_#p9m;=du5 z{~=Dl!r?t8xPO4>1HrS}4e_gZ47`eddOkAaS$B|z>FqO~$7hr|6{J5)-7`AwOg-re zwV`jrtu3D6-n5)=yG7H5GM{x~gWT%<`MH7Li+$mD1!-|}>*G;mOuxy*nh$>nyo|m` zGN)-D+a+veu6Ou-J$-{E-Y^;6Z8GZJMjP^-IrD;cgS>XynIO-(E{EUd%4#Yz>Rqg| ze23D5y{`6KX#eiRquxUV>2&RZNyd*7ju5ue?=ysx+>`wzVVtx)VK-;fq?5HrI7v7} z(6{l@uhO?Ob?hT8_gmXY{`0Teb<dhAyplMP(Ohv=^*WwI8Dx&EsxQrtF~)a{F__f9 zd5_Sa@T+gD8Mo|F`z&0ltoGQM-x7WGcY1xCW$#;fr|y=+CkHNp|8LPFGusU73vc(L zCqy^lMR;8#oB>BVo#PJV9Csh*xC1%IUC24Fr<mgo<Q#V(Gv5-12wB2b(qrkOSIcu9 z!4Q(9HImlMvrA|ow360NT8igIgf_xr(mF`%<arrk31K;DBczQH#(B>ZMhUw~-%GrY zP$2If;sb=c35N)igoA`_<P8&YsiM~dkBl&W>F0KIm}u|wI(s0FKTjx6I!)<u@UAl{ zN;_NrKJrvn_|%yf*?7}`;O!5Umb7Qr%iyt$4|Xb6dOi2Aad*1Q{!?--b_@CBEuszG z%N9Ge|CqihAEJ!TL2y^SU9ZZ%mQAa>Wwi!a#JU2$oi7`Cv7VW0bsl1go;&=rW4f0@ zXDB*}bv|MlvA#85PTWeYdk)%&yNKI~GsG$49%9|sw4Qh|aUZencFGcW5N{!Vr2fc) zPM){&Tr~L;%XrT5JT%EU4xUGOZrH}Xc|4Et{AA$>-+D}V<2;|@cOKU8yoT|05idG? zguW-dle|Z;!+Lnm7ALs6tKh_veG9N>9eDUWd@A+Ck;jAkj+p<;zkx?%;6=YnxCoxG z`;pl~y?9Cc0I@85#Ix4JF}|Pf;8|zdI*E19$1-BwDI-2>BTf^y6L%4(h%>~Ch{f-V ziPsY^A?_pYAkGqZ5^o`1MlAkcPMjl76Aw-17L4+|nrD;AfeYk^=O;O9HO_Mv&!={g zb~tD0``A)s2Kwr}YQr}AJ`CUTe3JZMGuB$3d%$aFexJ7_v(HOs@v-mPQPS@c$p^8d zFjk4BZat>?SGw8ytl2}m8Q+}NNvxT$k<%6N?WZVzU&Z%NeUfMSz~zTgAF0AVuZ=zu zcim7*kiMAwwjymq8|9nHLUnIZzgs7s8?$$^>?IbzHKtj&G5^V~Q9t(gP3iX_eZ|an z_TjHCpHF+SjQr+T=`Kmm@9y>1u(v0_<}i8kS9ZB$w8J<i??X;*^|}N9;zw+L4*Bu- z=kb43cWE5ybmc>8m${|Z_2=ta_sd>|_UH00-q61GT+;rHaf&AdORTuv`yTI&X?*>p zHM^W)XKzfuS1Wkx+zD@hb{m56g?O;zW<4pH(wJLw6F$%7_A#zCReXis`>AKgz!`ys zf*;(=CKg__AE$f1)(Up^>z0vT2OdPXo0!YP-w%zG9^z7C)_ip(b!rWJpWw`|!*6-A z7n&q!ouV?j3rqdD)VZAUb=pIvj@rj>|ET7VhV)0hIR)lh=+!{}oXL?=4RG3YcYCRp zZ^&y?H`_X{h3})BW7|>DS=?6c?rP9JE$yqHIWE63OTW4=O?|i1X9MurcHLplZ;X^; z?ze$&`*H5yAzi*|`J_fl`n_nATvhoG(M2$+Z_YhIyD61<kF{~qRd8YHBzwlrcg$Hs zfuBJ<l%>4rtltGfj>@+Obk&(9!Kk^n#+4lG_bv|jNxnwWUHQrz<^0EJYP@n$kdLp& z=4-!TB+t3YEZ>r49`lAf9`g#N$Gn5w5qO9@e(vUupL+_syaSxy)%n+h?A49rAE5jL zlz)Ko4^aLA^2aDYM)@(y^E(Ul`wxL1lrvU|9_|fSS|j&Vg=1rmsGe9@oc{fT&a;$} zUK?RuT?hXf?oJEO&NM*t>jFIJj6--o)u%K+1%EM<^Yq)|CDs_>`r`5W;sVwV^PBKR z&CcW9ksrvx2lQmJXzRvY%}Io0PQIox=V9aa_sUZ%Dxu#%yxHUEKGj@hV{krXy)(KX zT&t|tSxRWCHOhL*seUeqM}v3~?JstHc=fC@i-UMc5O)M|XAmzVULMrZv+67lV)1O6 z=SARG>B9BQ_toUB3F_)uW!407R}g1{xQBRsP*%?>yFQ5ff;bz*nzK!^;0y)tTY`8i z@iRdixgc#ch{u9>Jcwt~>tub-;t`tt7QIfLB`>SBB)Y)<_IC&NIrC|Fm(LreL&$q2 zaWnQ$EA~=jQNE>-l7rrGlDU%ZFK)wL)*0htEBGE58?%j2>gL{~!@eEWm>RWr9Lb(+ z#{PO0@>{~za(I8OF}HKBq#DU^cT1))KTkhx_&TES=%OO`Ex5Zq{bq-JdX41CR&B$k zmVZ49f5=B97&)`iq;K)x%f61)kF*I5qs{!T;y1~|Upv(TO`G8@aAWW9QT^7lq`57? zfNZH;Ym4r0I@6!l4(u@`ShHKZyF?!IhLs`FA;hNvmwyP}w12_cwrOVH>eod^nhoDG zxO@kPoRD@<_c+&rU*q<c;+#)&=HU-c4wn|PzdnaEQBlss>GvYgxsU3%6{6|hr1Snl zbUQS2@X>JJ-REV)OK-?_H5vbRcN>$WrFWFXYi@eflTW#pzM8?UlkTOTE335gah+3& zqobW<ul38x=B+ipP25Z@TEy+W2Wx3-J7EX=?A#$?z!B>T$&mJsT!Lsc8^3yYUb2mO zqffAuzs~RfIM-cPnZq4^_DtUEhAYzNwlDfNnQJO@3}^l_BPH7heR<$o`RZ5wb636X zU;B{I+tLJ@+rCSOu`{`!D}pU0dN?_szoQwxQ?#_{vUm5(){@W3$;$t6WwmtusE5+S zKX_I3Soi&&{OFp0wB8E&4Zlqj-<v!ko<7C1`c}UxGn3YOpUGo-*Blc^UhLeJO51xl zH7CVgKP}9k!~3bFU*M;V*jt5$qE}nJFJI3mTjxr)@CVkwANWO)tyNX=|9>S{5qMoR z6MW+T=3s6K`CsYcdEr4kuXn?r)jjl~vmNRS-ERG=!k@~Qf^+ebXX!!lpw^}*79N3q z=oZ#5$Rxi(SBSzt^P_GdT58F~!}8O(qpdJ)8ox8r!rvkiJb}z{F6fNBFBb2mfoBD_ zKYY=Muego5if=BSqnogwr*#t-N%^`djc!W+*Sbk^CmgD;P=|#0lP*zuxW6QOL-<i0 z;Zu3SXD#~JFjt~85--D-7iC=)H6tf#$*;pdUza4f1nA@2KKzCq^<IUseT29<m>=Ch zFSaG~3tHX$f@rEc88IUauVm+i)*xT~xYQ9JM@=Rv8ijZ^MeN2Pk90?OFpFl~fs*9= zBuKn%L0xfOlJfPYILtlq1xNMW7T-rHU#a9yvej0PFCRS@H|8SkUrMKI{VKig!mq;H zUOOk`DoKmK|5+RRXhZdd#|Ct)1Ae6og+Ha~n}peE$sjF)49+Y&yM7ve(U^pb_QQJi z?>RgMFV&fSCu;wLeLtQxe&IL9yOZjuyc(QAuRX>Y$)7O!J@CSa@FaR0XsYKnp6I{o zxagoFdMuec;g|9A#~pS{{@&R(Ir&MR;FHhj*^K_K&nl;i(89)(#FK~OxjqsnKRqXx zixK~wlS?DOwgdQyzH+OHKT-Rc+<_o|CP;5(QK@pPu@ELdoyfJH!wY}yD4@Tk{3$qX z@^53gt!$=GP9Dr1Rs89?+))(8<fme}6bD)+KV6%<mrZxYLnztFPepRB>&IJK{C*z` z;^pV7Tr9WbmBf>Omm9~3P`f3?pN`}XvKgxU^*ChJfBWnG^e!ely_bk5KM~1oxj^a3 z+~`Hde2Vl#f8ghDT|)XHCzs>iL&4c|HSyoo<ccibCO>^%?!a}#2cx-IpC9)qW_%4B ziK*An@5je%9M3Hu@be!~44&`F5;M;AgT#}Ea)*NWR1jx3`S?6SEO<};iOL<!EoLz* zI13;4>+Rj@mn#JEB(WKd<c<<ge!4lgY{bt`2XS8zj|cGqVzv8N@O~_aPX_VRK`hP^ zeQSd_8N`i2>;`dL5HAYiB|+R7#H)k2Cy28_yd{WpK|B`3`5@jG#0P@-P!Qi8#P<gA zLqU8rh)Y3yB8X1~@iReew)^914&uech*WNDhw$>rT;rJHL%FRt_~l|Z`h55hvG7rM zlOHz(@uDDJ6U2F9%kM$lFisunwGm5CFClIvUQL`LUQeuc_XY92LHs}vKNiI6hla8j zU2wsNKJ=kCeCWbA3=Cd-!J2n3zhL28-@5pM{_c&vo3h>OdTGY|cDXmEQmG5JZ0zgb z1nb-TEu?F%c+cvkt1o}g6?#6Oa7pLV)k}#l?^IZM>1Fnr7)Sl3SFFB#_4|VO@=Hmf z{<~Md=Utax5ym!+PTuz0{hu99Qa|{P-l25&;HC}z*RC4s9@-4&`+qs2JfT3in{bqH zjPMMh7G&}Ly;)4?B4i2DjRnF3gkuCII@3W|O&B8-2uBDf32u~cx(Hhc2MPBOjuM_F zG{>k%=pk$&<Ov1B-GmY$73V$>!W`gOM4&5!IyB3IXPU5ghY%Txo1WmImUxSvXZ>xm zqjp=~=C-x{$-ssl_qDG{p~g(#hP5JC7Tol{VVyC(Te96lAAI8*7QP{6Hf{LR-hpe{ zguYAGcMq!g%(UfUq6&1b?liXGd#+f0>6+Cay!d^qE%B6g1r!_DJmd~s<8JKTI53EM zF`GWzKh(X&?HwE(Kr0#3Kj8NE^=|C#A9Al5*xYZ2(?2leeyF#v@AcOV3~uc0aoaZZ z|4DZrun!Gf*W3RZv$=m=-@qm^>^t=79vs@x-RG_Y*zR>hy=r*lhD{s0ht{oEsqSmR z)8=g7hIQRTy>9o=(BOu(n}>SMA8+oz&h5U23U1H9y3H1d02s5Oudnx7+N5n*Uqt|M z!_bG_!QN|n2YdV1Aqjxnd(DP^y72Qfp26OAn_;&<={-yNZU(<@{op|Vz~)V1mFeaf zj2n(~dLVB9=8bFZc%D;k?S}sD!4HQ`&}RUW+UVT^u>C+Dz`LP;#)$D2zI(YlFz60Z z%<bu2*T?XNHVpK;!g=?Q3%d+jf`uajMg0RG>Zi4J13gHQ#uz@ko3g#@He9m-1kj6G zp4sAtO{A_H7z86j!c{;ss|4IlB+@Nyi4jyiJ2<eecasG5w}vo1KKh;}6wM1}0PgSU z?i=X0^ni<L7<epS4=NXmzuwLE^>%OSrPux*x7%I2`C7=B9T)_z082jL{y=7v9Q<Ct zxp$MAy`~o(GT2M)>o;#0?A@e6O9b3ao3m<91G!X^WY%@}3p^;<f2}$m8q&xH;2R5@ zUe<SSa@Y1=yBRD9KWoMQpaGUbkT-7LG-L-TCKH*c7i1Zsbt6M!XdAl+uiKop_?yM3 zv^kq1v*gO0l?i4Dp5O}QV45Y{HoeAnw|On{<Zh6_hREIwKLD+j;ULYDXm+{=-@O)e zQB>vhjvQ^+gtV&90C$`Gdg^VOsn0^2O}&GEB8pq=xNRu4*SOQzTifeSBd|w|?_(J` z=?1j*i1qZ$W}l$-Z@1UakY~0y%`CKcrgiY(gD|t`baybQ^dMcrJV6)F?Rt~Bo(U-? z1elof5+-iv$~rz1e4R}(Czz!57m39;^beWnW<4K$3;)MrHNRv%O!QIS;<0z}|D3ck zA~m0C=lPX3d99KqzcHuw)i1KqhIzKykLT-cPA6t|EE4Z{HBoK+0LF8yw&so&qFDS7 zYM6#%@tEqzV}665<+(Qc35rKQp!DcFn)&a8_VEtJ5xs7&QXfw8U!TB@jxwIui=W^z z9(#)a=f)V^(~k2srx<7b_EwUdZ#Z`nu|dI*oNwBfSmGk!b&fc9kx`qtP{qFGTz4K; zPhxW`FW+&xNNY^|jINxAZL#LWPqF%)f3rDm;sQ){=Mm>YinS&h&*$aeZBAR_PhDOf zb#AL+U6J?(=8N+^`;tnu0-W=hbBL*RQQ{HR`48t2UKS^Q#O&;R-}xmkOA<Hozw-m9 zWiAtYBE`6!lCzAL&cp)@$|*amd0CeD8^Km_GQ2ELd`kUPojzXDi3c@=W6l;{RwsJi zz>DX6f|oUk%arp&=a;;6B_4y6&T%INl`@GJV;49loNiuv5^qv#k2@QAS)X`VIaAJu zdFe~MM>$V8xAT%sY|;=;Iwf#0lvoehoF|=clCvf8FE8WeN6sqPVQb<ag^(XR9|s}1 z#MN+tbILi&%V>h-lX0GMJ_k5si8^XJKXK+V`tihq244Qtx$+zgnnZIWFHbw)IoFuo zi65zfpW2*b2`%THpE>_ZYbO$4)_8tyDStBYerh_;*q0|0=P2hFmh`6*dxVf*+Lxyj z^M%A;*_US$8&v06=MErvcHU=2?O!`3mVm~Yw~0@MoZmQK1d>K)-q)3P+L?kJ&Ca}y zaIa$`;uzPN_Z_jBW8Yexd7l^gBKED#nRl`BqLKS)r5!)1SSV)SQqH^|fGZ~+5#KIy z=0%YbXHJBcF&gJx9_6hjGEBWC&b-a4R~ylwJDhnxeKBuy?OUfa@1N8|!oDqY=KVcI zoO$+bxijyJ48^IlZ)s;<m5!Vj*|*iSBE~o;@*q8|apt|`RlJ=WIl^0)^Z!uxF7Q!R zSKt3RnVBRcnIu3+qJjnp5;a^+LeyLaf*Lex5&}U11w}<gOEoGYYE-P$QYDotwo%Yh zrPW%hs8q3{MN3;RXt56}YTBZu-X7XguT=lv-`aCdCg}V5zb_vqd)@ciYp;Dd`<yeA z{RlfyKi@o?gPvN{->|v(BHn<sKO;HM&)zi*Y@pek?`I!!I9Ng2PIwFa>{r!>L53~# zv+q(H3e#?4qUi9m2gSjP3|r)9U!YDcwze<vvj;N7{R0f^^s_US7Y7=))X$zzM)(J% z9YnFr&;E<*8=Ur6>Raw-f3D6PlBQ{5g`a)BvgY8li@;W5MZG>O?JG>L^0WUeUxugU z^90!%Kl>Sy(JwV@qo4hTd>N6Zd19NNy-6`UG;IRdc0apFIWaPA1K18CAwSE~dcb!2 z*)OR#4@-NIqQ}p^{|K-nEM~j?>@nh%8}<)BJElGwmG(Ns5B%)mC17LB>pi{~IhzSE zI#^!kTtjWq=qTk}{3~4b;;-|^kN=eZNb_<&r}5Ef)rU+Z@sh*DuGAQe@1+50@t1Kf z67L{wqwyu9nJweLWbCEKuOmnq@s*6c%=qUF?SAp^VIV7hGYOC#Uo?Vx;~(LCJiZQV zx$%RsmKUE&a^}bHptJkOeWE=eUV>Kx<2Nx=6vSuZ+@Sc<63;7)Ur9O^#qXyT#qp8U zctHFh679gaX1#;r<M=x`J_O4{;@9HC!SR==@sM~F$&&c}_&GFw6X`uHeiM}8@l3ob zjUNYPM0_P-J2d_R=`b?Bj}9#Ja)w|c8a?}9IPnZZ;Kwy~)8Z{S8i_Z8MB@`th{dyj z(+TNFDO}Vbg=WI&#Sg}JKi*A?i5c987umuj7rpUhWO9E^5*0+htC>BI``}*mCWYI} z`#tf9eoysA^G?Ud=yHi<=5>?<e_z>>ledHjMQ^?ndOmBFawZm4#Su?y<!uiFLKa)& zy8mhf`Wqw_ST9keOD$3)g?rxyk3~5#_wqGkrYM+J?;j$H(iSN_UVvmQdLV!EE51R= zL<i(Vx6Fl^cPoQ3`s_kLFK;)0qR(kzispT&7XD6?WTrPzeoCZ2O_gnF8d0*&sU+tz z2>H@7DxxcZBd5`^(XDbO@{qc3-(!HW=#%`-e}z9O?Gg%0Eh~7w1X<QN6Mj#^S~`1$ zy@KJ2eaug1G{>Sj{LR;T+AGoD8e4EaT^-HxN151>64OeXBBtuRf{A2#G~engn6922 zXsblQs50OJ2QN^Fhg*#Wt)yA>aDS<py-8-Z{_bbi^{?|I!XSuNIzx|Yq)+jmHs#+* zS?hI*vQ&DN9n{<5&f_mfVq~tLPEct-fAh7@rx@w0U`D)x+8nel^lMCOlC-oT_&;iS z1sAEIi!FWye>x2K8W*HW4GDhs$_#yvzXRp8whd;?D|ms?9bNC=YXT1h0@^+F?+KgN z*GI45bfx6e7UDrU(dg&?5N6H73+FEMqF)&7W#==CMfcf)?nSfDVMdDn*Pn=3G@4zb zocPj$oEi0s<k2WN#dQE*IS(c2nyclU&`F@6umr`g{5SBfV5<gxe%cw(W6`tuYc0Dv z)H9!j!aknjfS)s`M57InpM%8r(UV^MawZZ#{u_dw7B8nwd<A@F^n{33i>!Y!B}Y$; zER}_<Ic!OzO%ZJhqU5yNc9I!7;Gi_%=z_@SvU-Pv<2NAX$0q~w^*1@uU6CWGAgfFB z*E<n4*30^yCc$?NiDr$GV}Ca!(<_*xcI`HM2VA1Gj{Y-pBL?D4hs*eG+{8GeAuawH z9UX~Zt1gajW(JJKXRxxQ#|vyV$-``Bd=d@q7avc3S#rjUZj>_*sssJ#1Yj@Arph#9 zM6>w)buSu;u7Z(C<P@9qr$7p7sURAS%9Y4Fw8Aex7jo{;sWCIQP)m5;Liup<tB}3C z!=cA65ghd*mk^Oy$Lq)p$d6stK;<?+$1b<d%^OGZ#uf>V<}rPEu`2{;<_#vCvBjz; z$BV2Y(6KA|IuS3@$jleJ`c%N&cW78s?1n>Wao)AeVX^O=1L)=5BQrN%2ArQ)M3`dB zRs$F3wX$%=zV}<;!FhM^H+IXL{4L4r91FbS6X4RkZ;=(TuAyvZ%JTlfd=UGgWXkh~ zGn8Yu$<ElkpUH(gjz^{<@3-_)?9Oq}tMd+GQH<SvG4z_e7RlWE6W~PNT{s)NU!6ZW z?@amgfST2qHw*t`zYsjdi`>uFEY>MQvFHT;T1IQ@-QWHwDE;lv9B9aBZ=HU!EJsBy zQWVr=8%Pm{e<#3wXHM?#XAX5qS#65Uer&4}nV$wSibk&toZpKh4-~&X9KPM&+11vt zmt&KDf6>rZI>e&?MKXV4Uny&=Xz-O_vFJ#U`~{(u;@~1;G|3}$xBWdyqPKs8sL_sf zqIbfNMVn1w5%7V{v6%k?K-PPVwphBa=z3XSWPoHCqX~KSM#0@IMX^l(X9yn@O)pSK z#`VMU*TkQP?ZrpxdLaHkEJkVZ>&V?md^FQmG(JjM5kHQdZ+iTB=o#^iq<Ln1BlLdp zb>vc3e0{05eYp(mocOtD#p5%P%#FXwV9tvlHkg*h`7HyseK*;*Z}>369G_W&Tk)0X z4vO!?@51<NOj||qkKh)^r;}U<#BXO7Ixzkb&K?vmgfcijhHM-X--Vrn<F!~gB)*1P zO5#u9;n4Uh*1%!$%>-k3{9onT_FY8nBjS%@|IqkV*dG~>(bBT`Uq*S}Vevbm93H=y z&N?Fg6qd{5$1<8m#h+o^jgEgwTgJqTseNpGEcVC6ujcRg_#EPUWc)91E8_Q{RT+Pf z7*@rH;K_veENZWgSF(g06+ayK==gKU9}~Yfol)lHcF~OD^!8t2HSaDePM`5QpqKZ= z5x}!207mm-%!TQvYxrg6%_YR?b41U{n@AAT=Zc=6moXCfOu+>%XLZ-Hzx@%><(X2< z@|ZNRu^Uyr5#4}HpC`iL6OTRB^Ji-H84&enXA=*b>-^K-mseh7HeUN@d<-(6z@K|6 z{2`Zl{+R;2yib^J{If0sjOLw8_xtmRIX*Yic>ip{IYT&c_xy9tMqWGEGbm$GRTGQq z;3WNSX3)q00_UGw2tFXwzwSqrLl$xa*(w>rQJ&{770lH92W<K`TnUmpl04)IfOJwe zuNH#ebp)W7$KxxW|ATSbR^?qx!2DYUXXbrOkNYb-fOCdidhvOl|3huJ^Ya#vWBzRx z$h_?u1-A<>_Ht!3)BlmIx|sY}Ve;}+vEQw0&?v1?{meG<sGi==@!wMwPT_skko4|@ zgS2kujaEEA)XJQhm&O?KKN8#z6N^zxpTM8UXADw*l}yH>*N9NhknrzRO#_Pk)gMp} zxuoM_&tKyl%2f;Q794evxJPhip3g$%|3t0Hajje{I6v<Wdei@@-~ung7wCEZy+6k0 z!MZ^))_-IMYI#p75|0Y>@|twT`j~Plnzuw<yHUECu8qHzJ2^wny!0H;fBbIfrFs7z zgUl0x%kmPWyT3`nDyKD{P!4XJc)aI7DR4lk|J28-O>4Tp*|nxi-aYMF^MPu6#?`h` z{r6kJIeD2Sz*{7fpI0FIvw{oq$`!fi1Q+L>FcSE8f(PgImls<V>5{xID)xUbcxYZi zE&GGuVP0gUy5^7P;m?4<{tKrw1=!`9|6=dun*UPo<(j`uwlnjz0Q$ND#jh91X8#qz z`FWoxC;ue4An#c9(00MaUgS{{fzv_k=UzztIsR*_RM%IdA-^urbA#y($w!A=!r|Xt zP_@4~kFsb3<Ocz4-6T6!;j#awSY*fBSy;~-#AM?42=ww^jRXHhaMX>Zznb4e7Ak}O zrVP!=dmKT3myHKEVBgVzEucnK6#2V4^xa<ra{Wd4B17cs|0-Dr<oN%bf$brj!2ACa z<mEM}NB*s-M)R~m^Y>bfD4z~LeJFn-f5?LVpK?GfeDY(;ylo27r<Y>E%PVAA@IMnA z&3lNy{^!m_q?q~H|KcL)75o4FLVA`wUy7d`YG2t<%hEXZJzqX$W__ZW!1oo>oUE6I zf}|OepY<G*p&#*ON)0|s<ylIFsDCf;ft&nvKbQ3;>oz8TKf_;0WH=+%_{cP*Age|x z(9e*vtS6LTJYR<x7epGl*}e{mnzMe16+g$2`B^uqRk?Q3*qODLN#5^o$hBEl&=P-u zA=hQiQcwmNa(&iQ3VWfMUYhj*ha`Tnul`t-RiYf=2Y`wBnyj4~K?j-BYqLt#*1^6O zkabzNFem#%40#|cN6CM%A?vg5(KK*~g=9lk7d`El`1hf+QN0Fwh;Fd@L;X1MFS!+W zi~ZsL5`|@!!dz;n*k0CGnj1$L63w!VKGdW#v)-53NMDDMIaz0@>at`9yrJwm%zRe| zlpqm{YFa4pl?8|Uq7>XpJpFQi4e&snX6a0|e-9p}taQnZ=1Q}$%>MfL8;dICV$lMl zoQ~yKR2et)D)r6}BL0DN=CCUjfgeO<a+u9pKZt1B8eV!POND`GJgNacJL)${!=z?M zCFQhdN2P5VbBxU1<66b?g92L5IF^=<fFS71beOG49~9`sbeN5r4+_+U!}_V$KXkB- zpbra_->#Mq3sg%f_m3Ha1<Kn)pT=-0OWMD!9&h-_cBMdMkeDMcRiZ=($piecku{}A zL(9*F<7`eT>VZ(kTr;IeD}U*H&p*+GyrF+k(mYk<S4jFIW$IH!2LDlG`>CR%p%YOp z+p%Z@Bwe{b^mHxiFBkdeOU=f?%SD3AE~J*1i!{L?uaPmdQq%S$MgFZ~v+_SuWRL_O z2?S+x#Qi>k&lPDG;Xf<8=FW5G&hXL>Z8d&xT#W9;zQ41`|17M3r`12alp6k0qzN&p z@;5^eANrq>=!`D(E7%#!k<o=ZqBf657s}(2R^iw}HFkLE*`9x7p*j-P3^jK~p?_sk zb%v=9TdsjQqfotSW@e<AIjz^s?4+3y8FZ7MD3ZMY6PdbXoN)C?*(Kux&>PXEd9W_7 zk>LLkIoFMK@g96BC2onh)@yIX6irR<Wt-d%_QFo?y==)1vu)FR*#{8{mx}LYYql)2 z?a}+$mU4?VI^WNh?qPRDfIrOs2zbQ*)x$4`zo@AEC%c{6N)KD2r2Hg1!r(vn>*}e` z?i~I*-0;6Ny&)qvqwV`Sipj_;hXSWL_-L(i5rZ{IV>ud$r3=o!$n(>4h+{Ag#^=~R zjBJyDt)FUwt)Hb{`dh$8lw(F5;-&vvZTts+{ESTNjB{YR;ALd?V7pYiC2l+EKE?2n z7i!7N&Qzr%Kh&(1<KW9Q`s0~*_d0W+A>bowG@BROxb!!N){6)Az#JA=rWX%Va+S{O zU~N5ckYq;MVt3FWb<OaR)_(^NQva#X4>2<1Pf0ssvG!C)+g#}%!A9LVfAm0^FXPb( zF?DI^CZ3}QT8i4H;266)Muut~?8a}+K#kv#)3rF(nPKuvmjHLV>8&fQ<xZQTTrGDN zSS^oJt$$a+ELS_09X#@A4Ujc9y^Yi<oPT$Lddm&wdraONF-VNZT`g~iwLG3u%i}4v zJdsk1gPr9k&9XP*6|MLUnKmXy0lUaFSho%{KPPAQ`gyFu!`4aZxJ)fEE&`2az#DNH z!S>&9Bk_vR+8Z_!HKFdbk?5lNroqGZs&n6p_uA?)b#KI>#Mgh%*?Km#^<HS}{S;dt zq}ci}#n%5OZJjDxmlrA}{hLZ?<?C|v^1>bn!=BUvbGe(Ms$c?3#-^ytQ>LgZY>GN` z3_O>5*Ay!CM%HVc?=1Wwbnnnp#ck6naZ90=GAFshN$$*o-c@Kj!{J(^)|*Qsza{x! z*|g{6A9C_Vvixx28d+w<uAoeJ3-^x&YP%DQ-YZZ``-oSS<-f7JV*c-;y1x8PT93!S zBjzdwFBsx~CGK49;a;#?jl&)q3jAW4ruAXZX<dKG=wA7$c_8Clf@1|1*L$r<kFq_& zI2%F`z0q{<cpEH!%V--eM>?!^jCFCvKy|S{)f=mO1paq)BgI>1=5D~;IMlymISJy8 zXT4cw*aKkRk-yVqyRBe7@FqTf_jGnE&Vy~1_@6@^X9IbgCI4vOnS9yOze$++<nSMX zS8PY6gHIi%D$_I_Z!eIGFT$*BECYYla9wv*eSlyyp9vpm5_`Kq^`~{st1f_fls`4C zYt~VIYuaVNEoohCNBPZm|Iw?SXZ+Um%e;U4t%Ko4DAj8(<!~DEclE#(IU0Nm5G+tD zyWb@pUDK|}>7mN6;JBtO&e7~KguU6QU7A;~%#pvxfV;*m$<atX72JjVD&wbhd1LNj zPvl>1t3z5>^cZ5@X|icuO%tr?*P5t5eS$UoI)}B_V9uLhTh|py`R4IF;71bMnsPZ+ z)ixrdbA!r%F}(Z-b95Uihn7?&_#=m0%pS^dF>9+{0NrBNWYL-&Myo;(W)4PU)o_}{ zq<nAA1~39zz1ehH{c)z!M6YclEE|wBOO1;DVqlAVeKp%kCDn_@Z=o;5p|cZnk{p={ zsa%i$Mw6;<vqdK&GVXW(ogllO@NL#P94A~)q{Y<}jo_{)A~xro<M_<yQJatWUD{+% z#Ec*IM0#8c3_amun`zSIkc(}<IDz!mqpXg~GNwP>rD(PpisGW{sT{-oQ|op@(nBj2 z4id1HM4PHsDkojrw^65}(wnIr#?$t9>|xAg{wIU<8h}Qb-(7|iW9$s!lR;X9{ALZx z&kP<$W#jSfbHf&bc}IRJt-Fi#U~HQin2mu^wk^Kfwy?jE5_8^9ipt^3U+>5rtY7{E zMQtc)bot#s2$dc%r7x0751P^ew7@&^!o!i=Q=~T&TuuL#lI^PZ*siu3F**A$+so=^ zW5q^<8EoDzM916Sc&{;Ug6UQ5OmdGg&gaJQv3>OQ+R9v4jFP7pAj&N*ZeyBtX>na~ z51c!(ag6OtmKJMY;<t^zklpYN#kx{{8D^!8pzoNOUEsBI(7F;Um3C>e!UR8oQN5e7 zLw7~8I_dqYPOt=`m39EN*2MHhRCL#ej6DCLV!e$q)||R{WZ=|8=2RJSqh@N@KWz0L zC;Zt`@D0VfAAYXzSNY>VQY_sY0LRS3wEt-FB5-omwP~Yk(`gm+sjCx#cDU-t-xp5+ z`w4pE&tjMP2dm~8(8OjW6(r^2BK`(L?F#Rxw5z<d%TcS^gN!DJ@t0i8K;KlXm9z(C z&5iOe7FE(6{SfP#-)fgJdgEjVVez}aIxJ{wYf%px*+{xfYqg}&Ljj{~bJ%JZ3zrL@ zthKb&(&#O4wV=(gLZV!|2s87_2z8sprW-@ypQy{!&D6XG0spL`N@ON|2<<kQlRg8u zAD~9uh6oGnU%;50)}V15qSlujyd-3z_7)p^ku1+wOo#>p^D@M1H}mIJ8a19P&2#KZ z^DFFB-hg@kT*D6|T$QKDxA{dEA$=;i`8FTg9th~YOois#uV9*QZvoVZYrYlW12?gB zQMLoE3Ta(X^r^INhc*TFq~!p!Bv+G9T2<DPl>TK_<Bd=&dvtzwxkcw^!vA$R_#*T0 zcfu`tR~Y{t;p-Uc{^BAXSP!7eTIK3}hrx(L@jFfN7#QQv_xx*3?PRcH74$7Ekj+Z% z&LV5nTo~4<%K&P`u}0ku#=kl}#`qYPgUPNNJQ;8%{@#gDlbu(m+mnBH($TIB*Q9%i z1eBz_QPA+ml7RY>Ie&vK4CPGu^d$-S6PoR2fDQ2;h)<zB%C=J*;!5N<!E5FtI-!3F z@{h%J7dz6m>vHY+Hrn)Fu?B0)(OrqH@wRi>9GBfM5j}1l%+pAh;~xMZN2+@$aVgTZ zlhISX$goz2F;sM`>u8;h`;&^bvS`}gVxFFT1fJQ{IH_0{EC(wrov`9C+(dYOu`d5x zVN|Zgu780I<b~jg?btcTvX*s~jI7X8UmCR)q4p`JeKXR>mB5s=SF=h@H)FHRm_N<U zbhAzPZiK5JKv=yZvtD_drcJ+CLtZbCEr;fJ?+tzT&G)C!bIY$^tmXF*T0PD#($b3M zRIPB^<vIL&;K!A)vHKZet<%Fx?_p7s(&hXOcWdn2Y}aty{G_N?ei1(SRpySa(`T4F z%gTdLRylWEb<AE>=FXd;I}^;EFGF`6eh4ntFT<Sr<Z_JRiCd(#R=28m|LwN~`MWvk zOcM9XA02^DGc6HyW6QId&>IsZ;!I1#1a*wMU(?1+%d*qKwX>dOn~0CZwYA9MIdty? zOWV_vJCMnh&q?_V%i`<BewqovpJUsdw64Ypb}l_PDcv+-tF9@|Orp(|C)1h!S*HA7 zDckAoJoAK2++>|nRg<MnisyszTShUWUxBuWa91_LU@Gz&-iC6sC~Z*aa<Ab%D9=FQ zU+sEQ>!{J#wkz*DEgpXJM44V#;9dpt?~T8Y=|-83c5IBSuIhvn+U}8U9Yuw<3lvXM zBp;%WZRMp>#BC-^p(+)J8K>1a$rUYvbuXcMwIo?On_7pgwJ~#CYdS%~X)TmZR>1;x z-W2(1T?vYuNY|!oC^HE$MO148D`li(O`2D?9y_-uy>eSt){OcsQ03Leq*vl3H+$w) z{ijKR7fhhph;_w;^l$rVc!>v~x{YC9Pt}a_Chat;2I*Q>?{Ll%+I_*;An&RM^&q8( zRNT<48l<7w3_j{{82*Go8k#pbK09NFZvh`~Tc)GzDCbMzx@&T@Rn&s-m9~H%W5+o6 zg4g!Y^ZUqmt=y;DNzprytL8Czt(OZdA+wE~M|0{|Le{wdBN~c23w-@{XjhM98Zg>a zzgi*ds7ZEoBFbJvDoJq^^10Ykkn?G7U}P*b8L2edR3G(VD(NUonyP;uA(@)etC%Rm zyc8Mss<}1oii|$>d*vStCtxSowYFZ9UC!Ru@7_8-2=xgAduZoyTIWK2f*n~+1RrJR z<tNy&)fwX3tazebe|Lhr>v4zcBE%MiCOg5><)C%M$pdZgI-}-OP2M(3G@F66uH-de zi#=xYD)wr}k_Ay5bDebKKrMRblO2`sYnECzP<J+#3D>h9{&xqSi{pnAlksP<!?|hT z2GCm2ilq$E8jyA4khKy0du#rUFe`5?NB0kA`$yo32M|``S?sJo7^E649ayMa$HcV} zGeH;RBdxyslhJ|!+m%T7>dRoMC;n}$scBcD)M7i;W^GOr1<ZLtBFJ{_e45LFvv-W$ z**#;R`h*EhnK;LSqT7Mv*#yruEJB{u^$>!Skqd{VP6X<U@$&jxJnzgTr>lu;QfR5w z)h(g(Z!-Z77IbMF=~|TD*UmbuYaMyi#DWA2uV@pW(!^Ao?of9J(#a=`%HL$O?e|!; z^)9yFhxEJmR0PS^Gq8u2>z<@bw!c`i%>f_v$zVkPYPq3NHtL_6_5Wu0UT~LA@3?eo zn_#*2uH~A4n(O1gTdf)o6Lfgt|HGo@pE|{t<*N&JQ`C0Cc^h|JD*mT$Dt>Gl_hO-T z9dbjEbE)`+rAs5xajCe^Qt=${`bF$9ln}d)OzD(}CBzC?N{A?SG(5)=>`2#SVs1;o z@q6Ku8Hr+!Ar-?U-K*8xrOQ!ri7~YxB{ACUg!VaVR$@#uET5jPE9aW`T&pNpWiG?J z8mLN)E0Y{0#xiI@CoWcw4<;}VIv-tPBrmVrVkI+~c&fa3(WHXK%AEmVBJsg~CKDU? zBb2w{v42sn&ZP8c%mdWxcW<c-^5UXg<%RC}YG3iK+*x4l!ffNU(C|yaN7<p@w{z#P z8r%wA`M3;SV*Fo$yKe0;oRg1ZYzKU4t`-ljpY4q4vRoz;?<IumHsHzK_@K?3lH4V{ zJJu*J2|8t}9d-nbc842_Fj4*;CVW55+Ejw{3}!gL`?ac|O=;GqPpL?4ikMG@3?SF0 zsNuTF=h_srHnoB~H#5x5h2XA@nI^v$+_kY^(8k(5WXl?Ab)#Uo`IFArtKW@N+Fo7{ zGnn1D{7{;8&}j>YvMo+_yY>*RDMwdz3((zUdO`EuR^SR08&P!m8idVd3P!#1zmV{L zf4lJ3moC_~fA_EnG}DG`f7|39fO`sxlbZmR*o1J9l`=H8xe!B*5q)FBLSK=+Pe$x` zxG~a$#0{vq%cI7KRtnwAtN#@7yGZy85vHM$j?Od|++m)lepzP3VAAeb!!D~F)+5LV z&2Ncxtl&Bt#g$Y#;yCivA7ZWXUqjp7r5R$4(47azDq|=Pu}c!Kyoj9QNeAUv6ASMi zbG`6rT(z46Ulhvqm*n~~mOOu7q3*+eDEusDd;h<Mx}M5mM2?!Ex%10H-TOTpywdKA zdPTY~dZO^vN<Y6yP5-m-CskFN;f0LXiMsXNh6|ap6D_)}ntky|XeYu9fyRTNr2p$k zn5>y4h*sKdgN!0AwhIt-Ghn9KeHwg%-9G47q&E38C*Fa62es(b((hOF8HO5v-fOdF z4)lh{AiRw(YqNGE3jj_zN|~<P$pg)_?w{4~g{h7@9H!FrGH9ixj#k%8OEe{ENg1zV z9)tp{UKLs$Z&v4EHL+kn>DsaQ^fx5k9k9bq@>r$UawHeQ^baqZ^dk5rs88Agp!;r< zHUc~@H+4*|TzxskB^_)A`HR~~ZB91klN2evTbSIfrDc}ddeCI+!D6YzqJxj7H}qh} z33~iN-%g?<3BP+g^hvWJ>1cD(c>vYq*(6Pg*9o{5;8lRe?*p(GYrKOp{d4_YoeDSn z6w1d4*6L7vB~}|Ag>pa%wO2H8xTZY#oygBXu7=$3BEX3N)${G_t)<_k-uTiEZ`gQ( zP+e@a=CsT?2x$N=htP%%zdP#~+}QxhZ)@62QL~L2PZGf(qak>*ZmsKUSGF>Z`Q2X} zLu+<II-M#f?FRUPfV}|g1?V9EMSw;P5gOWX3uXCG{QNP%bOHAPJT2g1fRT*vh9?2e z0XU@?fbW9hU-JoorKhwTK^Jk&*8vWxh;qfnl<7Tz9}Rzi^e}qWgQ2>e68+kYxDF&< zLPXOBvsGOq0&f}K>^FIJb3i|GsB*Zv)AViC_sY)$@gE<g6P0y<o2}h{t7XL7<o5WW z9_oLNYDdkcek3)*^#Y&U0&TKO8-Kb^%AYizhF|S&nspOKD(#N-3wFo)1sD?*-wxJp zdtddPK|_$4q~I0Ne-_Ru0u<nL1t{dV3Q#9(0;rLqg;{(H^E(0*W&uqKbCW{+{~zAO zdK^(=C~jIbT9UU{SXFgp+SQm&+v~S8wlqp=@HKf|6C7+3?D|HGXs9(C+g*f}&}pL0 zOQGql63r%8I9jBui4(aQNkL5=i>R!&k><UE#CQ(ZpB|)HPY<KlmnD68+LYZDZ0c=~ zo}?3jokZq-hELF@X+Fd))Z%x~ts`j<fRz5Z{;p1i8%97WrPdnV^k^6lHVLeu4q%#q z696s*s9gbnI+hyRq5KL;^;&8OQuDYyAa+*fouG#)^sPl>ZT?8B$K>UZ^rA-N^#JLg z>+kAR_>^0q_-ze8rid^iYc|T8bzpjNp<x5SJb?O5m{qK|;fR`lIkbJy)Ma~&<}QL2 z@Z=1gXySMvm>!YGx0B@9hsApQViwG$7Nsxo(+z_Ui+iB_i2B@>!bf%*rf1^aW$6Ff zY1nIy&n5mI!#@Xi!{lGdn<j4g`nN6N2jSrOi_hkvuDw?8QQ-9psazZQ4OC6CedF0# zq+=VB%aK$YUvrYa-5zvV+)<#0aw(SBhLHMN8Gc#R^^D`SDBzk7yc3=U(pN~WvPQp^ zpmY8V=}e4I`YXWo0zLv*E8ug0X8{`14|bFL04t*n2UETaqqc{R`dMHl%KT(j43M$` zQZ5rq+PWWW6`TW5BlRX3OUz?W5p)wn4T{bJ-Q{r*8rvoYr;3EDIeE40M)0C^4vlqR z!M`a>yZuGz=VWUHoO*oFw>M?=V0tN4yS}|COB?hnm<&hx`G|fmYZm-AQf$<V>~_GV z`$zCG_N>(MEIlj5?C%bHZqCvf!~3u+?U|livXoTW^l7C%le!{{r1#Dde%pbV>&ns_ zi_Zza0>J-)@egI}RN8afw;Fy78Ldn4m4+=8#y0PVhP_MQjkia*Zp+f?@+~y7@=&7a z-){VE!tEjURatr<Y7OTLmG%tz9a);q-v+P!6!}{lSfUP)Q@_p9+b@;&xZ>6<or@j8 zIYO;&I(~N&3_Hg7i-oikMx~w2{54Cf$gL8b18^RKI<R`zocIG|FYzf=DczKbDJO-| zXxCb9P;iS1y~%jtDu~)+Z2v&>Sgjk?04osiquD2E&9L=iA4FR(4&<8E){AO@leAvc zNZ8hj>5y!#xJ-c73IYF5YsI>X-nAmQrQDliy5yy4r{TJq7G9RsPll?bU2GgJuK z5^Hf^<2|GXkywZC=T0Vq^X7W~@a!{4x!dr$s*OLg=^`}JBJ>orRz*lm@|fptQzG;V zM2pZD0<@x*aynoUGHX(>D4h-2qSPfoQ4;X~6s09p;a1dUYe;H@yxJYK>5XGuRwS}V zQ16peP-*Aw6SJAGyyJ;-<%wjsKgswHgVz?58JnfX9%H6Gq<93E$u)Bz+j;8jY$fRP z(8lvr;OW`t6RWquDs_X=Kf??UWaX`0hejoa+)c(SvM-{>OJKO0kc&-l9e7QTOkcu- znAcc!e}Fb#4`X&3`X5lNeTvZOa*Mko3$yj&^;K-i6O;LqoV0Yjg5X$KHzoz=o8ZF| zTtwUY2-fc-8k*97fpGGOrq!K(XfG1X>D!OmPtU7biM?6)<nBNnoBdbfky|Y<D>hKe z9DrHJ!M5Y(yKK-8g<ZcDruHQHFfpIrwf>s);muxs4|F*)#^_VEwgkHkdMS}faFeS_ zde=Hsw6a76rK~N6<G^5qn{ePsIj}xPkNm<WgnArs{yu1vO)Gd^1;Y1Or7hW)dtKev zqz@aOUs1|4Mle{!q9VzeaD;gklTn;c1)rg(Cn8?R)+3q=Wv-1syUkoPTRX13z=L~z zSD;e=07Fv^Ej~VscuGU-cEBEOtdtt-_YyH#X*5nSrZ2;OGuJB4zWPm<P<mO0_kWR0 z*NX<R=t6<Ijd_BuG4)N2Wws~!cO!$-4#@CvQX{+<1hfH+pu;EW+VNt5rUd{^i}YtH ze=62uVK-I%Rr(V8m87Nik^mX{RDev6LAEMTXpo_kpft$X1p;L7y8w0*YwR(u-~2}k z+GJaInz~_DC18|Mqus>%r6^5MazxQhtiM6wU)?6k^HJ=RI`uoCYQDS4IPNqjc?6=J zTivJd*L+PYp9-Y)c#`AJfRV2s3`bAuy=WZU^i<1pZFs^nB6_A9n!EjD$4%Y|x`x*G zV{XG&zkA;lT6hm6AJU`;0ZtU4>+72YJO}W5fTmXfYG-7yz)M5q(wd~;=>nvBqW~FO z4^SiF2C2OUW|7t10F4O$j|C6PiXt1YC64(p%3xSzhl?^8N*LL8DEzD6g(Hf_?@?BC z?YxWoXc4b|4=jb_O=G!ms5*&VD&@pHu+%`5j~am|iw0<Sv;<x>P4U=!La;kpG@u8y zOQ~8%WLFHB1@@RQI}2TG`1|1Q-0;c)ItwkTqumQ>w>uo{G$EcObZ3dz4xmOZC+O`h zRJf9=bmZxtE_54MT&-V#Q4Ns?jh}KHSic#Lny~e291o-F*uU=2NmRf|ZMHXJ!2lY1 zggZ<dd}45zc0_oX=2+f{?n98<Vb2r!mr2g9i+9)sfqPQ>b=%yR+E)Gz6C63OKT10d zF10uJ-n1L-BQK!k{#)*F?&w%K$QnB#)i<;5Ita8oep(RuHMu=V{|1iRm)>m$$2*17 z6Zhn*Cq8#vt~h>T_+%~y#@WI0T061565QPl|EckRkqCO~UOVA^TDUzpd0(zJZy$nB zc%ukMex5r7Pht_(G9fDu$^*IMjWS1+%d??8n0vfY=8JN(WPX|3WRwM>WT-*E%AISJ z4pE*}u05Q4j!~9~qCfs4xmOxxsVGy@p*)tm!YC_5xoHTLU+4bND62#{O|?If`*Wi- zi=t<G{3mmNX%yxHZ^A8%8~-=C8;sHf#cj`@&eit(fQd-hL!rO5IQTQ%qlQ}?c50=* ztHpmdS8xBdB0J@z;o!&TEnrVOMfdFe|H)gz7@K<QVZgBgQ_en^^6&xq?AU5np;Wn9 zo%^zN!n+u#yvPTC#e%%}Smuyz2)%j|3|o^QvafR)jpOy35^i*_hiR8>y<<F`JLp=U z6FZR6vZZmOgS%FDdoL=!mS6?DVi~?F5<^d>?RK^~B~O<JXR4O9Fg1td!wlz;(EfV3 ze=ilM8OwOP2fd%m&e;n*KVyKdXgV>IJdGWotB6~L+p7@$Y=A!mKK`ObT;68c_<vUX zv?x)C8-E9Q{Svmtdb08R=7zfyuo0S02=;5dHL5l<lSZAwWy<AoER7$a$LJ<&_|78o zb8r>fG4Lmig7!XDR0WKNqo8~VrQukB{&e0cEdbp4J!Q6)Z4Kv9j)9Tbgt6e^KD#;T z;@jtVh=&`fu6hTet^){D3EoX6A1m8()lTcwGcf2j>$&-wWS4=v1@?FjjpXqW`H#qB zEd!fiRwZDR!LViE6;Ya?kj`#_O=oiBU;T16HoBI29p$hKi4uG6XwZ}OTM!z0Gy|EM zU}UCs<cpuykwf9ptQMWhDz<fFsbq)~i>jrL&*MC&y8Y&O@pLbOg(k5kNel?CNfm^b zT?->3e;Lx&q*C0inhYas($S(cLkXL7k!zAY;j#ioA`=@2<~<+SST2oqFv>7)VYx?? z4NyWGe|9!13JBN?#KyG{_wz_pztYlPOIlqy%oq#}9QV|wyKShgL^C`Mi4x<dE~|-I zuu{iEh4u?-=wf8u*z)>oYz-iT>WisKhR*xCAq68a#D>vDtpg%0<ps(9zd^;KHWouw zOJRg9K2DSsP{I~3hQhy!0?K&+qg#VatM0E%TLrzof<IdLzA$Hko9MP>P_HLuz}M6G zM8w?<ZcXc2vVS@y(;?F3F*#Q(LZyWI&JF7uny32ihn`r@AKm5)N3R}dcQcY@{Z{x* zDEp`7-H*OC_BYU~cJL=`>~>Lh@h5C-rj!_Bb21scQ)%cahhgNbJgr)X!mC*X!`%-* zCr{_5EfDKx@kbM76ph}=(l&+}HkmHf?KK6Wx*Jj2tp_4G*~Hk@s>RN)-^$Yj_bmh_ zDvO$!nb#xW|2=OmGL!n_=XEeA#Q+`$NUTC4IJnaMnP{8tZdr#>aho=qTq~9{`Jv_A zrwV_OhT*sSYhK#{v3ix88GWXiie-#+3BD>pn@VT*9|8Wc>RbU+Q)v+Gie_@E5pGr+ z(wQZg&9$#@>W6cQ1u&JPVNctzcKNspo|4-i-2Y^Bt&2vYRJ9I984MeNwW4f*k|T<C z{@;eezuK+D=3!N8U9`fw=oWZ2yJ5I4y4AYqS%~%3WP!TqUNpika{CUPi!AQ#p#?~W zJ(Stc^RAhOJzGDQTFZ7|&)L7Bzf$01@QS4fmEzW661H=zdu?<i2yCUjihN&xCDByy zL^ndeK26oM#uj^-HHRradUVERaD66xh3$CCFm&N$TMkuCxxl#Y5sUrO?D#qDOt*`@ z>ak3q)Z&lB#U(VX1Q$1==Uj}~fVw~~t$^8gKn3^Az1jpp$RM?x(s)~6u12XoL5Aq2 z`1`4TTAHti!_=PdhIEcAGAZz5K3$;wUcF4(WBXJ3-wl2rCaYG#EC+Fnll$KX{0a;@ zTu;rfm5%krE4J*tBR4ity~4Ew=6<Ok1TC=>nZA1&z2nldU);DdWUITij~(k5-BY)v ziYdHqS%Mp1CKFu6Yho{%=%&Cg`)G$#U|k3Np>&I~PjerSBI&W16ccs35IM<-BxlJ$ zrr$o2qmL7F*gTz=G`Ig6Q_S8*0lCrm$u%YjMSa<^j(blk*In4Hf~6?EkTmReecv>Z z)o(>q7fv6V=+|ca`Yp%1EkV%?%Y^;51pe6G9f6kf(M~GZ5imX0X@#zHWL}%&q7z)c zohMqjBmG9-)=wc{#&F7DqF?i^Za4g&Ce7>@ySjx;y&D`)UT7iNB9wg!czr&DUE9W8 z-)y>mdy*e@1CLuD;Q+SnPc!r9A;#0dWrWyYGrbp<dM)vFRo6TFlC$aD|C2x)tFJ8F z@O6Q(_qQXXi`SoiT}BSp&td>xe-0^Nd{%3ZB;7Apk*ga_n!jl>+zBu7j^71NYwI^d z)1vgb<C*7)9Z8}kF&jHB-Z$_^*M9a8o$saViqwd@{4-+AOCJ^xbp>d|G``FRxR;~r zKI5c&=`G^uj~UX{o^dk0^a}!_F8GX?;iY#1_i}WZXPkas`j5nsNA{<@A&+J12|K)) z2T?zo;CJty$wjSQr9UyChsGR0_l<gggh^^yI7zt8{F?@7=D!wv!XKsj8@p2RXSl~Q z9rlE{_NeGn$#aZZZo1uU)xHM1@-GLX{PX~QVecp46%}}(g?a;}JM?(nu6atxle#vD z-{qsBqN$FDWGxjJkzh-p>ySY_QQh&c&T+`d9Bmr3hhL28`aQJwW@hW1NmHq}Q}lYK zw(nQ4kgqd-v(F$M@p6Csywq;f`_gr18J7-Hl-yay<?gL>d%9=QAU)kPQco}VSJ)E* zhaQWP-tSmq4<Wl(@2@i0J5=A6C*Jo`c*`BkdByjwR`&+`&GtM1-=_fmUZd-q74Ea! z-Q2J1QH77$+t&Jpnq7II-O7B|sgGsK-FiYf%Dz@)qrG`Q8{D0f{5n(j@2(P#{m1QX z?w^6V2ZWz6Tn`A_!+V?T1#cb@cCU{<Y4850b!EE4g3XyaEcgS;?#;w!O!^aWcU<sW z!~OP}WvqZMNnSGhk*<x`xQ^du-eobiYj+^jbvm}}`;~6%N4&hDtnMzIZttf(bUpZl z1mn<O)lc{8^w50eWV*q>qn~nhw)nQp{-~eMmU*_`uA0VT*ULg|eZMq7+p~Qa*{TFs z89dvwtrn#TO1NkH6BPc{mY{ne4BbI_$ZGzlICU#$bGr$;=E@+$y!v%eHJ!B@CwY&; z&Re<dv*sEeKi+}FTL~_ZOoGX3<25p&ML}CB%TCfbvGeTUT&|bN04hKoZSN)2-K(`n zX1P~u6V)~F7$44L@Yryq>j5gT15dU^H0H@OXpDU|#54UyV9Bl-Ebzazz>i@cG~T|_ zVM{;VFE|Ulb|H$BP;_@kU+$-E|Lri`Wxy+jKO#lD+xn+|y5!pm?$s_s^E6dS{QlwM zCwl!}8la2CCGgDYC2rEzv(C1stebZhPZb$AHNu@x-?)WcameASf+66}FjHeyyN;@- z&J9}AVy)@VTH(^F)zYdNe8LkNS5wVtrB&@V6uagiIGe?r?}S%AUL?W%BJc|hC%<ZX zkgK#WyjW<VTrT6o4npSJhCdEo`zb=_$(ZdMm-M?EV;{k&-j!^@l@O{+kl1hDbN!f{ z;&dXxKf6*~i7X?HFB$0fDxjsb&t|b|Em)Y+MWU>S5~lQtQ21B3l8WDfkxYyFg}_S5 z9AYIO7Ug^`BNvr>^&QD5A8KMLk*<3lPL)wvSlNN}fFBp&C0_ON^Ic_3<X%NN4ARQ$ zq&$W@gs*3A03)2$lTF3F=B>sPyy9$L*nsT1EZ6R<pGPz5*Fc;#j0gNphn!d5kn`*J zA5GC%*UD>F`Wjb}t|dHKw1*RcZ%CH0)btK4w^ff>MlYczciEKQPwV5~!H+qMml!ho zC4H`4hFTM9BkduuV@&N>t+N&9atj5fU)yieXW*OJY}AO*5F?%Tf;H&-nvP^I+Asv5 zWQLkcUp;&#l+jQwgwjwAupFR%3-+{0Sp%DnbF)dJo5+e9Qrz>T(fOnlw*2o7`Wy20 z80pWk(hKN$(tkqnYMYV!0fVaH1gbiWT~9+BK%;;;0OtreAK>Qz_84gi#uv%>&4X&u zo217`wd<)_0nwfzJq-+(mz?LEn~GHEV0}%}<@5SbHzcXoq*4>le{=Ji@nD@iSUcz$ zd7#H--=xl7K+V%Wz^mPi+ypwPVG(U8rXw1z12_+0@*N1x$JAKlSY&gNvc{~2S+x*G z2@Gq{@1W4285g()l_D87D6ud}4JlljevO1DJMd%)nl6_|+w`Ls8xomxt-H2Py`-+& zMQSg1HL*N!dd7;NwdLnVOOC&E-S^d<=?b{I)_BFZ?hr4zflA&RcBeV(=oD?A+-oma z(5%`$IF^gLMq_$bFdFkM(fW+W%sA^7f_lQ{6Pw`<#s7+GBug;Fd+*72A-?G6-i1ii zPll&A8>Yi!R<U8-)&|j?G6r*;{HW%uixgHhmP>z-<pBSKqWf}*le6^Y5|dTq128GQ z7h$?pur*u-cbJu6VNG5Bj$a3hdO7Vx`9J0na+)%dtEJUlzaFlxH}aUqQfESLy<tFC zkcWMZQ$yG_t2BI#(+owNdB#c3R4KD(VpCGURzdfwPp})HiRIs;%l!)5^sObW=0Nki zt4JBQ>8r3!Upp?3dR(kZ+h$z~?rua@8Gg6;_QgFDY-jc&xXZ(%%<>oD^*b=H&F>J5 z%NctiHGC6+88m87-DxJ(_n0L1BCiKx)n^^~EqY#3*JED!xAJggof(cU2weV0=<+&q zIhWmvbNOfHVmY{T`R9hu5Z_$B-(0={+`0S<v-}WveKqFg^0vM%Cr?(t?s6OQ-{|sH zq_%&CeHqI<WY$}h*E0vWD4&tj1Law{WKo`DUx@NIaOd(|!*kiwIG4|~?@*Zl?p&T{ zmZyQ&uf@Dpu1hek)mE3=94*hXD8k<fU)_6alCNBF=K(f=6Z_z6&oABmcwYIDg*0Q4 z#i!sxwSoWLYZ&sb8H+6PSIbRn#uXOnZgAI(#fCpFzD52@i~J67w`ae~_Us>nyFLBY zCeID*+7jY-I`z2be#bmGoP9=O3vL9bbaJ<)_t<+{BRtxFl}$;(jc#|k!5olS4qK5> zOLZvKXFKgO%^ySqn_YV^3Z7Y*$*SSn+idNv#Shos7W4N!aM#{e!#9d=?VW1v)yB-V zZ(7hk*Zk?${QNmQ?mL;<aJ`zU<lcVw=o5=zD|^IKgM!DXdk1#;^<}ue(r$9^LK<PZ zY7j%pxxO;D2g+pX(#6^jb4haVOkwtT!EJ_jg1g5HZnxXBcY!;{?=XJ&WWkT@cIzhC z(+a+2bKpPwIPQ*o6!XcjgX?UUnSsj;rcAnl;XNo1S3k6j)(@U8f#!E_3O)bO#>yL1 z=7Ro_jg5@Cf$#ro_;_#^^gT9K&I5PJ^DndfL-6|LnAbg+)fiVO_ZusTP4Ly*;(cu_ zd>+HEV=ch?J=Q(u<}yZ)3-GZP;B|6~03T-odrp`I_;|y$1iJt?T7c7-|6PDj=o{b@ zEx;wP>prEfQ>dlaC*`irOuhQa3te=-mE^muR;%3NydM5H=y~M}52h`9?OervQ`T3= zk0)(hTlNm<p>=0az1s30JC3<Zn6>3&!+!<t+VY7#i}DV*+uVLOK%3hrJE=-L?D^c} zhY7d0a2=iicWwV7dEC?H`fH!Lb-LJg-1A>M?(wHrto^pTPFce^b^|EG-rT$q(Yh@# zFN2}xrj8JH0*O81o#=QjMDFWS?D9Crjvq6%j(Zh*k!%C_GOVJ+y&S443NGf^qCQo) zP0wPgXoMG3A!_giQdUK#&ammO0<7Q6z#B`T<)?X(b9{$)nK$+@o=z(qs1-);vnFb6 zB)XFtl6K!nr3LXseN*3jYMcz>ci)Y<#y#rMw#I!b+8Z+up_txSpki862}MnHoC7%# zP7?DZ37#Y+W0;66>s$NutHRFm7qVOj3Cky_Xm4y&F}-n)ifK&?C~BHzS%j0sJV}Bl zNy!){BFp*)KmAT|r};dMtZvk=2x0j)743~{R7`JtK*hACjTANWWm$xi#5_rYCrQZ| zCW5gMcb1^>sBQE7ORzgq-)G}*w4a6YPP`xP!b^f(!;`9alN8!&JF(skev)vnRW7YV za4?AfOj=a{H=P56f72(I!?@Fa{9~KsBB0%G(j+%%?u_&x^(>j<UQfK!UQhfCyi%_^ z`l};4{-~P=ezlg>H4z<S&H}Gpg(qh*R^2(ty(V}kjAM5rkwcenM!^4BWYT}YpM){V zKY-N<pk@c0hFq}E!1y;&D)Ug;Bb7%YcVO1kirAl;S|vbDW^PjLJTSDLJ&=A!s|33L z>&TnZ(sL3w!mio`gVn_yZQU=*Rwy~5=yv4WX2RLn1tTFFk4J`*yJq9R(#T{r2yF~y zzfn~HCA2XO3jZd4hP^fz^JQaGWF66+luz_7fj>#FxBd{IM%;#jz#ay3Z#<&2OgiHV zZ&1Cug!@c7A)rgRgIN8&+BL{MjZi}w78)QOt1GuTSlB2FM;4x>OVFyd%&_L4USqsL zn#nk=LUNlVCl>nhPjUJs{F+Z8+VS6?z^XO}`ifD8*5jo9di3-2(4SOzY@j~^e${pu zVT_Iur3XqFqi;DI^$R67g0F2tSu?#>g3cuEB1el{w$$f=k|goEK(N58Uy-EU7SPH# z?@H3lSPgDg%t`wG98&JkeZ6Jt_vJ#O8F{_i+vj4&Yd`G>+Vphfk1>8Z4gDrW{qC`h z6gNJej`TqJEf(DPc-qECoXuLIfVobOM`O@kCAf!QycrJ<!p8Yg{eHQ=Hh~ufsoI%4 zKPq!ap<Y=%64rvKhF81r<A#A>7}fCl9(Y9~>WdKGjxTy}`4SV|0IOABP(2^^SlIqm z(Md;wzXD^DezxNsfU1DokbsiQ=Ae2x^2rqzt%|LnWdQ%ex{KBIR`mpAy~(OzZ&1N4 z(JIDAqbl*ITNNiDR2A^8ic3^QG46&{n2j<h=H!a#;{9ys(55Qjn~i5>qbb$K#0qk~ zQ#O=%KaOr8j+5G<eT3+w69FRZi6%`1I1r#lVhv}4jRLa~Cgnyc&n)~q4%on&CmoG2 z12n>}fZ|oGKsEs|l3E(Rg_SPIHp;}ABP+9mQ3fF#Wxta)*}MbdY%=^9^c4n*`ko|B z$p<ZRsWN<bk~l9AB*XV4X^R3{8SjTDY0CpzjaTno!9f+3+#ML)MlG31;-dj^H<7G> zm~;b?IoOikYe|vI*6=*={3P+CfVeTjlP*a;27@=^J#xg4+ZV(7!=TtV!p7|zVN1!$ zJmYvr|11-+SJQe>S%dngmi7O|x*IgF+Bd2GlQ@mCZ(04beaq^I1>p8gtN&yCo59D~ z7qRTHpMrb_ywYyey>6C22CvwN`Esgx3}-6yv|7BGri!XAq{&;H>ya$oyqS0`J=?UH zL8P7=A9)LnNvA`bf#{@GfC~VeSTkZPBz9yZM%wokyHjEnnOC}sE8x3|cU#3T!A<1D z{QMTz#jbJ<`9`SgWVIl2H7-ud!Gm3h*NE6q1QxxB!6rZFAzDl|{(!>o1P<ss=giN; z0i4*9Kx|;)F9NYdAU4&+^eqf45i5|jg2L?*yAj%X61xguNhr215F1qZMId%dAa+kE zwkZ%REF7k0$l7Cp*dIc%ZGl)(;gmq^?Lh2bq1f&~?7+f>fmp`3lD-`X;8nLFqRh?Q z1XkxQ=AAVpHGKHqK<;2eSQ8SWJVydSGyCI44DORK+>hG@Cw~P%H6{lG)XiGLJyEBu zi|4u};2-qjiDlrL{Z&7FUdgzd+&<y=B|I<(3z+$QI(atfbx337_`3it0{#VXF~F&7 zkkn{l1FWyG*ze2DSS*^E^9Pq<YPB0P$mg5o-(lH}nbkHXZpB=yDwjzUxjXGN)#II} zYMmDnI(7Yib*f@_Y~||n+OI98!k=1&5(c9wGl`I^@TXSc25gPGRZG!N?KeqZ1wW?a zLdN=iX}YnV*41JDY{o*4Ec`63QT{}_7OYNjDQzL6;`#ktO6yv%pHI^d9gd0Zw#IHp zx+7gaeYX=I>>DT?XE?^(`{l3N>ib>cbBTukXTvvuyNP0lS$b8teWmql5q<ahacr9^ zt8mhP-SAG~OQYa#L>{0=e<}PWwRvYmzbX0;;aysu-;C(Ab-4BuujPTi718fM>LRA{ zLt5|mL>j?=Df})5od1`IepUHn;XfJ({<p{+@b*i<(=g<}6VY!gZxr4U0e?55A7!*P zxH$`acVsL@If+;K{X+16MCO8@BYd>%y&uu9DX$Se=?L%-Bl<z**M+}W2L4e*KaQw9 zYULXFyC<UGLOfZxUefme8JU{RmQ(n9L&5(Y`AG&}EGPU30_E?GYzN<G{L$e5iRf3A zt4QU_BL;wf9O*|h77Bm70Q{4Pp7s7Y_=Jc0gMSuTt(=%%sW;C3&kfrp?z{uQzp$$i zZgN%rO^x4Yo%M-~jVS{EGV(gk4Pqv$JVp!1R}ozHCJH}a!Skb=V|*Wn@bV$x8BzT7 zZU?X3Ok<xQe_W;(L|vw~vAgHGYtPku6phKz5uFT~&!IhoRxj`olp-d9Nq+@s5%6b# zCjn}t*bpmWc4lPSmO|#Lm3&tf9(@&}+DSwhMZJKw6hDK)qH&GeQ9guVLm^iF0=Z!r zz*hivBS|7NWUjODI;3nDU(*S}?zvPkZ?SrpBc!e7ZAfTl!u!NzXvrtz+}F7EUTV9G z3;3&K_@=_Y27XS#ocU>h{Crsz)UHSF$F!@V0@wNx$c6;KcmYiSvjNQ6dDz@4n_Y!R zBJM6ZHbK->U=BZmC=RbrIyVg|9Rt{zL$qtp)xnMJ`aMXfN#~h_doe$!(>3WPr=>5J z<Hf;Up;F?5Yu&x4WDHz~G^3@j%=CXz_(v42egD9XUO){UM-05$e6sXU)ZB1d2~|UC zm<Mo=fQ0~m7O(_hFMzdpPA9#s)PA^d1bVK;D<G2ouEhsar&<int_F}wx>vsyn!4yT zqq!F)qg{K$_SEl73S5~K(43vx;QDeJEDPOz1Ukd_IF6fvfU2!ulazd}k7RG`s%x%y zj*-V+ed0RQCh*+1la6-nmQ%q2t&XDHIs2TX9DSG}nc;fgHYpZa6h3^5#ZQTt*1Y3s z64Lo&CEm5~>h!Ur?U0DAE4H+>&NK<PKYkvXzDDJ8qtSL0R5v3#@hQBr73Os0(#|v# zH)syJKiWu3m=IVg9z<=7Z4vK}_K4E#wI8mD>sL`dF4K(QU=#d1g6<0JS0;Eooi?Ub z=6+?fir?bRJnK-<r=kl`Dlw(Ogw$Do%9Q-(Q5!T1KNZ!)G++Hb^N=D4TcgWSDmJB) zLZz)qrO_;&TcfMRZSmS$aL9i-s_V_QC{>%%?I=0-UN)ugVtX8FFWV0lKM9uDjIiaG zyV_(`iH^b2+a|FSri;ikp{2LY(q4Jl-f<YB@0i=WLeURH(RWOA5V_#BA3X@s_f7PJ zP_&q?aQ?k-qE!-|d1^VLpGEf~rt#0WCLrbl_L+(K&0`)H<MXJN+2BVJzKCj(<=)xM zrwEy!7Ss1>IPaH-2GU|Z(o7nN#GC<drd?WO#xg^dr$Uv?q>6izt6$7&p<iD+2t&EC z{7~gzp-OI0i++01&x>ibS1LR-igHk_I8+%y8(qr=^-(E|X+t2Deuq;Ij+KNeGeVWY zeN=|Tv}cgYX64TCSQ#oVes_c_!vhtIUujI+iXeU?V%k(Fe)?KjzdTkE*7<yBpuCTP zQAq>d%-Aqg#>Z+xm9IjT@ky2BPgl5FaPt5KqdGPj6=qqwc|4E{Ms-k&#qX$?b~kF7 zzUatL#M(lYvqP0cAC-xr%0Gsn(ioeEpbN&mp-N+*V!@aaTa*%v6JkG02IC>7Nxvnw z5H*)fuZ0F$`WR?U8t`W72RQup*rHG+=Z2tV?MW3Ej2W<DDOeiP^EvP^CUpnH|(( z!8kppt(}5#7pspyFSaaHxj0mr*GJ{-n09|snLCW~g4haFTreIERW1lrEEo%7+8_p* zabZl`LuJNaODH>H-C>>Yh6XzN7`QZPz?-?xM`dwrZK!g<cY<InPO7+IT<L1T&1ejj z&e#K?N>ixP8PsCIxHhJJs#>Nmbo6hGZ3tDa2~}?Fqp~cft*lh8QXFrNZ9>K6--b}- z=A_EFxfk>6OE<?f$+p|vRHH$Ed+hnJp1+4mxA&=MRZLrC)$>Os?On0$sJNh)-53Pm zu0ATOW7<XgEo1Bliq=@I3i`G}sQ1Ns!a8S$2B2!_G>`eO+P^NQZMW*YMur}Y?G9CL z4pkluR0eA={mYnk=29ueIscK^o>1lKQ00+8#e)85Oq+M9oU3wE?9)(XZ>X}VkIIuV z?e9@(zxQy;XJRAp+9P$`DmrReunat7YKsW<nEyQt$=}AbcbDRo>69;<;^0v6oKW#) zQ@lfp_Bi${F>T_dc)pgi_H-?b)hISA9lJBX8`RjI-h<%dD2}t|HrvxjfFIZipHiB_ zF9dhrL3wKWEbzyK+iN|indMi(>(*iZT|Cmpw4*q=)v4PJ^%F;pbgbef#(Xm7{t~xo z>cH0YS((&xOZsZyW$;#*hkHT~Z!r(OYXc8&F^^6FubIORvhuHoqJF0lmqM)EGZK8Y z;lBf~U4+mdu~vDi_9YwA@1~yJ5}cw<$0H^<{yMHID(Jm7n7@&*S^2FozYQ}n17`3g z7Hr2jm4%SpQgKrRqylPXOw;W;=L~AcZIcw6E&k1#IuhQ_n0lg^fXwqjyQke042GT7 zg?^iU?r5i;<MaF(qpeSNTDSYt=t;An9`UEwte{~NhH4gUvf%LxNM8FL<={QmDNASv z^-#&pRO0p-J?TAA9>%pXx;jHr7k|o=J2bMtG{q?5TTStUQ1MGsJcL!v^}Cm$c1#7Y zn~cy~eERfz^-@Q%KKEw6r!icb@jS$YSw8)HflH+sJy5R3(x}4=OiH}xz-K=k;p_q= z7TJbKVjtQw2qqOdiq3$t4%L@k$0FJ$(jV@t{dB<eA|t2hT&S{OZ!#2k>GOcwKUT&Z zk)f?@4mjyYjMf6V7#)$(14UaQul-G3V2{iA18@NXC6s>mOQGnvj2<Y5nds}e@Q%_i z3wjj@lv4WLpNFDHW%NKf!9+h)J11tSk7pp@Hmeht2M$a$(WQuvv3#1CaUYUQjP~o# zNvzdt&u9AZPtJH1<_gSAmQeQ<p_!A-%zDgJZ-!0OTxYaz7>3{s)7uUsVS2v`^=6pf zi_(ii4E1IXNJsC?i~@)>fV%z@>YQmhAD}bJ-Vr}DL+?_?Z@@;W*=W|i90EE>gJ6D! z276g(r}q0n)90I=(ddn`#?H?uNAeWesqSOvCnUdrk=dz%q2BkqyF)t{nVp5`xvz?I zl3k(Qi_GqmvfFHS?dP+|ALr)GA03Xpj*K>VuBknt=?*jfR%p7zocKzn=B2tg^UP9g zEY6q@vBKONb#u_n#b%>~+3xh^ux}X3?MRre{$}sg?j$iFc<oCGr@t&?V-6RsFiXtf z`7&5L!Z^z2(=a&UI`Y}SDPu9bSY$VHUXiqf+bAgW(xrFCJc#}iW^of1!H8h{yQ=4< zj3Yp|LUoP*J@W1c8eTR|&iK{0M#u3P%ZF>P(dfL9@i9_6LrcOYyv5GKe>0>1E%If# zPZhD~J{al0#eR|gh-Gf^dXo=quPPlH5X-y?_Nc)FY1L+8Ef&%X0p~nAoF{j{^jjwV z1=u^e{p*0dxpxwh*nvKOy*b|^HN@A0qE7G^U{3JNsbvTjo1nfi*x9%nzIWDnBv|@6 zzZ6w}aJ&b~nV%j4ILI_!70>>>kO!pEjMSfi=iR}djLE8Bw=eozjrONpLT7eTWd4sY zw{(o&->7q+XYGiM^YtFh+=e)Cp}}WeK`y4x*DB&XnHOcw&lo3d&4wwBGCOB~)Q`ia z<INxUhXaYEdmcZ3JR)~sb|m+p-2VQ6biH$sR_bME*JVdYn@FJ-$vryzm~1VL(Ig#r zVtI&&mVT(GB11S$U>^1Q4di>Rvtww*d{|j=XCgLbU^ODyDJTh=6P0kbs*rHJ4B^2v zHP?)UbZ$Tee#l7vAb;cmlJ6h0>IV$;du<F9bIL%m3zF_rHwT^wg<ch6FjFo%uZn!% zX%r8|;25enAau-HabU6rLk^0jR5zG9WXZxYBxx2zejZFKGJ8EcBq?g{l!Prbn?pwv z2st$JfD#MEuvi#3PR6qtDy0>n&)hNWm7g-uX&jpEtI;D7GfQf88CH_*WLfIv49?;U zl~YihJz}(9e?Z_vV6!~68YM`g`1VN_`cb|9rI9qFdn-y~fQ?Dvf{yJq)5plT6fKO5 z?`@%M9=X5PZLaEyY_fJhx*A*A+XiV=ISvy|3Z43^zk8jJ4ioB4*ZE#ran~e>NB5ea zGSIn|tl*dwKM<_R_NQUIR)s39bJhgbJ8+z(TOvR>(;UJtS+*iSBl}eA-$^lV+(5b5 zP>}>COGMQMBFCocuvNsG*B=?q`W$$xylyl@0Q`uS>n*kGgwaW3VgH=iOOc~Zs+MzA zX>+HdmziwxDdrYtn*|IeA6gWuaRV(>t*O4U%L}Szf9%?9u1yPJ)i}LxKJ^K3`#15D zi8UjY*GKDAXa9$j4p19TQ&Z&V%&#jXP0dQ>1br;uW-C3W46Hanxq5nvSuxKT?WGO` z=K>a4JDfdDFBJ#W*f5yeSGWeLGyB%+<jx9-*&~yx^HNDu20FR3Q;D)>|Dyc$y=E26 z%3hS8_-xj6Z~sIY%Lf4!+FC@sORiZhpxWqDRm?E3S;c%l5xzlxwSYyAu3||*7qHaP zRj{Zyc>&!HNn0&oJs;}jul<wpg?xOkMTKmdD}iy}n;Mulx{R+f`Kc;o5mo-$KN<gk z4;84eD^;&e#T-6RRV*;D%@p_}olSf&qr!2g0olJ^i><PliEf(L)uwWw!QZx0Rfw+A ze!;<ORUu;{CyiNMJ3wfa3g_Q+6?Vz(O;zDMm>%f#0PN!9d+oa^oK8EC{p%&o2uRXj z#E0gp=!^;sT@ZJpaa&Y4ZrEIL^^*m@*Q&yCPffMF&bU)mIPPfycN?Ug#%)&dK$@k% zlGQr^dIDr0K$L4Tl4;56e1PHrDFsLbNH@TS0QnTaqZOu83{Vyz34pc$nFp{iKmw=A z(3LUYn<2h)ISiH1=lKvS70tRj@xow;yWF@fDjYWqq_`W6+p5BG`&iy=+^H(waDpl% zsNpy@9F9Ao?lysD6<gWmSW`a*@Q^kn2cRH8N&(6Pqy|9G1DjaT?o}A-Hk<A1DV%p< z)(Evb`d+h&Ri=HhzgoarK6Jl|tpQ!YUPo8qX@}oChQGlY2`5|Kd?H?lzgoZ+KG0P- z!yVVG{swC@KG;>DqRqgtPXcb5H+Hqyjm8c;MbZn5)T}~3!<y2e0awamuP}C~Ea~+| zYF6>7fnm)e{myZ>QfxD@O~w0;`T>R02`z4hloSj)MiTj%7C#mH44kIIW7DmuQs}2s zQ~X{6cc%%q24;FmQv*^B5_3$dSzp+*&w&AVCFth9B-LWKFT7?IZS3%TFC6URmYW|f zD#TUVwuEUbff^HNRpHdbX-nM6#+|Cdal_%U9MT#->Is!Sd{QQ<ZqO}8nzoZdzsH&q zj!!|g9c30(p`&@$27k4Hgrf(oR<+$mYF42iB#n5yyDOlR5Ajx^U(Ymps@`(bYf&L_ zW)Kw%3~W&$EvTtF%S@+LMWzYPR3SaZu64Dbg~n)Au_H$oW~$KB<17_TDx(;7@`7A7 zGgGTsYSm0tA&a=a!J4$pOixvjY|@5n0=+#5docQWi!#&44ZheraJA4(Q)yjKQDNRp ztEO1)K>bkZE<Wlem2%Garf;IyYhZiepd^BtRwi2?^>`{Qq;5-6`@~tqoqPy_iXH=7 zRP5#x@xJY^79ihKmU(G8(bipnY6de_P<=P(cJseoMKZ9Bfv2paf#ez_H#%h%I?jlA zS6s7N!1a96U8uq)NPaUPHCAOYGGtIWMRO7)Dm8p0p>lymsZ{~nk|e8i!3#ZJgso0K z$!rwYq7=B?Cu9<K{XA2}a?@*7v64^3V;UErD5L~MT28cm1>pZ(e0CtY*X+y+LMC*d zky=&g%*Uz}kYh0jTh$4gY|5r<QktTtQry2lf>|fvr%XW0lKQ@PS}!-;ZHTLsWY$oj ziefy1JHB*vuW&dIOZdko+^oWde_F3#ILQyjOgSH>mcU7&t{X$rK5U58r(Z<OG1V3o z1;!_T1;}hl{`QJa&4*KN+|as4Zih`R%_{6?&U^Q7;$Cjt78T<5otAr`?lXaA6;T9O zf>*F3bN{5##)o86VNW=DZ7LS<fvUou+Uc!SkF0HTIx6-W7zRy`@h&w|s|x)NFOx)2 zUk>OYMhcVY0ni;rYF6PY3)?SLzj}%*Dh3<ars5DsRWZX+Rm^f!754SLUYm+@9aY5= z1H)vH{e4z@iwegL8`E2Rt7@;|!?Zk0<?#l8+e%d-dT&*&K~*9LjqkNKRo0w;(|eVs z21+RblS4Q1q5Ueh8yI@u%WVm`efz&xpfy#XHJrtI1*WD7^zKJh<6h^03jMNb%GxY$ z&H#~GRLnPUnu>*doG*e_I);kn0|SPj^?X>(Rp_A|ry=Nh$51huIvqn$lX);rg`DZz zUimZC>S|TtybTxSUhY(Jowx0&-cDUDZ%eK2b`^oQQ&$Vx=NKv~l66mAEvStTYl({O zAtUJbnq*yC2V`Eqh$~p-c0Tm23ROTTR6Nf|5-N3O4!M+~+`wiPiUd>@&3q)RQk6pv zYSwoSsd+)o`l(&PDm|;NS%s^4`u;V$>ZVs<vnE-GN>}ytZ>~BV>H7I(8H{@RVdKCd z{dRI2AEs0lGYo81F~?C=EO697Cq;19*SVc|w44tXRje?uRmCbtRk7Al1B)qwE5FWF z4ELBqvkLvdZAwVR{nWTEDmD%ZQc%zz`7jhzNNvB|3^iL*HCtErYPP0o_72kCI;W;; zPEFCAnyT45dV8p|*_>)qF@sOkTeSX~)q*A$%G)*-jeO{--B+&`G{Z0x19Aaq3xcPg z6?P_@Wn?)Y5?F=W!64W}AuCW-6j=P)RTLZ8til;>4~*ucGuYIdRXF?8W#1W{E~ENQ zSEfc;a_Z9q^+j-3@lkH8T+fGoP&@Ri%PFgEK$2vjEn_qI;IN8Kx^vyTFBEr{aa&Y4 z?zB|hdB$y3A+CD8x9_Cx1g5H(TrA_$mr*Qt;7W@14%|Rd%Ap+s3n}(+Uj{G-o37Td zz53nVPCj_7Vi9_F!5^44M25Qq&PIT(0is`8*%2VBsgsZCEC*N<Alm_U1;}Qc*~-Vn z<k{W;2||$%p@a`ksn7%0DSOTu(B+P+Lgv`#Z=-O{Y%ZmlO&0p*c@!NERI$XsnJVlX z;>k9^m5!=nt%1!d9&l6@>m60a21iw~(NR^npw0~Z--$1~%&n;b=>b~5g%3?qp@87@ zUJBhagQ`L;gPMayy-f;Lg_;93w1kjrb8|pi0cox2wyL<FPnyT$xygSe)H0TjGF4>- zpG@B7?piW<__)==CZ|xwt`?@g?3D>D_0ZKtaPUmO>MUb`O*lBqoD4luK=wM4iuHO3 zinW<ygMrN|Iu0>vV7ynSrB`RVbRILE78On>Oke42w|ZJtY#c0$?L8FwL1n<b6#07e z#cMC7Snt5WSZX$-?W-tuIj{_W=9^FLU-xNhuTL|2eVW?q(~Lmp0~}H93b)D+%#&t$ zQb6@0tCTxw-ni8&cjAEPD&<U?cl2tN#dssSN_j`HRp@<okyR=nY2LA`gWC0b$tA8v z70>grfwl`k-WVcZ_63L>DC1)sy=YMrAd>+W1c+i*%E!bMwRHiq6<}L{>;UKq5Vc`< zfCL^c!s0SMG)9H}u3ztEwtkm-r{k(ntt9_GihNp%jtUoxnF+u~M^({m;7k>B994zO zn3+NCld&{|kK(6t9-mB)9~ZL0AWT1m6HtgTm|7c9?C!Q1D~EavAAG8zkg;U{RJ+=P zD&>LwY>3yaqNGHEVY>8kTY9-+0`_uSd%0oy_j0H9a!(EFT^iQgvIg*BJ}K*$6hy}7 z4HVlQxQpTg2L@*3Z<G1ltU^DWoU(84<+k*4L-%{Rt-aiE$?N4#?d67nSwLmouHN+& zTOGKAqQ`*+L;pYK-akI7?79<t(p9Tvx4N4)vW;yLE8V2S52>mo)E$z+32I3oRh6Vy zKP1GD86l+lAt?Q@RH8+<K(eIn#x~C2m`q5FDcNSnY{JB3ha?z?%_Jly2}zik?Zyd7 zm<hXKCnP2|v9$>^+3)w<ci(&ZfxX$!{IL&?&Uxpad+x7u&pr3PS5>eN09s%<R~=HQ z3hgAag-j3)3%P^njOLyLI<HA0D#jiwN&MHE%>uRo$hMs89+DnOvRf#7<cO{Z5q}ig z*Fj!tjHxFjwS(w1Kv`px1rpaapXjFHlhE4SvUvLtfHo8HSDbxiG4*?r8Y8NBo~a!~ z6kHfYlEWWog(f2YoG*?<Of$XIm`O!1M3*MVO)}z(rKt&%%Cfy+ayJUh0iLjupDFoF z3CUSNDQ`PIQ$qT<@1FEYK$(@Fz<WKA;N3Z&1nKh&BzR|`O-3haw$Z(JDr*`_e~?F> ziZ$$qE}|ENOl$&rsJTXoZ~89IUnP>;y-eG^OzyN``&k&a8bqwu!Vcn3F+UIin}|RC zj3X?fIU#K#U8x<^zZw7mqDmocBI@;>eDOD*uWO}5?+6(;gT_ujCahgV#{ujUV)izw zN_5&`p94Ox*+jY|*U3HvYqhQ@5j(QjI=EsDaI<Ddfx0wlDv-nN_(Il6-0BAJX48I5 z+OykaVCp%^5W5QWSDIvZXu+6YP<K`*Q*~usYvt_)(QFev5OO=wL(L_c*Ic3%FS0jm zqL7f=iTLBQ;1cm?rhQ?*r$6TD@1*|si(rgMYw9HG(p(~~X_=bFjV8TCpt2Il7AK+> zoj}Ug2}IPV6HM2za^nCDFOd=Ors_3tZ)pJ{mQ-quSYy`n1*0Pi-Vp%Jg?J7CeQq)e zos~McUM%UdT))a+*)IPv=|iG5LhdBmqPax;Not>yVxIe=IYy*Y-Q|y|C6YHzq*GlJ zWol@xRFvpGKu<wZAChtsM4JFQfz&pgKs4(nkkZ=SHk&4}OOhyjx75R??s)(V#q^FR zStF9;kYrdm1$<2CP=WXapcHY+gte|f`Xt~P3<Q4c{CH8>KYx(?+u)Up`t7D9R^SH} z#UjrF;K8o|Q42_-`v5pyt99K0JlC1W9e=IY<1AOo8c1B1N_5-=q6pTY67&%}5M(n@ zmyk9Qdk@^DmDD}Q%CQl|<)SOe57PH((q91<p_REt#h*qGiGH`gIZ$^ri-^C0?OQ;- z)EHB@tY_*jqO6b|MCBWVOT>?A$P!MXQurN2At84Wbpb?##8J&Z0mLsgg>E8#!3Dbj zNY}@;((`U@r9MY>C5VmzL@kLj(bYl3T7iGKa0|o(&8K49DZ}Y!{)+j104$M6*J~&1 zbzSo8WL90Togrl1B-w2uT}3xi$U~6Xap?1~xL`EsJEKJ3nISeg;3FvhWq{9Jm{bnB z(MH<n@>{f#g-<Y|AdRHYQ+R?&PcZ2Tx)x&uIR%X*X(LM7v|}wgPMd{mUF@3)>8cnJ zf8*R|T}Qw=C#kMWpT{jf&{AsUSCzitJ=SFIIT1||eGyQKH=5{n&w~DzPO3o8)lx=c z4UjI*bwd30^$Q|s6WtXuM!~g`$0pKw+@+GYS)EG6A3yg6cAMSQT};gZl=XU1fkdT< z?jl+P5I%`2&EEv1wYkRq2)T5s+kaDFod6)fBANpzYkaamLW_2Jirk$7_2#4)n}|PN z?(-;29THZIh^chw-Wvy=K-@3joxFJh3BQ21NDf2igcM;D=?b{f-chj5>C_8AS2Rha z1zls{t^BlvWfP4Dbxm#8;yi(vU%+dMClL1wcunyH5`F=%Df~H>N&p<gW}rQqG$vn$ z+d2R{&@ND5X(f#e_6y@ig7jh?m>4G6H%Clv44{|lt`02imjS39kzFGrO|%=JYekB` zd<_jml^bb8_(5?JN9&9fsTD7Y6cK-xSZ61d*9k;ZZUU*JI)Uf{K=hJWyUAoHwHd(r z0}cO#Ngy>2KmyV5Pr3=9#sN$KnspOQhq2Koq|q@V-RLfVqhkd&Ix3CsA~Nla6})zK z`P&&Qc<t=+w=-7o+S$c+nx@4HUemh#O^X%0rgiz7h6J~1UH+zd_R6N6l%~arR)yFN zNh1DGH3uYKAf-nt>2E<?T98Ezk%P!|b=+5<B<o{()SCq?c20^-5K#a_d3MtD_!%&@ zne8TW()k@1`r_|IUjV=iiC9DAKQl?<G5~y{JBClflA78?PYM|$a#WvjRbPX?BnA^3 z2#)Clj20wEk;*}O<F=h6by;+6KlbCs?6!NOvEA!`*BL!<_3xtobE1Ejr+*i_QrrJ7 zPya4Y|1MAeE>FMf)Y)|$KQ7b6eKMpwh-k5R5vE9tHEV8290OpZN_5-sN!-!=&9LYd zQqdhm6#&sgf;H#X*y$kQ8;fBb*j;QAX=1jC@<7KmNpub%SxMY^Swt$(rCl<Ucbs)* zGBTRhQy-113bq4w5{SJ4(pWl3V=sH4@d$vKh^ZP&9Dk~uszFi>b@)yeI8y$eWcOh$ z=BVA&B$4i~1Cs@>zdB3MUuys?j+p(22#bgwk!<2e!cG#ck}k!YlO*UUF{eU6G!Kds zuhsTPq&wYbHJzT-bQ<Rf6?Ba>P^uul4Jfj9UqBaF(gjKOM5U0sh-hZ8aUyyf=JUKx zr`KOeZ$w;sr!Yrkt#spdB0V^}iRy%#Bw|0y>!ZeenbQo_J@op00H!dJwpsk#0K1)? zhIxK+(z7<)(85B}Fq?>TM}%l;><hWMi6(2i+G!djd^V|BOkgJwo29JRvaSmgAyZGe zF%`WFjo$%aVEMcD`$dUOq)lqaCN#5IT5S`xORI+`-Igw%sq{K1VNRNwH#a240T?zS z&PWlWF>x}=4T;qN2oX8{a8CT;3UmQGnBBB^B1&fV5sgD`Xb)Um<i-rL+$^4W^B8JL zFdbr{GdAfCX#~=9Y`bSO+r2rqy$_wCr|Wi;J&8PBlD(6NQ&w4+S0uD9pZ#@ux;k^N zu1=$?5#DZ(I6j+5&)g(UNPD!TF(7B@(*D+_WrXxN66r7^X_U@G(;68G+puQAx(VQ} zg!p>^JSnC2V*s*=j|<J0*!6V`V&^4Ws6c!}vL#IN8Hnq}#x|@?C|9>4L1kY8__l0b zYLclsZ*pngn3p%UIF%-1GW+MF(apAa>E0%cbMhDfo^cLH`!1gka>rx>sk0*Jwu*UQ z7gpj5(0xtP9!~;%4fF)#6x603r{D<@jGNYYf-wr-6^${Xdw^nVq=cD{Nv0SP7ay|y z3Rp{afhmeKv(cOSyM~2n*&3g0jZfC=rgDr+6@dAPn*ne%lLZo405;1+G#%l4j(O(; z%*hpcPM)76Q6V?@WDki|0Cd$Apoc>4wlFg}Tj?@@<}_(qxCIVkkNAo>Q6B*36~`0_ zT{>cQmd-^06a4ffiQ@oRHql=RA31#P;q;_gizSD@tR(c}6I!FzngU4{gQr7Ar;|dx zX8=!GHDkw>9H^}+ka1ZG!+X$6I-ycGmWcBf<(_wgxGPRuu$r?aYXBgLsze`lv?M~B zPn0)&60@35#CpmOn2o(GMRuJ;hn|;C?IgMk5Kl$ouI3ZnGkgmUivG&?@b3{SNHf4H zXZotd8GTG7)|mx^G<^(`J<Os(nml)1HA!mQEE>1dq&SjT$f;?yXxdJc6Eev*YW==- zTtanS&7{%K(ys$(wZyk{2iynJ1}6KBV^XOue<r44L@xNvf<LXLuMkp`k|{>iCBk^8 zmPDWC`$eN*J%fYSnl%&F^R;VUvz~vUj6CLDwTNFjc21S9{wR)VjOGtMP6DSrrohK* zG4<GtE^7c3<1~bL9DpfnOoVK9)>Y}CohBCt1)rmYWO5G>C-@UMMM4Wm4g;Rlw>7JI zlLz3Xj}@g5s9DWBJ&Y2it&$RxM)h6XJ`k2`LD!Js763*?^p`@$O$M|6`^={f4sAC8 z8Hjp?OqdMAXv+y{kIUk2>6}=yO?32MNz;fvE2K?yT62lcXfDxN%{9uY>4IpA5nU3} zCaMs@4k9Y%9u&K1P`ZeiS40Pk(0bkFjC#+AvN+LsAv=kTvbaxK+*8)+DRaAw%Fc?0 z1Q9jBjd*oQc-gzW>~3$JUN*bw0jBzDdR@xtBzi|kw-yxq7j%_h|I)ECskfl?fs|tt z>89;4sVmUZ4@qlnqFEt3Oe*WBGq{c@<VtNfQd_`^O2!0{Eo7XiOLK|(G}q+u2_~1O zo(1csWUz^no5lKwdWE!!@|sIDuDL`Lnrq6TroR$RF(R#LyQeAUY1&RrI=gFR%zi_% z$BA_IPA_}h%iif_cL$W&Z%Ot9(LEtMh^T@FpD1|B5>%Fx`gagfp_cJfyC!!XN`8>) zg-T49Fz3=X8Cjpxpy1NJ^8{T3py1Ns@&uEn=(`a7765LDh)u^?90iAkw29bQa7`Wy zw-m&ajXCe7<Q3qo7QqBjrI2x=wVF#*r@2OxPjJoBRF3><$zT&z{gl`o(MBO{q6y6< zngVciyfb4@LyQ{Mifjjw))3zeQfqKq=jDkrk51k0*YBOBQT7-BF(8qa?efcdhs#$X za6@EmqP~xCl^*_RVGhIvb8{QS9dmOZ#Jss#ftpqVB+q6LTg*)oM3=eAg2<U0)6MLd zYXA%~5q};UtD-;ksHDb-bgFAfUfwwKR@O6bXCKgwCLwPDtqu!W2Xq5|2?F<kv?kY2 zd72W`WJkE7f4Y%)yU-)e#LPv$zj~AhPa1J$3k%pajv7ozWo)7|Lhd>XlzT-4ZUf!X zq}>361t42F^v(i6-Uk|&HtaeJbWW4!fpp7uv1PY4_YTmRt&(kO8<e#OnFG2fP2W|4 znpZ`I`v@r6D&!fUJbVvIn*fT!SAe_%v;y4^vI1x`Ob_H4pgQTiU0I-UO&$fR#9%;R zO&3C30LXbDp0I&D2h=D7x@(ypEAjK39xwCtc)72~%a)NX_sOpC$(9@0s~8!M4&pI0 zsE9o;Px|t0G5I9HWaM}Z>oHk@fym03#EEi%3JJ|>*Gya}Dt*56hbK-0y->oG*8wXL z#hJ9IN#tm8n2N291&+}X0O@k{b_Jl=sx8cuMwc_DE=Q;7j&m0W>!;yBwy-gF9%w?7 zL`Q|(Sq^(@7Mrp?^Rj7Pd1;DG^Qr?t1JNcSchb^Uiy_&xw9A?#(w4T9b$_I}Hmocw zmSz)`qZQ~|qAGy0CSH`*oe{oGRNkybfGPmWI=rTk193$7Hqi|scM{#vT%!8``34Bu z@r0PPO*AFs&XYiMnoD#;bBS(gE)l0Z>POTiq)n99+^ax(e%PEJYXRsOqRm3?90!`x zT%wbjOLReVIhQP%OEyuZkUNQ@n#&n>O_M~AgxpEAx=l(O20E@uqO(Hoya!a-E&@rQ zVNKoyx~oZ|GDP=i+iIXSLfS-|G?!?P<`SLI+#5g-G?%CXVGA@6H4AB<2fC(7qB}zF zBw8ze!ls{?)g;kLA$Jnp(%kz%4>U<MFXT?5I#@UQm+pl|4ss7rUXw)Uh1_`+=#l0U z(ea>?L}!JxiLPjFIsDHGaYZ(fc2GO%m5ysJol{60)Xoz?v*Mt35*-oJrmuRWNuow^ zTRX>r?rD+}ajkeToAWU$B>w1&Ud4h}=NT9sJ-s_=V$MO-+)PEX>G3%q!6vH0%p;rl zme8RBXX9o}Hu8x%B_U44=}0!`V<ToCX<|-FY6P0Vj3b+vZicRexDS(od}7Wg@`*#3 z1LPBPmXJ?8?C^;>UC1Xs13*z`>M$#(P`REOoJMs3vWYo?n3MQ~!zbnxBA>VdbBOZ9 z^8jck;?$xD@jT`WMTj|fgb#cR(}a9tP8nn+vN1WxCg${^IPnUYJo&_&H4rB{?y!kD zPbf}&0{{`C6_@~$6PUAwBE;t$J~5{b`NUjQDbLw*PMmv9fta=rl|+58Pl^z8L1k8A z+Ac(h?h3o6K+J%JBE)$ZGP4rXsL3Y|!C=WJt`iz#39LgF@4)f$7EE#gW*`yG7b`U_ zpJop-3G-$qkVuy6Gz|C4V$U|w4I$ms3$W#K*ex`g4A;QAEtVc5Vrnr~O>>dQFQ4?C z<Z`)vU2>p%^fiIoW5ROv?nWj~6<>t72e({zeYz%adsbLBk<Q>&ml=iu<<{uAqSD46 z9zBEgyFgAJP=;6c8h?1$_ZB5Xt3FI3^v6~7Gb0_4Q|K&)H@;pv3c)#<j5g743z?wM zc@eaUE(qziF~r#kSh!u;0!~zlOc2>Z#)-N#mq^zMHl{D1U~*|{9hOtBy9>){1jh!T z?}(B@#))=oE)lc&KIP>T>{^;S2NqZIh2@+9=R5%A5M2;5PIN_ciI~k-j!*FN(o`GX zYZm}EM?`1l8;MnLN-qGAN<^3D+o&2(wy=(~5IQD;38Ldd#)(d9E|GSCZlC)EPb^LC zf`97+_~yk?+#X-Zx`tbNzlF8A1@2uDOc31@GEVeBbBP{luCV~0;Qghk+yI0Ch|)e* zMB*+0ea2W`yB&9i>_$pXQf;E6Lhd%jFu2(bfS)of?kF5qAIM<<o>deTNaO(!C1N}z ze1ASNQ4KEM^nkumJOOWhLmazJ^p22T-@~V00Qh=02R|_d0E_4|Lb_AUc=d%HeFj43 zwII<2A>%|>G?z#(25!+l!OKfi%OF<{KubSXL_%+}IyNDk*&>lm2mQF-I3bYH*Cq(= z0r;9zhQvyVbZnvxLb}7io!J(hN~8m&UDQf1#cqVB(E-gadUiT2a2dtW!~6RAq?;X$ z(bufQD#d1|Z1Xzz(eyFYP)B{PDEE!K0jM~UUgUOhFUa7^*PIEo{iw9xCORo(jOa@M zJomq$Oz~&HxGd>zF_%%J>i{Suniq2CX%xYtU|<Z`=B16US#lLSB5k#aPQbu%QbcrG zNSo-2=9;3tJTWg%C-Zzs1Y<-x4+c?RUY@wg!=s*f!OIpm*>r-*c^%cN61_X>fOHMf z2z@<3YK5fQQ*Nr;BU5gZl4p>5K?@S;>Y@Mil>}>CrxLvm@P7)G(kozA=vkuE`$@W) zz0{aV#a8)*`^bjr*8%X{L|RdY5nb3?PglY(;2lHVfrh)HY&Q{waHMp%*hr&f{{D`> z=H24lfv7@;O}Z&W$94YK3nxL$nVSb7*8XeJ{CZ&+#8GoI|8L-iyPcFu5LM=;4#Z}2 z(+Hx=+}z!RlpZHf7R0!@xeDU8xvAKTs1tzZyk6)6vD@5CfS5BkWxY@h5HbEh?;U{L z+(}_i43L{p8dDn}Hzz@yGdEX2Tr)SOr>4-r9NLCw6z8CVsz935TS%P;VEmbST~b{u zJA#xF<Yj0{yhdoec;qM|-)IUU?IvKMhus2B6oAE_$QCkA)TOyZeVS`D`2>?oQ;&dk zT{3hLu}HWN{veIM`p|<D0JMl`Qb>3%eKq6uny|W}=w0?QdSe`&#-0ROk+G~wfUl40 zAir7!cX)YrczJesdED8126@g&IWgwRNp@@x^fimya|>Bn+@2IxoJgnIM7oY{3$8=! z3K8rgV#OA;--dD0F42G_n#5{?ybg3*NSkP0bEo!Uo&bD}9Y)rplHF$ZKAlHb8-B)B zzQa@QHu^eJ{|bO_9a~#EY^|<YQ&<aCNr12>gk^M5+Cmb7vrRxbO%mzq@A68(WY^bS zH;-$h$DIrd?d~+V=K!!fqVqz=i7sm{(KXGroXaP8VQK0dX7dFA?8;<Vg=tWwXAIFs zA>%}xAb8Vo9;iZka0h#wb^<QVYgm&<`>|O8fSbiQa6CYANX}}~6cvT0GosWc()xE% z{|Y@qM7pS5EUHBG+eEt5T`V=JxkNXG+{G_@WhD?15S<p%CSrZSCCUkD6Af!FQC@S2 z#x<8{LUW09Yj&|UCp4ExFEQ?j*12^_dUZ*%Pjm&6%)V$@+T`Zh$vjyAVt{$KDLa{c zw-mXP*>7vo^kq2&D*;bfUHqJD2;>&I?c^=VX26ry0e-CYGbOySz4R`SEb$2|&Qy}) z-Yv-^a=U}6B#!}}v<_-zygA{elbn-VQD&ju9EK+>sS2C%(7Pr1NN!`)O$%Ym9AT1E zSiYaIq-4`r(^otxuuxJ7fHd(*04B&hPzCgYWN%R~C8+Qr0Boad936iIz+_@=MDAij zqt>h)rYKmm$;@u=0w6TrTp+=&^NpME&B*B+l+Ienjb9D>sMPxQzsAZb(`Pq?+<VZp z7jtj&-En%4b!RUoA?NdZx140W9_6JX&eT^OQnvt*fv6c!jF0^gCjodDsHi}q3ji4+ z)=~II2W^O5%?fa!%S5(=s8Yx{5wjsqWk1Yol1Nv!lS6Y=>fJ%~2SUb)*iFbr#Kub* zPQjHZ^Z!eSg^+JE0Kpy6768=}H)}Q#TSYco_CKu|rptU*;%BieGrXq7=HAGyKrd8C zPmBv*1sWqmv<V<@Z;{xn`9#fzZ-dC18>8?93T44;EDNP_D5M;x9Y~_ZolhJ8e^cFY z$jt(vhUf@@1rgI_fK9|YJidHW(=trM3V?5=T7#L=003(qDUTMWP9cTCCrU9o*p7Fk zSvFBgj;ZdxfT=emHAbWb6Go76f2`owbX8>IL=@r%#4qeUwx;6iBAg)7!k_N*3ws-e zTadUf!tRR9dj7c7)h6m&SZ$_;gcT#wf(awIu-cSeBeHQK3bERLVXxX0t`gw{krw`R zpI_Lk_9jR~McA!&A8x;>Sws~B3woQWCnPmSM2TX&zGfux_!*lTeNptJh{lPu&V-Tl z9fMKum<T3_bcwFJI}O$~Nwx0+-P2?Vs#PXcb1Tk#Ycz|fVsJslnYv9<V?;XDEyPQW zd#SDgGIg`$O%Un4+f6&0!OBXieH>^`ljnghYw`imBTbq-S8;o5A&XkqNS$q>JG%Nr zcL6jA?~M)0Hi$rsXk5sSDWEw`5?uypJ0e9zaLPo~r=ZVWN<DRPs?(y|jVN_^=0({} z0IbABTDHqC>sePL1a^z8Jq2`3lP7`BYLXSZu1V7~tlUG*B8m<z7)7S86jqE#r@Eu) zrN+HfcTdjLGRd1D(s|uctN?3^q}oIc0RPzpr9Y{YiLMHnB)SGzI69P_5`h>I<vB-) zDeRvk6rBZNT_e&ZB)k$j{UvyVz-;4^EkQ&fjICeR8-$}soD%_ermz;bG>hoM@Pa;O z>h~lyMx;~SUi4DqUaH%ROua986GS?%JCEkUDwD$Oa-hwci~{Y^<OI+WO&$k2p-E#J z)OK65i1?f9zIA}9B_Aa#Ms!-pokZs}mq_Qqd6mAHr%Y1gL^{tdq6?Z!r1Q9&1m?L1 zzyu&-s{cityWpLa%pKIDGrJc0z)juZrMgk+yqmh+OLhCUg6c%G{SatglQzoNh1jN5 zSCMjGrxJY&;5X$8<Y<(>vx&9={K+>)ksE;JndpI#Nur0EOLYIhg1%>-lDzJFpxt96 zJBao`P&*+~$0S<^5jE%pQ*G)k7bP~4t@WAIByRhJl^_}h;HcqjG1c~o+Bi{G$OMrt zEN&FAeo;|i6Hz@BJSaBlUYSWht5UKgh&BlsC(@Nm7{S$G)k$iCNDF!kAy}*?jCBfV zQQxsOd7YQ&sE~1@W17o6x-D*bZ2b|PN~H6|Ol{7B#q#tigxA^r_Yf~b=9<<(bX~|e z(M`=Ix}&*9uTSvC(o}3gOsV)1R$r;UuVgKQOobRnf@qbHaiU7iC92X~Q>ssJ_0rTN zSZphXvfM3HZcKh7fq=tQ$`^akMzeq?EPQ9wXG$n>8sOZLJOg;r8Y_|gH*c<Z>81>0 z>B>4#;j0C17E54j5XF3y0i_|Bdn3oXusw{dS(y_6cp9S53VUqA)B$W(g<2?WH2mOP zM)HJHR*7}shE*`S^qrA81DSIGr?9Ii3~Lq9bs-Z(cQn`Jp(aQ0+S1hPUa9xw*X<<R zO>pn%a)|B<87I20xkU4tYs&En-dmcw2SxWu#bQL`LMDigXf6>u3)XVZ^#bh86|b_9 zHqja(lSFGZm#9i}iRv_$Xp`oe+ELR=Va153Li;;XTGpMhyiEd7D$(3QlAT6VGgx~h zbvw}+A-jmqYwiW0E1EQUuHyE(uxz4RLMDkGX|54ud8dW7o#;yoQ?s}|CoH!%WaWjG zBsw8v2ay&`8qE|uDyd1L#|vIV>NiBtUBVvXmcPlw^&M!9kR3#89j;Rf1y^Yn(c=Y~ zuTBdRbqU!)bVPGawJ8|YETYE?9z|*$MhcU@+?{=f`2?yR@*Y<jHdaMb4q2xG&NtkV zJOg;r$~&$GH#fX=e>Pp}nCD%LdU%sxfoFEFlgLlSn7!0}Rg*+t2NdJW@>l}Z`8~)F z&SeUqp<WSVwTa4JXHi{5<wDv-CnkjJ&-2@oCq`8E8dE!o9s%?eA!Uh%P9iGQ38bEt zgcwnskex&<WnnzQ%ISjQQjo}Q_cX+*L04|OzjBwQatR^|W5~Qb2``U3kXIpiQ}WnE ztUJt>i22yDD}Z%XZBtcW;CkK3k7sD*1!}kpSg?f6Lf0ix>&6shJp|}Ao?4p$`fdtc zp}WJs;`?%7MfT;uoiB%PwO-{^TPkLHs0+*n8PVNDeSigZW%_1GcPH~6>d{$@7Q-sB zhOzV*?!;0-!-Al1wK%?1&||sfo>?koSZI<rdoC}PGc3rhb*pz{shnX!ZnG<QZ>gMN zp&7H@S2%Hy3c9a|<^VKdZ=df8#QXx@ftDu__X~JCMe6*rE`sRXk|N0Y11&&wb6J6_ zA`l~@5I&A9*a&;|x#CD*AzNM>v)nwy8DbM{nUu*w)F7lyH2*Q-5|vMzJ|Q&)U=$5> z&rKlJJR=FlkXXt?0QQ1JkA&P!L_s{fe{|R{dQU18Ct^Cs!0W+P;QDH8Atxs<P=&5B z5nl#?qad=Uq=fmycTxR^02DWWn6<9}$PH`!5P(h~DwoQ;{)7eI0?>01e-8i$PQ=<h zXN5j}?{F!aP#OxXEwbLXvS8X`stRkoTg*B$4`%1xVv`xg-*cO8#PLF8osq_xP)FfB zS_0v_hgnxvP;M3%gq)jvIX5xqtj>AgpYy(3=4wb(0`O>qh?${evroxpDmki^Jn$=d z;3`=IiM0SIA!24U`HB$CjV51_wjbAO9{SZhbk$TrGz5SeB1g?tznZI}hA)}81Lt(c zysM@Tc{gb_M2?zkel^!b%@J)GQ<HZ+%b1$<S;o|)ueYaAsJ=Es>lR%AkyF5Re*xE} zfMdFVS$_eu{sLzG1#qDB)d;Q4x&R`lfE)e-Zb$*n>^b7*j6&SjIf<N{xBWS9`*U(! z^_7Hpm(EG#<h<k0dB>mgn45Dq#P{f&L{84T{+xIHIcWs?>VtSz=Ol7+-t*_Y=g;ZA zT$F?Ou+B;3<h<|CdEcMYdpRf%@o}A#$jSM@pYwq~=bT&HDTvSNoJ3B}d4JA%f6mix z&Z7`NrgIWGIUo6RKJw@EzFX=9#82v+L{84BA`;HbnkpjUSc3P3Sf{}}1Hfb=a&pf4 zbI$s6dS8`w4&vu^P9i7g5r57j{+#FCc3y_~6`hmF$$8YD^Qb?k_xb*-5Wl8#5;-|< z`JLu1ztg<zmdTu}F!%A*1;(tdgEavGyrE#`ukWSCTS&bPK*ta{y?9@lUi2RxQkISd zK{QbXl)|wcFZR@SnL;V*==xh}BZc|)p}U~$^ow%A!}D(<N9zOSiS96>zEaBz6r>^J z%QwmkB)GIa$<?g%h4R8($BDTN<H%gbVx{N-s<co;S%;W`b<j6hV;rOMRw!17PK}Qo zfmkGjJ^uziS6BuLCDyC>sTorTByhE@(%NSyNsI#=DX%Qg39_so7>=;+Iz(eh%Z4Ld zAJ`CIgl~Ga6d%*(DHD5P6#%bw=)E3qk^txRi9H}`an9=#B(DJQ;)WLI4adSs-wl%8 z^MsX<Gc1sEfTyfaKfp-oEM$CHWOh@ABzqHM_24iWykS>5DosB+x27*$annebVL6v+ zDqim1EC$53KnfAd3!4kP83rJAZGi-<?xe0Q@Mai*)QSQLr-sa1;kP$3*1BWu=4UNw zPY$D^;H#z9VL2CT$)Uu4xd`(}qD<y=@0~F;_a<Kzs=OJ1z>P?UtnLXjM{$FsCODY1 zO2%;PODY%IQB2w>^<^`x|G)GT>%nH2elSgO?;q1oCy|fK5&DVfypSE`Q#e@xfNL81 z04eiYkmwNr4zH*{;wcezdzU)3qRwj|wW3Z=1DXjtl$bV*;{;>BAdOW#uKTI?G614i zfT$4U^14j5zrUrL5`VBAQV&Zq{b_QVdt<=n-jrX5JW&AKL_7?@i%F9O5+?vy2#Ba# z_$K2u6nGneAs}KpRs|MQ0RWdsdoOoQI0wPYIuFs;g>;AIG;Xz;uBv4W9gf&?F1jE` zlI^54QcV+mf;Q^Vr>jGh11#JYlQSy<F`}c6fVT}j4bBA-u!(L6nIyWUxkR@$*Hn*r zz9y^~(G>tojTJ~;mjs&{bT;?smbZ6wD$!lQ!pf3!PYV#;Um`%x11&)GaEZX>SsdK~ zu$v{i4$w6-Rkz;2_yIV6K&t@@>p)IO3lMEuB0x@`79e^gWRmFFH$^YeS|O7}b(%}G zS#yb+HJ9j!=9(IM`eR1FZh}`t%oL#$Sc)x5Vno!pu+g5%xKW86xTh~}^nvRsiyLL& zn#v8MnJ1;iyNSLeq&vVY=Q@DzmlHpf<W3gEO8H+q=lwYV#)0U(kV&G;noD%@Eea%w z&IoA}tvVuHQzdG;BY9#(6xOXLbyl*)h?s3*w^023p1@U25?u$p8z(og>E~aVDl72* zj{#3Qyn-p5DjrJVoh;)4fWN3*;tH$+XFCAxBswBwC*>Y$E>W4ZsFP@gkT#KSr~5F0 z#XJI(TBFvOwYossLgpuNkFPslUEs}HQQARGI=ee^TacnlcUhOgx&pvstf}z=soMZ} zbfUXD!TPY<l!=dH7yxJr(OCfd(=L#@r4xv5y9uQ3>ja_)ZUQOm6QYW!gdnO+zml^? z3lOapGD*~+xkT4B*PkZ~7R`+KxFmNFQPOXHyuU5UHqjjbjvMDD3Z(AI9UDgKJ^(Ey zD*xo-YElogz}=XfIDTTb2bxPXFJywqXz<)GIV%7tf~aCi5#&^90iwDk0^~Gm0V3NK zAeGb!L|txz=`eEkXaS;eA$JoU11ua6a?Xo@O>|Spq|wCNd7VmBag+^mQ+Zn{ESqR8 zV4-pfydVNGA|v4S5;=7uU=wWyEYv`O9~XfbkrD7Tkkc#zHc=9=Py+>`A`l~L7t$s& zvI~`Ifw*75I|yZ#Jz4`%7O=213iOIVjK~OhMUeAJ5wMAl0<;EFpVbLOC*1@y7UZ1O z0z{XW2&{%=u}GJgJk~u(nd?Fk!T<=|0z3pf0+cD3DPT2V4d4M_9#8@m<$x7{Re&jg zxhQuM(6@+RSq2{9HsBG!T;uP?+6}k{xDMbi$d^5ZIy{ZC0Oq;^{$jZY;F&9nJUPHH zAP?Zrsy`@)9>6?+zwAw&=2}kvB=VSRH{`!x{xe9wOPv6tpT9hAuB%Qu%jJ)Zn=ASZ zd=y{~z#sfJ7k{dozur9$C|O~+n3SMz0{C;>_k4W*>@j~6csGDQNo%fQ&}RYX09Sl` z{wnJQ!0z{9roP`u!}>wnfFyuFg32E%<xiiQ-zeqJlivRT>IUFXMVgE9{0&w9Na;-{ zoxiDRenhk!vQYqkKGdI&`uNM3Ce7&MZ$sXJk(wV_<nJr;M<V&li1`m2DbxdUB}m)- zL+Dqe@n;R!B7F<MFUMc3<j*ovhCe=NWQ?X;mFR~bLE8cReK~U_Ux3pDWC1yVx$>a- z%U%4{t|M#EZooXi{2JDBa{O5@b4`HeuYZ|e{W5&&IR-cmI04`<a`A_@sJ9HT8o*ze zGS?o^eE|Mq)ER*JkuCmARTN;ZYoKocZUXp2P3F3=4&wp13b+Qi0pRcS<kn+c04D(a zEgJL7E#_BSR#l-)fVuLJF>>cXn`<7r8lj^ZU^}{wA^jFWbUA|jbr$o>E&Tlz^P4J0 z4}a+8DBw8Y1mGlqKfkhA&PLunfC)fl0HHfzGoTT`A007QSrCf}!2BYH;jak6_G=&u z;J0%h16&8(0`U9b`SqRW0p{D;`9-z-R%vtb`=eJtt^%+Muo_SaU_O4?vbp$$(fpF= z#rzOtSw3Z1j=A`y&4z!*$8WC1)(*fgY@P@3tLMu$!XE?p&GY74j*Xr=@WufXOoJYN zPxd%~UlniKV!q&;U-`<fsIB@*lN<8B{QL_0%gg9F4qfb%e~F&k{}c2agO1~X6M)lz zGXT>*ew8cRV=lvA3!a}p=gZ6X@mpg109gRPYj+sHFWcp}#j>5|szP6G0W<=d0sM~G zJ^;TJmi=rleuW~x<<NX-qTwG0?*xEf4tU}tSPuYq0sOYU{7)Gv@Ijvj@C%F@>oLax zHlPb&zPxS<^br6*-EOWkTR?$lzAnamSBy#TYk<u(!gi9t0CSn|ZQ*wq@%xL+wP!2V z`EBqU+c5{bK<~gB0WjCGX7mr>1mGlK4#4jTF;`_2?E{!Eu`v8*@NO@|-`tAv1ekA| zm_?Z<0p{X&Ti5`8p#|m4^(cn^i^C6~O<Mrw3mi=P8l-){bf)p^fbJnLzp24|O@sN4 z2J;0Cjp%Fkskzo9U@L$;fZwdZ?>e{#xDSx;*>eP`vmD#I)8LB?`jB6S;9k42z5&Vr z<p6%5o}Z5A2jlMn_?h@s-KZC!u@CkDD9b_)kOb@o@Pj$-1$n<devF<U!#1A^H*)+$ zcovWY3<L6jS%A6tN$$&lD}ZYNew_OTz+BYHPvwVt;RBs|@x##kNHagJ&CfXTQ?2Hj zgWP3+`H;5Z^AppL02cC=1NgD&3V^xzk^Z}T&{pWAZhnlOpP@CMjy7_~A$JmR7H|c? z4=`^=zGgraV6GeB-vrzSSbI=^Kpntb{GtGUKLFeE&{q%gti9+b0KXW3Y3x(;DPq>i zw3#2X<Yz1wkCUmhf4q#oD&%=wzK77o&#Cc)g8b|uKYYs%gZlN<eV_c77v<mW<mYGN zjsX068hv{BF;terPd1v1Jku_Ic+p&>`Ef&kJz0+VAnanfN6d@1m}@QWn*odY)M@NI z%RJ6SnxDAir~TLta~;8$$hbJ;VfY+7e$_(-Y^{>^=3M0QTOatzJC2#T_;DqEPN{4V zb_p=okrDVhz-ho)fVr-Nz6-bqc;MqVkHX9VeSl$rxlVwd1Dpn&@$u(L=P`!?d~JR+ zpb^jv;7j)ADhIs+unIsqbMejlHGnEWosZAA>W>1Z4j`5Qn2T@DkCP8L0x;KE(02j% z0QUh80639yujSI}kiH4f?33f$=3M~uMmWpno51E;knYR32Q=UPraa%DHkaX_1n-=W z&v&=^UiNvw1;Awh->ha{e|e|Dqa68neEFBlyTX?~H4gs>FmINc`uO?BkZvy0=K$9L ze5cf0(bq7J0KR>A0$?ukk`C{zkKg<{_yE2}ST$j!F=mJ0hX6MKd|Gdws^0;97jO^o z0AMb@EW|f`_@s{yy-OxBCICLs>Y4%#;FB#ri8ui`3AhR<pTT$n%(a}JGUzZD=@ozq z03YP72CM-@0elE(uEptwPZ?9MKA${kdkSqs9a&Fvk)H#c2k<f27RWRLngNtI7irVZ zJ)rvlS%A6xJeFae$SiKZUoMCI#{j1RM&5F+Yj2_---3?-@Q~JAJmBRCEf0tN{Bw}G z4Y&ii>yy9pVV>iB9odVE{^^;gts-2w0Tku>_gcZR(UBmCV5YY>*fTOvo$DVQ8?Vj` zj-`6`_Gi<<y1=Gj|6p%!tS_a7&5boakQ?q98BGOxsckgh*Oy8MvM9_-jSu(ayHn%& z)W~2@4m_j_Pm{=)AKLHIBSX2Az8TGr^bcl0E76B)X}V{0G&PdfG@huV1U!X1|6);v zx=|di$^J%Atw^hZw0bJg9;uF~gMm8rS|Av_R2vDZP2os&AXpu#iPUbWtqE2K--%p` z>}x5gpC1aht*>3L-W^Z}0vp#?zf`Nn0_vH78V{^f<$+-BrAYDKii~=9xVm=T#-^ZE zTvDWd*9xfpVdQ!(5UExl3aCEbtPZH2aIji^IG|d>!H9a-H0lsc1q+d2byf|Y%0yJ% zscMv+ja0v^K1$JN15F!MV>qKm-p;7Xi|Y5Sx9trz!Hp^(P%FZyL$EGX9aKXB^;}@D z8YK!wiqjRD&sSI1^aj-j11bkSQmG2G0M%HD0@SMkhj<E&u2o-qF8tmNHK#vExzccH zM7<VP?<%W=n0i-$f6K!<N&ZGq_m76vmsGl<D%4zC1!ghZU0mQFxeW=mZ+}3D8Qy(v zR$Z}9p}(Wm!RB`Pt3FYbMh_0mW~;MNbjO?3)gk;xhh#%lHC3TduzFVQ3m`3*o~f>> z3aY9w1)4+6ftp}da6_$H5eSB=g3Y1G=l>quP}Rn$%A&zFh18{e5p<vW9~0qdRj4W( zva711p-goY&E1#g$jj(|Ouav?>Mp)Bn?bjr^pN_MNiVe}*rGm^j?qjuq76ld3u=2H z^A)vWI&x`tUjbdWp{6>xzP73+ni){dZ>!pGt3+A_0xBLrrc8_aiS%B`RD~kU-pfBV z{Ig*{#zK{!8dR@M*QtZyVBNZ4FzA!&7b(@87F+uHT-mWmb?{9vi%SFYw>nz00a?`h zrZdr?>JMkCgD+h;5(x&`acU$Gt->h%kBVt@IBfl0VfFMWsw_>Hs`sYX*UW6I3ALib z(B$Cd5PD{P2pwa?dP31`RU}vyMOO@+s;R0DLW1Rlw^jxBwMDA4>uJy!w@@`_!kJ0T zoM3e(*ZZANRl7F-129<F&H8X4n4O&w-ulm}FYXItmS7giTmlWtD!T^34d|*+um+O> z=~e1!u{HJ6Y1QOdUFkq(|1W+KrnYax7h1onK9E+wT5&2^-L`K-u<GMzvihC<oLU(b zJ*8HKqY?F?a0Y`Dgzl4{SG{5NZ^G)w!<cmI)knhFnEFaZ+T>PWMb_V{KraQ=rTu}G z>e#cVBGqluRnzhpuBxPnMqNZ(E(*2=3(<^PmsUH%5lK_eq_a1XRIK)1Ec=LBF`dD6 zDbh;m)BGb;N;30Li_8@a#BcJhG%bG@l`>0aGyh1TVm(5+6)A?*sL_jR{`I%vVqTh7 zk%0PRxE-f^1L|v&flF$A@t&f6x|q_-4pwn#nEH58Kz(*Htp2O@c2ND(;Xqcs0nY4X zc&1%yQ#xImm4e@5Mxne$RO?1em#XYVSWA_v4gZ6PAeXvkO@kNOsD5oS{LScFaG%v1 zF&3D|E7JS-4`5`1zZp?)O=1+Fx>)^@70%c~b*9y;w9{hs-mrS^A`7O)w!IB~YP?AO zsTBrQfwmLHh3*SCtIgra#_BrS<5L0r&DL&&i+%|f^%ADSCH0@J;&4&_o2q&`sOmX? ziqvmefg1EtSiSHzEUvd%RDE(%TU@%d|C?<y5tw5xlL>MDlywF7sp|BMEsZ?g-m`I? z*fpEGl08tNzIQl0qo#}Kwzq|Yl1c~EbFn(|7CcuPLQkvnlSmKNNQQDqssEhERBhc5 zRUZheT%e%)P}_v4kUuyTVx6(-48wyT!F<8e^97a|uGx^qM1*y>2HuINm0{{h1XQ)O zvNTXipIlU@+MI?-kNOp>s({)Xo{6@v%SPa9UG3`mQ&>7`Hq>Go-C21`)QMT(d&}sB zrc1vH*Py=K8Ndn>47Og{P}>qzYr|X_-Wxy_FryY;A>P&q4=Yt&@FgetJH(Rc5Fz!^ zfcn^vrEAm`806){fnY%Wc2QV;?Qoz<{a#TZ5=jM{)wd6agX(9%{_VqoOmrriiL_P+ zBW*L;)=VS{Gr(W0AL!x#6G}dLIH3N)!=af}5Vif};j+!_)c=M-Q*Ry)w5kV1Y4wK( zzg@e&cJJW&+DO@l`&-q@>Du*hG9j$esyEHmI~|BtN3w9U<I@Eg4}9osKe`DX{cFSF zfO=n`Y*z~=<!271)$?#Z0rh-9{-Ts;(wMZFe)X<2w5Sh;BPtV6KZGF&z^w(#UO*wg z@QMCN8`qFn`14rXg3&?bst#r{{kRGB2WvJ&LNm95Y79PKb%nLj2UTqV9_ey4xPdKt z4I?_!vT=P7lRbl~d}(DmqE?4hZvYMwcBas!m@N4Jw2Z9U8IFk0Db-FdN;`3VO%WIH zBC#5=Px&M6NR3TLRQYtM3QZK#!erfZF;Xpyoa5RS>6(qcRU-k3xW6gps(u51X;O}h z5=~-k>U1tZ2XJv^TGa&9N59>QNttF%ieb`fEj>iBEQ_l5;(x*#C@JqwtJ8fKYc|xV zXE56^e_<Gyiq-H18{-I?Hm=`T9cit}1l8_9G+6x-=2M;eA@qxw?q7c(&{kDdyS@!8 z)Vi7wJZhm8_EH@z`{~P7q1kAERjV4rD5nv3!AYT3VfBYkUWCE7MzJ&;ib3?N>S8_+ z&Saz6*{c4gLIxxCdxPnf2<R|D0_xec`Y5tL69}rO(ly&^pdJgX>Ikb1VP&V)JveeZ zeDXI@|F<HUFS0+fk+Odksa}UXWiMn^d0G#<Gx%`b#o<e8XF&b0m=!P+SmXK0fZBBN z7ToX#_C$R^-LTT?9Jv3x6_7Oup&m7t&cMz|pl1>M(SzQ`G??S$I2eZY$iQQC5ago5 z#>WN+5F%7F=6pH;=Zt`~Jb=I>jE-Elaoxt6(1x03glB4)k?MX{p)#Nv18Oregw@Wp zdNIHXBZ_@r0FH+tOh)~l6;{778LnkmG9zZz=2+1eSVOT$&z|JAmI;`kEm(0tB0efr zQ<L8gs?`_OiOF;!itkclE7PUFrmhwT)E^xRM`johVR6V%=$FvgJLvFBhcW!=2(|{F zU<UO!RsfBbnAVB8TBu)4tQwJ|dz0$lHxrav(Kw|r9czi12c2FHz7cF)4-d!m;4DYz znRIX#!{c<Y`o!e4w6(aD23=IDbx7r<p)#kmN~UXSgC0rMIbFCk*BsK-s4G2H%AgEO z>@@y<91Z+$7Cb^QGZU%m&%g-Mdb}_pLWu1-rtc0!E>W$@pSqQm`CDB2HW}g48TD@u zr`10exwf!y9Z=7{jXCu)Yz2l_Gg}Q8uYM{}jZM|gi?iy_k@erfOFwun{XPT&Z*Igu z!G9xY#XhI%^N3x4sdPas_xlI~;Yr8Cn4Zt2H)4xXHTzOk&4zstJzk3Tcwyfih>k)o z##pF4puYTiV5Yj3k!*GFQbfI{cx#dR;J2%TZ%ALg1dov^yb)CI3Co_WC;W{j4#RL5 zz9Fb8rrR()Xi3|8bV<BcJ$Mz)KCF5IbouzZCIEM#{*wx*TN44g?aFYlR_%i0mb(p% zw1WtGFX3-z@pMtqchxsk@!FzGEwwX+=$ve4B4X3(msKD$HwV9r82DiLC01ij{oQy# z9e)z5(Rg?p82I@DS^=EjyQUvjy%(I9(7)<_N#OGcNWP0Py?bz4eQNUC>bsWqy_lhY ziZu^X6g*xUQ1{2v>I=$E{pN<6e$0|;u8MD{uxx3LWZ<Q$=HMZ*e2P&Qg=SC~gP!oq zGg%?IUH+w~121g|Vpd1`gDuz>)J)c>KO6}JFK5)xO@uK@p<o6Dgph4En|Ukq)%CR@ z^>0-ekycpc--bU^e{(oI2WRu6)#}d>!Tc{zgli+}*rC81AN#Y`C^j0=Z#pf8BX}1! z$kpmMo-Nz#AMoGIht;*$!!u>a7farL77>~@4RwBSI-|b++(mT>Zu)oNpoxF?xj;4c z5AamKKR8_-`NI0znoRcLH=`J|8uiasfYapzdM$k8iD~txuT2*a-*9trr8w}A9gAUo zzX=aB!SAUH@OwUEJPu3Ds2gb5xhGJp9upbv>S#+;ed};IGgtN_2vgLZ*8_!UjS2-2 zb%z;rBlvjkZNIMX4hFa%)s8n^n)yOB)EtZi%U+a)IK#$6sd_5hnn7TRio)!qM;NkK zt3QI<y*Pw6uL#V1EThg0!IS@^N@v(2><i%<!!y|`jCN3E%dX92GWOQm4cK?r20yQk zAJP%Pbm=8{_s=Qp(7r^+c&a*rh$@TSC0A5h(3#gUouCmFt%<0gFOd!P%W9|2pDxX| zd?6bAGj-MNCiSx;)36ixKxR|_r8upAeZrJRRbp(2aWL?Q%eo@!dnH&@zOBCc+Vq0n zfYV_4r%G@_@dvMk3+i`Eaj2sm?{ukpG%>9{01LPWN3TAPv1mCJRG*j#%zSejToVkq zDx!YzP(b~4vFu@=D$8@>KZSiPmiowg7y^8<x>Q1AC_chJJYV@cY&ldm(2k<jpA>0) zLY;~fTH()TqiX8)Q|c4yl=|*OSe<_&{14IF>a}!mzl@4#;zUlvuCx0tsWXSME+Lo* zp<NO6Pw>sqdhF12_7>$4*QeEL1XkYwzOKU9fvBm&Wp`!V-NFA<Njig>PP2S>*=C$D zv~YK(RA=~2>`&i36xPe0?q9JR@q&_HLOroAy^0|6_?Jkh!|E4`FRDFZ931e_i;kp3 z*2t1l>=q8gEunwEgT?kV#<-SZx*rfitT~lY|8yw8e3Fa9#$10{G_C&o1g*IED{Anf z8q_57ssF3!qB=S;J*a-Yl)I;DuF>iXaQ;`H2&*3v%U7R*k^bLm+Ll-j@mwettwB@( za}5P00(!~WpQcOqN9e4mxfW5!chpm5UC@WHXM1=iqaN;0i<0#`!gw`M72_82<ytP7 ze~ul*7qOEd{?)@cf@%q3I{#{MaiB>3BO-_aoSI>|aSrg#O@{YnXt=kkargqkKRJw} zsJivFDZLg1FTvx&kl)BeGU`9BHb)Zbk9()ph1CId4Z%7vri=QW-ase=uiT2&Vq*|Z z<kl9)X@QJ7diWw1tnEB!JcFg_pC)izxeaR7Us%}DzbCx4dSh^1HA>w8MKz)Isan{~ zR&2yED3O}rdThK9k$$&2f@3H+qGtm*+vE9WF!&D4=o_mSEV%!@2TfAx>3xw*W+1EX z7EfcVo58LVjt$%8zdVHC6vvb55mu++Q!~*l;*M{tKRxue`k7*$cs`x}b(Ug|Jbz^p z#_*NN^jo#tFfVaVh5#n>RaCw@xDhRQRz`N;Y^J~?t%HGDRMlzvkD%1Qvo6XCrfwY$ z$EtA1N83U4H|qqfILCB01c+*9)lb7EeCyD~vKOMKn>M0HIR22%#j@Ef9QXI|xg>CM z85~MpRCf<uMC<>3F^|>MzdMA|zFc%Mqi$LF^EUr{_VC3_6p6K}BR!*jt_acm-yRNU z)umP8+Wv<e*5J(N5QC}T?dK8}RG&SBAquLW#iaPu`@`xoT-(=Q52&w{gpcU`ERJ0N zD;TFr!a2>j|9beLI+6(lqh&9u-(Qth7m(-L>w#$5PhEmn|5T=IGpu#hDP7t-EUoNk z)u~Ka4W^qFR>~_lR#64)_da;>*VOwjX3Jjv`~JS)P`{YDsQwPz+0@$z{DYzPtzS_0 zajs(MFF(l>y;KB;pI9!$f(IF)>{A~fzqk)OBY5!jZNaGe@Wo)HPqu*(^(xG6eKoh9 zd(C0OyBJA5%LC{dwI!V8n$e6HZuLdzVpq=~(|#Nb^~*3jVZL54V{O58aC*r6#qu<A z!pT)dgJlQQ%?W?q7^n2BKPpb|+rX1pR0_vNx$5BGi~cN5-S_G93>LSQe<VTvRMlbY zfdTo<yWVbJ$D`nZ>Y7jurb*39zp1^IaTK-KZ8e9=eo|W6icR)+)CbG*=ph*NQ)S0g z3cdUv_oV~a1E4<G>3!y@uy^xr((T#(NXk~N!`~drf>opgq3po6)(x0#Gm)3M;|gGp z6p02mHq}<Cfq=qseJ&gdZopm?n@pMYp%`*^2eO*^d;n(q@7Ka3N<@5EAAR93J;taL z?R;GQ$@YNym9@hBW4H<R=GuVz76RB$D=gT5kJIr;G!ntW748piU0wx)pm!#)SYo*v z#609#4UXT{U*gbU!x2<Seep-9p${iq>OPjgb7~rK)@RjUZBM_St3#+Y(?e&<2QHs2 z3fHv0v_9SfoqgDRXZGUk;D-X+YPj~cVtK@w8xGwM;wFYebVneF!w^G<0+DtOB_rcs zele|n0ZYvl1m<6QF;G`<ChK2g+4=0Da1<@$mC35JyVG#Sydvs<o0zWI&>zY&sKOot z{f;$)OG<elQyqC3i$jEljM)5F)?vnV;+QUke>H%h`r<lvWsp0$p!!B9#q`n{#<~*8 z#ME(|Dc;9oa2f#xqDzKb->|~_)bIZ&Vm)koAN^<mailt{L{E_C{t)T*w2Er2|1U63 zr?jB@FB}08md^j%9f2s^<-QE81b^0JWKT>^uT<?}Ra2xorlV?ISnWuw|4<xm#Q})= z$$;7#;JT-N91#&bJ=Vw|#-78^KMK{_1-2}D2;#Z+;dFv$L_zMY@<0fshXTR2R<$aC zP)NNWr-ii}T3a{N)PPp~kdUoBW+5Jb;Z8GU2+SY$>VW{xun@Hfr4gq3`dTrN*8+Hi zGxcKuHN685Z*WF%3FG@a#o;>j)k8SzgZsP)#@B(rawy!2Cq5zdTNrJ4&ud7(Pz)Qp zc_<vy=Mt^Wv+4`QIG$D44}}qLMOx?dnhVz!L~w$W4k#l={=Y%~pJRTW2K_zw&rPd; zF2d6QSoI+sG0sK@v!BD`9_(yyeU0Z0>R@{IWGHeH#!>ZgoFz}IbGuIA3>LxSi__}( z;fsI%J>5Eloi!Y~_3Gx%fcg*U=>rHJ9D};CGw>!hx~M@UvQPaVYr+NE-{0)IxU&7d z*<e*&ZN=<cD^ZEqN<5$pW<oe-4c1n);U7+iRtDQwwy(71U(C6wz}^vHZjt6A+bcf7 zTb%<rEBb>QUfNiJf@BxOEqb6$z2_932d#T)TU`~#3GV9M0UT7+sqVB2rr$w)jAKVV z1?8^<mo01nj-3%oMqrI<A7)LJSi%_2>d}W!hga&*C^m;d3t@K{Qty$VUFJ_PlCfnI ziK#h*O-u>{^lTs#QWqy-+T~#!e8SyxFrJqf5ZiWYEgTL|?F=F;xK9SdFu^@e?MgA( z#{)2M9H@met(pD}>hqI4uC7CKf^%pI?Oo5&akv5X7e(onb7(#eYDf7T3GN7d8)eC} z#C<^T4YUPnuoL2jzD^CN)eq|)*(b-~$iavYjSb35_OY@TE812@W`eaVeH|8w1Z(w! z9sjB)%aV@ADeK*~*GkWcf<S2o=QwQ(8Le%>w}P44;7o1st(BR~{v)cYD3S@bs^^OK zePE_my--wKiYNO0qg(s&pxrvqlN(Dl4fa`Gt<mm=<PN*3yS{CQHPD?J%=hOHHl})W z%{_yCxzq@F1E~T09mA9L#-4nSWU=ex^{w4aZONA8j&9r}TH3aC*GIS4??~YJ{>bpq zsMV9p4fT%pzm~H2r#o-;<PQ#~Buh(E!rGro4cj9_y{XYrJjoXsrdzpwybI8iOZ4^( z4yH!%(X^5Nww?hf$@h%pt%0%8{3|I`+G?&(G<PTKUx_w#w<Me5QmaI=KG~7zZjV?a zDJi}?-8*Ov4-MrSa;csXE88=gP4?`~rSxqoml{BOlPq?iTMA%Nqr*MDDSr>JkK*kp zDB0AN>~3soh+623J}Z;TH~Cahd-rHhE^qY?4IaR22q=$T*qBQ9jDb7S^D5OxQ-hg& zR_fankGIFWJK7qe?TMzw?uN$tWPNv{sUg|Y-sV-d1s&3cS0t?7p5AP#uPycJD?Otr zD-TvecS`r*5Xr&5p4`x2$_yL@P?$9cZ0ARG524C~eUELW-80fN&?F`RQU)ejzpcBi zzO~63%JsDj>a<Q;51U_~$9oui$MUHbZAsEg#wt2qiMBL!w=|+}`|^F3yaA$XA!3c~ z+V0xg+nTKUWHR3JN=LHE8tv^#r=zI@sT{j8kMUuC*rQk0XhWZ|!v&gJ+F%H6_0jG` z$191Zq_uafKi7x8!TTs2!i2Ql88OpIL&NAHcYxh$bjy@*jTLPdyRr865B9-aN1Zz9 z?s#nemd1F~R(4#+ptQbE%lmC>81J+UWoUf)6yK9^hsH`Y)VH<4u)DkMcvBM7Y%2_f zmeJh}^Bx`=$s5BO=uVHMQpui7w0|_u;+mZIX>@V%RN856{Yb_dIEW^s#x0p_Zo}K! zF?Fb0Mq|((Nu~S8Q*37M&;Tci>94+_-Z9>5)zb2YSVw(ZQs<<?CV8i)6O*@p2(xb_ zbwI0oMfV*mD0aJOB$%~Dsz%D0%88DI-PG3DL?ePz>CZ!@vE`1z{ewfV!X$f#I3}is zORNR9Ip}m1Y-rTjLfdk4M(QuKvZbw|Js!tggqLe*Z-jrtM0(X8dKE5FJj&4U!Gyep z)TT9ZDvDtyQoXFEsgK>BXpsrsn}s=!IOevj1MO&wHYE~lds}0Dl=A|8#X2YGMhChx zBST}u4h@T0zC7K2w5~@wYiw_>zZYEqCm`=wVP0eG9M3zX=i^qGPlKLpt(Yx2OHW~I zpy%M;RB~v4Y7ph?8NM~ulOG#NX=mQnnrx3WwZR-m>EP%l8m*>iQ!Dbz41zZwOtp;- z>_w-^sHR{@quB(Vq}SC8`hqitNiwsSP1)K6FCTB}Zf$AnPPFW75<kHeXEZ-Ff<=uB znD$Vx-Yh&?FIvu(%Zvz2X{n#1m&6n@Mmjh&GSHJlvu)FXaIKljez+sn&eWl!tp&!> z)V;l-xjx>V^lIMF4rhd3aC(Ewm*bvw!$(GjMzs0pd$GBAQ=%!}iIo5|errotH%f9G zjqChmv2y#Tg&u<IZ@s%1oBoqo=uE<v!Ss-o8tmoFfkio!!E^_;Y2Vm5)JwPE_fJeT z%M@3>`Z!m5T|eF7eOT&brc-oVD*wt@I*s8*IfJ9!m>|Qs6ee9yKCdS?*4NRV46PZi z&sqIj1`#uiEtoZWwP?UP4!_u!Li*4_XKY5TK`f(*)UcK78O_VA^7Uay+biuIZKey+ zYMMh5gUe_K!36CO-)4?Z5S_j_!W%sNu&mgUxC_@3qOfJ{J<RB%H?}ot8yrnxg3vFt z4EAdiL6>$7<QDfOJNo;0XLn@1mB@9?o%PX<CiGiAH85OjqbRNyT;SbIdfIk3w71&P zCak61-THmV?sQLoPQ+T;;EU>`m^JjM$iKLLjvMG+XlL$P%|KwZKQox>tK`(;C>u|+ zSd%{%NbE=?n_3wQc=kj}VkwW+*kL1Ns81pob>ji1F1K7XHf^o%h$elK^p##;ESiAb z@h00#+!k-|u)8Jf>Tb7_Y(|si4s@Sc=Fvq6^tQsQpvjHNM#|Y%uNbAc;n6&-FwgiF zxgCcqOQ$t9=<g;8eVx|B0$^7;EY*v9Y{5LnjRe(gO`T43yCBw)x^oigFbzGFAJb8Z z1e=`wgNWC(&ljKA595XVl0~5D0OkcI1RcUa_h4c;)!U!$Psv&%y(Io%@lJq4vD|3$ zrC^wnOj*3*E91!+z=Qx&OB87H9bml>IAm&YY(QMKjIa|g`(i{hh_-~rqIoM!IMEFA z%`=eKg^BZQYd6j|p|>|2t%ils3*zVA{n8t<#jyrBm(T-@pB(QZF_hT0Se`Hb*sC2I zCN;cVM?SsD>s}p!=$_l(KRldrB0b|`2V_<4W!UOO2i^jVWd<81*{KZl5596RpBlAO zBMqEgX=kxzO=R@3C}4GPCr7t-2~vCL*bmQ`dQ}XQIgFQb)+ni+Xz}t(VDFdZdfL8~ z3r}~HOPZDLA2B`_F5CqB@aKJfW~l@pV@Nyl`FqTqh2dEoyDe^8s9G;5+*!1?BwFi} z4b9@x;mf!)+RLW6t&kcUJ20_@9qmYX?U9(3dND2yV<QN$^6bWjp)su1&IFO_(VrWm zlqspr3X>aCe96EJo0Z?)Hi~a|mMw4aIZdn-7j)mCcB5BD-JnaGoa0+PDaS2v$;KYL z7p4f4O)O_XY#rw0<M$EtOy6%keWj&MVpvoQVF!A{MAIM_jg(`w?p|L;!10*P?JW&W zUeB9#!FKn0h%zJ^=RQW(!vupe6v<6KTjA4|Xo__pxNgEu5?lSAob(di6ptbLmW!ob z1u)@gOTxG55PNav%c#{i<j)O#dhRj=z|In$NUsHY1Bz-au9;pLTq`p(i4&*0rEP1w z$UECtE{Wns`bXguYF@T_8H>V8U_7w3qi0Tu;lM=>j(Yn$Om>9d+@#YBW1EB>ms!nQ zQv-2*f<cSuFefhyLwo6BY{JE?a6BM8XNWV>lQHmG<;{3+U%P|OLZYFp98)aXPO)G# z!oNo8I%1`3$_+S1g7cZt6jw&*Lf{8?fzu@?0%SB)4_`Ql?cT!SH`7=qt~VXr(RHVL ztDW2-tw0y(C8K`SDVclOd{2g*U^aw{oSQUN&u|G6d!5+b*?0O|#**P27B9-^0+@_D zWd0o5pv3BAQ9*959DWfhT@-4wOSX*+y~^&=2MYb8dNacAMp=Hdbs7p|hG&H%GkbFC zT{JRo&$YC1^Voo(G+7@{TC!(xLlLb0h-*h^WCPv(T<o2Y9MjFQnEt`;RIU%FEfAE5 z;sB3&*umIt!q$9--{AQIS-l^#d62YayRd&0S+r-gUWv9hM8x|&Zd;4~Vdpx7=Z2?x zDOqOY)TS2*ED0@x!(;9w!F1CRkn9UMFJ1eqmBwj>aF_M*9p-@3?5U`X-R3NVa#%44 z18nWVHY7D#Kib>h&!Lszd_a}}u@L9vj}xR1(|j=H>d=$c48!oqP=2U)2#(O_L^-zF z_PI^>=CnVCWpL{p55OA?;s64!h0%tY8oE`99c{__E{h+d!m-$(R%V==(_zkO4x{3M z{@xMn8z0|e8=XTvac``rE(WKh`W(*Lk2K>rBgz959=7QLmnaKE`grRw&E~pc`~i-{ zwr*{YHge-LIBJ|FV^w_&yLk3tyx4P4fpQohQ>k;ZBvrN2BSQo1qqYR2DxHpH);L_$ z5DFF_iBgMi88e}H&r%118H1tL<vIa9#%XYrOnsEp4-4#<g9bC`deXY54Y{GA{bR#Y zvtEtR-sRkc8K=b9-qBQ^Gmf*|1pH=#d!y9R7HMnW-sT-|QMw<y0>>4g?WpErm&p8! zf@-X%=ETLFOBRAB96B+o89oTt#g%ZuWb^FU-QP+u$_=VlCBJHJcxC)j`q<kUbK@oT zP?`P3a!Y}8TBZGh2)OGI*YGh!^q4$2&Cp&>Bv_zqQd8bRzaCC!M(O=Qw~cM_NUuI? zMok>I|Cn9aK+ouYX^Pf?4#0`EIp@sw97weyWU~54x9PA*A6`h5Io!kGRv%7ax#*Qq z#-T<%w-BNdChrS@jbrK42Rn&_qx~`{149RB9a&lUN4S*sB5uZT<IFsrcBedSAJcW= zxD9l37B7f?8M5I-r2!|RQU}gC>|kV@+}+xW^En3Me#>j>vT?GCtqdn)lhrdk>`oI{ z_i}qogg&|rIFCacoHHlH7HEcqbXYt&kv$hfSIg%v`taG?kaHFE0&l-Ha2qMlZs=Ly zhQ|g5owG|=oE|aM?y>Q?aiqRIlx(5AhPSj~!`9N+txrw8%`XlSC=|yrDxw*^OZLU* zdiv0X;g})ysyjo`a_%}Bd=EIdZCvKOQ%5V&{sF{>&el|)kg{0MWO%~mJFV4oL_gzO zI7^u=DqB=i=oEP()jI@lgFuwLSIl%3B})!#oSmzadtsEMXN}KZoMl8GKf-8m?u+^6 z<XsfD8h0S)cX9p14f`<n6i{p=orZ_hORwG}!Y9LD%7Z_gE20azeqtVT=hr=&!ii5_ zKiNaLW?ZUyo+rB;9p^G=8sRCjetsnzS=cAWj|ZL3VY{;wi3u)sNmzwsW3#|Dv8kAd z@Ujb5xW^tuI7>Ok<uO4SCd=be<Sc~`KlB-*>1pGtx?7uC+v7W&Cs2;R#{%m+!nJyH zL!&8#xmdPLXX)BI;-(`We-!E){8#GnV3ddJvP*u<Ue$Y8YL0bzf)h`r9cvzz$2Lx6 zE4?Yr)Z12^%k{!_=_=}|+!HaAI*z?+3&Kn}8sUbge_$97R{Gt*l3B2A8yY#-EjEZg z=}wH{VYX#s3bb!?Tpc!P`nk4OMExu6ari>#aiu;g!ZckNx*>Yt!L4+K@oeHV&9bkn zztC6nxy*n*CL550Y1eg(9>me*09NRJJ{pj^n024a!Xm5ZiiRh+6qD)fZ6}-BI$C{m zSyDY$(cbMH{KA1F9%TsZwOm#{?_rld2FRzDRsf!E`3Mh&yeJN!c6w>fL@tj@p625K z-AquoL5_#f$7$lm26;?^F*HFY)+DH0^n`ts2fto(eBH7r0;cWuk3v$UjZH~di#G~h z*^$Hx5fbq&-LN5q8Wl6j578n9@tlE=K0Z3u!*z`7zT-W`8gTGICyXSFnbR|VpTP~N z)B#<DzFRJibUVczM{f|F=RVL6UnDU+rS(BbE6*m4?&W(PQAcu!yBPmj>)<Hc<Mkqr z1np>j1N=OBcoakAtx*mBb(xJ^VgY#SH#Q;*5_2vxSUD8HjPD<X@uTy4a#(NqiUGX- zDBp;2r`>{Wk6x6W$5DJ#IErt?=*c0(={wlKLuEew@pcM0ype}ZdaJ!~ioz>7i<CT$ z@7d?L!{sXq%SkYd=7NQ_-%LX@%1#`_AZSTHAgTfrW}&yMdckkU<8&;b3pQxtJ$)m9 z7Y~wjG;MgeWo)&bhYH>nX6&&qG_cPdi*y1}R8GeqrfdD3=`2+X9fx<E=#HQ>L*>MX zj{~7p7TaZ(G2zQx!SvT7(6{L1V1Mdh>Z8V1#Z@df6H>$d*tU3!7B)sH&a20S9PU~t zCybb@PGoADt(Q=|QqX}XJDpAb!v#5v;h7<i3)<6*3gG^U0fckt<9m@xAC76o-pffX z5_alIYH=atQLYJ$Wb5o3Z1;JJK3sIo1=GXr{6^<h9nTRonRg<vYpQt})+pO122rM0 z<0-r+Fo@$Q{RCL=SzPU2^r<V4C$@Ov-G)i82ih7N#&VIeomW1*s%&e*6K|}8#vbH> zBz--N3jSIgBwQptGoOpda}_oO9;C^QmirgH$i!qU-L2wHdCrEN10rE3P^K&6Nu#*C z(JbD(k+%TM^FFDXShNWU;Y4Vik2}V9rfzpkJUGm0*_fSm@(0*rq{|q)$mthw<hYs+ zo*Oae$dzx|ac_pLg>!iK_(up-<)50;GBjq{sbL-<+O%3e43p3TyH@=LKso^Ct9+ux zd26HzkNcd%0B=@t$L0pr&ijYnc*Et?yYDv02|@p;`$`7g{{lDd`BvGG$_|v?4b3u# zI1terc)e;h$r1A?##qLgePBXeyne&m<@~aF@g>{iKOYj+@)Tf`h3=MtcD6&XKL0~j z?UD7~!-;H+M|X=fhhAnUz!Nz)Q6K)%nF|l2wCsvIEW1fg3+6PwoZ&0)5d$nb%8}Rz zrq-)>yVCTQZEfv%+lH?t@+}TsbsQfrP>FZ6<X&=M@4z>JWMgFFaaak4-2Xge;mApD zOhWgJ6P5Fg8tu|FL)Qx1lNPuOFXqz0n>k&BA<9`67tL1pyoC-xO44?YNrJad^aDqE zMTP5xSy>jvl@h*TwSvtp8w)xe>PFbScZ?hr_ic}iBkt9Knl}-c!#RD`=ee+S&u*<8 zjyZBxFgrAm3J&)NM|-g`9XYTu*fW%aPY<T}#GSSC1sBw)t+^gYzYWH>_6_NwKugCK zKBUC}NcSx3l15;u<_WIuKkZe}!}`4o4B4Vi<7tJ3N$<Y;rXP08Q!lznd1NKNTDmVk zG^`bK)H*HgY!^Jf;L$azJvi#^`1pD(w>@M#?_l^NUMd!gadvP^O=hoY6zae5Bmydj zov@G(l=W#^zw`R3KE;*F>lX-G+_P3h$2=25)Z--g>9Z?wF^nD)e90AKh1T-Hj;!v8 zAbA3tO^v{9nuqJ!RdFtSzlXc}ogjJY;5OH|55CroY3nTK+8W%)C3L6>8^LyWN4&** z3D>-+gL81-%P*tu@bc-4bF9Yl;M^PsFKeX4qK{ds%xW)Z=H?)5i5W6p5j)i4-r*=l z!|~(nUzWYli}?IM*M=oWChU93hAPVrfqPQtEW>eyl1wYatc54kZ`Gt8<6qI#$E`oC z9Mz<-<>mWud;9g9!;A)XXeKex!VSBA!@E7#CzWGFCP$dYW%LcT_+M3ky|Df$fOBbY zD*tLKHAvgH5_p@Muj#e7M`?vjmd=t>k1$UDyX&`N3($?g&b%~ZZENeOY^cPS_yuY! zs|R{Udb1zFxBMM=88_+NP*1)Z-}3hn1e1Ma43B-}KzbNdJ~vw3hX)vV<n$4I6<}p` zrn0&n3h*U=y#I-xsH{$>#(Pu4d>Iw5Xd)^~Sk|_NhM%ll8}At%-rL_Zs0*#GtvNh0 z+`kb}vre<DdVH<9)x+->w2EE?`NYdsX=z!}yNcdj{GO7EqW2cPU#%+oK+y+_KcrR{ z{c!Q~`1ZhZi2XCJBCB}fnewOQ9xS=a@VCN8p8@^KGbOXgW>q@;bHJAYuRODAw)BlB z-Yj`b9Vz~qqOH%MDr+2>95Phkn+IR{f5<!k_^jst|DWr})|#p5mzk-nOeU2p4VBbY zhGem7Wf;~khA@N>R;?t9A@n91LI@#*cwZ6X9f~2n!>;{c_Kt?oo9O#^obz~XXIIzK z$J_heAK%?>uiek%_4~Ze>%7kEyw3BSt4(@I>sbl2Tip;pC+<f7T;EN0%#ev!?8jF# z5qD^tKuN-^R<q-8h@0cT(Ki>da@u6ztBlGoCmvt$#CBGjq!N6_Wj5<$!mL*Knx!3< zT;iYQn~k)MVYvv)LD<kX$us>-=?Yt{bg{y=A*`oeuckarozq+6OU1G4Jc@NT@p2RK zCD4}IU}&41G}McKJ=@@4^RkX_Q=VWohT~T$R@>nzGviC*X8C9PZs2~H@P=f32^Cok zZPTGC^!PRz<~UB<2VdK?!xKuF&eX30{`@**3&$ugfMEXd7cTPgoyehW(n?y*ik}^K zgMW_iM&yJeZt@E5i#qsQ$ZKeuVJ04bjbcShWoEY-7O+diM|bh1&867hsm!5mGEAHR zHuCItiK-Xkn7+YZmzZehv-9!ags>tzeN&jJXZC^kDySV6qyG+T)6dj_zYdXO$J?p@ zHl9bNI4{{hhqh_n{`_T#HFmqkD8tpZOAf&oa$AZwv`s(L5BLiatL<`{_Y<>EJ$spc z8>76TZGt8r{&GV}jC@R+Rw8_X9d4hCH+wJ;m@=l~S00k~;&~dgjKToY@vme6egOgP zmenROGog8}YV6lbkH*-5xLIwQ?@xdk;BVSMd^y){m#A?l&~y$K55gB*(dSy~<EGyH zdVhZG<9K|VP*Z;4Gmsz7#}@J{GHt}Kco(3KI_7Ahrt!)@dFL?G_7f4tajx09?CSF! z@D*%ltZ25+XvU`Txx+<HyG4!9&EnJ`PN7{+R6ap`B^dtv%f1+G47OC4H3)C8!*|ZZ zwCjo@>`zPQ5yk~mRw2I9owajbjdkJIy>}JPuY4EBNN>hKe(k%!4tLH$Q|>zW^B0!T zR?Ws%la61j&PKW{ox1^S^RM5PXg|B}wcLNpufo@nckZ8!*V_eX+yvy6Wao%4kV7Y9 z+myWwn(c_|FVC@LTw3hE3iwaK^)O~19NK09n!7Piel6NvMh<kED||9^z@<x}*@sOX z7DM-gHv4bt${&_==UWq{H%DpyZY0y1^c-N^=@X)Ka+FSq(t#+Q0qxE|Gb(&wl+J=? zTbugiM(K&r?)-|P(oc=j#Zh`rlrDpI=eIB_d~uXs8l{&<Y5wY_yZ-#yO?P`%K)cJU zj0&%d(hX61Ta@OHc)I&dnl%0R$KRpkbug<<<9rFjcGH;0pNuSP9^QCv^UK>4?XYI! zNaL~LuOK2y<D8DaRJaD(J#RDpl|K&{vcnQ)a;{^JZ_-W8+ouC`0P#$CCUm+>=RvdI zn|%3Wd|A-uJTU$h@DIiC?@;Qb#rSX6!^F>M!G9q9dEQ0G=dac=t?^I7HvbCYp9vbh z5IW$}E1?-?!q-4EAEP%x+uOY_yXr!`Ct&r4*`vckvxU`+-nO+uZ~Gpw_xQ^$vw9C1 zHKI4}=$L}xjy!MTR7YNVu@luH^X$_*(+Qe5Y5e8q;_e*}Q+qqx<HnE2n~&~Ln&{Zs zD#E4XE;<)?v5IdL%XK2~-8mDAvaH?{oR=A_-dN|D)EoC}xXa>Fon6nyr8(r-l*c)^ zU!H`P*}XqZOD%L&3&XGd$74{3wlsf!ZD7h_wT25x*BtM)>h^NZA*N?Mp05YNQTyQd zmp0F#`Oh%^9SX<ze-tl>I81}fj{V2{25Ory^&5<B#4DPiusp;IBXd)piH9jzv;9~* z%4`1$A<uiZf!U9fvF$E5<yPD`n9LLpu!h6A+hz4wuT_Y6%#ZtL@*9h7CO;gGf17W^ z{Xm?v&Hs$Y@bg5#{#&pBKa5dkRMY<O2)oPenTK*mIpyN8G?t4WqiAdc=Cb!89_s;D zxn`Gch>G`AZ;y2i#yIn5;^DH_tlasJdF}Zf_qPq4+21>{ZPH-V>hYY%3UEVzCJfEc zEWfPBz4mp0`SE&S@_Pu|CJi>N;mB_Z@Avd)!d`$j+YI{tO^;Q>POd)__AIo!{c=$* zj~B~r4`<4K9otO9e#pO%zw}tMjeuqt-Fu=5%HP*(9Rfe|XX1SV4{n>kS%~NUGhtuB z6WzDSgfU(pBR~`HSJyU!S0G-J85E(pAN>0n&b`0+*xzET32=Y+gERZ9TWI(=f2$8f zyO_e@Wj0B7&8HpWwJMV>>j3z(ZJ8gWT_*OU@h^XX*P7$1pUJN=f;Qa#e(Sp(?r>jY zEgWB8<0xXZzwx@@_;@Vb;@E#Y#@?OMyG{s%`!Eu8cB1Qlyww$3OuGb*>3N)&!L5|W zZJA}(h#1cFb&WgWT(=iCHkij6f$(B9(mKR3@wb|Th4gHqWsTMHSZ6|;H6s&$yBV|< zpX)}>pU1+j41d?zzE5ZT>mbeA5%n$5X1$2|9%!>hM7<Q+tP4@|yfW)Q)ZD)ep78dc zQ(t@CNBULJtOJ?&>E<9Py_1&z<Lv$I=?br4dT6c_ne?04q3l1WJgyTN{TVjQx)I~o zL7R0V>TS?weaPgumJ<m3&&jXpmrp%bE0k;2i5R~Vv{@4}=}Y%*o_-)FJocZ*Iu!BE z+K`FglP8<P?c?jx0}<b>5i$Nq=s>_(4>IYebX9VMGkw!9je4x}5#Ov0G5%H1W<AKH zA9i3<dM<#Pdr*cmKduoue;$iBU1rUQ;Y*;++7R{Mq0Ksw$$vxlru59O>6b!1)(41h z)`v{|#f<}`Q$E*)oIi}&h;P=37=H`2Sr4M-I*D2Tq3#N8)_JId&}LnSIt$vY<xsQ# z7GurEl*jsV4aew{5#OxoF#h?_X8neGDzsUzG5Kv8*p#06<sH+cS>CikO`73c%W?iZ z)*R$#)^<#ONu1Q!e@^@OLz1e0rb{!wDK5?O267T(|9Pxik-u60VE#*>&6*B1(-*no zzld<NhQ#pqq0L&6so%;ols&>fMYvfTG5ImR^XIg8R(_Lad1Wrm`j%hN6#gB{pX`jW zCcma%lEe9li;7uyGWAKiuqi$Bx7U_zFOSt7@y%M3iJyE?RD72{mhqw2A&QA#=?Z85 zTyt{%JXQhXn>8pCfAz&p;f&AqCFjp$6(PP^Z!+<h7d3@5KHJmzbK0-q(k9Jtt}!`( z=s(EMtT~zdmbk(hzv&m{ocuONg*W}OoX1*>{LC7Z$*&M=OQt;L*Yt~X9(%5B)}&1Q zwNdf8Hf7Ski~P-cl8IkBttp)Ob3MuVbLtzK*`yiX^vhvRcuC`Y)#=Z?M|b|5@ToU8 zX{P6Wxbx?Pufe^x(G2Ikx6$mM+g+OBya#vwob)S7n>53D&+7a+;j3Mm;k<`+hu65Y z2_b!$d9eJZzXWR|+K+z+!FdqA89D>oj7M!@E-?(-IE`%G4m#VVyF=$dCn|gZG*3qp ze-v~9biBgHLl<J3#WMekp(ne-uZNxj%_#`O%b<DqjJ_Yb1iH1tmqV9f8#T4#zX^?7 zoyPD_p%+8*lED1FhF*v5j?!Mtjq0$?I1FzKU5aZ2_nF%L=fhq$Z$IvJ)1S}c9aGbv z&)U05V9RIU*))0i?3t}ww`&r1{Pt0rwQl<JS^L`cNpAGw47};jXV1vpx>J+DmJcf{ z2Q<zNoq2X<ls-C2=SJxZqI5}=z9&k%?-^O|<x%0Qqx1(+x;9Gx7^PdWqv?<Nw~5m2 zqx61Jx-+y{`)-FG&>PyUbyE+5Hf!9}BcjruAEhse(xp*)ew6+jv|0aV{!c)g^>6A| zq0Ra?^?GQt?oHhQZT`6b`{2YeYuyY#6xytHQy&9u*1D-Vw>N9u)Dxi>&ve%OsEeS@ z8aMSc=o*CcOrgF9+N^O?KMQTvxT)WU<_T=#*Fc*!ZifE`o$LzV4-w58H^YyC4!FWc zLz^{jhF=7o=?cFY+N^Oid?|Dm!r3;|uR-U!^yknMp_3H84Z6sc-@X`l%o;b-XF?ad z!pA_HHExC%L6^DmD}^>|+zfvLda*10T4=Mz&G0(t<*x7q3^`_vo8gB-n>B9g6QC<x z<xPUFbfv!@+N^Oi{@<V*T;b0^n>B8RuYope+|*UjW{sQrduX%9P3^@HXx6l;lU+k1 z+dKu@tZOs88?;%+rtSl6*0HIFLYuW~>QkZ3AM=|8ZPu_Eeg(8y!=}C&+N@zyKMZZw zu&G~yHfz|_A3~e8YwB;I&6+i}4;>?;6n-e1dLQV4(7a`%4nUi=Y3iQPg$U17_+aRT z&;jXFpm}`<?DPfL;Pu?(e>wCfXuuA4{~%`ixae<(q~m*a=Idk5H>a9^?l0=&7STpQ zjcFUrWcfai{a#blS1^rjCT)hz_D<Gmu8%0{Rpi2$pNn87_NNWFq1WNK>HhwQEZtxW zYFjCt+x!EPG2d6P-{W%(xg48um+h2n;$YJ0@@#HU#TvNGp<zD;qe<IZ5Ovw<o#g1( zz#Kd9Mx*uK=UsN`xZa1`rlnEuY&U%lr#H%&(z}@faI<$2olN@EKv>3-P1bZySf60@ zmqqOi8mr;7gYmm;m#^YEJ;#`~MZeI{Xb9TE7jSkmQPlx#X6bkpzqX>6jv8Nqur2SJ zj?V->IN9j~JI!t9lt)vd=E2R5Yv0CKl%1~8Eb#E1Ow3JAu*XCE-72B604Ghe0-V=8 z5n!7n<9Ii|?cD4Op1qIk*T0YRse(r1Z2F<{Fp0H~BHn!JeN?btf0qy6Wq@D*VAL1I z7_VPrt(so)hyPLiomWEaZ=En+(9tJmQS>nauM$xo?$V>_(bw^C-l(8Qrpp7L>ZR8a zj+gA->2qW=A3M@fJG~Sc<J+aZk30hP)mH#}A9>{Aea&aCE`#cu$&c32;18zBSHfiS z><L9hc!4%(-hsl{L7Up0-;qH84^s52GqJs4#~rhnKIV%BNXFwk3FJ`4x0IUuM7{RF z(B|gtjKB&t8H6|2$P%x0@taRm&ch=*j4UwHwEs0)j^YJYj1soxCM<xPGBTE>mpaDs zyLt^+_SUEiEMEDVM$@UQ&phBA3H###d|9T^_SOCNep7Yy`dhRI8)qj=T)Xx34FJ3C znzznz&CF))^sztj!<?I&A=3xV5&eFVyc<8=A>H^Mpt1O+Kek(X8$-c6eda~kMcKE@ z*M2!Cb`VT&V+X`Eu~&W?p<=%`pg2))ZWv$JKx?dq-Ia{>E|0=d(_Mr{8OAG3b6?ks z`#3-?Sb!tMZmyPtQIVDdcm4VjGRMmq_J?ny-vM9{o`vu9I<UKSb`=4&+Ewr_-wA2f z*<Cj3rsZ1*=lh|idM&+8hTV!9@}dsAdS8s@z=R^!*IkgKb5V_v1mj2yU!3da?JA!3 z<~<!`Gz>G(#*h8lLxQZ~xm!FV9ou*eg!UIn=xfJvcDw0y5C&i{Z2CHe(yKVx>F@lx zQxwtk(x1}o^m&w>{hb%H<lpS`QO)B<eJ=y0Df4D8DKia6YE5uP*x!PrC*HQvJBLzu zZMgA6E(mOV7fPp@d7qZC?cEw}zoM?u*Y&|oJA&&Aoc8yB>4_S;-_+nUNiP=pHj547 zR&krSUF3ow<MVk7nII;K$zlgFMNAU|V!D_i_7wS?hWTcS{ltM{NaXVy#v3MPi#cMh z2r~#f9__mszd)QQ7K)R_B5{hy=Q>O`O)M5m#5rQASSHRF7l>Q^PCnbj?IIp^+WGs% z1TjfW7CVS3VwxBb)5Q$2rx+Bu9?1RZCk_-tVwN~e%ocM*t`{<Wo|rEdh!e#^ak5w> zP7$Yy)5K!2M4Tg*ie=(_ae=r{EEgAxOT?w(O0IJ($Gtu7|H%co0Vfx?0iVM&Z9G%< zK998k5)ZZ4foU(oVNrtQGhy#b@F!o!ni`(*vK`9A`Qid`p;#_17MF-i#bx4hafP^2 z42!G9HR4)vome4m5I2dHVvSfQZWbHFt>QLuyU2wQ?x$Z&5R=4Yv4fZ*rilSDUE~W3 z%&(^y6f?zsVh1dJr>#W1G$%fd_L(kI<jVlm1I3V-CDP!U;n^ZzLZQwT^Td3yK%6KR zij&16af&!qoF*2FCE^^hR4fzciwnesV!60jTp}(N`{6+a+k?;gy+N$Of@!ayzjgy( z#rSt1{ExzWINia&V~vS~e|84K(SP|&-3wc_%{?96aHPY+eh#zojGOWJteWjqDb|Q} z;%2cy+$wGpw~H2@aWfykm>?#J$zlgFMNAU|V!D_i_7sC+rr1v$D2Bu=ahRAb=7_l> zpTT=i!nz!ut+U?AVh1rrOcMiQx|kvM6oX=>*iRfNhQus!n3yf*h`C~(m@gKH6U9Pt zvREWe5vPjN#A2~ToFkTsW#W8sfw)jC7Z;05#HHdgak;ocTq%ad)#4g)t+-CC5I2aM z#7eP7tP?kj4dPaDo48%HLe6o{6#Iz-#gLdK4imG*95GkS6Z6FaaiUl#P8N$q+G6m$ z43T5;EJJ#jm@VdrxniD}FBXUs#X|B_JPVShO@=og`NOe)4->P+95GkS6Z6FaaiUl# zP8N&ADdJRdnpiBBh;zhJF*F|I&q~a%CV*kfw)yam!}$o?4KMtXN$d}8GpK2E;XMa- zV6dI=PR28pB8RkvV7!SW{AugpJrCoaG;I~UNHdv);p7r9Z57t+$=6`ZLcWgcJ;QNa zDzAoq3-!1LT!ZTm`8FPTO#|P=JOK2<zl?mxvgVWjfK9-3Cw%J+a2<~CO!!Yh`;%88 z{cJEE*P|N{j&XM_`ES^E%mKGSlkl$u5BM3+sBU!P(-wj0wt;ECJGKYjhb+sw3I1RL ziF(uKfLu+&zeXA{tsXf32_mL9wkBzyiOa9817e046mhw*!$aaQF-Oc33tY5T;CN8u zSzw|3i^Qp7u{cL86Bmf(;u3M0h^+1UgvB-DI&p(oDb|S%;x-YFcI<p;)5`Wq7E{E4 zm>~wmequ-*CgzBFVu4sF7Ku~EVsVaGCN2=m#U<i0afKKb*NE%H4PvEOCpL)NL<{?D z_X{yuOc4Vj@6#ABDE1RWBJaZ(o+IXo1tRaW7+xe!6^ljQM=`uiTp*T<OT=a33Nb9M z5!Z<u#7ePFY!J7Jmd`0SK};4?#DJI~2E~42NE{~Sh<RdxSSS{WQ^jc{&W~d066rb8 zrP5{6^Q9L^my1ipW#S5PGx|Bl0rq=xtH}OOy<N1>AE^Cef|w*Giyg!iF-;7J>0*Z1 zQw)lkVn2~~t}HhsW{JbZY%xd774yV=u|S+C7K)R_B5{g1Rh%XkizVV5u}oYjE)kcD zVG%>K<;5VCL_Ps~4Uv{U)ccX>b6v@$meouC1H>WXXz_gU5^<_{y@<<*o$owxzIcy_ zTU$FkEaK8+>yO2V_`PUxKTyxT#Z>WN(LQbnA0mCSc!p@VH^MKMo*~{M+U<w%N2Q+^ zUl-SjpNaM2&!Qh~XSb`^Sv*wiCmtu_H6A<u*`mF^gYvJEo-N)ka-3oQPlzvxZ;2IR zMEq9#RZPJ7#`GP<ZsK9$KykRp@qzKr5vPbVM4s;qzfW8$z9g;@KNf4m??sF2OGw{F zOcQ&E{lw$NT#<HtOjjgcCzgtLi%Z1k#ns{mVx{=4Xs>r6-^4g4{}i#iXs=Hpe5ka& z?gV|7w7s4LeYLc`P6U0Yw7vcV{fzV~ajm#P{9LRN|0Vt`{wDfxLbDxOi*3b@;{IY+ z@nEr+*jMZ?4i=9SPZCFpr;2Ba6U6hxi^a>uYsBf|4dOiUc9C{y+>b@#L*nD&)8Y%_ zE8^?o+v5A;N8&%li1?NGt@w**;o8RX<HaPgotPqa5oy=P_<h8qMB2B}KTAACJVQKJ zyiB}ayh-G{ElmHBn3&*b+M&_^L~)GxfcS*?srakdt+mpLv=?JO<HQTatHj5|=fz*e zK8a4c@#00|)#5$kI`Ie5vzL>utvF1~6=#XJi3`O0#Kq!rah3SK_)n4VbaKCFKSgd8 z{kYIk({76FEYePjx}SKQc#=3$JXJhXoFJYjUM$jXiuqk5P8V+#?-L&vSBvY!e~Mp; zKZrExWxnmjF5;o$QDT;Oig>zsj(Dkfoj6y#Q+z;tQhZ5#Q~W^uT&x#=61{DldbSZ$ z#e>CXxo-Ug?q9_Uu}=I}+$#Pe(r}XL;>9GfotPqa7SqKZVo*F%94HPIhlwYPx#H<! zfq0HMS-e!7Dqbg+h;zj<@lJ7}_<*=Xd{SI4z9fdlH^sH$2jT|tbFoIO7x``(+wUiF zyXeKlkNyc_8?l3!Dh9;vVo&jKv7b0d%o2x-IpSFHOz}MNa&fviPyCzskQfnnh)M07 z`X3@5Ar28Q5$_Qn7M~Gc72gp*7QYpL5nHu)%4sil5&MZ*Vvd+E7K+8<t>Q9qrMO0{ z5G%!RL_eSB;5a3VX(B%=MgNePEnX^KC(ae`6dw?u6kihG6h9C@7wg5J#YEgFu-r~! zH?g-kKs;U?C7vywFJ2+e5T6oX6W<fR7x(Gpl-o@ViP_>r@k()~c#F7Dd`f&-d`qkl zBjUHBcVDO6eZ_RKk2pv?Nz4-`iI<Aki}rIlwBO&P9~Pe#!{WQ*M)51reh!B8o)o8E zUB%ww(c&<1j5uDrSiDiZL;PC&N%Z1IkjHs{F+<E0M~G*M=ZjZ}GsK(4yT#YV_r=e| zZ^gE$PPu7fhIqU<TD(NOTYOx6Q~Xf;MNHe@$@d5`Tbv+H6BmomiEG8r#IMC4#l6#< zeD@Pi67A=AXup}#_VYDp`*|8@KR*Niq43rRIQgWCeZ|4zNn)OOt~gaJ5f_S&if@Xa zh+D+=ot^T!h&{z)#4+N9;#J~p;)CML;)i0T_?`Hh*s+UKURSZVI9MDfUMOBI-XuOD zz9_yaej-+jTg3Q)Q{KMff#MP35OIV!NxVe7R$MB+BEBR3Q~XN&LFB>-&zrqS+;gW& zA4EQi`vU3F;^`#fU8?Y6akj$eDSV;yBMN^(d_(+5+(;t7uSnG6d-?w??d|5&qZNsG z$t2=+ksd6bDgQ$0E2U?U*pJ)9yX60X^fTfM@_$pT5*x(d$;a_d*nv*@2aw3O8wvkI z<$t97k0!lnKlzWAzEHeD{G0fk_`diR$@Y-;q&qr^M7e2VSNZpp9w-ixe~x&zc$LEE zO5Y)UxAYPc_5O!gC;u(dze{&K$f?JH;vppJ8zhl_u=H?+=ZR;@e-ep!Q>3p~_&o7; z`QJ?<-lNjX75<v|mcqY~u9g0sM15L!chaYj&<B!ezmRyG{BxwokT{-a$^Sh0UqqrF z)5KW{FH`tk()TI+3F#FIe?@wY^t;j<q(76clm13J@nEOi0Ev1ZCT7Y%Pn<0O>q+eA zT>1Y^da=SEm0m9WqV#I%x1}qjtHiHJv`d4+f0e&K!>L~aiSQH>_3SEkm;YhXN0MmA z6U0dhzf$4TNYwuZ=~C&tq{~U9UreIB<???;d`<rUkp7rN{Ceph#D9}W|2xTkatMfe zw;`eTlkO~ih;(o1{?db_Pn15HM82oWf4uyQ#H&cu=UNi+Zj}FR;$8ADm*%$_7=MNM zu~;WsJrIui?nNSAs`NqRqj&})eT4J?66Fq-|7j%BU83+Sq^}om5bqElBT?RS(yOK4 zCsAGniTvxNzft%$>EB3{*XB@%-ASZ7RQd?=amyM&qMTvkXcF=ANTfeU{+CD>OW#By z-aX>u;>%)~MEbYIe~CYmD9`HYgtsN3Q%U64LmVIu7f&IP-&FBN66xkkKPdeqiF}@w zepPy{xL*F7q$AP|;;-`O0}kfjR_rYH68n)T=NRc667`!X|MR4;kiJHGj&vFMIOhB0 z6PEQjiS$p&{|)I6NR;!5bdB_8X>V^Q-GSl&afY}+d{KN)tPwqjIprsjD1U$H?j*`R zQaoDz$4ieD&k-*duO^?stD4etN$lrB>HA5P^Q`m=>9yj&#NWhyf=>J+#o^*)66IVe z&2Lyy-%6t1_lpn9|7qz};z#oTo<#kAmfok2lfDxP|1Ko*?IHieqz6b3mL4vBns^q8 z{k%ZoSIGYw>DkgZk%;%G_@Y=LZWZGWck0uf#QtT9{Yj)hMVuf`5$_UT5I-fcKQ+=n zNdHbE-!^?6wkHv<v-E+|y`_gppCX<v|Ffkp6sM4=-&G{qbB6pEk~~iGe@y<*$^Rwk zH>BSokx#7{m+9!e#m*%1A50?O5#lI?7mCxwdE!&z`(mZ|9f|$lF1^<gj_yPv|8y}^ z?62@F=@X@MrB9QdE<KyX{yZSQq40ImUr5)JC~upXaHOO6CQ-i>=?t-#{PA*|o$eUv zY!dA=M!G=ZlStH~M7&>oMchcDoLcFv(mP1hYwx2Rwj+_xfh6MhknS&?MI!!*(z(*7 zkw|xuc%!(4L_RNy8^v0MZ<XFbB42+$Cw^NJx`T8V>2&GCq%)-lOJ_-+BAqLJwlwWc zS<lHN+HsovXNhIxBbIfS!WWXL|04=tD*b}=O6m7V<of}Md}~PLQ!o7kiT(M7M7(zW z9lb9JeW*BC%n=Joq`Of1IuiNcC4G<dBP8N26JHcxC0Q@AM%*TLAK--dCy{=rc#@ba zUMtQZQT{E`caX^cVd<yD<?>%6ekyJyk^XnF?a@y9ZY0V-RLm5Q5l<FR6$`}k#7o6% z$y+V!X7O(%>i3w!pORiFt`olyw}{(G9QRfOo%EeZ=&mH{*<HGi^aybjiTyi6;pfQz zViNVZOyM)-Un<@q-X}gHE+vuQbJDMhZ;7_OH1_u!YS7q0cRt1`?-+5UI7z%(yop5q z_mbGJ2ju^n_@P)QwjbogOCgc2t8@>suh>uF$4L(-vHz!v=ZIG+{C@Fa68SzQy+VA2 zMEdpOccO1F{Bc~`kO)6OI)lXi^b?1PdEx~m(p@1vTfB)xKF^68MPJDA??fWsE@Fn* zM;tDmLSjGir6-9OiC2on;*H|XB+@M)QIE&OFG$q4Ui#nC{vq&3eL9Hyk%*TreTa0X zbbsm5(s|Moqzk1llb$L)Q+kf{?a~XRAC!Jt{JZ$RSV5v*Ur5(TZ;{?Ay+hhR6!Fmx zdy`1FpO{W!e-Bak;qpI5{zIilNRJ|s&qV3-NiXjA<$pVg{O==??<1ra^LP^JR?7bk z@jY>a!Xwi4;tyiNu}F{eaX&Gg^jg+&;u+#K;(QY2Jwl=$OXdF@iTZ`*|F--;m;Op@ z5Pwm4t1Ks<WN|;SH;H-;7Kf9lS0Rb=uO?Cc^(4xjD}9Uf-O`Il#D7})dFeN#KNL5R z$fsJmjzqfe<iB11p5vT&NhHeOheW)9^kL$W@*gHWf<*n#mj5O4ze4_V#3#j7;yWbj z^%05kHp%~M`EQl~zvaKr@lH8G@l5f268T(CBA=_JXGzZ`QNIVpSH%j2e=7a8_=~vT z2~N7h#1qA<#d##kyHi{wE)iFfDED3IkHs&<I`JD4@qUr^4Ri8M5<8LzKSa8>^wH8G z=@HUnq%RO}67LsZ7T*`E#ckqVCpzVK5DyT$i$N0o;uz`U#Z$yQ@k|o&&XK;D#D2__ zo+EvS^xe{rNIxb0j`+E_S^SN}aZecT<hw5k-Hm({>$+k{JWk;`(ql-}?{xW3k^faB z>UoFwl=!w-E&fQNy!ewG9w7D>M~UZ)SBf)8<bSL5LK5{|D!wGXBW@JGAW>eu^cLw~ zq<2UsW;^+{B@sW3#CX$Hy0>&+>5%ks(xaqLm7XYlp7a&c*GSKio+o{`^djk{(oajj zD*d|jI_Zz3tE9gt(JnvBKW>DxKkdcNB*G7r?m?nm50gGp`e^B6#o_Wlg?t?EU&#M# z68TM(zF2w+iFnt_e~$d;ktpwJ@ni8@h5sPE&&f`_ZY1(Kf<!q3$R}_;k{&KSMtYKX zzWgtjzM4e2H;a#x$agu3{8r0<1Br4zldhNkK}<Tu3EziAegnl5N#r+*M1E(I$Y;Ft zh0<4$NH<sd7U_l3_e(!1{k-%)#rPa2eP^++c%pbF$#SJHmYyO#U3#AMtt9Gwzx*GT z|FhC7q~DN!S9&9f{j8OLz5L@xI`!)+9xe_iQLj^^&lj&3Z&&yN>4&5rlYT+^@6u~Y zl>dqRH_3myc-SbX9s^0lJAp*`+47$(7R!H@^lj32NiUXON}`>fBavTN{%^?t9r=GG z|BWP$bKGc$?MS5GpG5lZB<gdR!uu-xSovp*BNaYgyk0CNk<VQu@>wYVCE{}m4=el) z`F|`{EBsr9{~-UixyTRoK9EGd8PZ2c50E}V`V<oTl}DmJ6Xahg{|n_mRsPqK$bUY0 zE9Q;T%Sq((3W<EykSPCM=?&7Kkw{-J{~zW5i*(!=CtV_mcs;~n;$(4(SS-#XQSJf~ z<=!j*7fICXHHE*c@DCKeSxgw~l-H3&J^>Q>93=nV^6xMI5Q%(Glz*=LPa{$9YsH7e zx5Y2S9b&gro%kn<=Zka12gUcqZ^e{6C*5J<VDWr$uK2L{ocM-VE5@DX<P#8wh~vfC z;=|&5;^*R*;;-UMrz1bK-y0;_p+fo#675+dy+wMf^bTqN8BY3k;sGSmb(8KR4wU~8 z>1^qdB+5Nc`XcGM;&b9>;@2eV`-|8v-_f1L3&dN*yGi8#sPu9Y^?OlzwRDA8CH|!F zxHFynyO2niE`6AEru0w}{p$qj@d`gz{zdY?M*hXpH%XUCmy3_ff0^{_B=+Mi66JiN z@J;gnTKZe*U!{F#Iq^G^sQ>;X^64Xv7OxR+6Bm(a=O?Atktnx@L_S|De5<toY{$Pf ziFoZuq(4CZ-K2X-A0r-1BK{cZGf33$TJd)A5%E<L@joC@k55RHQziYC^v@*XSp`n` zUL@itOLrj=o-Tcu!ZW1@OJ|XYH$wh-@;{SAJ<k{K6dzOgQ_?G?S4qDo{jv0y;@;z& z{0<h65>F6w#f!x0B<eMn#QxtwV*l<|c!l^c67jZ@h_{18JpXt{w<V#wk%)Jw{EsHR zxc`^`NhIRsNS`J>Uc5joQuwvfv&EZ8FXlbs3UMWga@Uf`|0D5pu}0zFN&h1HCOGkv z#EzsF>nJ4hJ4F7yrH_&xL?T|Uc)nOH-X-2cBA>@e)N8r;iuk(1*GYdWR*}g6C+T0M z6DB(Ov?URKkl0TgL882|B#zTK66Kzw@N30+;^X3n;+G`SZ<lU6$<bX&<kOu*xkJTM zMf_fu?SG9pheY|elSsEf{twB2x%B(u2Jt5``5Y&|9%7a_Nh~3e|1Hw@Nk2-WyeFk! zlzv-$PyU}ue=hyC^tUATuk*PMk0MddQ0bA<`6S92Cp}qunmAqlrP8-bFO<HYL^<ol zdWHWe?Jso7ZA+q@4$@tu4-+%xKUg|T`V{G066H)0=ZjC1*sqn+|B(KeM0x*|{!;oU z@mKlBpXbEuB<@clzaAv|PhaUl3O|-aJ<b-d6YnRHZmIOk(r=QF!p=?lW9cu&f64zR z>0hNgp6{efB~e~~F`q;^=Sp88J)L|M{YYFSE>`$c(#xgalm3uI{@;t8E^zYiO2R)V zeKd*uL((TnpCJ~={{rbE>1(8mN#w`h1R-Bh_!{X?q^n4j(;)Ik38>>p?02$sN9n_) zGfCu|BNmA_l1MjS`a$U@N#wgyTq~|u_$KLy^k(Vrq_<0ZE_Cv@zjuNB_K^;Vhm!CQ zN)IAY&$049L;6bbe(^<xzbd^^+#&Y4$jK*LoJKy5>z??q{6Ci7BJzi%SbmU1{1e5o z<P+#u;#3mxZdUmH(ocx5l8FDd^akl_68l>x{e$#2X<v~Oo<Jgfd+8Js_30^n1c~zd z%l|m}pDd1+f4+1fiTIP{KTZC##JTdnUHU!}@gI=?GxC2y{;Q?mmi}0}O8QF@_5Dfy zzsf)168K~P_a>2ls&seh9wgEYkpHpbF!_&^KAlARv*dq~{I3*?#n}qKU3wvjbmj7Y zLi#0zzbXBW!Z*tQ3+X!PZ%E|xi*)>@j!q;||5OtD*+u?6rTa(^l0IJgbP-?rw)34S z-X%UNK2M@wtRj*BTk`*0{$ERPllEQa#7iLApQKYr)W47X`$?Z5J&HvBr%I2PK3Dou z=_^U(Gf(<X>4&AC5|_(=mGqm^ABj~Y>i3Ppf0lo{DNa51B~ebg^dZtmi(}<~hIFCy zh0@oHGf5nu+ZDc0d`Nsu;m=C1BvEcy{_EubsaPe}k%;$iY47EZjwexGd+7j)cFm9; zD2@~-iC2m9#0SI|#5cr^;udi`iFQ2j3WvQ()aw}OVI;~QA)P0ErgWk7RPkE*&yk)- zBEP%k|B(D2lmALFOk%&+Dg0BhTH#+Q{Ac-FS332ICy{@968q6v{s+pxzjzFZ{6{E! zl=K<W6G`MVReHL3ll&J+FA<-S|C`e9i=WE>8|j}!YpRof2NLahfOxR{kCx67PnQ39 z=?lb5<bS<bCf+Z;EUp&c6+aWd5fiR*>a#zI`lO4!#KRSSDv5R-FMWyhG!p4%$^U-o zho#q$NcW+1mGn0x(tR)en{>yk;g9yuBoW?UI-f*7=Sp88J)K0n+0wU4-zj~+^uy9m zOFu8YO8QOd_0k_pN2I@${!aQQY0ouI`SB#`w~uru>8{e<rTa)9DLq8`c<GVSW2MJQ zpCf&V^cB+6rDsduDt)K){n8IhKP~;d^eX8$rPoV;EFF>lQu;gTpQJt0wEracU%HcY zSLyE3nc`siXGxD1&yxQH>5HT<lfF)Rru5Cyw@cqA{UC|+JWQfLt(N9*39-L?CVnYy z5x0rIkw_nZtrNd3$?=7R|AF%FDIOsnO(I^l^ce9h`Hv@&{xWfz!e=V{F7XBNWfJlK zL89Ij;%8#D!W*RjEqbqW;_pSGK5a?l6Oitu@J#8k;`!oDV!61OMEd0<>hX&Brnpw& zpGsGW{}Q)~zmceq=Xxi<b|iEc68UzQ9w43}P807H9~R#dE5z+$_hKjCVPd{GRh&zr zzuqccF8!4FlKkJ6t{_prPo?X`EhOsyyL8fYC*OTZ#6LhfokYC8(kF|j$-hwgG7{;g zi?bEJK;aKcKO_ALiTJNezo+oer0W#^t@OVYo-hOHu>b8zq~A|EKzi}~O8OY_ba5Q% z#dmO|uM_8q^GPr4OQgf%Tk`){x<>p#{6*odXCgi7wXfJ+>_vL<TvmFxc$!$C@QbCd z74H`BSNJmNSH*Y53WZloTP03CT9GKXlXSY+R~(@56QxfT&k-+F_%!Lc;v?dd3V%iV zAL2$aqVNXky=OV~>Oi7i2TJ!5L*fYvA1ggkyiB}W;WtX(B`z0VR`@&88^o`~Zx#NV zbn0xUUR_DlD=0lk93kc^e1h~PVzGFG!ta!RibVf>PI{%n{~`UUSSM~#`0vt5H#qf5 z6%P@EB<eX>dW4uSPEh!z(#7H};++bANcvgvHSukQZ;<{{{86;#IOVq`(ce=^>}MD0 z-eP|e^&BQWnnb)j>2t+PNyM8jT}mR}Lh*k2FO_~;dZqL#X?|yu>DH6T?<;Ye*!o8J zqrM$TgdZr~n|#!=28qX#xLyn+5r4G&^Q0$87m|o~iTtO@f4X$3^sOYyyHEa)%Ku6E z|6N=weng_&O7c<IGsyot`EQrrYpxTouQ-H6eU6tND~=;kev$MwB=RkmzD2y7M7&3( zmy?M1qV#I%w@JkNLi|SITcv$BAsqE@Ln3{9>CVyzO7|jfwXDNQ<TqIQ6!IbT6Y**i z`OP8`Z@%;*68S$Qy-eYMmwrd#>!kmw@OtSV75=Mqe5sRvM-t@)NaTNzbYF3(ID$ld z@}<uu5r4A$ua^HT>G{%&NW@z#|7Ya?qBMVFj^%$yBHjk+YUw%><^Cjp&pbyblSsEe ziF5(!L#2Zx(hZXTiPCw}6G)`HOq?qJnbLDeq`z1Gi>05Hew9S}_rwns9#MFm^v}}X zo1OTrNaUL)_9mae{gd=C>Cq(e&y$`+qW=_2-$WvxJEiZJUMBsH_>uf;q`xDP&%w8V zC^wUY9wdE+c&=C?E)t&?H;KQB`;<BP9UvYe4iHZhx91_=BlynbX%5rGUZ*?y7;%L7 ztGL%0PWWTuOJetP9seW6k_#NY{A!1*#R_o~?}t$SW^ubXkn?f)+xG)tzI43h_$QNS z?+UR4xy<?QF#Xe|GZa2hIwV~nJy9CNw4EN^+RhhQ*?PJ3TIqGtb<&%q{T?TN0*Uei z(&^Fzr9;varS0!rB7Ui~{e4jArP9k3f339rT}y;-mTpkE{XI)mIssuUzb6SDl+KaP zm7XeXeut!7da=S+ORtfxlin=t_i2Ag_ywfXrH4spOHY<Ak}i>+BW-_=67}WxW|?1w z!Z%27mEI<8e}5A31AZs|KoUA6ohO|yT`XN9y;$1*?j*{yzc-2WYZP9m@XgZ6aZdgn zNW||aJy5zpdZM)bdnCxOSbBlN&F_q?kY1_qP12Rp7CJij$4{cXbm<J~Ea_p=h0>Fy z%cS``!c4zRdb#vE=?duv>8;WUt(@}h?<*pGhICI7IwWm>KM{JObfLmaq~}P_mtG*f zSbB-{O6jn4o%CkuZPMGN6B1NE66L2zr%7i>_mmDvXG!Ns=SmkyPn0f_o+4c=T_Rm3 zJzu(9da?8}>E+U4>DAKfq${K=rE8=cq_;}*hs*8$Kw^KBr8`Imq|>E?()=A_`*=xb zN#{uCN*72^lrEB<B3&$9B3&juU%Fg+vGg+O<<ep4)za&vE2Jx>Yor^bw@TwD)}8$) zx&P7~qyy6F(n0A=>5z1mbdGecbdmHF=~C%3>7~-kr1?8QJRV``4bq#W8>F{N^C#f# z<43ao(jBA&(&^Gc=}hTi(%I4l(i5epN>7t6lb$cVM0%-oSbDYeI_V1OO6eNu2I;NR zR+9FI#QsdZaPpLkFX(;oVFBl_PiEiDK7BKfIO?cCpieLubp1avGcyo4{K&rj4+jH* zg2d~O%Rb)Y!G%nJ9xKCYQuqc}B?`bJ_e?uH!#co9#a4NB=N*Sd{Gnd89&B6T^|hYB z`r2S{QLQgIsjBqd^2k2P<&mZD&8+l}D34fgY^v=N@K%-XGre+gm+6)M(7iRDKDU3B z?DbVLA7<T{R|t6_KQHndi2VHR$|Fh0<C5epUwV>fR;G8JUg--bRawWauT2Y=N4y7= zM@m+eR^I=9X(h`@LcYvDX5Pqmm-T$}zfjNPcfX$A;QHEPt9>=vAD`@Y+So!nY_UdF zcf{wG!$DtF*cx5^^Nt;fmGHwa&DUaxN-VaLtG|ceH}Jz;EHMm|zp#~4{SExgv04QE z^^P5P+hM_+D$Mq)eAY6%{h80-5suTnv5e1=micZ1>v!y^XL{syJL)x)$Ltl<<16G> zfiSN%GSV=l*VmpR9FGDV@0{|8uedyNBl5GbPrhJrWp?nx+C-%BeYfZ?JhrPZL${*i zT!L;XwwGXju@<gKVGY<`h;46hT%`|b@tAbu<UVD!eeFJzQ|%Ak;5~$86wRsSel|>h zrOs0{y^6Y((V^*8UMn|Jh<H5qXQGWx#kMyvt1>(A0qQiW+KW2%L7h0SqAQo<_7phI zr;_1JIBA9E)W)lf_~1mle*fOF1NFP3HqI)K_|gAOJ%8A-Bh?=&sq$N6BMm$zfr?tR zZ#~m_v0wi}y22RgYLU)|bVy^z^&oB~;!cbacO&9@5f^FdJzzDD3)+oo4nn(4bhVoo z?e<U9W0~Tx4rz!}=!)Y*oDUG^5#|?U8;*|bt2XrJ6j!o+vjZPF?H8QxwSseM?e<4| zueS4@j{Y?^f)1F-emw|fyvqI2@yRg9$EviCn@_~*hppMCwuR8ALasiA{`D;K<2m6C zpiklW#RY~|rRW%@;23U?!~7fbs603e+q>&HM>KJhv~6ho8yUKx)<XTa6{ElDxZ>6p zeZ2yGo&D;=X7$3kS-%qXSpvs7VPih7GGqCbM8!4rA>GcT^#pjF#zxNPaYCC<MVp_1 zZFBzZ2ki|__u@7)m3^@QVg6uwg!^Ej&gPtGhxQzUu>HWT?61Ka8uvF|eJZa{*&D;r zXV}l#-%VdfA8hv$j<ba}V*4;Y``2K^%}4)=j*tG`?n%UF8!;}=b6jgS7Q~2)bEw^e zh>LN@?&B<@wT^>12M<EpT$~?U?EIYbD*(S7_<bQio)i1SFB^XE!Ox5S&Ay6r0OLYa z-%3H>@}LcTq3O51vSY_wwpn|&SwL+T{J=Th7~9$*&y?h2tM*1X#_s_hYb3|yyRAS| z+j-Ep?LHHnS;aO@RNdL<ZU4Xw9ET?Vmd=6cC?onD;IZO3wja)crMM_;fb(NO=Ukoh zV>)i{j$_;oifb61j&a!j$hp~ha60R@i}Romb;^YcsczBv#?ry4xTa2|+nKah@(s0} z8vBJa2C~0mjNceNHupe%Ic~mh_YJ479*lVGtI=`0ATGyaj&G)~a@=HJjgHIfFvt8C z5!XJy&{k=Ub#ks3=qo$*RqWDEeHE7*yRWj2=Dad}$@CqcHOd|@y%;Zj1-J%dtn}oR zM-Jfe!1czQ+k2~@3_w3Y2t%#qE;k3;`EWtF=&)q?(WM0MwU0Y~5X(NtTcK=Eu%xON zQut6l&yxtp0QGBgZle8SULSET+Sf;Oo#S|c_KSH<#5rtV6M3CuzC4%FJz`!H<B%_p zEv}9BG1x$=PALJi4>Rn2;Q8MU^|$?lGip8T!#NnsgCEtl4jx-|S#Zmj9Z?o;f#-Sx z<<;rdqS|(S(ax5y5|*YIPs%Ygl>2xdgZ4R*s<K+81T3D*oa1Jr3{M#8LYr#+AzZ^k zI5wfIs`gfHwIAp2P#hQD2XO8`8T0#XU^18jM;(C6)i(7Xxn)S7gt9%!xJD<>j5`>0 z#Q2oRxr-H^i8|a{<IKUEYo_@TZH;tQjFb91#>sGLRT7Rh`eCXSm}$>{zD1k*;J*#@ zgFk^x`z6zcc|FSKXUP*e_wri2X0Nm7X7;=*j5?tXpDB&0Bjy&qkCFZp_<N8i`cggT z2Ool7aJ|iukz~vdPKnW;KD6ilYR?ebvm7Vda<~O>WpKsP*<hx&8U9ze0P^Afr=won zH@0&!`UL%cQG4Pz*ll3^agA+kE1s{rYAdE;JF{I^Asx>Hwm<T=j}MOn%i?*$W0xFy zrS9?HoOb*UVe~8feaF8#IrDiR^JCkRY+Hw#&*NNfoX=xCv69z!w2I5ybN=i}#<`Kq z`;U>;9`xJe(9Q$f;8{1^Hn?D0T!X-+aK&)L;237E8JsJcaRF&#jtlO2Gsde#E4iW; z^I!YC=NNHR3u8pAd2`Pe#t4iJ_84K$n=yvPW1h=#-h;Bv#J;iba!h-TZKrU19*pp= z2*<rxs#pGu>xKUr@JCyxdWz>%;r_`Ud)@_2Jd7cByg`VExeUh1Jj^jlsxV$9dWwft zu`DwW=6J=nV!QP~U$W=eIEEg~P3-$FtJl}vn699_IuXYpF2|4YXiPQoO6_)fhbq)H z)sxtv8r?FnwUu9u!;*+OO@#N8ykEn;c1>>1qS_>lMXhn}ObKoIG8N}fr>yb_?)~tY z-hA#)VhF^%D$y#MS<5l5!Fr{RV@I)-R&9?J$QSpRsUBC@4{z1BYVh^?+A83jX?-oO zOVzk8Rr@g(#3fI!%noBbC@zoSoR7qn;o23>u1ZBYN$68B_p4ukK{*F*1>9yd@I>hV zNVf!TDf}nHF`jYsH``<a!udN8+%|NF(~s?T2Co@bPQ-d`<}$0@%omc%);`C2v(Buq zKRg?C-c-x`UJv5Kq%+ZuA1;3o<NC8+_*r3I3-b9{4h(ZME0e+>p}q2XOcMR!JFsSw zAK@4rKpW$cOJY*-8?`LMi!$u-R%N`*K7;%&MjX40p);3ZOnt^5E@7P>f_pA0x%}z9 zi^?Bly^!_+Y(L9<SjWeee)J!tPjaQlc4PW`?0)F<CDSHohiBm)G;QNUy?wk!sLnU5 zU4o{}813Rk7}~dz^-L;WYwx>zzpvema{VaR?<%**-q)N6?xi1N-gUMf!}BY#!RPc- zb6&KxFJ2x4SDt5ZU*L!JjAqAW4E&R<Q>)kU+&6s%aT1bCoxWlfSGo7+M8w}4@iA|- z?{k<Zk9{%fX4<V4`ouJ7renJdWc>rY9~#BawkP^Qp2J>{eTU~C&pqDfO~F{mYl~&A zuRRyz`XLCP3=VWwGTPhMcf=cqcpSSf0dd_<W!lTJjW)v=w!ZdaY@^*$eaL4D(szrI z9^<c_?n1=HbsPJ?zP1Q)ySw5t-y(#6<jNOo33k4hAui`2sJ~sWLD~<_jqJ6eFy;v8 zyKxu?QZx?q=d}d`)>cdkH^Aj%`_H&6q>JU47yYg92k46&TW8>YFh7DJ!QNNivsxj9 zVLs!8<wh{)w8N}q+ymlzi*p;A={KPd;reXnksEoN<0bad%(E~?M0g#x%fhiXW&IuT zFb}A=u%^Ma7LFD6d?~oDHcs=;6tpSMox3@{Hs%*7ukPTQi+Zf0DwNmPgtxM;^8|5? zfK>s;pqyY?Et-^X&@7A@)QC-x0x)^lEgX=S37!*$qFtXYkT;GQJa6Z)YRV-4oJ zx%OD^4UWWh##uuQ>N>#vG~1pa;@WEpJFn9OP)@iL#&o!4aBKdgTY_}49P^{U2lv^W zTlzt)ch&pAPeCupxuwq<XRm)Y_C2msqRy>xZM`(G<x9+UtI;jydP3#Zd030?&<)q8 zpcnf++P;qZ1Jf&UJdkga?S})6IUkN6+9?C^lhBuWeA%B{qd!jzGtd0$4r}c`z~hK} z0%!j1!+|mP2<YNHcx;&7oC|R}7jSOZr(mHg0d5;k<_wU(hq3_93g2GK@q@>Wb5C4{ z&|h%hfo)vJ2bi*~5aO{fW6r_j&HFek!6tHCGWR5jIL=<o&+TK5d^WQkkw3>==Fjn! znqxn8jWowkYR=ObZtBB%Py_m5vW5GuoLeyuxV_dJo`iNg7cM`7cHC%TO%~TX-iHl{ z!(0OA80IR+Re1`AR<*);;|VojKAi)ut@)K>OJEYNAxKknL#3579eK{IHFFZqkC+GM z!<_HbhOs7IjQ&rJIZAy)TbvVN)B|l1D7qK(@m$m)e;*w0M5|y^Z9LXEvvWQ|d1I;% zgI_BU^-7Ebmldqu2m9ELYhAc!P4(p9xj{jE74MG*=fqXTPnZ=!oCxndO}?BLSz*)> zZQan;xgL4TN~&60r$$;KZ87Fx#l?$iF^@|0EZbD;E5|rewyAdTvc0MXmnT;3^?Z3` za9QiB`15XxBo@q$w4N|K;wd~H*WJ>p_<PDD-6xet4gnL2Z;Zs{%#J)$ygIThXEpj) zN!44}UvKfITGo?w8eE*<)bpG<kvQb@OhHzJ_Ykijp0#1e4hsj%K2|xrM@Ac=9XW1T zn5#{*wtQKP=K`3@<9c&D);(}M!o^h>BM{C$cPqv~^uG}H75&}{ha2<YHOCwuwtLUl zu}?TIN$*xhijyiMaRt1eA6wlMx*Xb5R8oaCw2k(BGrSskp+DJqbN;#3&ewx$Ei4FY zajmImT{+hAnw)^TbBxCAFYb#Fhjj~~Zs8Ja^Eg!0@?LgXD9pZxQ`gxS-gB5SEIL0# zO2ycSds5}s!oIS6cb?dXW_dQWa_X3deury%>aold=XVy)`(mp@^-#7g_LXyjfv6j< z167_Jv?=Oq<#0dN@)N{ZM_7k#-cRTAdVcqYoNQdT#xVU{D+lQdCSm?Cw)#+<TYP4g zJ^|0tR-xbESf`IGk7Q3TkF-VKOSl<rT|TQS1Drj%GJ;1uwZ1YuW5c|Z^>`S5EWh>m z*-rTdYjN(P>;jzsA%B&pcy?9K(HQTGk*;`M?X3LD$Y7NB5a>f+^N*SpNf<c`Y2U0Z zU5orfIQOwnbW5Q<IXEU}-*BAQ@La($ZD^%=oA!l$1LyBX?#E!18-HPCq$ImC(jD{^ z&#L0Su?|+)srO=pJ;i>Z^jI6`{AOd%8RZe?F=rmqmCdSJ0^0jsHnX-ZpDl8~k%s%t za+1ce&1Ttsh~-%YZ`5LaqrQmORkTl1fpeb3hbC8gLaVF2IR%xxZeo(N(Gwa~yA644 z;CLDs>Sf>Hxs-(UCWNQr_}4R!cpPh9KfD%?v(s1oxITDtxIVP5CN8T4*IxG5wczwx z-d`3qUUzRrTm3bCis!gz5A`Wu3w_G_|68B3)Tc1M#D@yhrzSV{Deq2w%AUia`?&fP z^5C`7?o+Pu%FFQ+*8va4X53Rm;#QYNmW9JOC!6;v&KuajadA%chPj5GR_*1O6WCP! zDg7|_;d6RiyE&)Cc-1stNz`0r0Qz=uH?04_rF3;%!hu*H!}eDAl__imxEO8&=13Oi zAO|ab52R-tw=?+}ntb;Jr=o67+vHc@hI1YBC3}68Yk!_(T>C<BSmS|CwdYk>8%l)c zdKu;t^()X0bo1r7JqK<I+(I}LPI{9kV{SB(_kbA7o%t61_?!vXUX)#0#phe}!~IA# z#~#iNu)bCQJH{TY%MOUg{G8W8Gj4219#VC%>VxY?J<D`Eclq2l_1qI&hVr=|4`Dxe zpTRX$vmZPLxL>R8WAF3ys(bBrn2xzubUbH08guAGUx0mg6xN}z-h*vii|n;&u1otd z@3qsq+KOdheprp^HrjuBRSC-g?fa#I@(AYai9XyjaSeg%3?AfrCh7|&#^HVd_x6|% zJN<+6+PJWD?s(ZZussNQb6qeV^V|y&*MoJx`5@N;Zv%Z`85ocGHTRv*&r6|so^pNd z2c$LUBi0L2dH)s{!aiZ16Nfdu6x4;!7qBK(zX2Vxw7c`WQZ?A#UAGWvOx*N?oNYtn zPi}|X5W=~PIvlKWgD7{J$~1JRG3l6gPq?ipm+LKj-un=avFT%G?dW$LQ`mR($T@aV z?L(Jh9u+RB?1H(z1)CvH0glD08!D4l&Ht*?8)=nXBQ;~eJRFy_%V5XE`y#~S`T*~t zH{@hh@i=*lN7g3jUL!8&I2<Rex8XQVMthauLF8h%BDl2Obn~O)@wd8|mUKJ%^@H=4 zjl?l>%Df6?vMjfYE_XG;_mu0&`r;UIP3+DcJKi}O^`+*T7|xM*j-u8%#(OrdO|q@` zV>@GeDz=Bh-`wNw2aRzU=bv+4VmQaS$}}UZG0#u6Fot`QaSp++9sGJBd_ORb`C)A3 z{R8h8?Xe#InCB<j{RZPkQ@=T_x^;0m??ZdQUa4})D9n?OtElaQd2z{*S(W}FcYW1q zPKQd|N21R-dGa25iaiIetUin9cz|R2D6VC`!*Ss>`LVB7!4Lfs`;F^5%B4NTNQJXq zF#f;8^(GUZh;Xh)vQE4<n0<%6P-2|g3(qQWy=qzuNWu8wL0jQIa&ElZ3hO6{t<+Y0 z4i(*2DWM^JZkPBH#%rcsfwX4-Fu!kXvuBVN=L^O;99xZL|74qno$)ci<A8C*J(lsf zaV$F#$D6-ZmX8~pY`Epvo($4)dv_e;ZdF`Ece=I8GuC*<GTqLdj@wMTr`&3kZN{_G zU5sa0L;r8%*%Ta`<V*kW;~Abo)K5cuSv~QccyP{cx`wEDtEEY|V}6U_+~Zju%4At? z7hP^L>a(ZZ0@l|xo?-lHHlB5c?u7G|*LyRba4g_?kL5n+8ub^9HS;vqT*+}FYOJ}G zei~b7zjBe{aBP7M<2zWdvd0pPL-sk0aSCfry<qFYbNB;{rTJWcNaea{Qkc*CHet=f zdA`T}E61Qpw+6?-xRuym0=Et>I;;eKboQEIct+K5l#>*|b84)aqYkN@FPU{tUwFJd zXTuuPMjzH;Sy%dTtz`iGxJHk0*Y@N5@d)_&;fLoT_0GM>2e>vmb;Y_+J?rCkrtXHO z{(FK8(1x5J<9WjXe~{}D=r@5T`wm_=ux5(qR-+voHpW5U@mV}Zwry{Fu6=oF)5hnr z!S%M?3vFJ$!PxByl*2|ew#^HlozvEZHmAnch3jyq+I;|P7_K=F4p3@KwlBDr)(3In z4#6$&?YPO<o+jM@zqRr=;k#lk(s4Zu_XT&GYY(0Sq#E0mc$7z530!Y&+ZfFGeVnhG z`y{gt$T+yh;+pTw_i+pRhxZR`Ti!#U?QmY;SU|h;qm2Tu^Yq&r_8IPa9E^JK*&1zx zd9TNL#uL!%pm|S6{V4QWhNIp2EZPfxU=#Q4p<Z9-$7p+uFU{KCZ6^b}llnSL(sSfi zg4?w{4J_2Q3I9*I7Wwhm^l%-U53x_?*c25zHZ!<oNMzgbm>9ob5YHS7Oxt(+STMb5 zPs~SB*<ac2v{mA<`24pfyBJdz?PwTQ6ndrZ!R<}$zXblMFYdRU`!ODCJAWJplE=el z*jYRA1lG34nn|)*SHUZl&K!qxt^)KAj58S1G4H~BGh6|?8fV-Y!gHc8>}lXO9gcTB z;ELfU!_7y>?w~Mpe~LN$M*Eoz`p86g8OV>%!a1&)F%4~B&-89*$}(hmd&*^?Zf1Su zSdQ0dYs?+%y*bmX_-qHmaiUN2#Qo8Boa6JJ8;|}{{ffhL)!b`iII!ongAiwLY-7Ew zn)lNfQW8A{$5%bAy!i}@^LmrFUwL;$x^~PD_w&3rXL;Pdh1)pJyoTUj12)mqtL}pz z$K&-e)+>08GHVyCC(Fb5(pXR4UvU0?2GXOCrg{oySFxTqB2W6WOkS5crhg4`e$WH` zk89FcW3DpiMgzuRwvm1BSyawvHmLK+TEFf$TjPE+73Uz@ZtlKg$|EZZ7S+ZV#8t9g zx+0w!GuiHFtVA=8V@yl5*Ryj*@)^s3FHlb(pE;loJXaemXWf1W{4t)U^4=MCQs{1a zc8oftV;l8N41u@?H{MUNEIdn0^&l^kPq*_sqK){TONZ)Dk%spRp2UuPCYjh8=`sGL za_!5uHNrZ$g?;se%B$_;SAe+z^2GTWX@z?pe;Mw-aGWswq}ultvRiT69nC;Hh46r- z0WJ@dg6-f$++0#;fOK`(UJX|cM}On!Z??&NIOf4^Lw7j+*gli^%oqDIfqf0@w#NPl z`|uELkU-d$z{V(4{w(XyeR_|_forC?KQiYuuQ#l#+qug#^<cSs!sVb`?jLSXY&#w9 zhiwBCUSGR_#}#cboPCdN&}ci9i+<(URH3gXT0?15Re^a+e)V{^myR|1dF2hr1MmAd z@Ax1Oj2kbpAHXikZZpQcPI0nS4u&{84s4$q<6N#dST9Rude*ZDemq7zKg}`X@!)YW z_E22Q<M=xXak(%1?qXl?EXuKiLY>$KEQk9rb~no5n8x$^B*bMp3wf}PCot`6w5@_o zR!(Ux_sOn5!Z~gXjtXbHxWkV^IBlDFPjB{-dE2&4cwT46MLE3?k2Xy&Al_DNn`d?Y z@O+nj+Ze8|!oF>Ft@{{tMtr-@IDQyEQoZQE0h|NKClSxC?dR@z-fq7u#eHJheUN5D zc{XgL*w;_5PQ?8`#`F5D{;=I~xq;YryKLw^<$9v*->_c?<dokI8?u?0o7X4glye=W zz7_Zeh_LF{LEZ;GaM+B>*KjYxwH{pB6KV6+-tIrmZN7XK*G6(|n=jgJ(f$iIUi;AQ zinb}-wh)K5U?(Ddv@MuN>0uL+N}DU%h2ea(?ZTMW=gP+$ppDq5YAn5_#wlGow*81h zdojjurTDbjjz^qm+c8rf#;eBiVwH0t%Hef64rOv}K9S`hzi9ii==v2QF0M0)K8*3m zH)86^d19=3vTW9KSGH)TEl)rl_)N+l=De)AUD}1{fBX&9BDmFbcv$~uTn*C3a?FeV z{vfVdp&0gOsF#KNHNR!si^a4*!#x6;(Pb|dF5k)i%#UZ!ycY93=9~qWj~={Vr$4T> zuuZ2;6V5~28`Cb1{l>Hp&VO8kj;&%FnQIWQ&vtv5c8Sq8vG(_W<+lm-p{*Xz6+Amb zpQH^Rj<0O(XlIuhWoNemHhB1D4eX=y4lC}z>X#uOx2wbPayxg}|9X4LF&ulE-q|&4 zBAx)=M{wQ88+$?6rq<I|(6)t>tstLi@qUHZFtZ*DKl^;Zb&z&}i5Q=7of{Rw+%nOe z=X)tm65`+<8~x`8yZ`Wd?W{43#2nMH9W?cF_t7Mr$5=0iy*<_rV2{VKU_*Fl73~Q# zke@ezV-;xr?q>k?@MEDT39bWN+MjgHBbH-+^#2`oiNpEPXhR5FLfRhD#*p`eKFhHw zH0J`(Db~mBqU#o`y#JNo_CY)soa;t1j~lk__eIgxw1dQ21IOXHp0HyBndY*A<h7mS zf+yg-tIy-aaTs%VdmOglZ;qA8i|O$!dakjf#B*oP_3ij>8%R87?P2;{66+OivM-=* zu(5|kAFN*<f^ESNtQ)~`y8<o)+ngKoo~#?rW!fUzb;bG#`!sDLG3E_u?0+HJBVu1* zA7^YLTVY>(7}q%G!@k=0m*&|K?IZb|*w{z%K8$4;dq}Q{(XPjo$@?PAVXJwc!g%&Q z8R~-dD9l&?*w%vk&+~`Ji0zUTcCJTmTZ_$@?9!DCb=;IJ+`D7D0Nk#ybZqnYY}qy* z?3?MQJ<yJf<8~%LLzC~GU=8YK)&g$hT7aHIrQ;ac&z|fx#+Gd@_}jsBmK?XYqHQYS z5)@|Q{4Z=RSf<;VvJFi=_XN{WH_ihdim`TK);Tag-N<K$yJKs?Ii#_*@L}6)ar|Bf zTbMs@YvIkoIEDVZJGK_QC$sOFaqh%n`#-X^@bvonJN7x{*@fpL>f(Mr>9)1VIv#e~ zm_*jV<zRbvUBa-YxMfOb=+2`MVSF~pI=F2uSf1Ot({P*V_LM6?+2+~gx#&l{_S?_6 zJkGk2v9;*1yS5g*24N0@_mbLIj$hRAM%VFS+t|mbXnk#~5c*w|Jq*X=KXZ&KT*rs) z8I~s9j$!5S^AtB7p9?V7x{pn)zOfZ)_LQ5CvdweJyJT|!*3-|}S~xZbj@<+vJtcB2 zl-J4qa6a(7q^$*(ZxhY+GTPQ6z_4VdacnJUL*cfyz_Y=fY%O>%%(0$nzUO@nuc_!e zT$lMB?@%Tbl}9eXI%5*n^d1?CdnSH&sHjy{>8g^-q*Zr*)$z)-$_YqkUz5>au*QRB z&C2Qm?i>0L`ylNn@~LrcX8wuLdC<%o>ovG`JNt|^OYEDo&oGxyjl;ItS7R@M`{B99 zUIJ^HiSgRsb)54=?XR(yz#72-t{Y*EV6Itz#r(2yzqu~M`zu_@u#N`XFN{YYvR%T? z7>9P<X*_b<OKcbp+plcQ3*c(7y%411_U<^wO+U$rYv@k5U3tbDlUSzPxzll*Y4?=d zin4cSOtN;@UcxmdtsS?BKjGDQjCN;Ciat)!Z52yzjyjGTq)E49+7<9~k4ZS?>!-rc z?V`)rj_^I@?B5{A_`|iaU5!bdcDj~0<HFoO7#C)^#)bJB7p~_xpmBk=57%fMz;lOs zo_}sz2d<ZJjzL=ou9w8JbtpX<=N{bh5lwChw&%mGgo_R<f*&37jd;WVU0VlFsJX2J z>*IE&?uPDt_+M|Apba@c<yiTDv32lT&21fg{{>qI$L8Cy@5IF=mCww~b;13ekB&Is z(sE!91y_EG<MOawD7^`OE97s&cf}CW{kLo#{%HQr>m;9l^Vt)x$JDfI;94x7uj5|W zeuhrJUjIc~2Y1_di)#C5TZf8~cupX<1gz6`A(*Re6aJra1@il=Y#ny@SlG4*vK5JC z>#*eyY#m<zi)|e^Kk;zBRIqDXhqPR*-NCIHjc1r}li~8<ibr7>R2c6;X^Vdq?j78= z4vl3X>?@4t(Y6ju?{=mvLzcIvTnE(6tZ(4<JEpCJS984m(YHCrj%Dj$?sf5O%$}1D z!Z^7%w*Sc1!Q|~%-qE%WERW9*Z{al&?f;+JI+%LKsh+WH9XO|EnJwBn;M#24J81nZ z19L17`WN=Mo_)<cv*Ekf{H6%*P3CsOyVpzcu5DaSQYF_8c%NbJ2e9VYI7h>}By1e= zVMhQvINQb{zuISP9B`jd)M(>?IM@eXkAAjo9P;h=<7wZ(=er>g_Sg3K$9q()Ii}LK z!KCkYdK%Un9oq)nM<n9D0=5lle4o>{ZTJN7VMo1_ZG(Nh3R<>pu-7D7ux&^?6?SxR znPV|81Vb>CrS^k#tFc`UHw}*d#?jwwll|bB2e%E~;q=>;Z3Fhfwrv1gv~6(KH5^+g zUSC*Ow{w?g>cMjNgzJfNW7#%vT>4LJ8+fc+vTb14AK5lAPD{283}gT2Jv0VKKHEq& z&;317whcbS{j;_WW*>IPwt-`Vv29>F+8?lvC$NsMHMecB>yL1b6R~U?+~G$d{jO{q z?6@fB&)7CFEsqgx8@SDT0gM}|d?##oZ5tTZZQBqy-Ll*+1={U0p!bwZK-vEd+Xk=2 zwsUM7_?+L^Ht@NWv2E}mPD{28w0mHB^Nc#$w!!Pl#}{a_ZSX4{o+qTnA&#+ah*x~t zHnc*VXxj!;9&H==9F67Cz970BW82_InZ~vu4*5mfHbke3wrw!=q-{g2da`WRb62(v zrY&*Lk9$>&4Kdb5FTyo+0gQ;V;TF@K`RCkfq>bg6AN~1E%(iU^@;TxRJa5#ub&}Ce zxR2(yvf}J|^4mHeVyv2pYrYe2C)<V~*8GxTH^^}U_p|o5M{JvgT;78u;@LCS3G*HM z288=imi_z@_kkQ=oP0;y-!L<6^gPmS2pwC+b~5YhTz|9M#I#L}_KCI6|0}<hY*&|k z18p64$G*XX`(tC@umt;9ihSH|4UU=Hxx@a~+jGwPYwa7%`e_IDwGhwIo$VXUxxSa; z{1x^Mv}rK*4YYN@9JWRKhMKeSd>3vj-1a}|m`5zf{OJE@>>F4gw~MY@tn&U>ew$D? zb1t{#al;rLZQp?Fv~Ayzi*Gi$?He%PPxJ=9vww#m+P1+H_+#4!j1!#e$FyxQ{Vj=g z;usuup65r~Hk6G++rp)d$9E9GWpI9M{}r|kUZ<biwhg?$GwW1;rELShA>qNbgxBsi zXiraYT@Bi<W*o-UK*6z9<6zgr=M#aPp;cD|x7@iO#^=ieTkhohT)1ya<a(01S90Gs zS+HR`{2Pq(t#Ch(SswWU`QyBNX9EbY$5dV_e?x-D+mCN_(+|&kd|a2}b02aC{CIuY zF)&p1J8Zl>PMq5rX55Mdv^m~s<J@E_<`#Sh;AjwCD=}z=s(9^~I%E;Tt@=`HMx`Hi z$ML9(C-_~hwW_%CXyh3T99xC^L)i7-Tf_HsSiZ46;XH@)YQ`ImJbSKMgu3EeYDjY= z*1P##?*YiWWFqW3cEe3XoR-{FgvD|##s91Qb5VXQcPj1cys+y=+r7YNj%Yi!2fj&V zx7jST*-?t~BiqkABf{%B+ljV#J9Z>noKN{NkKp{zk7LTY)>O1#Jbs^G+Nwoy`=V_z zKZq2mec3O4$(U2Xc8kvxgMmuk<EL8iJKEMms<5n@XnBe&i*a08H#~RTX!_2nu#ZAL zY=7nfo3(e0y&B&a<Jf*Q$`2+Ft%8|V;*rRc-~K=z^?`FRx8DtyJPGzXEw~J%kL6m5 z|5y7bpkA?@<((dR5&L+Q+6Qx}`i?qAoWJ6`d5y=2b6EaP0gusC9HUM;Mw4}nFnZ$| z%=b7SaD0N!@$n>o;2fWz`}jD02Yq6f$H!c6d3<=RS~@;q7$)qFTZUuMl3Rm3V!4*$ z|JD9WP`6kv*711)-}mM@lz?{!i|{@BDIVu{Rs#K&MG|pN^u#z?gx}x^rO&Kfh2P|{ z-uR%l3%=dv`G4%a3w%|@)%U;mIVXn@qlQZehA4-dqFg*6C<;hWRH|6RMa7CXDk>^! zRJ2fS2^R$|w4tR+ePW3%TI#J)v85I@-qE6>qD4zJ7miTGN-I86i{$_P&FneZIfRSa ze|g{Mea`1IXKrg|)~s2xX3gxiXD7J(g75n1dp>QwXl-`6z5m?$@W<ZP_rh1NF9Lqw z<4)_U19kr$-{e3h$lr1bYY%5+Ufu%k($hP_qq!dp`}(q~x<u7osV#G!$o7&y;Tiu} zbDt-1?peNrdw6HpdnI#HUf%7gYVSGnc+L)NmiH}tZzeqJ!^10>^Rw7<JnAiCJ;ByC zaZA4T6J`AtLBB=zJ2lDMQ{uTuVy>}SjWQ>Y6}5b9n7v=)2YPQ>?dqLPue79|H7sWk z=aV|~h@(5i@*Yd|p>L``PCsRz7-zlIS|T~5bAI5A9|K<Tbtp8dZ_(=0>+eX;ukTnq zzdko_eriZfMXG)Ad~C+&bC>7*`u5~SM4ytXx*>X2!#lyc{~CHS<W&ueR?n|jeeLzG zZ~_~0>h}`QriSD#PGtu;Nk<xy{3&an*3l|oYqsECZfyJz+hX&MRvx_L`SdxbBIWAb z29Emu|Ba{K=@jjDg=bX@cowyQr*z1t=_9ncQ|Axm+=0mYVa{@;C)6+(YBIj7q;);> zdrs~fPVC=vwAWWYW10T$lHP$)TU%%g5*eFnwWagmt)!tZ=Cst7^x7YhkDbY#rj5kd zde6I-vt|2@ryq$wL*H+*-_~Kz%Ra~PfaZnI9q&A@;(iW$zk8=(%{mo1JZUn|Cvn}c zY;xO(ufi>CAukN~Wy4db&)pSoznL<-Uf*aq!r-<h)d#$K5snsD)yeMK-6h|hXD2Ov zgGqNB>n==vn}X*6=mBd|&j;niyR17ces4nWVP}4Wi8<Qh_a@Nm3L~_^Sp&}>>^GP+ zM-BdguRGw?4|E0g7HhCY)c0j(!&bcCmYkDMpR@Mo{crOf3EoE-4{kB=)f&khjB0NB z%uVr}&zwY`PMuC(F6p|HS#lvl+9<-{$-6&eWh;fO7$d#7FgMA0OL7M1Dz*;6svg0! zb^;fqOXlgDUeGriITC?4BqyTfRdpXzuZM0GNyv_~xgCB-_#|;P=SH|P+-we#zKUBI zlyiP&9l}%J;L1iunLF`IXCN2Pu3IVGl5eB)!@tPgEaa{GKGbk<TLVtL%OrR>e<ECp zFQ;(WEzF3!Ji(3+;N^#%gK3r2JKtj)ehHuO-5I+MF#jT@v)f|JRT#!wu;RZ(!0MYb z?mJ3RV3DDP(s2c&?;`yO7=3HT!Nh=(Js1mjn*aA>d}GM>)1ZT&yoL8($JWhKIPtdS zwbH6KJU2D+-79UPU#sLL2Im`SL*GS0me<Aen!f8agfbD{L%zr0bBV#{3SjlErA*j< zz{Y^RGk{h9N`cikm@;7x1vUz-o-67-=lL!4<xF7w;#-)zXV;Y|?8cWp-GS5{MW;T2 zv2{GM<QmQ@12+|a6s|o^`7S-v-^y5O-HNd;CRh`+W;~>^f<_k$w}kHU9aEPy?Q7nS zZQxbboCxznHvFyl7LCS;{<J86#!#1)KWCfoOXwR(uLR{pALdPq@@E9)ocvK6;wzqS zwkUs&1vZi)e>7(5LyUWuk5WI7L;dh2myX1DeQpTW^JkDtza(Ath)-3nhvJe4(x;FE zMjn(l$%A8}nsdRq3S;8F^LH;}GWA;ao47@|?$_~L4mWBFHix+JL0%c*xrE(!{<=g( z!w{br&xwqI)@IK0Z9g;T(V6@*_7TCi{?O-<xxDkr7@gsZN1E`_{plT{oA~55aC#0V zuf&z%Hq-X5Tq*hOadWTV8D?8h&iR>j=<GQ=$sN1v8$V=SFt};0jY2D(9qBuSO#B@8 zT_*EA9Pr~&>ZW<nDC~OEmWNwIdSynQbicGbfhKMpWPNFo549G!b&&HZ<oFu%{T-DP zA0kUy<U{m|G#?69e2DFIi+uP_m=9U+q*Jb;EuXg3@2-rc*6pXnSAnct65071g|d5{ zA=<I02e-P%p_gbE;r;^I8)bffaB5JW`oXs)=|>X}>3fFA%A70BSj?_}()j4`Dw8K1 zN7vm?e#Fz<E@{y7o^u!r(N=tSf#Be`R;=CV=IwqfeoX$!t~2m_n8(He+i@y9^BwH` zaN_?2zFb}qS6bL@hR?!r!LFr_5jgo_=inj%zyCyXXczqcD!4p{z^}wj!DaI4-o|Uy zA9&FDndP|KgfTj+4l&vcm-dWBKgO*S{yLxMq09^Jajv^WJOKUrkX}r_muKnR%8ZAd zJAXlUk18I>)=rG6`!1kc1GCEJwEY=lrE%J(Z&U?*%tb5d?+rTG7_dJCR%@!@#KUpm zv_|V24-PI0+-%_VPM4pYWAwG-z}HXw$*iFV2w%Q;DZcnKZTe+%j2wy(|C8cDnLg?x z^3vD&5@p?759=f^0YBw?d>;u{gwxn|XYA$nmRAIO(~Y*Q^Bs>kKc2kQtWPidO>1_m zP@m_6EA%n^JyP^!eOLl+DyR9hf^u&C4wsv5`Zy=}M(L%7rVj(_bcir4?32S?{YF2Q zt-)<OID;vkV{~%%!8!ge=F`E9!zlV!gxmbxuffAX+1g#yp>dR4VEhdoID6dX96uM@ zbW}aespa^h^9X#or9s@$epkL=CsV#9=gJ5t^NwIJ2fhVuGv`1Yer1g*92)So#;XK4 z_q|QW*P1IUfs-EK`2S?!GWow3{T46K|Md6|0j{O-e^k7}8hlW|E1FaNfNg2~wYSyy z|B8Cu9GOU3G!e`Z&h^~Bvo&`UV>@cjOJ79}kAzloRm_p<y>Nnc^Aer2;qTa;x;fAq z{G8qz=1=L;e-v%Nk$q3YVAFrA*KJ4VDh>44u&k)v!JQQWy!0uzj&1>dLJRO~fER65 zf42Z$G+Ph+_!i(-0xy0Pd;#$4Q+CDtdf^=_J3Qr8u?H;EeK#i?xteEqR=N-SpNw_s z9>!?1<jnW6?ZzL+nltDo>lAiwGHEWH=?nfj%8$ay4?722P{aMWtfBfY3eQMx({q>e znEN_2i?PmD9L@caiTSA%ebZS=guZwl_;UYyYj0Hj0XzdL<2w`B*>iuxU8yX_U-kKU zxwVmGRo$tk&e7)kT7F^{b&jnY(!tib+SI9MJ=9mF`cAFStvR(`_37R};l^3OZ91=y ziiYf!v>rV}Ijh53x<xtb^Ux!+!CiXe=iuP_C%>Yc=cTw@+&YBdGJK^w9%CJRS7YRO z#?3*u21y5Zvi0Hs*71vjW!&4&f(C~Mu;P<%1+b1+94tKB7X7ENlXwK12QM)fx>YqC z1>Y;IwJK@mfZa=uq#id1Tpj<VH6ZUUV|&FuD0R7M*Y0J90Pp6sgJ(Z#;3KT*f<Hfi zm;6Zr@8pGp*FIGBO9v1<d!kJqceylvA=?@I4PK4Mw>5_5e1Wmxe1Uye!zq*nhugUK zt3m5X9RFa}k9guD)+h7bb8La_w}?eY*QWFgwdpfYT)P8AqW}kuLxi@aqZR=hp<SKH z91Tuc%opvK>am56;@8R-Z0SX{S=^B|a7W|2E4y)LRx$Lhc@sYR2Ym}<8Fni#QHS;; z=ByTdA)7IHjXES>Bs1B2HT+R_*3|tHejGWdJww628b5qqaHPu)Tjv*1a61^k9exLV z&NYoqspzP_HA?<M3%wunI(oUIh4|0WqFaa-vaeIwzf(@S4DY$sEfo&Ic|=WUAK=O# z!1+;l{F1?Vi!Yaj_5uzb*erM>LOWUPA#>92YS7+%+M2iB&TqAUtJ(&C-EDez2!HXp zs}H>`J(iB=p4J%A7kIr+^lJ_MKCZR<cWiCn6~6HRPwmfdBW-dZXI;H(C1*l>|9McS z=<}JvjJeM2#GA{%XwIANUIRU&oyPnsnZd~cuIEh76VS^t-A3}lX@XVTK6tAil0|Cw z=cXM!H?VUctTSp(FQNW2+z_0ROVl$C*W1NI@?80wl^;$c-Z6l6ezSaFEnZE1r+;Q% zYJMCa@SpVdD13Yn;}^+87K6J7KT1C`<>`}Pbl#X3@R!D+C*zPQ8*dE8SLGdleuH`( zPa@mWYpNT&t3qYm{2mgN5nmoanM_&9Ue555+HrhzBxRy`o_9=+Y<M~AIMJSc=IZRT zG&t)htExL+y1$W4_Uu#k=Ut(P#(xlN#G+d~4w`uWeluf(YmXa6TxkPvOA&(Il@Hv= z09JWnw}LVc-~>Alm~x!+6_#`GbAekjhjj?&(zcUdNxGjWonTy@&)F3w3_0eT#(`d- zGaAVf-S654zcs$jkPl>>^bPV{ovY4zVq-hrtK}@aE$7ntojIfCT%k~FiO%L7OoX!{ zovZ6SAyQnWZ$F#!4t?vY4X~`YW)4Zl>TJL(os&8M*_H~;%L;U|@Y&`ati3v?Xj`u5 zPG{BaAfEoNc%avG24}6!?^4g?xgJ|U=#3K{vhkgBbdkR$L?@T-;5L%C3MW78!f*-; zelugU3^-TT@#y*VBYci~6?p6XPW`}M(eSePavX5sv*9toiH?Hf3@%MC?KRzb(W8b2 zb5e!S^mf58w<Pn-IGp&z#%pVv=$;RZ&Qf(Irg1ok_^pbUv$uwxf1|Elosm5NA4_Xn zdn<g1TSR}qii-thou65Uo<n+h$h`#TFUUWhdo-*<c7Gc@GxN9;sNs3?#s__BS6<bC zzGM0)nq99ja#}q0JM}FzM<qM;JwL6ZJQKN1vS>=d;#3}Y(fE0hTG<wezYm7Li{Vdy zzqSpRa8?n)zXIP&&Pj>qj}6)rJr5;5P;qoxbdkDWIC|=C&ET8iI`a^Jz70K>K||*% zpsjODNO$3|FW7K=cVWS<#?|0l8*bbSz;i$F4A0{P{bWrn%q6|8=6A*H`d66yhZAni z{DrpBE~c-u>pN$ZJ%qBXiG^PvFC_!eY3e>P^49K?ejd^*!}}yy!OUmj;`T^C3F(Mo zShf{r&UgW=<_ld*>z`rR>wwj~`BeCn+i`l0u+GMWUpM;yN985vq&gC2Kb6kwLHxN; zygTt4;_iG?&o`XT8*cNgpiRl8u4Yd1t@zM>%gLo>)Kv@OlNj$IILVGAzH?5l?9LZ# z&!DXQuyf@E<LY*4E*?)#GUq<5O-8<EGvD0WnT1^E8APGzHq-QbQmu4%&aI3L3&Vb@ zH4{2NZN_AhIp;y2G%_p<hpaba_dDS94D>O4jYE5Ads#qRt^e&Q>-HaE+Oj5amNzGL zegG?cS_A9$5@A@KN$V_6W2^Z&nljSY&%hU)8#~uu_@pho-R^SuS8I=891aeKJ{p({ zfZ=^C1LN9uFvxQQGai^Xfr)$P)ZGbBgxA;bdGHC$|GasesQrMm3tTbbui};jW#xyR z>RLpaS7GUJApO^zIJ~^7L3&L*d70q>#w1Pi)*(KCEpy-n1K%xx7v1j%-t|2U&rz`9 z1=U{=z-x{!2Hw#;3_lrot$~8y5BNaFG~^I==f<Z3<Mv+B;u#TmAge3S!B2q3f7Tw> zn^gY}zV=~%!p}nPm~(s9zgEenHLzqGbq3Ga&GR{)IXE4<J?nt>lG4>~rR{kfdTv2i z%FXbVwh@{}c`hJ*96ry9^1M!G)khKb@+_Sn6Fxy(C`FuOHMQlwA)8NoSMA{beBMiF z!+MjG(^mH_8~WvFo#h#|=83~GTu$)pg>O?C_Fg&I{jdkAl3gs#)i(T8?Ne6sr3?JO zfOtF7e}rFvKOg@f{2$=Y#a<T8mbI=#_qm}<%}M1^W;S`ErSym}9dGyyn!`^wkspb- zZ5V3y<g@B^#{WKZT()!i_Ufp-w^BN*y9V2^eAdy8oUQmZd@CS<Ep;2lDB;uQ7;Fya z<f9knOrpM4Ocm+c(Y%D`?yA=J0yqkVPjnviI=GH&I9m2Kd90_zogGRkH0xP`9K^*! zZX1UY30!Uqd11IO8{YCmsK&Q1b>H}CgP;9=(`n!q;obf|;3+wB26<UERdssS=k5<1 ziQIDc%_9SH%>CKs{+e+OoWt^7$%uOQPRSAUOSp%f>!<U-EbjkK_yoAQ@6ENPU%H!y zKA67hdvp7frf(BGOWF?N|LyJ$3*7|}q3@#69AL!1x(~qEu@Gi`LDtS=zM1oqoUDZC z%v{x(17Yns2{ZR*kzQr)J&y->^hj@%JeMtu&Kf&X#^Zjm@suf`%v5~#I)zcvRA-*X zj_~P(wfE7xS^JTe7360Vj(M`7DG6+7jQtpM&e)dkWJAN=UGJOIzP$q>!hBM{+%t2p zq^d5DedHVBfg17l1bx$;bq-rt5B{dDEbPcT(w>KGLjTz`4&^AZ5M2RRO8Bd|2YzhJ zIX_&-Z1UD})+!th3)(%LcGX_kh07?ca{J2NMB94L8o6*pO>A*$$%V-Mn)2Gtd|%bO zLEp5jYM67uEwypKVnb0ZueLYzmL8}xxa$bdo6Q+<4QDJmFXuV0WZ~M<;`&3y4;2$q ztxJ(-rEjOQ_!dA%eH(zW7z<4*e#-MTTm`f##%&9n!eRG7M%?8Ierk{>KkNiE9_Q{J zLQj5I{4GAu(;l2>`jM&$jFH8ME$1fT5q7Q}=U0L2zH+02zUWMr{qD<Wg0H(v40-V~ zGL*Tm^MhHb7nn0UbeDHUmA-#~2%KB{YsS>eTAk|5x30_mTWURj(T0N7d9~OrFqS%J z7{gsS^Xl~+S29HUWh9}!$C!rW9POyv(Jtm)P|J5vnaA9*?#<`h2UT^jv8hY;7#~q@ zH1U>^3pxjk5SFZYi*T&uX6%4x@tx?qQvXFenRRizmm?iSGV9N(2cC-5SiTwzPvzFY zPu@Cgl<d4dlD@n7w4E_>ZVTa6xY+G>zPj{Ge<?8Pt7!Y2-Zh~A*9ZOAx#?4+LB~y^ zC%W4v@xJ=V*(|t8?vyl)5YEUTtyyaX1AQW-qqlQrtn<e)bxVQQa~Zv(^v3|k2Zm>~ z=3WZPYL$zU_7~E0R;PC^*CNB5EZIt2{RunQcjssJ?>`w|32u59^kvqmuBJaa_h+0~ zpYoxR=mU>!;;f)fw$gfDr89|(v6G4=u!m0KfFA{|zSjaA=bz2sP5|x#(F9s)Zi}aM zE{)dixpg8^Y;CK&QtT|@(+$`PS^JoFX6@ts*M^^y7AwZy9(xb1M_SA5b1Ux657}Pb zBRR1MIf3iQgB=gI<W9~YaTU0#Aa6Y3kvMa|bwX=_J+pw-HVG!|Tz$?jrrf@AbHQx~ zJbwjua~OG&cXQe<EEd>HzK0!|y{~Uv-RZ{e3Z25}U-mwGKM$JGXJ>oWfj%#XPGML4 zGtO&q*|?7MH=Gws>YKdS<<{K%7Is)~zNa~aY+{~lQl9oiF7Hp8JLDlJ*q_WZ&n&49 z*<<w_n$0o#4){gkLEv-NvR^rjK5D<h+3F^>A9i6}6dnYQ`^r_*zWS`az3VgfpGGJA zxuJ)Bj`%L;p3?b$COVk8a5K;Msv3S|=%TfHY+aX_=pz0OeV?~fWA(NfE8g*ncu8As zMo_oLp_K8~w|Qr(E_~fz&%GCQI~aRcU%A$L=FWM*^Ng&`jgs?8+wR3#=<uGElTqOG z{+QMR+RD0=@o2@kTtVH8HG5CWBzWGKtg1V>-kw?NIilVvhY0ERj!}Cxyx-}8e}<k{ zDSqR?tO~dEF3#_E<K_Z05x1%Z7%xb3ez=}BG$MWc+sHZa*4U)yNd(@LJ)WMw`{G6V zr!&r2nfUW;z3T=&#GfU`t~^$5dGmPA39)r3^vZ5dbpd{@r*955>5;wYm--WSVVo2e zUi-?eqHXOlw{r%dH2?u}MD6s&sRw3izdEP3b4_l&cc|_jsA`zmWo~Vx%N-l?a@*F5 z4`j0-8LsCl=pWHK;!7y&m7`PE-~zdPbOgC9UP_2>o7>1wig=s0R$(`Q+j=i&4Y*>$ za!H)xnQr^y=4pamPg?HX)>qg$m94?WiuF8rT*E2M3(XhF$;ark3qL|wyf2>p9dj-V ze%GAi8CPL!7d$%~+?UbTD%{jx@VsT|S93AStE}_G^{j=@9bWf_@akdg?rcA1fxG6R zc}^J2!(VJ~{E+v+HmTp}Jq`PX`u&|CU3aUt3Z-8|x_IE55$}j~-wW}87w`aM>Uf~Y zvpg`7G3R|nLpSk2De)@GW{WSx13J?IH_>u!`3d!7pr`rHb2+?FzBZLrK9c<f_fjI) zZ-btt&~YSg;;-3f;8ruHa)U@yd{0iW%W%sBUt#A|b`VZ9QQwaW^}T<HRy|`)JkpzV z$v5%%sha2LnTMG)=10))!$LATA{htoNLJnx8lys2hPph~=Lr0lue5~KOGUdj&`$43 zNtfxXXD!AC3_3ACvp84ki0slkvpg@`w0;SEhg*9OK5jc<x!%kL#WUSD@o6Ysuxp^H z(wra8UqW82So-j|hPdbf&YCkDIkQr_=*NUgr`MCt?yX@<RBMXmhYuzDHSdv`9W?IH zCDOvUkJLN@pLw{c_hAG06<q~5tE}_G^^720djxD2j2_FGnpwAG`*db7t`C!EY@x{e zv(b_4eH3R(e(8)akY8at2j<Eq$D>QYzxe(=JHe|R$(}4|`V&J_J5MV^JgGBF$E#0b zo9krNoFHBDY+49@hSJ5W<y8%`C)xqsUqYVey^KtTm!ipej2r9T4R5CI?q5~cInS@3 z({EO7v|r_hJilG7m$*5r47-NfpD};S=hthzbv~fGU}A}$De3y!Lw#4YN$UR4u?@ax zBR;KxPivZg6KDvu>HRRW4c8O8w10qk`Ah2*cCHw@xp1a0_?sxZ5GOzE1UrGW2)ceW zN&EN*fYafu->rGif$zIE436?WzjmBC9jm(!{956BH26o*Rn#x_NBfzR#H)E4@6odR z&v_r;)En_`TSpjMq;A+iAF-A&XT#k-Abc=qTs(JyXJlhY`&DnIa+9YbE5<hDsQ!p| zr^92rZ}FHrs0okHcwQ!bBaBBk;StDyjRudg=p?VF?xy@Y>TSY<^S2B<oUA`0#1q?P zixT3sZNwc<<%Zz?Vbb-D;BgJB&`aS3Gv7A{>6-5!hzEo84^(eJzioOh4-bfTuOq`a z`>R`<cOv|wJ9MnfI#0UMJyu>hKP+z)mdx2#u9CK0-+mMHS@Y}pP@jKIx^zbAj`u2z zJXwOjmb)pW-?;q={I^NEOxR`WFw#l(m0M2Rk`1kq4bkMB+A5x{cmv-w@37D6Hxqeq z$A%)WU2QSXn<V$IP+tT2KZ&s9zi4x{XcMGgNO}}{lqz3xK9H5|SqFzRA3Nc{ft{4o z6(+zlt$;K8Jl4!O;Xc4%-^}wE%X_C&m-K1rU+yerEiz8JR@jC0C55Fk?JKvMwjKTl zgTL0CPJu7GF!f*aZ$Ib<|Ge3Ld*i!PIlpZyxy>3Qda!*gG&YopEy&vmb$3XoU=AZ! z>Ns!WjDvj(JeWm&oR>fwt3QeFq&J0KroJToXJ5G_ZHw<Xr#V7<3+aJg58ZW;UB8t5 zMp(B*H!}TP^)D;0#BbXqmjd2+fpiysmhjqg?w)~%!nBYs5q4pHKw;?w`^pWWZJpV) zh8CVTr}h{0--~nBn}~4MJD0Ow=3peRmgmBT4!4E+J10bwTS7FMLAq>R&0Zkb2mEzg z<A*n@EPOak<?z2FAAZx^jloCPDL<fV8Da74Re?V_@Gr-g4elg--4i66fG?2ktbspa zqc&><y6pR;OBcw+u1IUu5c;+jpZIaH;tP$;SfF$1U=2Bwx?H<sf_i;;U3+xwE|5*P z*53V0Ae+!tX7!tgZ2H-Tf`08-r&v3UUNS!=nV>qO>@$j0Cp>nx=1ks9qqoZr^K{nQ zXpPpW2@NMIuj-9dPM|aJUU0)n)Ys40RF7>qjWD)TdcIxgbl{7GH}vXh@EmRIw7&qx z^<Vn0=$26XLH`a8g$oIr{Ta9zTTt|lp0bk)WZ-Pt3ZGrd=6)i0IGg)#GPjpK$X*7w z5m$p-imSxU#+BieCmb3-m!0(31{e!F>9Gw7{0{hs;yZc$-@qWLJUx3Jmg9NvLl@Dc zjTyTM`u-?mH$l$?89OWQy9P9nUig8^2mR#Zn`TXrj&M)_^B!r9l(*ygt%h3a%dNS! z_CEAZFV43}s&eYfjqb^K9@h@u;4C*7PwA)^X-uKF#`KTWrGCAnc7pRv&h%ea+H*mg z&b+us;$5BFYrOA4-w>>HG5TW8>XnXNMtUuKjI!F>x%q-_Rd?lItiAM4sUI8dEci3) ze&8J4ma0tB?r&rR{X6h>=V|ANuNY6a_J#KeV;H|R53$$6t^N&isRcKWyl}c;-$zD> zFQ%Ds8DsRnX=ZG=!vOv7hCmOUqW(%hPwKmrvW=LZst|60UdDW3KD@!c6unk_5X|=} zq91e*=1)VJiBnI8Uiv-N73ig$5fw%}t=;In8RvMT=x4H;vss*n8;M&>KjhZXXT>vJ z1$p5#!7dMAogdC$NS?!g1o%oGSw1Ui=pD!noxyoWOQ*@Le*hVhmL2FdhSvf<5ihS~ z9aaDPxxNSV5Fhp?O>#~BMb|fStz973h^OV+x$u~q51myH@=m%md&_kCK|#9a$r+*a zcBH$qd4wAobL>-*uTAnr=X2usY}J7u$5%WS_>sW(@LgSB{L{kx3t#g8pMn2b;C~wA ze-ikA57IxD&)gGjHV0{&0)HdE+WjE#*9U%mkY9`M`raYb$9IEt^&R}4r|xIp`e)<I z`@^@Y?~S1RYJA0C#m}^di4?QXVlT8idze9wqTk@!hg>${<RiT6)k0nv?#qTf>I~b% z$OcBZv3?Xr34a-T7=5on-$7D&o(=D04<p>e&h^vzUl#X&CwvmzzOFq?^h?;o$Ogvk z8)O@!vo<5sc4H6Yh3sMc#Lo6GvVl>Zc^W&ynf5TTAYb+{S>C_N9)|ZSyppQA_SnO$ zmQ0q+V$JMK8$P_=l06J^cvI<bIp<^H8G@Tk_^Y@TkJ)n057)7fJlVqt2e<D!oOab- z*oDg|taAIx&7*DE!wf_=FW(D$m|oD^*~9pyRqbX^S)6~h#=zOa)L2^>zkE$9y9V2Z zn&xL)W1+{Q<>+3xMbKpw&Lb?RaM&%&h`T(&&JObAhn-+1;+!qaT<KNFV?8f#AH0v^ zSFB-t?Dqg}5kA0&oomPWOKERkx$!|?oGr{a@D1C-ln^)lOWVSn)6lxy*}}}JU8;S6 zY+=f?*&od_`=buo&23?LZfefwf6JQEk{yhrTc+(wOLj1_eUUtPhdN~wBN_8H;aJEH zrcyeW*W9M&JL0R59gObKi0;7-#?7PH?>Tc1+&0E)4KA0s@?CnSUkyyA9Sl05>3`S` zMznlD>BUWUFjj}Nb}&(7&z|gHbjBr{y{}^jqyB`Q>$~$a`}d!WuLd_~2c!4Vqx5%g z>|id<ux~k?^}8iInDa8=P6RH~4yG0DB1ODi*};5Z&aSnuX|jX4i!|B6XrJKhVC?%$ z_DtN}L3EE~#2=6mxWtp#ao`?!0-26mgj*Wql@cz&$qq*Q)36<kV8YJT=lqeB+gGjv z+;paL#cu3ic&_uVvx6B0-8}RMt9R|%4yFb=h26*%tiQNCT!Q|F^Zp%nFtSAm&H-7E zc;9(9b}(u`?83MxTnvu;$}Ok;f0rH1p*&;N-dgmC86Ay%b}9V52RoPx81I(sV7yR$ z<*JXl(~=#`PqBlEAqRA(#J;gmb^%%obS|(vJDA_rHMfIdQ=Z2E7`0ckYde^lr<r58 z>Kg9M-HodNW-@L~3ozM1n)Ac;tb0oHq-8r8*<kI-4kqS_Kdl{1R{5^&VAMyaKca7K zQh&lOjFZB`YhSrFw5`2m*bZjP*RX?G7P5nJa(N)nN{uaP@N6Xf9{ZI%E8YGqb}P8e zFEMXkMvfAe8-!DQCzp{f*v-$d_kGU#3OlE=LXJ?Jd`q|md!UD?50r*#E>*PJ^K z+_QGUv$Mc`1#PXt-Sj+XKY#pcE|>Bu>-=y%weY#KgLy23SND*OMN4)tJfCZ32h%## z@30+AUMSt!!JLjA%;v9Q2U8uggVA#uze4Z#>KPBV_B^jBfu=3lL(GMq6QScM+{9JT z6t{*kl^a5u;(Ky}U9k(NvV(B$Iq<(iwgq83m~VYaJDAxa85ap;v}EPaLSwYIb})LT zE?uS%b})LjZ0u8+pJ6+gvDm?Ee3A21+`5(cI4^Jmm<x($Ixiz#@N1!|;G7>Wvy?pd z4B&uW*uk_7r8_&Awjn#1{Y4kgt|9Fi^C)wwrEx!*abHefDsWR@LAHNIw-B6F*7@Oj zMv$)aHQB+m=A2m16?F!FR<L(^gmk6p40$zpyF22CN_N4!EuC#+-?z!}=TdNAPaAu3 zf)CpzETmoWqs~m93i0C)gLIu6jt!;H4bmmcmW1Z+Or_Hw*}#lNmv%NV-LZiYAMK3| z%r)4+Y~6zm%w2}3^*jmNS<yy3T7y1P)BK#^MrbpL!<__fz^lk+{1q=)r?7J)pqmS4 z`hvfSvMX`&!%nahNQ>^q2Ilj?_N05r2If=Qp76ZG*>K1P23t(_uFY*=RPW_`VFM%m zsU;hjOF}j<rPL!^oXU_5%(<q`=6Em<z|GEoX9J_PdGVL9f$0(Ai7)h=JY)m&PvTDY z9U0=OPfWT!w?9hh!Sk(;f^_lVeIeVJ4XT%C1+pRPBz}MgWCQa?$OguKN2<vNMsh0b z!m>tT$(w!Us%YEwxjN{x<`*9kNYmmz(wz;=uM|d>+=DM080j`)8yM*^VV9}DNFUi( zZUt>iHXLZ47tPtF4b1Ss24=FMhkXwEWAR4teB=_*AP8SXST-;h;A@}YWM$X}=FN}| z%t6dS*}X`=(t0U-7}>zQu5-xX`P?_DOExgly__zscfX})g<V)zQds)ZzH)16+u?r* z_-nl>3j9L+OdFVdY+&XEHZX3zxf6Q$HP{XZHZZpn*Bs8Yfr(RJ*ycm}QrKncNz!}v zl}pmL&L{HVIoW)4E|1jfO!F6AtLn<T%rv(3MLpZrb_{GjB0T$kRdxe`&i;YUfCIi* zDcgb|{5)allhP}~w2%%Fc40k0Vd(<<$_=4y(V}%gi(T2ja7O}m5jUsih5CDIh$epx z(PWm=S^G5~W!EyDcuV#$vV)P_GIlWd*DD^-@>;^;*RUOo%e#U+J!`%w!}jH5*>O|m zqM+;r_<Ck6oq+zCXU5a$r)*(}ALndgh6wjyjTslz?ZfBVn_p?<(%#v>NFJyj*-D&1 zJ+97S0X{>O27ZGB|JWe?n7|)s(n}hKYL10$W+v(^JFuBKoV;j;%?x|`oPz?JnYM&w zGqXQ%PG63xe~g9fV4U5?h58m4xO5~<_92Iw{(h^WyUy%@)iZ!Lf)8xWxzohdkxQDn zx14rl)6x-NHZ8jUA#68tJG783i*Ut87urwIJq*T{WxtRui{90A?R^@0X8sR_`N=Nk zlpOY=yRliprlnAIi0<oy=kN8Qy51-3o`pXhdKUgpkRE;(zUK4BmzSHf-`a-PgSuW* zUC`<k`2lTS4$@Wz{tNh`r|e+lKZD;0|14si3EL0c2wjx_xXJ}Q_dCLwHc7m@pW_8< z(rJuM_#9a_Ng8u!la$Yy&O{a~xkb1#+<4q5+yGq9*KD5pP#NHNr`p6WNA@~5K@(@M z!~241dmWx%r0sQh4>{fUA5b>aUT57pYp?Ta$X;g#aE@NzSD9p!z0PmwpF2l9M?6hm z-8!9VuQU4%p2^|L-=r@sxFO_)(*-Mg9np;W4)0leokv3UI<#->#vfFFGwgNd3b#Oq zH2Y`5nf5xTihdz`os&&`XM3INRac-xAE$nL(lc7N*Qup%D{<AhZMeDgLvD5uS6bK= zlNXK)c2WT2{BZsV@|+AU1mBkIb#zv^xAr=BvF3}1Te-f6>~&-ZBiXC|?#^E4FWgt^ z=7H>B+&ukLC|!0iO4mHau00L^SJGWs*}=4AuQQPG)qHzTu=wln6_*{1{I&Qo{I`Sn zn!uMGjPhj%W1az>!QG442n-1BUW``p9JIKqZY=Y#C+}z+&imLNc5S_r^Xv0U@XPJD zt@23McdUBzZZ`9^?gYUn|B}-C2nEpRc=*$=u4)*`ovodY(*7%2D?M}&aNW!1*Y~KH zUq2$bFcnYe{p*`+y$ah#@3Q%+p0qQhW}(*DI^B2W+S%T9aSB_?x>l+q)Rw8A_FNmt z<3jF?txJ^8Z`-9}ep~Qp=at-+p9`NJj7&-7foEcP{ZQmsC%&(CGxZgKo8I4GeY{P3 zZsdQV@N>8cPtl-zng$j>-8*dXW3El;&wDMr)6cq4SZdx`=XpAJ8Vp!HzkbV)_}&@s zbI9h4OUcq{<AE!J9tT4Y(M#~VqDx{IbXniU(xr|$S){)4tv-!GOLS46dEXhG=gw3X zv|K|OwbzlcR$mXIk9zmMNc|*i$J_R`C~tnf=-|df<Nh4wJ8CT0pNWQ98uzNIhLSdm zQ-$cA?#@5#CJObOud6q<otLPJ`U%Da_+{WSBC#-aUB$;AOn?><aLBFVdue6!>-PsI z(StGBlpYKCPk6N#epO9;qHzf0rti$%1#Y?EmPkB{UNp9Dc;bY5^apebeJAq7dfvCW zlkd&xKAAiFnEmA#^G&aBgD3Bm=geo0X?%nOGS=Xr@e`fQ_>w+{bm5v`!S~(3Gq=Wv z&nGl+H;<vK_}TH0@D^Wp1b4^VVVsL<>^NRc+4iC-I2M3kA$L2$(|0~ZTkX7ZPxqw` zVZM&2`EhD|$z3VU(@1eu-Mo^MYIC2SSDRZqtJZ@~i5locUaV$*$}3}D*T8?JyhqI# z9ss?BLw9iEU9435S_7Zz4s1`{XFN;RIkM>0Jr5dy2kJ^rQ7|ui!taBQTAUIu2oAjy z+laHwyBLB`K#K`Accskt><rJ(OAT4gJm8*F(QYDnnrFhHwEV98MDnhD?j~l*pU}X( zt)G~<E1$CY?dgM;oSBcF-KHnFw&$K>@n;O2v%yn+Q6IQ>(BRuCgl~roeCIJg9lpR7 z3eRwV%0l_@9Nj(3*lMdE-N9M9qnB*zhw{;}b0$EGrhd*$_fzSnTykcL`$9G)h$rb= zKk!u_dMD<m1`r-VU!1(_oj1Q;eG;AnXj5~n2W=$9$H`|Kh9h4Of^N|Fwn^YMnK}*4 z4E^RoKlAM|!+Y(?6MZ9zi)s_}^%&}$Z2B?F@<w8Qy?7@ZJfLezJR@EaJylM4Tp!RC z-960*4>M;q54hiX(}Z%y+SDo9%uU@)n&zt77H!qG>Qejd`!&(O5A~H9+@;Uxdu%f` z-iAI!rO3lF<Y7e>-ys$6+Hp3tDs7^bTN^~D72JWQ`$&=TIYpW~!8&vhYY*#1dTof2 zFWihgNzSb0yNoH_XQj3!4_7kxG~RBkM+bdWzWRsl#V-4&?;kt<imHDq!&rHxv+`dI z>M^vUp25UR;IQ$yiMTSH=JphPeG9H5I209Y{3g`N=EpbpqVXPl$&XVf5%)^5D=1r+ zS~-J$cb`+Ib>|4uId6J*IcbXbBi>j(mpf?3)G;{=o!)&0>B2*IWO&>e);?LmdyN{u zn^XF}+kyLy(H(dOKFarWedfN_McKMj5A>@@Nk7R&hUg3-`t*-C#NZXxss5`D%?<78 zR0g?d>e7AkbT225@_(cM$~%^LBry-!$r+~!uS-1z95#wM!Z*^TVnYM44)<=PhjGu# zz+G^{8QrFValcb{kbEo|O1T31AUUSFJp>=QPjYR8#rJH<e1k9huAJv-Q|;)E5z#0+ zqaERnj$Me&mg$G=xO6|I_SUbP``E^q`UUq2^`R@K`|uL+XsK{KtKkLY`jh18Tu*rX z;bYHh+`%)U+CJFfozC|e=5PE)UU~hfL^(2pZ>@5-Ap4gOWos7Oa@TrEsg_`MKbl~< zLt~GyuHMoRY|$R-#qK;^uV9TXse8O@bU!5bco$dIwK31@WJ}amJdooTztQj#=h)^> zorJYP5s!E!Jktp79*poFdRL7R@1c)j4Ow2#evcJ(D}FJ4sa6}D(#Dfky`J~F@hfrb z8f?1q!mcAQ9mx}H1$nb6?|g;j1V0fsf_i!aJ1A7wHp1DIT?=0cSNG0o68wZq*oE75 zb*kQd;U>^-tXOyB@E*6$*fq!DWp|hO4)4r{f3jcPT(mfK&xKkiX4G~r$>M%Do;8(M zHFP|a`vb4JrMA^I3pTX!^6QRa3?(z#mgs&j?m924YF9mPaekh8&&ZDF(Hc)=Q#=?? zJx}c%jHmYCnPZrTgmkVM?MQDHr!Nk!ma*81lOJ}1uOUrv3d<jWE5f<5qKBS2{DJ-a z0G{tEu4jVW*ZOjjxZW3>c>(v@by=_>LZ4adOrP7)XU<qQ86Kd2jt6*jwnrWiPW#F& zr|k%LJxV^iyUVA)&fX81tNYy+F&`zz?OktGbzO)@OSG3ivq8@f#4oz1{u=u3)(hP; ze<gA0FrL-`)s>`v($9IL@xx058`S>_b;!O<a(A@u`6le{8FkOvr~1h0#4KQ{8qN-t z<^A7u*(ZbxFonQ;GlYxoTIb%3G;RgNPY%_g_kdmdtn;>gPxqYiy&8Da-E}J7yom#F z=Qbh-oSRI#3x|EdhU2>n3w8o-6wbAgNk84K*&6zF2=(Vs(%OdN`NR(h`lmJX`Vf6F z)hmo>?&)6ilDAS>B`0yG$C(XT$kKZ$GlaH#;@0AJhwJY0CNfIOcYYXl{RViAalf3l zcCfb9?`S+i-{QVk-!RvExTW#>nO$b^9D;iW4{clf4{#SxNtXOg=kVUe^_-7zPx_e+ zs%IAYhbzpQ!u*T!p4}$#W0qG{_X=?BOy0b<q~#~LE1mns3!l$O*LM{7-caFF8R@!P zeFf>iCp|`6q9r!tIkj`pr@#r>)}Zrs@$K4@;q|f;iIh%gM%&H-ZO>?dwyU7Ab730o zDlFJ#!MMl|JC#`&)Tgju!}Tcc&X;;4$8^4Pv-%aBEgeQ0a(<KUj1~QQz(eNlo*>?x z_%y)>@ovP?`_WfsnS0!?CA`DKUcQufNmwuZJjQekW19cE8PgeUZm#v)Fs2>a)Sjs| zB6w!4v6YUbdy;vd*VNaZx^>^UaFZPN!0ioiiy(8d0=~_GuG!R+j~~Zxt#PJKzW-OK zae9a6-w~d}aAt;_nOXlY%4>|o`-cT%f?lynd>(dTnkg)P-B)fMZEKEj2mTS0uV0+H zcc#utcxG1;ulG7&2VYv%Fr&>}=z7P74*Ad(I%+)Fchwz0zt<wWA|YLb{nV!QXx(AA zg?QM7^ZwJ}@qfiGh(668w>Z^-^Ng$#pB4JdhA87Jo;(=7(0kVG=^Fg~+B7h9d=sKg z!&JuF&Clb2%?j2Mc#`i3HLWG>p+~Dg&$t5mETlb+@sbQ*X%k74?t`9x9QR3WinBhV zBh_`K{#FUA$3$p9PFT;&IeyO3dofy{eglr~F61u6?+@ZeA1bM8r!z(#?ZE5n*!v=f z6Fj5i+(~zn=W`x**BADV@u#WN$-Wq2A9$a>YyXa|Qla)o+MDR^9<7<@(YNDGpDnJR zp_e#X3<_wWvwU!iK+mkMUR4xZyTVy2&waaYUL3X;^I|J4?<+T#ftQ@&?l&VZq<f5^ z585A<;7d>8IaYd2?=3!I9%Pk5>x}z^wSNe&dGj{2SNIBU)rYp6{IFA950EBaLN_*Y zQF^qIi|Ela+T3F0BJ=k^aF%>M96geI_BX99b@SKWHT<z;ScbgH#8qwWE4PHUgLSwe zs&UBBDG&K8<HbCVAfI%1kM6`@kFPuN^-VY3L9Fi(y-zr-i=MNQZ?cvwM)pUHJYe1# zd7%69*8r>g@K<j~-Y4uDeXPd5SaWoo-n%c<y9^Oe^9+41m}ktL+uERWBsddF--(Zo z5c8_qu;<TtQuy#|b~nDhL&dp^_OIrf+r?FN*jUnT^Zn}z^hxtB4DD*J9uEKc;=f?O zlevGL`gfl3vZr5$@8Ku5uouB8ts`k=pP&=sPrz0F!=@`Q?ADULHh?W5Zv^F?udtlp zyW?WOZNzQExjL3pex>TrSq`|my-Sk$AzZ@Fm2tl6+*hth{R#H3>=DxYSMyDB&Pv?= zb^X`azb*~-uaegqPwij*(p~RgGskc><L8{Cnen$a(ch&zxGKsl!^saj!IcN~DJ=M{ zxOG9A;^F=4Q5pN!BlmLus{T11cwsMiKsfCyH<h;C{?&~8@FzBQdRuy*-M`+>d<^ej zyAqc!DcvGhdq!l^m)XCrf4lkqwMKgs)?e)dMz9CaUNUq4%6F?;+`sb9MY?RYa7ldm z{p+_vb!h);+Lyd*VgEYlQ_igdx0LzsTu;(mIP42H9N%47upM#PIM+r?``3lg@5}68 zCxz%+&D@J>?(Jg#x{W!t9yjqz;GNm0?vz)W^TYXN|NZ6muQP=^Yx=JCud~VjkL+Iq z9MG@Zt^Lm8{FAhX2J%cYzl+{+2(3}!Gr3<&&qCIO*QN2$*EuJ<cIOLr1WqvW!%k`Q z{%Pw|Sg_%`6nA^qKEdAg7I1QV*PboxUB9n<`mDLFz3X>FaqV4iP@kA<9SL7Y*p1Qe zgS{x<2->8w+KXzh;P#^X)0WPGbpExcz34`CYwblp2==1ysh!YXRDA4oZghlA;@PkZ z^PR%ty?x~-(YE%YoT(hKXfO7n7l!tto#?mrqS26Ep}lC?XY?oJZXz6Z;k^HJcs;mi zFIv5uy=V#@*X>0S8D=lanM$+0sP>;)7pB7t+Kah$A-or5|GFu$&B~l)hOcqo0xoVZ zdL^*oy{Pt|(n+)z)xK1F(Z6VJ2Yb;K;K+W@%meL3_0EmrnR`*~EnC`)-WTjeS5c>% zBif5fcDTLh-J!i`74>WV(O&d4v*&Eui#l4I6wo4bFFK6$3d;NCO}fXxz0f_DBRlq$ zE2r%py8Ez%Z-afIv&=cQ_qel6_ILIylk=G#ZEM-D7P|e<S@ct7{-HfQa!C5eXwi=S z&l&jI!`{a}#OW2iweB&0cD08MuX`o`Lihg)uHtiBPJY;_t}@d0W)JI!_OQISVD_+f z-Z$-G!!l0cOkCC0zH*aj+wEZ^8i!yH>-5Tgf3y2m?O(NT)&AA(Tk8mG-|Aqm{%F_x z*0+JxzV(gJzO}E$yIAwt?pyU9^q1YY)(D@BeJd1hXzO{8PsiVnXaAA?%>9@56=U}> z%=7A_Lu>2Gb8G9m;aB1N-qR^B`Ly=w4f<}DM_jfX3b)C&b?KbTd@GDN=f?LHcdM!^ zKAQTtJ5qJd>|I+oE2#Gugnt>-9Z_8gTYogDqxc2Ns{FB(=dOQO$Glawb*d+Nyv6SU z;;O3~ap4(NT{Ykt)W_c4;I!ow_UPqykM89yN=2&p&L4aCo)y?yl*yKmZ@No{Vek2# zWTF434Y^OxsTG~tDLwg9Y(w;patYtS#a0{`ecM;x&Gt&?)q2H0P5H^$JZrxhf8F{x z_7`6AxzskTd9<gtWH(^=fbT_>^}8cA#lORRH=X<cc;tZ{Qm75iC|>rGi&EIt)Z070 z=a@6WC}$PCZ^E4#b5oo{GOlLa9`~U+<M_D7BG>co^9OP7D1DFis;WD2U{zgL{MNlr zsLvUEV*MkDr|YVdPn++bReMh}wr)(Fzc{6FoZ5<Y20KqZmrp*knENy5Z}d3d@Dkj; zom{sel6-E1kM2@%z!=?eSeS<$l*vOrE4`d`r!}<my-(oZl7=F$MBk>)iTHX(TB18+ zbHp>|`670Xv8v(qv5Km?^MAxQq)KT=&r+&+o=kn(mz`+%^~?rrF<)MaonTgSM(v70 zZ>EZ{mB3!6olje>yff>t&np!CsN_qjX=7hVm5*MWb$v-=hpCUgkg6_O$@Awq^?vTz zd{g(<`UrL|vC>=W2U9jy@;E$weFJtQ*f~};jH-Ugz^mM}qh3hq`$<_I_dc#=tmqGC zqK|jShB88%`i_?Dl&<F+#wWF(Rr?HQwqBh5<kO2&os(Jh<^IfC*;RUe<pwNv>N@0A zwHuZ9Qa;Zs3U%(cwq|i^Mi;$nQweR_)fJLoguSC+MkQX#dav^>hTqh_cx7tz1#{m` z419T3^0@GgmRwvvs^q2ARB)|Mu9S`CCZ&6cT0@KK#L7DLL;ZO|dDsfc)?0R9Q@YGf zl|4N>1rOzn%Uhfp#~Ii-?2<;cnVl-Zjl+!xW&*AhH?iOB)Fj+wToTwMu*|i(A&J?k z;^b^=E5MkR(ZN69^lNOi{?7jazrhWjXTuvoWKeORzlz`B<2s-DdC0qsANpQd!#BL= z@)LQB^Es!({%>*qsFK<Fac_3V0m<3<@Nzq^_~v~0DmtiK_C!rT**|uNm$474D=x#9 ztMsna$dbEKqp+7Msl6*Tt_Itta>gjHs%|d4-a3K2NaC;^%PpCo$}6_^jvcXela0)M zpEiEj9eWztCfZgk?&A><t{*Egh|288=6C+j>c`ZKeq=*;Bah(mf@D>@Taq>T+0Zik zVSh$-wKrS6+f`V3%tKE@E`MC$vqv}a?SVg@Oy%dHq*hlyP(Bd_^8W0H%O@do<S#^U z$R7Y72yQk)t-5+?c`dXReEESkJ(*|yNeF4vUVH0T!vTtS?_mAafj=H0uk=9(75UEv z{`!M#d=ZjE=^F!oNGBW5M(8NLBJd|*Xr}o3z@OL6#>e-xei6!<@)LcnUwNeUd-n_C zM+N=>>yJCu`nAVdf89{)Pr@Kx^{i$Al|P}_`X$4yziou|=YGTb*{54S_lzLD#QGh_ z1aSsL^-Mj}`pIuuf5o|hf4=oce%t!hrPd#Gf%SV|X#LrNUlI6Q1Aoy(n?K|d>#w_% z#`yJ~#Qq)sCVWWlEyb^{eyDuhWfpD;e)WAl%12#p{jK=Iv*#7oe-7X9$CWm|9>4kl zzkKU8_z(HzwKMS_jFgZ1q0L`Z5tLtG{gOMZKjC5PFMZVdgO*u;{Nq9X8tVB?Zh8B) zs_%gEt$)Uc-?se)WM;?8yT51slEA+y@R#BX-$@@?KLMjFp7#ai!EYnJ;zM>=e`Mf4 zK&sN02mW(`-`@9WKf8PizVgche_r6P3-X6VY(5~n{Wb347Zi>$@8{r{h4$CjIGvJm z`h7Be#}_6r-Td=+AWBGMW54bErAsKq{Csa))K!$>7xOX!&)=zf`nWF|5A=4tuZVs- z-si6|%4(tC;)D2mZCFqZm^Dt1nE!NrB(<{W3hx~zC<ybrsd4&|UMa8!&BjJ%sYl(! z7o(wm@w|f7QI8$g9L29x{Cq6GyxQM@-4`DT-q7E|zoIzslz(yP+Z|tgN<s6heILSn z@v(`U{HAzuQ`|I7Ydil8#?$xrnC9kpdyg$U9-6#=qH_jlqX1i~AOlWOQDB()pYDD1 zt|3f`U(#>p{TCvfJg?Y$sr*xun(apnwVMC&=rR3^QqwTS_-6~+Xu^$+?|*w;=hqHw z?7YsPSv*SB+MgW}7lVHZ@{KnyJu;1*L*d3&W_&U`+f>~2LhXlt!}gHR64Cru3V$@? z?{ey$PL*<v0jz?-&+xA$wo6i*N~zfc|K1p2ylej5(FlkAp@ZN;{Hv+g2(^PB{L2&G zp^Z_VP3rea<FG>-Ujx;@Ef&8%|K{Rj%d205A=X>|eRIyS-uX4q_HUMdKY0qp_USbI zE1&%6*qZ8RiEp<2`|OKD%e`{tTYi1^{h_6v$#04mH^m#DeGPcUGk=zU8(Tq2Lomy~ zjf1~EEX}Ra#%R?umVb9NzJK6TI~s@Wh-B8YbG)&$fU0mi8jlb0Oy^6Qc&YI_2Sp1z z6&-wt=XFkW>DsM(kGwYFn%cHIw0$`4d5577?E2^byMJgMO}{Tuxt7Yk`bDC#taz(z zj39FM%iaHg12g;YW%NJ)e^~$bib#6^(mE@b{^heFK@ZLR<>%$LD>@{)zhSjbg>4Q> z|2njd9I)SkMIFtrLkqw5MX{m|yU8!=UQ|?+{WX7Cd-%mOey#LNcM`?oKlIzFp?ySe zNWPc94oz?!iVBMuO8r_GXC>__-GQg`_lDdP+2@SMmEg9)lOym4;m#a)a-V)jb2iG< zPijsxkY%LHm9QsLJdeFi6%weNJxwigQLYAgp!kU+hL0PL?w{%3aPhU*U3T?V-o;m4 zboIo`uDVn>UN_}}t0rDB`Rc1K_Pl8qU*}zQwNk(Suf=)C{w?$Ozw<7WB3~_T7TxgV z)4baU^lq9=dkXEldH2;Q+`QD+=kJ35U00fubhoju&)@$Zdhdy=oAUP^f7|tA)JY<! z4WEz>4^rCLKEubJ_>FHU{~Ke^=rd^0z+?OLQ|#;ic2fTTcm4nRMBPmdU!UIp@63zc zka4fGT9iZkU_a3$XZ94@cXDX2iMkuWuTSs)<?r2)cc-it^_qRa-#a1pKQ!U%)BE4U z-~U6&yHmHqTO^bDrS+44554y!wVU$)@0Q>Hr||dJJbugG!|_{I#_?PHtDL{B;`wRJ zFlEfI!N$Npj0fdwY>GFIhl2V=Vp*46HN}hGLpZkP82!gu)n?)O+27w^u`Iq>;6;l# z5Xzc-w#^?AC(@d~?0DHMlHwISw~b$Gp6$d((@Ok0g=1dyF=b5QahcaDFMh*|g1wt^ z@$V?;#ruIxe5%5+_>fkFrzxBrzgIBdJ)Ur`mmPZrzqKOK$%4O;=eJ(;Odj3DzrT@S z)>IC*M#XP_j2^`=0onL1pQ>~5e+XnwE^B^Xe4J{Z%V#XSj`3a!|KJ?LMe*YV|D)>& zC*nU-dc}Og-Qx#yI2K><JHkEV&v5n;|EXYl$4^xwx2v9H{5>`Dv%e4?5a*e$7r(29 z+(Ge=AYc6M1E_gOya#lP-#eOcar~dqGk$*$AV<W{QV$<cr$)vniee8c{0%SqsTwX< zMcJ_z_|FmidII~IKhbAD^Y<}nz-+>6ttZdfF(v1U3R$4Ezy6{c%|g~&lU(GId3iv! zsuvlxQj4HWwg{AwZCVCqu!9j%nqbKJwsM4s$k;4rnk(~gvz+~e$$m<s^c&{?CqxeT zQ*$WOWu*Z%%ltnfs0f6$t%w|!FeXj#fM%1Q9TRD@V={I=;HVY~n6#700O(j#U>N_g zNUJujl*G4|yw*y|j<x6iz>;{De<Ojsr)V-B_eFd!Z>R>emB|<dqz0?aF<GQ#`)32( z=D#!(4)%X$>RHUcq4A>x_A`G5;kL1MgJGC5->)u#)!TEl>iG|w2IALHqyLDKN9Ava zBmKuk{84^>4EFK=ph$_IpR33UMaKF0-57cQ2}Q>H`F#|5QjrOM{xOO?rAVotzW_A- z8bv1h`No>&X+<Xa`NLG(Gm1?1z1&jTmNTr?C<!s0{0^~J@o!Q?!7(7^6<ke^{DO64 zL<%m4CeebAX)9K63+QJR{757#Sj2y;f>+7SE?B|jZC!9a@HquKP1vvCEv9X5L02Zr z{snQGKA_;&gbytEIZfvkTtlfg1?N$!ZNZ7u)2`qpT5MmiKlIHn=t#Ij!GlP<f`U`2 zvtz+als%~6pX3%6d>c$U6`VyqMFpop=YtFKfjp$(UQ#+2OriBe!8Tg#Qg9?4>RRv? zDcuTw3ru&fW6VF!zfS!;k{Rk1oJ31CenAOdtzU31-WK0Gs57urTlw$DUIa34xQ3}V zCIRXdo<Wvh7n@I{%rERu^L~9yLqEkYyh_8-U<yt33s0hR{`%OTsA6i=%N6S>9FRR% z+$<4e<H0-!y&q>C25kzqz_il~+R|aK;AjZs7xVz(NWs4dM++i^V+A*nnN{$GM2*)e zPt7gvL6Sd;3W^NVEfxb8m62f>vr|$)Mt1oc0Sk1$1G?V=ErWKE^Gr<-IiSdS7HG<~ zWC@I-6TQg!3Ld<?6$Q>WlC0DD4144eQ~1Brg&%1u{76&bM@`{7)Y_whJ*0pEj69~Y zOg(v>BTzJQuy3k6msS$$6$z>@Q6^*#_Eih%U~`BGcQNQ3;tQXyZ5SZl@V$bvar@+> z+hty)tEtg5W1uWU{VcDwn&_-2v3_>Mw7H0c#H7m<*LWo+U+sckr|IgcCDU7g8Cvc& zneKp%0x})UnApN!o=ly84R1OE-9$xSl|U-HGl2|2I&GH}upNCejqBd>!^M;cIvQs% zzj8-Ke%H~9spzYARAqP3(azt7WBg@NGxEQ6ZIF=WHo`ADZVSTQF1-E{&;M;y@ZFeb zzl&<IvaIz2X@<4nDw#j}HMZ`0)y<M%qh9Cr%yNIV%{!j~HGLzYsomE@?Y?2cUFI<D z{WqiH@-DxI75z0f{8J>Q|CSAFCiriga5vgpYntdjoaX&^qN1qRxrd6rlV$q6nzp-K zE|K<5mckZ~ceDPibS-xNpADdydH%YrCR+T(gw4$J-^&tC-L;bXwOLwXdvv?l^Sj2? zhGzELRM%R4%Z_20@3o!*$f57SC;qR^toM(A;Y1%BO&ALQ+9&~s#r*qY1(#B`+%I4; z^UCuIj)QvT<%o`+YbfV`&o)EtH0D=oNjluf!tbd`{f=Omz9-!M(O%E<)ZJMsBluBD ztz4KcGfQQ<ka##{W~s~xIIrhPS-{<@QsZzFaDL^>=~B0<)I}t!)U7Ht8|U@Bn`D21 zN>$@*Te6k3_$^SWd&p3!1uFFd&g;pG!JdDIO39?wwsmy6)Ez3dfee+pL#47w@Omah z&wEr#2Dr=d{mRSJrS4Iw!*Qa;Jt_q)dYuYOMfw@pD0UqumaRMqe(G(+Za*V-Z=zIh zBYOK8aeEO^<RgCjn|NnNvyTzM{f!8Int0#Y0KH4=NBW~9-{HR`ay_ZN$=VX6PD!Uu zBsET>f^ABzAhl?x)D@)m4^q?hCTmG;){@uxWOzQZ+Abt>C}73M>d->6+F(yQJ$c=P z?LzXp>4n$%CldG7wgzb<wub6Z4b`C<9uC#;u&trj?_rS07E^<apkrX^SFUCuu;krh zs``{vOWrM}iU)zT<hAiDvmAN<ZmRtO@qQYkN&@;tw)qRFv;TKV^O=MFuOd*az=Z^+ zC~y{mZ3K=ICDst=sd8`m{Z|kl-wKFo0yikIgup@t77?f=z_4|s#II<g`2dY1^@+^X zq}po+=k=-=mrXIENH*ZT4VPU8buAgD7_rwH_O)b~V#M8a#m(5*_-Di|mtAkfTR!94 zcO{9%RMf1&zFSE>D>F5jpg=P?uU9L&7<s@TCZqH!7~QXw*40N6GswA~phffngXm8b zH`C!kgXqgPA11Q#W07zJ%yf9jAR1ZV4J?L=M^Eu051Y2m2BPmM{{EGTWZ$WzwgG`= zh$fei+APKMdL0b1kw=aAl<Hq%a9>POi|eCiC-W}~T3jDByUafVX^Fbb#C89<CF-)6 zWcYQ&yFbDhMSg4YkJ&~6@jk6*ed3Sq2F#!WDvf+(T9)bl1k-YRr0TIoXnbT^_Dha6 zH2TQY<Bui}3jNK-##s9N&9v!{wJmNjdB=$(Wzg1b%GFnR5#KC7bhj(BByy;U={*5E zR8P>T?e3vjl5dMa$9DHnvphYaxM}z>6F-WQw!4R!C2KVC!G|-AB8QuruO{AiA}qa- ziklI<ZzZYsWu_+e3P>|Juh%QI89CQfrxzKj>55<3f%ow&qURb!AEqIT=(z^54;43v z+IV~F9nf9lFu@?|kM(-}1g?(UVJg;}5rd2{`F*<LJ50s>DQGLc!&H2kDteeH8ChgX z`eO!2Y!K7V-5=XA7P&KPE|nCV0~>n<Kc-E;;BfLH-e4&JWKSl00bLoqj%FkOW$GD7 zaIl#ql_oxpxYz4AL{}tXmVLdnvDx%JM#%O(5!WCs1k|FKh`$KLL3R+~jxHwt7;&%H zdFuRGrmAtUgJrTa(p8;hs(KsHKA))3vrN%EFzvIgDL$RJ*9+%GZZ}ow)e&tM{mP~3 zs%|$`)u^bc>UL9A9q|G0Yb@_Daes`h*v1Md?e*#lQ6j%I73*D;2Ta9(Pgnd)Q}MZq zo2l?iQ_)SthnOjLkFA(x_}fDHNfXt}EOSjoz3H~4+moiEJJS_e$UhMGhHli@z8crN zFSVxF_b6s3;;W{ZUt(K-%~UV!>{MKBTOV_5+11yv{>61h1Dg$9$&B|;@bwbSJX7Hg zhX<(|zaGQ~Y!aWGXx1Ztbe}HJiI_(7WHmqK>JrZ%;p;%hA3LCnY8+v5k%dQ3VMlec zFP-@&U<Vh&*8V9b_fF#8(C!e!KhxLSI|(CN7Bgt3N2Ce?zr;3wR?z$a)BIVc3V)1k z{A^!`L$2|&eVr1y#?SF}SoB7^@o$-u$I;61KJ(C@<`2TE?zoZsO#-2#uk!p!zD`gt z1_T79|M(C3daY;~alf)1V`fH5sUUa{a2CafnxXhmGZcT*j6T0Hd0Hz<sq<)b;Ya*Z zDDi@A^942Zg0EMYN=%#ArQ3YLw7DhS=8MhRe6d-ZE1QvJr6Y?s^h)G}zrok5QR7Vg zZ>H<tVCru}-1cc>v-&qStN*Xf`t(=VCvWIT)(n4gM6X<}GJ`r7hP5=C91+d>r|X{_ z(Msfxw!=C(BCc}7Iyqu_s*m9*n>Ut{mWyosQsM)rQfTnmhzA<&LHHRGkDh#Wf5k=C zw`|-+w<@Y#zs)@X<QV9OkW~Ja5xpN~rzBUH1xR0MkiMC?CCZfn(sn9bX^_5`T+5AD zM#9{9WhCH6Z|Dq!u0J)RH_t3t7Q^+HEK^Mj&!t<K+Kenyn~`N|GqTvc6eTTLZ2X_Z z2QE*OWvU^|IGVF$nQF*#sf`OKQRx;%MHU-fLlm<7O8h@9qSxdsS$t-KMS7Y+x`4PP z%d}=>nP!mI<g#R$){HFE(q!q?Lqg4NOV-oMQcdN`6|NO>#4%?n9@>^13h#mi>qxLI zf!C~_VYemz*kRj1{~C%hr6b4qy@^c*$m>^zG#j7b;E!q}!~8{n^q)uCo#ghPLEv$L z9VM{pE<8aHSgCJ7-gO|`1mbm$LN>SU*g-vCe%moeH3Zv^V*2#uw;f3)bFl50*A331 zLcj7G;AaMj9Fgy^B1b;E%~-9tA)k%k0Z&@;*=>hE){v=tcb<Hx|DXC#ft;biIfn#f znnu7<a|DxalE8NOA2_f(9N4o0J4)kObttc03T&I-|L?>%3nWD#pJDI+4uRtpc!j_% z1d2t`)rVQWWBW4vDC+jd4nIuZnBkq|O&ETlJW0u3^{hO>#zQY}K4<u7bD9u#<M9L) zTRyTIjY|@a5H|iMaZ3oh@dya9l?tnc`n2du@qqZ{rY;1;FO>u=zqCIBj0H9;YCs-$ zARh?C>-B|3+ipShUTI8otMZ48MR*HxU{`|@2cdQgvQY8R7UUh9pWcFWWYn#mYquch z5g)h>ESmNp50YdUdOfXnq*eAN2Eq9Zu<66y1cc!)vdOd?4ZZQI(*VEnNVvmtlig@M z2C&7*ZZvLY{4F=xjmB%l!yAo0419Q_VR&m0)hC6@A7Y)T-|`lK2AvcE@0f8%!Uc@4 z+m8S}=mNxaupiN@xZ)?j@>wddYS7o)j~K+3QSC?}_G#<^>ODbYeS*f>J8n&~#qG-5 z2=-vRqSu1UDC}2W0e4%X+3m{nhdH9z?Mgpb$`Z|PSDqklInQoa{ITK9iWu-jRZjQ4 zQ>a=}tyh+$+98MYXGV7g`K7|Vf0iNV<>VN0&J~E)YcZV&b}N-fkzi=IA&sZqt^5vH zJGgdtvR(1eZlw?&Z@ybGZN~=i97JtjVB0<kFw^$M1ZaC$E_rrCQwivDW`bY&x@M!< zN7@a|&A{5W?S^KB+S=2G<{T>7&4y;E+JH{s4b5uBLmQfpiJP%68OWCg)r+dEYRVZZ zp47+ngn%XV)Isz>VC%Ami#;OOM23q)e2(vW>1Z|B7wKj2d4|eG3D;A*FS?bwY)|dJ z=u^cFmF>Q00kgyF^`|&h*?p1TC*Mw!e&xgIs_ee#5kSNHqAd6~yf3<fxanN=V5F0< zo*ti19j0@yk!gmhfq?DYI>5FG?3}m(`OJY7!2KY#>_GDD4ofe$&m+yR%<1C#XLncw zfer7l&LY0+9o7`p+^em6Yj;?BTV5-QUwLi1V!Ok-4^T@uyTf{$c=H{WVaF*{pvR1n zU)fG<1<X!juh*C?(t{1yFxP<x)9u&|SX<_jZO1~6BJK@+WPggj8lO<i#hj+!UAj8S z)6xd)atiHk16C|0V=0y8QCVb-MfK+tGDGr+n)G_<$Scr~bXkDakJizyojF!NdL3Ac zu06KByT8d#>qmDo-!t?hohdA!nkM~dgM@-%mFH+k4^7dJmIGq=AfIV#@ES<KvP#j3 zNIQWA`q7yV<T`<PopXKif@9f3x;gFU%N)xtpc<zim8NU>GRLy*r54y@S>3TvVFb@* zTEUFqvHH<3z}J$`>O-d?2kdmT@jnx9K|iWE3GGDv|I~jU<P4dPJvt!MIRq><A2`_# z8~Rb4h7H(v9M~@fc9h05cO>&uwV@xip}JK9$s+Kn0{;Z!kYfmZMBowv#iA(2C`K=r zel(Ui`q3%!#ta`UZ^G~+<&^-~>y>P(wg<DiWTHGuMrE#Dx=}W)esn(-TS8cUXfTq_ z62iu>A>M+1)csVB`l%58Xrt@lYk(Sl`Ivy^m*Uf4bq2ucNBbim4al(sK=C|D0IMJA z{tK%gJtS?y2y2^jA+UDrtbVjX@sNJh8%b$VwnwyA5D)7|)x-x50*fa7$V22Av9X#~ z#|yzgKdL3eAh?x)FuY9|TKz~jb6EZ8j6)qpRzJ!f;xMxM(OSigaJTwVSHxymKPo4_ zlYZ2l>dS=6A7X>4-!RPs02*`#A>O=WiWyf;im-mPUCWU@uboS_)sGse;NPYnRZ;C+ zA@*r(74?Soqngnz>PHuAMYPAcy1vBfM?W~s5zXpH9TCNL7_ELZTX91)s~_bRJI-rK zKRSin6IFR0gt?TeoAje=$g-oml>91T9_U9;kYmXCXMuRVR#7<6kLHepp-J;ATcLSb zcC-3X4x-WGY4xKs6c6b~R}ybQKiWuzQhJ<z^aH?5+xHWo?J2Fvv-**)bg}x;-_vbd z{pgQs%dooDk0K|~)}HjEX;iWs{pdWhuRXE3e$-(^bNy%_akDP;K8st#)r+dE)s!<# z`2#X-PY75-k2?nyLSSkADB7eST`3N==f=9U#_C5ytd@x!vii|$)Ma~W^`pT^T1#cC zAN`5A*Q>P{%j!qE_r^0K?e%n3RzKPXXjnfw?PTHxJA01&B5~8Xd1!BWS=2Z^{vdUj z&h<Ja=-e;@wsR{08zitmKN{;mt`msYYm#&Xs~@d6->DZz9AWUMe^x(Q0Bl%4dW86{ z^`q6Qxz`Oo6<hsCxB6K9=*Q`bt$q|A=?G`_qyEHO(2vGZ!FY8d(2q(0bNbPoR-{|4 zr@GWGFMj1K>2|DsbXB??3%QiIH*_0+=tsI_Xe&X#a(FK%d0NtsYALiw{b)9oX;wS^ zsQovBA?Zl~vb+Jk{r@u0+H|SWc+>7LXt(!u{gm+{38w(s`#KH;ZFC;d;|2hXVCMK0 zu%8=yiRVZ^`Xay<o9N$614DPjY2d-AZc55Em3LvgU_=6`I$h~_YCv=1YVBCXB@+CH zO#E9WpObguI(fg5_%ZXSPN)7y`eUP?_+yXs$KZ`Yl;e%&5qehCV;tz;WE2?xcJl<T zf-(~g3Zp=w&%sQwAg7Wly<Xqd61>$squC1R5^(b?-*MQIBW(X=u#s`qR`b-Th(&p@ zs*3!#DS0RHVN>CahbYL|bR^$A^tfykEexw7{e>X?3j_Xw(npNA2tx|eM@$7j1-xGK zTc?rHWl|QIbNU3N3y>*b!L{?;A~T417@1p$538Zk!4woSw$c5+DP*>geg^5?(nxwE z23_LXe|P_M`?|!c$`S)`Gju`wCsR?l{Y#05+pi%$EE@*+L$mfzVR80`4I=%ujP}=F z>e~M(2kLJz<F<~(5=!`$L;D8plcT{Xr=s2%Y1rqXcM}_Y4ZZUJ5fh|x^>pA9Q_C~N zlAEb2U=mr_oCs8F89eslwn5MT+yLs1F5BD#>E=E+&D93YeQqDk0%V)pZkkiBn)|}k z(v{rg5UNTy*XuKe)Q_2A*Zp4_X20^_BVCtbhQFkhs7o=!T^FR=h-axw%2gY!Of55s z^_@pm?Wn}HbJ8Lb3=f@rPcAL=&C(@f517V&m2RxBX{?G0`k3caN1A7+PbzL65gloo zUq`&Rc|w)U(y{#K#O*VxWL9u6Zz<5<VAl}^W?%`!DijA~4Wq=-BthOAG}nG>kk(aa zR72MzNm`SsJUK6tauu*co^3^Zc~)EUvZA$6>}bx^YfQ;skblY)ic2iYOy&j(<*KBh zotdI)?RhHP8yzVY(T!?LO>^&)VT_4vhP182r42+!s*25uO6u6Cl%bKbt%{zea?u4_ zzCW_ei;mK>xafk--~YyCUi9=Hlp6tH-?cRIFkq5K3)X)hX#{Q>kOk|A$e!oO$oF`t zcByx2_T?7;R}J{+tf;QB5X=-h*ON?*Q4qI=avuX}Iyc?xDXSxkzHW%K{rX+MX8k%F zghKtArD#*XezUjz`m_2~P9wKc{a*B|I_THE20Wu*t26p_nyh$rx7`3UGM`YU|1l)} zjYfx`AdVP4unf;69ypeO5|1a~d8f&MSNGvnnzH@+lRJT=3FHpHlz>0_xKgqanl|G% zO&OGyWv_10vjX*3Dm{awzp9aW1X_(Fa0h|W3jBh=)dc!hPxid;1I(a??5;MFx-c^} z+5XB5IPWx>3Qr>WCWCW>T78M6`BXjpeFFaI6Q0BywMpSI!)109|6Kozy`D!<Ci1>` zO}G7N1L#+NG9Vc9$opdQ_o>H>dE|ZZ@|mc>X3QhCijF|-Jl$B?)ar5Jg+xahi;;R& z8d)&$o5$thHwbnunf-+A!mH6;@FUs&vqyoh(7W$!0z&sq1%zH9`hw}n7y<(Ye}=kn zBe7G~m%+>daTZLlEM1~%m<}Z>Z04^wTCJ4=TcxBeNqS})`<1FzW2+Sqd;xl~X{?yQ zK!Kaa<`O$)?KOMVSl<D3>tvc}K8~fNPS`1RHmTR{l)6QP2~su5t+gIz<lfJBN=0ON z%XUglg6qpW)jNsQ+RW7CLQ<RI>UI9hfzateYl5v4SNqWGLGw7#nteZL9v+geryM41 zt@R!<j~KfT&!d8eO$B2v#nS5Y$e8P{p3L*7h}U@*f-^GR7i0K8PFFtNJO;CsPd87h zZRO=AY%4D}&$_+N_aGr72UzqDJKCXlKnT49Lg?ABt>M5BdTlLw2Cs^UL33VY><%#M z2FATiuGhm@>qd%AtcNnjyPyoBF0@c|rPqvXkZNPJTwRs984CE7mvJg#wV5_X5nTo& zS#73`Q9NH{Q)CoTN@{K_Wj|sM9@-jfwcARWE1HRw*Rtgl_jZZC%JE45o}l?8nf;3h zw7Y;n9)UB_Df`C=+=*x!DEKo55PR%m><Eep<b8+0DFim(K)o8-dDmN0#K;SgA9J$Q z|7OyTy@bFt0#_<<C4mM7E+BC3rBVl`@w^h?W=zv}8L2~eN?k|l*qu_dzw3FI1*vJX z(Y^ynot~MRTtli_O2c{mBw&l_L827|SrO4^kBu089qf!?{a68s+WpZ>jPM;q;FO8e z>9r9TV<S_kR7)r+V#4*`Vb7@QK8>7vEM;CK?E)441A*HV_zi(a75F8A7YPg${26Z& z+d^#I`vf-6Ah3Zz@0px-3_%o+qk)n^z<ok0D>_PPDaF1}QX@(8Ng6hnl+{Yfg_*Nh zvxY4t<(En+AmyK=oU)|cnf{H9Obc)iB!ky?D;;|ja3?Cd1N>}LJh_T^8h9MI)i!1J zolAU6Q#`qXcp7-k_aGt!aW%)j&-*5!_yFR4Lh+@<hlb+I!0hy<cydYz6YtFJ43P&! zF<#`!$U^|0us>bz-;cinmeBq^2pplnK?F`CaGZlbqlA<xq>LI$AS*g3hf2ItCo`m4 z{8pMq?Ks0c5wGuDa^5qk;q`SHsatnST}NsT^Q<|GuZBqyL28;E`({r?gWM@~0I8#P zO3l8J#c`*42a!5;r_@QL{&1(%K@7-}o$8%P>f@QI$qG`NPaUuCWCY3jOvqD{*IDk` zVRF(`^S!>y$!R}0lM-7<Jz}TSqA3jJPN}7&o)x5~sg|rJwK;B`p3Z^`W|?*2Uf}Jk zDzl_~6qzHnSuZlcq_X79R?xopG+PRX*ZKFbQe=S<zy3x_+a+s(k-BzOSzsirT~%z@ zt_eRjlGf|hF+vTiObxo@*zD>nk00g)_$pIX6%1zu_$pIf%~ei-+xUFQYX$f#rrJIb z3L86?iq}ldFVpRQ>RrvvI2bo_N^HNO@b{ld``PsbUL(+;z_SFp!iW8TM_>_wzT4-b z!f+zeoGYKZ)$@KEq)Mt;ZD9+kt9DB5cpG1b*eP{9soOH^P0l8@Sxa6&EoV#S0W8Ef zMDGydcaqkfiP8T@1g=qFHi0J<m_}d}^WZEA?9G(xnN7LdjI6F9-N@?C6p*a$JB@%8 z<p~6i**HHftDBv^ln^Un!26cY_Phr{pc#sNdqUP{cS<cG^_|SrvnxrJ`Tu7o$DQs3 zhSjH*-ohG%9@Oo4wK3N0w#G!J_-c>MmS5rzH9Iakdg@I9>>0a+9pYg7CK<$w4P00Z zO(6Bgol@tLx?rc&Wem)(c1m4K>JvMqZYTB4ol;l*fbB?-s>Q^z%yv?__|;IfDYZA_ zmd`9uztgG5RFNt%yVK#AAzy?l?Kqvb2v*Tm;iH&ce&y{{)L)C+Pc+z%68QhPdmr$+ zva0U?-sHAqrU3&Jpg@qoM5$1Qv}7O*k;x2&7Krqo`!5-|FafGoDVP}wgdwyQq7*2S zN`$C^8<>I>@@j>ERRdP6P$2LYjZ$6;M2%9lYG15cvC8lJS?lhzPudQO;`2Vwug~oH ze$QHKuf6u#f6hMl-rT$K9+6LojEmg%8IgRs#=EXN-mb!Y`Eh%l_ruun7XE1w-3s`V zKfZcg|H<z%elJM$ZM>{kH9hY9g|2r#P<+?xB>Y!ht^XGP*8|TN*U7Ox@N7D)X{kw< zpMA$|YaV#srb?Lyo~KW&dEi;mW#)mWbKeyYJoU^2&%a5T(4|vqYm_ei<(@&s%LfxK z?{9Xi<A6G1R!cvxWMK8TKOd}al+rrC6RR!seSTVd0ap4-X$8KO&W>Y7=Vu{w^-mz= z<)J^#^NduMkh-q6Z+cfQ$9OQXhbul}NfAE`U6Ja%VxXvK?~>X(L3<a*LUR-HV$HoD zf<5OSYwmh&pf_V~&Am)l+jIBX91m-;wGlG4@twKcqMB~`C(F{i<iPs>K@n~CgIcxW z`Q(Da@y-5w^n9{#ot!tHPqyA3oPRgZC+}r;HJ?vDoqG7*JfFNr{{BnPC%@dGp#1rS zujp@oICFk_d$_&%^U3Fw-|X|rm^Rt$^T{XP6mD<+eDXovWo|vAaenGEbf42Fo*vq| zSp)PniTy2`Wi@qyY4fPoQJL6iK2&>>jppM;+-&zR>a|kxzOD65!R*#x_Chmbd3OD> zh6A%lx4uG=Z#^a1A<Py<TC{y_Jtp$!+MBi>5jmjE;b!c2F6-(sT78ujk={8@=^~dK z&E`91wRrIR(U$ewRGF2zMa$5lOhj^9m}aNnt^EeGPqn-mvmek{{1j#n6M5h}MD8zg z6p|PDc`X@x-|F;x)Vu3dZ!-U*!F}H^$cp`}BI55`ZB{s&Fng<inDy>p^0Sz@tJ(MI zh=t9$mSe%yF9y5c!fp$5c3EblnEhkR(6iLgk4yF?%w8aJyB62&J4LoWL;qW+5xN=M zov+l@n64`OMW%jD<V_;Wzpf!ZF8wXfl+8ONdGJg#;4}B?)f`&sZLyTyEQR%{DxzAK zq|2%KoekA`m1LHU(Ie{S2G!cp@=Ce1nja4}ze>$pcSwDf=H^xL-z0j*iT|ZaQXNP7 zo07g%GiLj;r2hHC@IdE(u&Be5r*u@k7^kflc!aN3EsOA-B2Ak~b#MloH@VG1uvs=6 zi@E(nY8smdw>*}7GC{r>>>l(>!PTjGB?PlayQ^Mlthpj4&HfiYpxqRs(=D$IzFrXw z-+<v3Zkm0+qUZH?nJu<_5i@R$zknGx%TGYKeSQPN4fXL_8rzS2P%mNHmR`0qiq0!+ z?{-gK&uyN>Y~c^y`;KZI;QbRV-P<)CZjx+kN&l<J&(>#&+zq)!<Yz=~#&+jjy1G|a zLoX6p*UCI>_UYiS>M<90XIr+*o#p2fIADhVp-67~tQG;cY0grdpR%zPLTtJ1oiYwX zdZii13hTmid9j5b81YlZd73;d(O=NytjJGlL2vyPk<W_U_F<9csbb{AdX<zw{ZvuV zinbUZBcf9Ue_ziJmiVdSaXX~_vP6lrxBWd{lH0!^*!eB}?_&s8Mb>|d|LauoN*x#d zRMEenjcPqR>|Z^5&8gz+s+2iZOeraumr=KB2gsZ%er)bLoGNy{w|QPTqqYvvrN8{- z4#msVeBS$--Fk_LpDNCLRI?nbzdaYMUKOm~i`5qTzVMs6%VX7+A5q|2>Fj4Qqw{|U zp{tv;?kz7rA#yYJmXKf5)%M=s)-gcivG!DfA3If0y?LsjJ^nCyh4wCdDm3>6oYUMt zL$H6kHVkX7E^;&G*4)Q+wY}{=o8wdwTeDL|_iwE^Rs0oxnV^?NbgK9#Vr#zY`K;%J z8~^v{RPj13mT;;#m^%M%P8C0<7{jUJk<Sg`eQ!<`7ZuTe=~VGA>lBoqD)?ca!o!*K zf4y_<sp66EUwf+f<OkNCD!%`NYflxApXcVGaelkH8BY~=O6<3gvudh?mysXU`Z1Z< zoS%`_Msq$j8`BYT6K305zZ%R=1hcQ18OyWh6WVexdvxnbMZWd>m5lrA&a(AEB5#DO z7r95biLKv~`NOq8+>HIs$4R`XtICr_`hQ>KheZk^cGKASyIOMi{b);lNR?Tcf2zf5 zQRcNCb6c2ZXHMjD{JpnM6<^1U4<9^A+O0n&@*&7eMQ;C?$gs$DTB7Fu%<t)(%t3fE z|2x6`FGy+bKPuw4!2VAvHq4r*ia!b_e~F2^n)?H7-`JdMS^p#QK&1Z?>>j2yn%lyh zJtMO*%>J?Eeb1BG$0d7;v|E2e<b5Kyzh7kQFY13|T530AyYn-;`iib9e=IWihaz7U znfxOSF@LW+rS^9Il_YP~nA%7D&VEWi3Pvl<Q^kj*us(fGM77$q%huHV&VN*`zmd$c zvFp?7rZhTLd?s|^Nx##qSr*CNIwJK}Dz<1cyi%fPjD68h6%Rmqe@VYA>GnxU{Zo7Q zajNK0FAmaH^Hgy@w9~E$*X%`~I(QVD=BeUwQduvaV>UiPzMyA9Y#!Y5dPQJq-yQ4@ zVrK~%_}@whX3bN@2ZG6`%$4`Q?K3)Ka>PH~@|oakH5gvPa0@rh{?BUTz-+PQu{+fy zx5f=07vW~v2jTYlLI^k1_lj&^_`Ke$+kWjkcRW?_?K1tJ(-7nR6D_Zn_uC&T+197& zf1kzS6GhHJ_(H9J6}cJPozK_R!?Xm4wu`K5-EloRwEP@g(m>$uY|Fa|mTB21OUvU9 z5uJFn2)IrE2d9cI8HXXg?^6Ze3sYa#O{tY#>~&?e^bZoffF{2!@><9S#rJ*)e|Z1< zBDdWrqCXYA?TLnk+n#3FcE@(%9f|%|{Yh1xkmFH>oc~(uM~bS>7Z*HQJH*yEi984L zI+53i+!9QO8j`deE)IRju+lpxAN2I_Q0D#rWBWN4>7Zxt|36zz+&r$N-A)*{6VvSk zcst?VPVm;1Ikj^;oip2=g!&nYEZi-GyP~FM<R-t``og3c?ki3-!+jToa6c(>GiJ?D zhtg2n{`jg;?LC(?($^}`oHbRE=`ou6o7PjIsTEovGo2b>YwD#UH)GapYDe1C(Q7p2 zFElrk5}Udt(^E8csr5-EIc5-knigoP5t{liO<~q-YFpY=_n-Wyd$n7pD>SvfFc+Ho zgV5BUho(BTJKv01v#G(fshO*rYCXJ|8SB==zqMZ}w8_=+C9Moy<Zmc+Fm37AO>%Ah z8ip`hKPPfaFtr9-4=?ObTkMmQD`r>oUAJZ)$JIjaNz9HDGQC9St}9qu^P#QJhPM7n z<Yr8o?JUN2&RwG&f8jbiUTW&`<1}%Leb|Yg30$#t`R1BV3(wS6AkF*4@2C6i6DHbq z{ljKCrfYl8HUD(`NY$6Q<_(1Wtp(jAa{uglefV$Ct~Z`k?t1Wdn|%XD%i%)bp$F*l z_U2_<-y?L&$v>lc+1^)ppf0yHFFX2pu`d720^hXMa=5ealUzQlz&EP39Nzf+SHE~q zF2BQCYB{`Pz&?!h?B?arz~{BE=bzKOEZ)kGN!?u4p+}!?dYSd+DT>a9`1F_k(~y#X zv(g;m7fWeF{1ym9{CSaEf@yP3jWkEN-g{X-Y=rf4U&)@r^wOX9l5|lX*80ocRQx{* zT~W9~H$+{tH(J$gp=z^I8*@l|Pod@Tplw0S5{tO-mFCB=4i%2bn@yB|3K3tYvxG&w zN#vGb+Kf0XxO#7od|Vmvnz`~CwWb%~H9Ls#%NDgZ$g84c^T`Bxct`H0BdYXGuduGQ zs2#A`-{)*rn(($sv+F<Tvw77x%UwmaZu1)JT1TS0oAyfa{GiyCQ7kL3uMCQ@sOVkr zUaxE28-=;+c_)ksAHNUOzNu3mGGs|Smv1iPM>PG9GWv&=-=C7`X(akhB3~A{?HwZA zs~U!d+dgF2cH8TO>%YbS8(F^dHzg_RK=zEKuj=JDrTUTbyYr-^FO@XcyKvT0)Ot9l zlR)#4zV-09=KiKnXi2ti`T<$-lb)M}`lzdF>v{L3QqY^%$%lWCY!fT<gIwAN$?Wn= zy0oX^)*s?MJ{HOLjbGET%2Sr_Rf~FQqj;lcFt2eGZ+x~!P#?=xbQ<e6J#dy8b76^@ zDNKrVktb0F__htAy#&}JuO8q%BO$<E0^FiDJ-}W99Ocpiw9B{Y(gWN=fWNKF?b|W| zZuxHp_)YC7o<V*D)dPIQ9U(x=;5UfKK4NGod&sE}pj|#gmzfNX>2mv6Ccyj3VAp># zgW89h8RXYlJ;22@K+E8}iO2%9lr5zJ+U38b0a^xs@G}Z<HWT1|W$-^4;3MwUDsH}| z{4a{@yL(G{ST}+2mh#h{A0D{Bo41tj!Gpi0%+J=^*GJEOy{=T*pSJm1%4Kyr`<C)! zb=>yX-2E-($DIyO$NrXb*B95mrTkT0-`cAi$Hx^TPs@K~ufdP#A;pi;hrXW6?U26Z zE3K<Cv19blN^8gH52R*Of2x<pFneub!wZ^bCxh9lnOP23_3(q)_QKC$c9UGT=wWB; zV?=I)JVfLG<a&|c6|uwo<X`AuO}%%w{$z0f13F|{6weg#hn-E|&~qkc@AN-_e`zpz z4JPht<2k*lfX!dDel)mxOR)PGc3YT*ZGWW)<Oj*@8?BF5&bR)pWPgU)pNaJRvB;N1 zUIAGW`I1PDS6+9k-XQhfVlTSh{U<WuMc4O0c+vIK5MFfsN0Du-=lw<3W^hOTM*9S{ z4;D(a%0tT&za+vdO*=($!y|vD&jLL{Z!b$9UY>2qJ!e5;z7FA+OkB3tZrR|H8(U<> zrlsvIZ|@}QqMUoq#Xt87pZks#>}_hR@RWIl>aW52Yr=(G?h&7EQLJxd7tD9P@Vi|i z&uLTT=BF-Rq}t#8r!GFt3iTzzFFGIR;5FMax^{`YTxrWLk=wqqc8Qd<xSnua`EBtf zvQ0BS`>Bg{D_SB4G$<>IF)oo;N$fLf=<oEj!=Qbo^?omE4%)ra+MxY@YF50U2r+wY z;ih2rr@<_*^^@B|4$pp5a~QMjh2Ov|k?c{@ZhfZ6Pe7h3@)5`rMA|g&wnPRm>Se7P zRPWubZwu~UE2Ty8iz2>67XDE;Ud)<H<Tr!K=P+?sNB&7`9-F^tJri7gE!bVJd6V11 zJ~aK$dZ`ApZ?rz|PBqk_aGosf)^#G|kZ;NAlaRj`dA!zsjh7KFs@@Fs-eRvHd`fbA z1>u_zUO{+-R=d4|@NAK7v;XR^AT)#9{Vk=D+6N1-qE(j28>zq&xmP4Nyz&1kQ$2cj zPx{Of*())B5&Lly|0kBnf`)<$fA<|LWR}R7LiHCE(k1fTztruJpBdNaYjQq&RFVF( zM8Bs<Z_Dctp^t-~kXmPoaBcc${iR+z2nxLsc2|o`+t=|!<vMxF)5BlfoaT~p+W2u* z@V}L~zx}Pm&v5<dcA4Ja{(9kFUHjikJYXH)y!3mz_P>>Qfa!Ix^S_nou)me~y426N zFK>O|I+|)ZT)+8@(*Cq(YJl=LSe1X1jTS_{)BgP7C%&Px_?+U~rucXUdANzcEb;aQ ziAjV;LmwBA-v4yqadK>bI?$S{|G8qyf59GG&dD01{On6*@Ps!*U2|T}o@!Bj!M-M5 zUwrz)Z<Cq7wu=00yLzmO^-n7$`P<h$@g<tdlJ3H2maEM#|IwGD`H0$k-Z{DdCkEje z>v-gP4cGQ1;oH`|P5R&9+P)_InPz`U*ZjT5cI(-#+UlRIFUQ@n?q>PjudADLo!<4t z430|loY8OlpSwInHasJ|O6gdUteKA1SO1H>3?{J_bK$G@fBxj>MX%QXTJ5WL`Sp44 z){EZFvGe;FZ+?p2g?Dagk+5GAHFr`%W>S9kl$z7G%C`1HzN$cegzxli?dL)BU%BL2 zvh}H-mhr>>+CE*{`ZPS;qKoZk<fi#|9@_g$1oqRacjw#nzt$IE#t+|*3iGpn_)<CJ z3ECAuqWXSFuM_2KxwI493u)^8uGL?$yok#$>T;B)=hizp18WM7^6=a`>Q{wPo}F7? z>{o50JUX|&#IM>%d2()jsXsV(jPl^zy33!NJGbvvc)SG10~k+yCHwSIxDD!*uYWq# zZ)`o>zFyebdbkbj@K?gxdAijzfZi??6nGuOp8(|XMPE~(J}i6HNOM@;dcA};EC*8I zonItdHY|rE^kKPkS7uoLUER+NOP6l`nPIs_m-^7J56cU5v3*W%)(p#?f6U0+fSi?X zRK3!g`O!54@(R_=49G8W83*K3t_=h7O<n$v3`nnj>*RlCK<Z!A{K@ZL&)ObPD;q5d z-&7KOrSD$PN`KV(u+o2GJ(FaRYg_3*xt^8&Vy<nazs&64pzG&z&d$HwJm-tsx5@cy zUu<)V1Cb^bYr_v${7I*-G{)^uQTwewCXf91$F2F?OJ?t{^^@<E$miX4#P*V3D@a;? zoJ$qZbwvqY@&wJJwpR_hRCC{?1H<x=-=7~g@qvd+{85EG@O>Q;zqu*SDGLMh^!=Sp z$%twV98eJX_ckTt@;-1IlG9B|$HOGq*)GXfnvyZCqX8bl^Z&Og;Wvo~KCEE!mzxrP z!Fb@w1oinA59);Wy@4OX&)1p~e${y3P9*=(l<<blz;COU`G0Rp&TWun6wl9ZbwB*( z@xUkO*UOrcF<sbK{nviHd9S#iEY$scPhq!2{^HAZ&k{AW*9Wt<+`!v$w5jlRGvh^- z>s}trjs&yoa|8D$g3X1GnHev!TsJK`@Hf1=wx#fS6Y~Pgb=(K7kv|KyTXF-tuanu$ zg^Om!OD@;_A+?9a^6y!<VK*V}QXua1A!O}+>mFm`5yXTv@E!)`1M8k@;v(V~+^^Zz z^CYu-<oeve`8JvT>bg-gyQGG%d%Ebrb)0+W*S*HX+ft{0OIyd*{hW#WgSee-`CiGI zPG2(4uKLIYv*Oi{>)s*ylE<lX>mxsFQXZI1n#(^h{{s)WVMFT!9`S$&<{z}aLsO%r zC%0k4(>JuX$^Id^)(70O;b|M5t-&ue<%(_H4f)mwY}kM%FO9w*Jec)s2Hfw4eAKml zpS)51x*yB|*FQM_*oQs)2C8jXXOi}O-mmZfXk9;14jzCF7T?$Ow2lkC#cQpsd-e^q zqA$G+m->55TG5}rSX}EuT%D@X=HXN0!I>~MLmpDdg!#}-^2Rrs>o-3vcx&=usXx1X zcqRflc*IT00`BQhw`HPhUD~2v9MeUbz3=bKTs*2-b6u?2-K?qJ>3GqsX%~-a*3<># zcB3xol<9h+PGA1IK@;HzZ_3~LFi%W$t}p8MPU&^7Y|sq(;Kp~|ZpqenEr)EiXc{~& zbEz%(@!62q)Y}{*r`{7{>|EaT<~QUu$r!*VzU2-1T+7D8x656xi}eWb$o!TYO8M$T zM>gDHN#43Hx8(+EJ}Ilw(Kh2(4sPC{Iy#%hY*6PZ?)DdMf7li^*nf4*#PQTj!18p< z2F1shSv@T#6JG<FOPT#}bhf7ZPrtr74<D%P-%3=pF-Y*((Jeg)Sf}LWc8Fd;^)|8G zrjT<F%r`@Rre9(6tScLQr;pQi?;|EVn!VQoYmxJ3XD-!&=LAEVdG1ZkfYR|E>Lbyr z_9M;A;ziY-*X(!ma;KR|US#;T++f3(WX8rOeo0xdS*btp+F+wyxn9QPq?%0yq13XK z^>pW9S^`jyWbCzS@1T9%yPJK}v?t~lY*5Y^wEEilzGi4%cvCLB7E+xKeW}J4Z$@)x z>Tj)v$aH553z`^SZ2Of)_a&K(NpAmiTjb~tXd}%Paym>jOw*KT`^Es^(dcS}ZZk-L zV34F9kmwN{55O^%wH`1SGlK*O2GIkO<7Q9<^u&6F2MkV`K>`GW=)oi!V7e(7QCS-U z1{=*F0fIsFfMk~$6oEY|?g3`sG?Oa=d`YJ(V9P3M6X?)wc5RzT-pI{2R|IB_R)M1~ z1?F7}oOCH*U)7eY0>8s~Bv%BMj8=iKyA<Htv+}tr(8dWUR|L9LJRH~#R{%pss{m6% z=0L@zz=%tMx=Vpkmje7og&I^w?O*I>61zD}H;-9|62LoDi5*H}hlXQ^lGvePI&{(c zmH>1kpDP31Miaok1w2;)HmS7c?rLd3`cz~M&{LB`yhq8^v6o`(HDX`1*h_%NUW>7p zV(hgTdnv|VBletyPy#&m8sGt!03V53468(RyHxVIS~kL7i=_<sIE?__m2#{z66)Y0 zr_DfP3(Od;0+(D0Ty`nY&XHUnlND?>S_KAN3XHfE*zHo_v`c|Lohao27&KZ1hFl7a zxD?psQed}BuZ}y3aaV}jBTRs9Yqb(1Oo)(g-pJ=FF~WohCtNxyIOr6ZR%y-c-QR$C zCn~@tm3%G%`V|<fCuzXEOBJAK5hwJ6;N2!0|D+9H3Gm*fBN<1f9D6rR?~d9~lmQ== zVIXJWlmR-M&kX~;E(PeUq(I%JfVVmvVw%0Cf4WQ0R6X`;IP^-=Y;}*R7VFevom#Au zc9bShs^oJeVA*H|IA^pB@C`f~Fr2Pf@FjrUYpv!RVG!0c2sh>%w7AUzE&~ihYwnf% z8=?7NmyP@C$xdsTsp=WHa;o|eSMhw`Q*~LMHd{Q`%39Q3D?e!IpY|u9&D>OgZlfi@ zomYsW?oxokZOz@iKfU?JmWtmwU~0DM_ODe6%o(i$M_mfcyA)V-DZro6Xuk)}xfCey zY?`YAokokmv`fP<#8#6w)$vv<fcsCP|4Q_qME{lOKf!;W`L6(jDz=Ov-YzE%`$xM6 zRWt<w*QOIRMpcec4HMNd6%7mEy&eY6x)ktU4+H#JkZb|>pDr3MkD0az@Vh&iB^9*^ z+Vecj=c)jIeBwI_%&Voh*;uVawT)J-0(2WK1IsQ2&bbue7erffcN=z#x90Rg2nfxf zh|QHl24i#O*oQQOi;95f`Sq&Y_U(r^I>c!|T=$AUH*;MVe@*84p!mI+>jiN>yAkTs zftAcPd{yN^xxKmRyjpx!?lCtG8Eb^#L*38=@^?Z-Gagu0@dFX;j4OcEQ~~>ER{)n% z1+1Odn{<;D@YgTy3O3*hppq(JyIcY6NfoehR{*@Y?XF-4Tmej`ifn(jS#$}oWVB9a zJmxx4?lli}0EfDr0XWOsA>Evj8LwUfLS{;h=&Y1YK&gT2esfX+LO)9ln0wbN`Th^@ z9#J{#q-;*yHl1bsMpJ=Tm~<8u@JmRUlO@{AD(VGr#0)D(1!tWC7mSuK2`;-7=rvDe zfDd2mP6O~kYb{w|mrM5uyw!B?h%uF7OzF&z+H%yUD?eyka=i`Io2``*fKXa<<NF&B zZ+#@To}S$ZhL20LPYXI!no~`z#}z<tst9?f=A??U1@QT8(Ir8*RZ9=O7#=ij3BZ%~ z$>4^|9VRLQ3lBnD19*ekV}bF@O__5l)rPEE0$g?qwDB5X?ymg}$f$~<0`>$sWXk39 zg40gV3)-#m1n5+;Q#_>GFZMSeBPwzU><V(oq|1RrE^lo>X8dA*19C=1m4OwP=Npjo zezCs+xuhZ^fM2Py&OkO<3KF0%$RVRH2gs7yXVY6(R$6jf8X%uU)s!bUd{jo1bR2O? zI#!*Mj-16&Z5IqVrJv(Y>8B4?^|<JgOV0={Iwj(Ei>wL|DAN=ibn(?O_F9ZS)W!Q! z^DAh&zY*-RQ-bwahKa@Nr;CKkgVtgZIHcm!3O4HsU?Ek&R$T#HOck(>PMR+Q-74-1 zHsA_?-v)C<=mbGbs%Ttk_LNg#Sw%yZZ$MW3qNM?$HECKK5Z;beWuRTfYCvdN7cC74 zU(;zCNPo~khWw(n0U<nmHUAOY9u=)hAOv4ZPkl)G9*jW|7*O%v!S=WUIF>4cYih1| zYrsXL72vW<fp+sy2YOUm^<~u!NUzBg8X0m56jjv6{S62$W_m(%tLC@_xZ@JA$!gu5 zZ$R8}3CE)<ncWC~$4yiO`2DoC<A}jUGf05TDvEc115%K+ZhHU~GjUPttcq?105x%2 zZUi42aud1kiQHo(dra!fO+qShxnypO0Kdq#HZ%-2nLz?zp!Py_E{7h9s0i@OY-_7y z&}9Y*(4%5Ue@L&%O8^x!J>!yh)g%H=IR!2ntpogOTc!?|gC;5h{G{62P%x;QK?ykI z6qr_N&AmF`I3hyD%-HSH<sK6aj|(u(973YDigrS!H8+-TKqk$!2zUdMr+Jg`qUkF@ zyWVBgQ$S0Dw;MNy3kW|TrTad=&vq=xAqy@CP6RoGA8M0*ww);x)d6=gG0}jyX+4-8 zl!zaL((Mp9s&Zp)Vq!Y~l!xo6dV9~rKAlu=g+ICH(XY!r`kvgQ2M2n((k|idg4Hhq z{CeBk{9l$dCus|>qY67!l*(;_A*Ue}>du;|2=GH~Yh58Z?*;(Bw6@j&$)JknCBUzm zU2Ra2rX_bcv}zUhdL>{|MT5Do0XgY%U`Ln9TN;od6(+x6)aCmc5L%Qx_@>?kb5ReX zHd%G4C><@}CY8+0BDgUXvNa`KZE~=~Oe<r8ITcKf3C}h;ctIsI4>I2J8E^TFi+sjK z9v3U-qMpX99&Pkq0sM^H+LY4e0W&B87-ZHFm(wOH0{o!b+Ugh_RmqMBmZwydN#Kl% zjR<7p_nRD;Rgt`<0hx0-u;B824G1k}Mud9XR5B^A>vBv*`D_Iz)~X5aq>9w}RbjuI z=D}TNS~)4W*c2DkUatz~;5KVNU6~ngxs115#zijU!d&&4i*!Wj(Jm7efmM~YDaByQ z3`zh7nGxY~@zItP;FOA2hfO}l6u^{<D`4}k0QhMXSHRA=0=SqeV7qTLSHK<>uK^o# z1+X_&z{XtxOr#3fL015WQbm}c^ry@ElK>}-*6GZ+g;odVj3&SlmjXv!3LIC_L1144 zvgmSvo@lOE*DQ*pAZRmM2RdB}^c$@K11fS?Xh3$Dybg>8Ib@f~YXEuCO^qzjVNu|K zig|(1bKR|48rhELx-l*RZ7L+W)PQ*!N~GbGb)iHTyqOZs;4U*OE-H(cRn%7ihwF8W zxbEK{-U!Y!)}vCl%XLfcF3a)(`G$vo8GWAgH}(0TKc>3JRkT&bflAj%&=zucoyj*a zSTfrLz@00CGkU_$uV|G67gc<+!MY!73ShH}D`0zE0gR;z*a24nlc@qW=L+CRs(_tv z1#mJ|!1zJF%-%zw=Pl5L(D*AJ4Ky(EgU~v#Vl)BHspvd7(SUR{JtqyK->sqw#5>`1 zQZVBbATHJ2*MKaz93U)`kThURt^nFC)&%HOQQdnQ5c=R1viUx1-6#Pe-=zlZfQ4TI z4yjPH)PPO70+>w|Fgm8G1<*6E0o&^eU@}#}4!Q!EP8G1Dt^gKN1<VJc6nd~(fu2!e z$`bVDCcje8!f&cYgZ6ZDz*Ku5arUdgLqg$K+G?T)Q_*0Vxl_-jnJ5!57CLV)2|V`n z=p7A9(XbQ^(@sXiI@;6bu?{fC+E!W`nZce&2ixC`h}%r`Q>4LbPWIS*dh{Xe<3B_% zioi(~hPK#%jXmBJz=Vn`V24}*%%lp~8CL*jQw8k2D}W2B0(RLI0DnZ~ZNT^q%FL=H z&_xS0A+$?Qfg$ry2PTXrz_Lrv3eGvDwTn&x+OVY;8%yU7jm=vNB_L#_WLYVij}lN< z@s$7@bp@~|Rlp9o0to3UHDD{Q0Eo_A8MDrp3W5$5SHL_g>Fl|zK#wXymIzTUHF=oW zL9cZY)R`qR_c+fUOM!5XsK7%**(DNewHSh_Xt2yI5h9#Z(bxe;ReVrkN1tE{U_r$d zu;Z=(7E=Z6v@3wln?eoPMisRI@MECvD)gHm=B;J|gtn3fY}FM&aG5k<_{lu8;^dHu zwmo3lXdQ6ZC7cnX3;?g5P9mxwF>M(LF_bNaQ?39)4CPD=={|y!9u>~r;1T1mFMuSp zCHH#6V{#;30BH$1NKD8>Vg^-*&TwkrU6s(W2kBiFd#~fJ_^t>3=QFnO<0{v(MZV~| z*I(%e`3aTKCj6A!UezXfTvEAK8)1m9r3?K#FTZov|GR@ImyzXzki49-;VuG8Dn5f? zXI%kYNENV+PxLt_=vDC=us&A+gQ)^mb_Ku>#(E9dE>{41QUz?v6~J_=fX%o9;Kyax zPI&s$tD@-(oHJS{W{;pwn}^Ip9l)V%0i0zv1w4865`YVuDm7qjW?KS60!j^-w^GXX zQ}5hJ;oj2?3-4}Q&f1nUw&~pOlkIVp7R^=gg!6q2(V3>4pe{E#arCQTA94>TjM1i? z439NAIN|*D;DM$bBuA<{5#~!KmV73b{lw&x=T$lcXCliJAqgzx&}8Dw6ECs4CKGj@ z=m%0wrVsf{AM*5tet7*%kMfxw?aTBipXt%-!;pLJ&_8~?x9>?dyMaL!pJ1?Ut^kHo z1?-S3fT>ggn{frekNK{htF%>7(fkAIPLBxoY&GeG;DFOf!D*va;H*nm1UYM>+9v39 z+9T*Snh@N$OMwZO5*guS_IP6Hw*X4OfQrv{m<L%RvIUjQlU3*f?`~i<U|wr9>kZUG zVtb|Sv&wZ~NF_Y6!Kr*b%j>RO7f*3q<6#3bo&QZ3eDM>?o}$Vo*?3>m=P|S=RJ4`> z3=6pl&AnjjSHT&rboF6g1U9MoFu``a0vJmbuvu4Rog9%PWfX92dIzM5In$N^EcEhn zOCy?=f}?i%-KfHmg8&Ab{A&F~KI-{}OaDj9$5qrDU}HbD26U--$6%GGnj%|`Ul39J zK=H{&fx3#l(g2xtIWQOGkVTgRCxaZa;&R|zkVCqjV*Y_175Ue@9wM9kVqXI?s-k#+ zT|o|+bUARy<t+`!lwa&?KxS1`8JG)l$fC=E6G09+>vCWv$RPzwU;?zMSSBEYE(f*+ zIb_V`z<7{DJl{z+-zSu4-kJm_ZYJEyLBXWutU_8(I3<&-PDx&eg<9znRGgBPai?Tu z#_62kxKny~#wndT=M<nXEMCwjOXcbqdo4!qLi)tSO!F?d`nW|nOt5F266`T+YM1~{ zJ0$>bX*f>A;m|0*M>3+K`JbB>4$22S{0n+t!@*+hiYCx;o8Lv?fQnCi*rY3f6R84r z(iK4OEujXiPescK;P<`VRfs3HmEe8FoFu>{6?<%jbf}^(3JnNOb+Nty*`cC|3XHnE zr2#qM7lj67CTQkFjt33oj9;v8Kvq=bD;wL01ylmi5`27b6A8aJuHFHQD&9L7zlSRY za8bn-u*<Fh_-XOA`M~9bxlDjVM(e;46+LI_?JE&)HKCnV6$K4kQc+^`kwlTpexbJ) zMQA9~Gg>(yvF=2Gw^9O*s%US`Hz3|hDYjCg6?ZHX$a(8biGH21HqxD#{w+$xhql7M zj4a)8&&msKnWY<5=cGz@#s<A!9|`KrTa$Eb)fz4W{G|HYgkr!C39I)22AM>l?J!Zf zSJ3Aaz}P;vIV$3{%Ap%vcHfGlBG9Aajlxd5B5S)x_G%PxZR+W=L<Or*ignWzV%#%m z?Esrpyd7A@6+k^z<eLAe*&(S~1u)3;n#)BO0cV{8ows3F2Z~11#c)*G1(od3Ae&cF z4WOw`M-~s8o`Jdu^r?9GunVpLE~g6E#%)#u=uv4VR&1LqfYDR|TXqF-CRM=Bx&l~9 z6|hxT0OwK#?4m1xOQ|B){6~Kd-cEE0u-ST0r!%Wgfp+td03Al_K&MNA9u+OpeGSMa zmjm=fi3G-63hZ?$aKNR&5u-KWsEX~3kOh<1fu$gaoHlt4ATR2`ir}16;Jk`?fzb0c zZ#~fQJu2ERfW0aVOQ`|#G?Yj~pDN0RE_gE~n!#P>$UCY!yH(Uz0Egiq8=PmXm!uw7 zvNi4Ur1!iEJd8<3Z==xE2X(GX_B|>(9K?Z2Z_z>P?=WD{Z?*|Qb8FvvpeL1Q;j9RZ zs`&JTUEFR8;F5|fU{gCx0Zgm70(ROJz;dd9@r%J~16WNJunVpLE~X0D!Dm~I&}{-8 zu|N|-8?tH%P*KrcWTF9?Rw10E0b5eh%vctjaSG6^O;^Z86|VprutpPLn~J@M03jH+ z%Eq(9;wb?kais?AoF%RVgv9AnoVvQ~3ZSjou-@$w^WLW0<jgY_fE+O|aJak4L+e4$ z>T0S*gSKDpS5>G@8s=2s^zd?%UumoA!BjL@W}LRGA{M$+g}jO4&SOt+0MW1%4NK85 z?IeZ=&0`&HPC2GM0r}SmwKOsVG0_MEapmj#_?a?4MSviEM$-H>=T{6SJ-gD0bI-9U z2k_0;?gVyl$P~aK6<5IKTmj6d3fMVU0OwN$?2;>h%c%m^_9NCt7#HF>Z}B8VaKWl2 z0LC_bW3BX-My<0}s|18z=$$QHO_+}oa7cw-=$$RGDOUiqsRHIPr31EEPR^*<ToPVx z@(^>-Gl81w%mi9`uJ%1SrS`n=c#~glHiSHQ3bv{qOhtob#wigV^2`C#Dn2@}>E~HW zfjJddz>c^AIGQS8i>?52J3|d)y3+nt5VS`{GhBk0v6=}G+DaO*)2;x5Oa0wr(@*9E zgOhO;-6?<rM(cpPF5!$AWdIPy6^WQKZ5aqLlr4q@R{$Y~awdj!=@LVS3NNXHd<!=( zk%J_Zm(IaiIYJK75^|83kT>&^+bml;6JFj99n;Iy`72)v$L~zW7JfwKTDHiKx{eQb zef#0rm*yp(R|##x7u@!$Hp%00m20&ThUl8QW(Uv6?;-2|-RacL$U+({FAFwaMc}xK zPe#}&R{&>Ig)wbT%sD}qir0X3y8_spDqy#|0vJpcu%at~kyHVja0PH6Rlp`)0US&f zp+k&wmxY}G%SP+O>=D#ybKE@C0UT<o131e}TReI75@6l7eF=6^MYA0U2`DvS-byLk z&r*Xn-Fv!W;oWV^S=(~PHl6$3vOS`rm$viZyz~7G(aENqpw2ZparCHQA94>TjG?BS z4A+|+-0gfHxTh%x$&u>5KIAtOi^bH8WgqC1hZoK>ky(T!&|kXF#A)#ot7|e*TlAY! zO{Nbvd76E&zR(Y^pXrhHtl6X2XL@8kYxZa&4EfrZ)cK9`ZXH=QyMfIrKD%MPt^oQ| z1#H|Ez(lHmO}YX&m?}apX=_kL^AFhJbV@Lyv6pnWV2{%=!J^SBaLT1ig7YrDDBwe? z`a^*ZL6^~l;C8tb*zHmxBb>}0Pb@taKnd8SLcdE5m<L%RvN@H^6GP|%ugYPy$-LHR z)*GmW&UQ)LZI$alze;!#fm1pAk~-ITxaLdhN2T->RXSzkeHHP4Xy;Y5mH`a?CAVO^ z_60av;g8le;y}BKk2q|bD}bR?0ULKkXcH%gRFqM`wejpD(UfURfNK?+|GOa3Wfe{t zwArJQJ#l387F|;xs++rM4+pq7LKrpRl8W~Q*86-@gnC3VWz`a3vtHFy^Z?()Y{xjr zxXXcwAcxGj9GDAo$fC=ElR*x-<Z>XVVB|mFfE4^<Ujs6rq9B05Acu^)9N6vhmIh>x zU+il@##K}qm<V#njLU)9Acq`xIj|VykQJ8$t3eLwy2Jbf-71zL$dJo{N{~Z5-{~YE z-?J*biVluwY3M<DmtfR#Qz5OhPRZm6rzG#ZQ<B$f(NzWo6{lonuhR*^v{QPx;FM0C zbPCWH)+>0?#o0OGG4@)F-UV&3{x5dH)zcQ%Fu@*oO0b8_=P&`xJ0$>bY50<;dzGdC z+pG-qsW9iqgk92P=YP=qvJDn%7cnj?HouENUBxFpY}6INY^s3GxdLc^L8t-iP|<z> zET)POZ)_{U`=U8XfMpd;i<SoDyk8U=5S&W0z5(e`(L@CXT&~ASk-A?L8j!s~Ga)h^ zG>`?qSl@sws>oM1wm!9|EgC@U+juZQa!8Nk>K!nn;)#MCf1xRWWffPz&bk6vd{Izj zU5=Q`1lVn~3>;9=%ewgn#9K{hXHG>y14oROfs-x;&ZyW90Xgdz`x_9N&-9n>)FoDb z0dKnmOsd#x>kx0dMBCm<32?`HZ5^^?T`bYtIcp=`pXv3iM0#yKJxXU}Aq~03rg!G< zCGjJwmz~E!uh%AmI`i5(9Xn|a7l9pjUX^A^H%hAB0~llzA?*dLUha^l)3jv(V|#6V zP{eC-RIq<s=0<T;1PT=0^@|PIv8E#D|F9iWQKNusQ%`3lS~YDc)=g80aqh+5j-WvC zcEoyJ0raPeW~0{3dDT{{zy+tkWfj|l@kT|v$Tj~Vm{CzZ;J8!Zg3&s#`6Xr$>P$*B zrIH;qWCvArm;jpUP{Ta*nU^9kprXH;*x!H*x*Qk_@^O)ga1p!^hC4~36aC#BPPVD2 z55S~~`WV0CAsA~G(MVlIe;KhK#5OazqGbtByUg;g{h(W>BgN%G70n1>O2tPi1dG92 z%^(4SLHxp`Xi&-;#5eMyK{;!n$NuI&e4el-ioi(~j{(M4%PKfvDOJE$T>+d^S(kg| zzkj>60lny&;GWCNE&^tD1@~D4uaf|sFSWe4G$5N)G#<cam**Rh0hbpABQ9@gKz7Ny z?19}Xwy8m0<MMIAA*b2aJ5-ZfG}xu04g=jP>-5>EEj<lruWJCBZ)%{=aLqQs4yQ%I zZWX+O6>GEz)K%8$@16R38c>g{NMr}120E#tNPvS;1NANx0n$k$p*!trjBcz~3w(AF zPG5B0%Qc*AuFt*F^l%c&!C&7aZ?B=G84gClIXxLsgPQ69;TLkR{8BFMi0%Nr4Z1Sn zRsiv9LwrgD;*qD@7}3wFsGGpRk6k%8Fqkug1Xwa!29{OiRyTi<3oZw8KiZVHi9AIP zGwTv>)FolyMHMv-TvB0FG}h39DocZp4wdG3LA%Xm5$I8AYM`531N24>)Wb;6b$D%8 z(One4Yaw^H(zsb{vw0~2eJaZ6Q_{gDKYVelA_LC;_?79xV4E2vz=+WjFlw|sCfKVY zw=E6Gl*voLT#z3XS(fii=5S11G6znpC<<UkrI|VC5!c}3SW}~!4n1Kmi@-^hX6B%$ zTmzhr8t9i?6DA;D=T($B0I#08C9x&5EdfNoCUd0foau|e=G|9j4uiijg9Hc$ai2Xe zX}hYa*WH31ry(%x`&|S~sI1+`F?gC8BtS5T{s$zjn?Z3*u-9qukNrUx0Y_EV`p4j{ zW{?2EAo@Qf>ATFJI43ybH2BB<tc!rkPtZ|4JNQ4ee0i*PR=~A-bckB7TZ(n{Ko+&9 zt!^3cy6MBn35o8zT{JlhrPwLxQCXK8*Ut4A=qA?;3EXSCz_{G)T42g(4VZQ*aKxn{ z&S+SfNws>J!2e<VC96;bw*4f@r~*SOYli~cQ)Zh0*z1U6h_Sx)=j^_#{g$HNTGns8 zk#ADveihBYP#u5!T?CvrS_LkutPKm>F*8U2><J6RcuiQ*Zz=k%W&OsmPOI{YN+v98 z{ADI82sWv#jU|U98nmYdonqHE$42un7>I@>VBcrjA~2xht-;1z0ZgX~*t{!%lc^%O z9F^q1Ruf;VD#`}1`{hu*{NVr4E}1p~#`mDD0Mkaxz-Fsc=@Se%1>945=Zx)?Vms-Q zjM{S4ri%_&2h4Nvpx}^GU`|B`>U;w-?-wnNC6VQzft(GR(63bqCSPH_2BwWxff<(q z-9Kfy0G?#D2n@LtxYMP;m`i~-x)iv0*P3j`Rufu1WKC6Kt4VCN7F$hXtCiSl5?igr zRufvCwg4)?ywMtP(r6hNA0w<9aK>l_xad;gl1qV3>p}^bH(CJ}jh2@Lt43>pcQ<`j zpu26>#}eS$bWme5%5exrVlv7x86za4$Kwacf_8hL=u&_zNDAzADd4T9cZLh;z}pbe z9BWS>x)AfR&x}IlzcC8qo<rb_injvuJXZix>57=t3b`e*u81kFgcQ3XOl5}I$F_?1 z^D0`v(O<fjgP}IgdIQrH6}y1^xz$SmT$nsKv5RbbCoI1;fTr!`gV=a2*3&mFX6t#J zHrqVT%w$S$T_H}6Zow%$c!dY2qY4!p^*H2HbSa&SY3GBXbtRbE1;)!Nb^-a4igs&& z$+M>O!3{5<t64%4jqRly8iwN*SOp+PAGT2KKRLRgK{_3(!b6kUWDxDk?k1ulaKLC4 zIH*E{#RhEJ6h&ahXcc(kE3GEbXS50oxfB@Mi$N8*(`XSGb187prNFF;HwgQ6R{*Ds zR)Nzl1unT1xa?Bk;H#`bpz>-94j46B1zzS-V9ce!n_LRax)k_`OM#Ov1-{}^VDD?K zHQ=pAi@>Z)fseQpIO$U0D=r02>y)Gf0q2btfr~B$F1ZxA>{6g}zx53$8m$5qmjWX$ z1zze>V7E(wJuU@S-e56=^%18;!ju@d;T{H<7Cr}=5}Rz86Tk<580dE?u)~I>0x$t= z#mAYD#F;S6OxSDI3BdU4xhzhDglTZXq{D#EhzhV|(gZkfv;r_IJkmHn66Qxi6T`m9 z6T&QM_D5{c#x((a>I^eqcDWSr`7#Vlx)hi)It)y!_?P{PFoE1T?3ju+2w>6ZFmO`E zDnQPdJONgX4g=>^%mh++P4L+vwlW^BU`#?8?rT5}+6+s8X`{mcGtx{T$4s68i$;e5 zrl*-e&X_y_R*en=9rrX%ARAS@m#~$fg3P@>s9?ub%rS)N?zLdcHm@syuYqz{18&1I z@Cly)gEn)A0VciMFwuQ>4+CQ=nn3`w+ik9%;H9|d)v|kD$@V<o-AZwHt1-d1*#s{E zLpI@RfbVXlIHzmO=>uj^0(?%_;+!tUt*ypH_N}cHx3*fGx+SKrZ*4VTqs@;J;8V30 zb~$>gPi0Es8(k@GbhR-_eWNSIjjqP*^o_0*H@X@V(l@#iu&U{%n-*}sIR{G(7?Vv3 zz<0n>+yQG$Gv5JAaR;n1vwR0E0gNuUMuBf|C7@sfSOXYn?-tAlxfTbx6b4yNvLn3F z_N_ADO^n1Q$~58IUV6%#m0^#K?Fc)F=XHckvg&k5WXbt<JwkQno}_W&jl@8%;j|RC zC58Fj4D9!OD7`l|dh<Uxs-CFYcN|L3U@c~_7BiR*WgM1DOj{+chhf&kAr(Di0-YK# zdqo`L>!cFbNr`k$tH_#(&!#F0TrfHec#6uTsME%N80c1M&Amon1S-<wa-h#>8SsP- zvoMO<lJ!NEz!{?zfQ?$x%znK;-LEa`uw$#Cd?T}G?{9=X+swkQZDyH$dw(PB+h!Ja zZZpg5-TNDv-Fkn6-Fj6;nE=ik9R@mIXHuZc=rFL&rNEF&fxRvTrd<lm7)`pg>kq1^ z^E(84obDCOIL+K6^cPQBUmdo-N&vgQ`lEMCMA!t>pO!|r0cf9R3e{D3%T~bVU?yQd zh?A%omti%|r(&E>Rpyf~{$gBv#kh@D<2G81+h{dzqs6$5R^v8WWE=H~Rb^uN##xOU z=YRF+NUr?uSOk1gRmsTJ2fw(!sv$M>yiHx^p#Y@&%@yI%R^m=kVPX&YYzCOoeDoyF z><Uw9LPL%i^x>~C{EV<X$6>347{a>McFM}&Tp=2!sA!lRqF2``h1K-myAOG*wb*Jc zwpzQo)yk?O^+6m4SY7JfIe~i`#?ub#$}n)$Xc?GyDR5jxQ+0m>Lh`ggV!P$5+bzc4 z{&yyi$5@TMt;SZ<xiP3I>q{Yfn+q{TZFUR4TAReVn1qKAb-A^1wP`V$7K5ptj)LJK zO(<rProp11c{7faI!=z%uoexkb$7udQ&b-TPiNzSv~o38uEti@gyWTa8{pmvLVG@y zDq57Hz)2NW1LzSyA75ux5RV+tBZLY(^s`%zdQ`%Py5apQ57JB7_U2{g8|mwk@5$H( z9|UvA<oDQnp!4Egifnz(uW5fs?S^Y&=+RL*TyGNJmAM`hpUGSw5nsw&hjv%fcKp3p z+F4NvZ?nSxLFHO~X;%y#7L(V7->7meTjHI|*uw91+x=JOXhHJh8C&@0-1e$`u1bDU zCBzHAta7awa?O7`q$ihp5#@-0<}z;-<kVX>z0Br?=$a?oT=*vg-_*<9qCHkU0o+r% zF$8U!rp9Y>T~F$21fw>+h2)aplLPO{8!a|q)o2wsufh?#*no9RVp9crjTV7EmjXLn z3JkdvxYMOT=g*i2;IT%Fz<^7Eoh}7-xfGaiDR9uGz%RQLm{svOVMkp7%p0u&$6X36 zx)iAYto0k%WwZ*6yA(L!QsAUZfy*uh+TLUyfOex*;FwE+nS<78V9sa}IO0;^m`i~L z74Haa(G|dnQ~_IZ1#mi5z|Oh?SV<MI`8Qh-!0#I^0%u$b{Jl$o+*`~Rc&O1LFy&HU z#-+flN;C6fLx-#;u*YZ-m~bg@z@@;fOM!+<fjJfT2RrgM^9LL?S_I}@3LJAOaMGo~ zX%%+@TXhBS4WmWioQm7P+JDX(0)|vvkzF72wkQ%{!Dt2WrBY&XTy!amqsJzE3Glg} z#JOLIb3ci5zcQey=yN}bbHBpe-)(a>0S+211BYA+%owczECrp1_cyX@B5ANDiZ)>r zfC;V>39!edfY0*^FzHg@kkJY-<x*hArNFF9feS{<0P7<B8WOz2Rzm_DF<Jr^Tna22 ztt<(aodV~K-T_>4X`809ucr#&izoq@<T~buxo*F5!E8Ta^Ev^Rj8*_<yqQ4Gn>+z7 z8La?Je=~t}s_+J^pxbB#7*#Qo-6AXuyMVAP6wMJq$6GDkz)_=j0LNSkoN+0z;!>c^ z*2En^htUeq?^0mUrGPKHJAl0=Ed##nD!`;k6JXkC8DQz@rMG+|tU;SQVHJk)vvuf| zjtF*WwOA#{kYBvM0hv?@l@5tdxia5?%-V(C!hsyI3;hfUgk{V}S_BJ5%K!^EI17u| znhncXvF>Yxg&Ztd$`{PZ9RN!?sIrT>U~9Dm`0A;J)uTYNYo}yu#}iqLi7b&wlBOq% zkUP~3nPc}THOL#m$|l4tn-H<v5HCT>CL7;Ti?0m$UNQ{y+qO~${O&po6kQ7V-E|n) zsG{dzfUQLj55S;H0k#%N;|^1fJIpXU3~7*uY&Oc4jU`tAJ8Z=d10zPuz%G{pdtD0n z{xS^so>2za925r7Wh=Z4_#QDF_lPokgb%}T9ENfnhT%92<?Jx%4?i^wOf$6t_-rc! zJ~+d1aLU=iDL3Na42QvCqt98wNA?KDR9bSkH$YGRNT1TuuYwr#?2pt%$u(k9z=qnA zdqx9f8%0hZS1k!6?0CM-jVx*lIi-U2itv1s7qmyPryvJ6s^}yM>`<3mb8SD=h`Yc@ zSQ#b{-8rF%t{%>~u@1AFvdJlVVT%(DOIS4P$!9|?R<FhCwOG9ttEZEmK)m`$tUf~Z zf^W!ef_bNaZ_^`}MROKj1?V<9(j)MoE3wr|Y_)QA&_!CEvpY!ka7F;$Y8Ch|9-KUu zYK)~CV@aPG*;*%knjR8hq4cs7{zua^Y;>8?h|X%!SuHxd?+qzBOUDLhmsGSF0PPA% z8?nB0SY+J7ECUBzzP|zSo>XGv>7Fhxr)5B=%nO8NXSbfP{(R4FX~byK=bG5HYV=;E zYbRCobOO+VAK^k<QiPWD1QyzH8(QJuCmVqM*cD-(oNsnp8IJz$d*8UaS}j()@6=yi zEuk8*>f{kZ_SCdCuC}hmM((?>p&FgsJcZ{X(68cshV5_#P)rrDiYtJTQ~{fG1#mD` zz@}XR%%qBJ5JgLT0$em&2fE*G!vXY~hdOa>Gg>7Q8r7dk0CkrFG@)E&{d@HifD1ZV zYQT1zZ3&>7D?-g3YWR}HkaSDA$!t@<XopN&0Wd7&_UccOgRNf$XShFZ9*V#j75lXd z$T`0#G$3t<{kT%RQD289zEMR31azxdCCDZf<^gu05j+<p=cX^{avH294Te-Mnzjg> zGFk<eTng-d2cD|Hn2Jvg*x<A&fFTuEzz(_sm`W9}6RrR*r3zT*yUZ0ZpyIAzMOS14 zKKAq2CP2kPs{kHlLR{U}N(C4+ngAYDg)lmP0S^^m!e{~<bm^4fs8e9xXaX#`6j*+z z#Q=DOm289~7FG!e87nnlJr+(0=vDD~2J3SL5K>uc#8j5DsVp_<!?f1`=2hGk?4&Dz zkYjz(j;`7*{1QNSy$0-nD*!t03fQzOfVorw^Zb;6^Gbo&fPLHYQUVxDSHK=?<5&Vn zm@Be58?~I3fsnJZ<;;h$420B_GpQ+OQ&YCocm~SZ4CuEW(+rfe87Md6(3cOYKOqBh zm3Fk8?P$3XJ6g_mRNu&*cC?)BXgOV&tT*pylI>`c>8Q=s(9tB*(Inf^B-7C(+tDP` z(Inf^B-7C(+flhnJDOxWnpj6K+K48A4{kBrXMGd8`rM_W6$$t_7qi`upS(Y<?oVpj z@@ebvFUT@qfU#F|pj*SGuYcG_CPtb(%sk|wda%{j7)(WjrD!lbAtzxy6fNqw(OhYx zPv%w9j@d=*T0+;TYVvGNpLSK?l!`VO;Jnc)K=V51>`Pmh$<+?77|#37Z-_tUH}sLW z>8OWA_H%p$z;xGc&Ol=#iq#d{Y%sJwV#@H_MVtpom<J{gPS#`vH{I4=g*D^trCmnr zd(ssX^}C;hp>?*En2yj3QV{wJ57yb#Y*c*9Dw%1BsLMn}0Bs>RraOBWGm<tvL!BZp zW3&d$sSr!C0Xt@jBGC6snAd=c(IPP7Qs9tFfhiSt0$Xtfko#qG0u+oEfsHN&`dtci z%$hCGX|xEObSbdpQeghQW(yoMS_Ce?-=sk91JEMS{wpR0I*b;9?xQ9JdW;r<O)dpC zyA(M3L9+$sjTV7pE(I1`3Y>Q-aKWX(-ecwg7&lr3>c3&q>>&BbBylVf#^RI>OTGIS z6|9Ozen2qjbeCYa(K4{nvS05N_z>2CZ6-~C9Y*WGkV^qZ)Lxr{)LjlRpgM*Db1nsr z7_9@xTna239R@BNEdxFWhJiL4?F6_%#oB`~6MR9yj;U~J5*#;LXHNJ;Na92oW+D{c zZMHy{iawLMuK_u#;vQjB?=dT2M#ZckzibzGO*9~LDqaP~FAQ>{5Ok|3)bR#nLB*|L zt17Yrn2WA}E!eC~fbsVQ1#C)1HGm76r(Of*leZ2OZ1N@mv({~3LpCQ9;DCyPdPM^= zr77lCuxXoj2{5Ok-rm!I+-nzi-P3?DnY{|^m<lNu95*@)oKkTc*s_YX2=Qs202fs> zLx8FIPysfhBB#I}&35+$^VN_56Dq0<Od3sqV=8VAJK+kTT`R^FuufY)3BXcvMRqk! z+HIo*_`<5Nu;w)*bU!;GIHHjjJuX;udRlPYMzyjeIPH`HUYRr7i-Jo|+cmmFHlCGH z!7ita@`O`HdFqH&J0dvlbV+d9>8jwI)60Uh8hnKlr$Z%9hZ57_lFf_?bD>j3FU$h{ zHZ3a5gx$Yt9wr16HZB!r1j8r4jMnB4866a?I=v`px1p+Z3K%)rGHU0XUKX_fFOzl& zb~_ytOgNns6l{<x8wFiXdj)+?cL*4G`Hh2KnU-YErAGxm%$3uk7hTF2Z&XpW&4OO1 zLxPIa>{yT4SeF6P!>b}`mda$wciU>HgW<T>0VY&<kDT8sfcw<R<Uc(OoRxM;(<pm1 z%*gVgfw&oGwz4Fv-DA6U31HXOU&ZQ{9kxBc3g%tuzF3W$VKv?gtL!w)8}&Qv8=~}^ zTbyXGz?XTIwe1VI%Bp2ZWWXA{B1f^+N^G@at$r`p5F4h(m@fQJET_!EiTS9IkN<Gt zc)}`SGgOcy?Em!|`ra*^IKbsNz~y*jEpub#4yt_|IBm2H?9xW5+d)eM!p&6Mc;=qE zFTJORS4Fw2vb)L-;Ld9GGq>1#(pzk(6mGI+$u4}!Hsl1jY_tUA<}5^Dv(YlpYqSLP z8BKse6}j8jfNXO)aMoxE*k}_n0eo(j!;L(|6>jAg7u)=_?f7M2)@TAO8!Z9nRO~PK zA?ICwNP9jv2Bid8Pzepdxlu?3_|mp}fbVVzQ@Kw?2EeF_f+;j0EP0EJN#3V|k${7P z8D&lociRc#pl%qUX*hQcRRX3}tP-SopxBo^Q0z+&6z-wWh)0TYTsq~<A>!`FvYh!I zROVhZq!QZaX2hLHceikiu+DJf;jR<x!coGM;RIn9oFNX`u9g6-7dhiz!+Ape0*<R# zzaZRvtSaP`iY7e3-6*sNKVzyguxd0pFYx<S3Ak+1GElIaR0-ftCXaw0TFTo*xsxdv zfQ>h_lWYECaq?iK=NQ0`#WmLH)z3%qPEd<?f?B*2)Z)%pV^T0edb$JVjb<Nd;{Bn< zcDL8MREzhAT8J<lyLmhfr*6HO$2#q_B{TxCg!nih%Y;P%2hZ9f7zv92ahUb+IPFJb zKSsjj#3IhEkvL~Y7<?b`5k{P&1;(I{{zx3-kuauM#6ca2gE|rh6$?hyhjJv0AL5XX zjm^gtoeWwSkYyG4m3qy^pcW0<u&L@+%>GCcMHx*JCmOa0(XhxxIrWhg(Xfz2!@>~_ z%SLpM;`h<CyFHnbG|Yd|Fy%$VtQ5UE!pgOe$prfy@8GcumDq(V53b&uO6*M~Mpz-N zD^7ngadu<z#MzF0T=8gu0ZT@Uz-bk&^?eP<faSIf>`<{sLx|_xw&kO~4Fk+iGl|ic z;{c>P89S#oFn<6l#{nqE0mwY^lw<eGaRAb7LC&rofLfd)w%|S7TFh@PMp%mx)?!j? zF~VAmuofe<1@BX&79*_12y1bQq&os(ol()WFYMNxs8h2Op7x-r*Srtv%o3QCb-(7a zYU~R&f-Gak=5a)YUvlYwzs6Q2`>QTNugnE?CW+j8*>g0p+1<zp(>;9(s>Y|FDkDg8 zWWb$=<cPAnu(gPC6FBdbjh$UV(hz%WDtm6EssAU>UNP=UjJrbIS3hNiE^u`5Y}viQ zvsH`Ps>N*8Vzz2ATea9~Ew);V*-Gb5%vO<s8L)vV($tjGX~C>hfCpE$-}nGqB$zHc zIuyGFo179C53#m|3kx=)#Wn$hi<ls1Z5)e4w#mk^xLGjZG~{FIUKy%rLILwC+7PZw z?*S_k6g0b-k0G$^+|20n8GSzZ?@--tmGHUs&5D<m8m_}*cev)+n`s%YgP+~<!MIr* z%4WMI>+Yb=W%PNn-PEUXj5OO-KWTEWiYToebUG`TbGjfn?ev`Bl2ah}Yne})zdHT` zYY1amHdM*H`>|V94ykAl$W_!aItLH`f?oSUP-nJ=$zRvaUqv-q&I@y1yCu{Pdi5o! zMT53eN!rv*6!WfrMbd&^Rf0NG`?ONFs-l#)@IuLE6?pI-^m_R=s57tOx9g>y6Drxh z23e+&aMsr@!{OY|aa9gB?9rLMCmPyIKyFxxhUx1W(a?_jobc6Nc)?Jo*6?znpHJ5} zqK`Cj(MK&tRf~q{8s{m5+mQl2rG}QRv2?#g+k7SuNsATI=Z8!-c#fG+xh^-BYrXY) zf2#DVQ@W3AlY3@Da28~l>Bhl(;3GBzfgLKmj#zBKMqB}mrV7|DR{*<H1#H?Cz)Y%u z9dQM4G*yJS2x8RsnFJ_&n0V?yuhA+nXdddsRWVv65*n2)u*anUO=#q@{=Iq$zy+Nw zStrNMwggbk6`|&c8g4U#q*u`IG^?#!gcSfo{|rg6UHgd=+@CTJMc|x@eK-Vi$u9~G z$i@YK8sd{8-Qt^6G-g1ridBO2t1v6GpD4j|r{tO?*l%_ktTS_m%A=+&0%wd?fwL|J z_I?acRbWEJrv_~3H%$SIsJH?)<qBXXRlrWU0>~W?HDF!8ZLWZAD((t4;);-M0zUCk zY!hJALaP8CWkOt=t(6MkAtrzaRUwRxYEiFa0h2}(V9KR4f@4mB1)~YD>{8(DZ&?h0 zM_9>5xXZ#S0U=|h2CUa2D**#4KF?r-t^i1&D_|aV2_SM;z-Cpn=>rR?0=DD|AmmtI zdZw5=E&LKdcik22peq16-)uu{))m0fQ~~q+lz@v$f!BcD&xWf6FqW=>J<$~a33Ej@ zXL~GXWgz5CpZ3s|4`CSysVO&NYRcKvlpCbRGf>WEKp*N*te$~#HUs5G9QyK<Y(fU) zD(z@F+tG3(cC?)BXt@zPTF!Pfexiiw>m5z99o45j(vI3(4IND~9Zj+wO)?!#vK`g? z>1jukY)6w!N0V$v<tpuHlI>_>9lh)`9q_>|X8W92pL=X@6Trv0nC*Uii+@GkpVqR~ z{U|+T1zF}8a6rk}tZ{77A2^VST}>Wl9`Z1Cf~~g3U@96cGdH=ld(PU8CO8W=_OS>| z=#gE-t|fGBTaagK`n0P8r&YAU02hr`0Y=6?Q4(60$<+?77|sxecDxvb<(D8>M=`%4 zetRvd8D{ol69m9?*KW>0<60CyS8TJv(E5%k!*3UH9wcENm^?VKi_j_DY_j$$tQl`F z?J`<lkylLA?|u@7*4L&Z^nw(G{=$QGHZ|Rf@2pB@8Y1d3Q4v79_7f!}ZT5GlQv~LW z)_|ib#8Pa)j+>$g4165(8c;V{1V&v7OuH1AQE?}*bFKi|K4DIPcB4h0+oiyuOM#8Q zYqmg_(IT+qQefGoz`{wh1&$jn0=dta6et)i0v(?<DbQ)O2=si;q`)SlMPRc_fnJva z$3Jhjz@pJ2aKfd)NtXg`Uocys-DnXQST-pzXtW5_T^i;fgXANV#IZ;ii_<nN^-YV4 zP(>rZO|Zl19>JK=GSF?=ulEal2<yO*NfV%Gv<_5U3NWJfG8<%<%K-*d$1vciOM!W# zb>O&5fwM-3fr5=|8SptU40M<@0Un`Z?Ln9cz93-7RkViyCydsa6Fw1=I1z@K2<<1# z7U)s2SNkBxRNNzM=J(7Bm{Tz;$h~%<Pn1B8s(2Mx&nK-4ut`OsjyE8SDsBZkucA-^ z=AtWLi#970VB!yg0yeFp8o<R<K>_p0TL;=~@+JVY*1f`tHYXEcQbj?%q5+xH#B(dy z5u1$(a7;zLy{7^Bh+XItB@iaFSAqFlPJmM?`WpmbS;g9bteQLlnA~0$)?w4U3~V%- z07q5a26n;~K=E`?z(!P*4xme`!E3;JY;7a}tHu?uZKfy#L#YB*F+~E@Q-$(s|5#gx zRCEpne3?~PW(y~fR!#}#HSVG(1Sg%I5uC6wt}F}AIAyrc{l3{=7UXQKE1iO(jc#R^ zV7F7o{D4!&eEQQ??WkbU>1n~T({qCJPIH<OD=G>nPL4{P93>{l1)C?8f@X$qaur~s zin<95*nFulMRqTlvkAe3jbvp?;DcRZP<<FHj9tHtR%J*q=aex#?(~#k<Nr2in*@DM z2LyGedjtzkPYK#>ge#qb9;f|+0jF^aR7NG4bm_EU-sys1^B1kPKEc8t89gOfa=Ic| zb$Us_)KSiuHk+NsIa9Hjp#L!$#%(f`0nc4E=B`Zcm_s^pggO`=@H)VxO85W@+~-zi zfYQcRrJd0{%bp}Nvf$sgaNoN#J74;m06Y6$+vH0ChW?S0uuHD}07_4~jaK8{S&etj zDjO3MOFazRj41u)jwsqE@Li$GBx$q3uQEwUs0>(uSL7(RT8XVztko0L`5rAY_E$Nh z3;z@A?b<6Vrlvw_{==2!xwDn!x%>a$$_i6A4tqHcdpX{n%k3I{Zo}H>fip(Sz#i?d zy2G?IAl#94)X3bJ^;reUxE+Ug+u>}=vIDq1Tm8&^`kwSY9V&%8wOO)x=WO#%fP&Ey z(B@L0&uAIwH(CM)j3&Si6}j8jfDE}DST$M#x^0>!fX~=+I1Plj!g;{r;_fhGH;OVa zXEXuM7%c(kRqSIakP9xK(j9~QiBbX_R|yTkxxYvS_=2}vhwpg_v$|hJ2EZ;A1yg81 z*a$2#=6k;iMgmSBW|TRG+-=8@gSxqdrr~pTqbUO%MywK~c`DhLJ(cWBPbKc5(1_=f za^^6i&!Wf!H!Ot%Tu=#(#xqEn8y9yi-3ftXD%L)PV~F((a!MuC=U&B)DqP3gQ<)PA zx2T|k?^aP1z+R)tguriNCE$=r%K-N@#lmfkdzxsE?q}T7<e^J@DYq;OD%`t5OWeo$ zRJ3{k-+t5ckEG%7W3|KaM{><``^Wm^0ZR{mfFG}GEY+)@v*InH7H<)?c#EjTeXz#7 zV372b2weSW6mJ~0c;l$W8%Hff*nUF&SK%=i^vz;~rP^hyXaryt*}H$5_pA#zxMJ&I zB&-9(VdBH%%pZyU7-4>L0>T3HxjGW3%}5wwEaDK4#33FDLyScn<B>SVBaE>hUq%3i z8{;^nBVkAplNkn6AIgctI1-Z7-FyhrL86smI;#S|Qm?5M)S^Kfc3a)K**Hn9C}ZqT zB-OBYNE%kZC`U(9B^nl+D2s@7BigRX%#sleOGK0jO(#Xe>=eB^mddpc*o5^RZ|yPI zN(}bObFRm2w_r929T|wbd5jIKOwy~vvU`iC$Tsa$ibo3yST=eGFlh6x3=FB*QzgU` zYMb%AZ@vIi(oAB&<(S=cE7NWevs;eYO*f$CcH!AA$LyA`?nW(+w5?_jtQM13i?P&V zEVVe&wHQk+#!`zTU5g`Ki?O5&n*df+G*8#<(LH6OrV~7kwW-%c4eHFCC8U0veCaff zqGIsD7I0KWZ{Fs6bfi740>4tP#09lz&~g)H=g{<IlC=4(<|&A+KvL#8T^D7Zb4w82 zD_|!OofgbHT@bM3C1t6T8_}zqs>G)5<5)<m-?OKz7;Gg5TZzF|zMDs@&>M~;p14}< zO)Vy_786(NR9-xBwHQk+#!`#1)MDb&Sro^p7@I26)D9b?B2TJQPNxO4P6^<&Q-G&c zc3B=(c`${8r&V-oToEwNh>5pLMdEHjpHrS&cQ}oq7YTjQr6D!bpVI76(KG{&sc7ZL zPo1nv(55-ZEDfHrGd82Qa|5$W`rtm-sk%KX;Zr2^jOXxheM0t3!*Cr^8m@z*J@Ua2 z(soE}Hja$mj#+KWVm1!i-K?U1o^LiON^AYL2+Bi(qSIZ115RfIN1X!4RP_CZdHdeP zYkcZtQhKUrFhbxP|4`>36>TN?f)*JI4SuCwdr44dwv|4;POwcyHCktd$C^CU4tn(^ zs6~UeTS@5iMC6%w^(MbkuPQ;Esm<gYQc)UPXNAX_Jk$<)y~G>Tnb-L{^n%Yxm26*w zEYnCh%4_f8SmS53>QM#CcAnXhqG2T(R-$2gYmA0=nm=Z@(=xzoiMln0mlXZby1o&8 zq=}0@YO%3eG)$K}4;k$93N#%2voTB4eEJSaixtu*g-kYhOgW%ppE}uoy=F@zRGiYy zWt%#{Ot?~(nQnDWuZD_5K<61~nj5r}rcHpeMymjZ{=#K&9zB(!r?lf}4_WmxaQu&H z=lQ^r3ZBXh*zrGch2X%Kf&z9(MKyrXc6>*7N-n(@);5lGa$ga6hte=G%=7|7y;pW@ ze=xO+(4&detL4VMR)T3JO?dPkRng8^sMRCQP%{HOBJD1f_4*hYzo!YGwClUC;~FO? zRa$e`eY=6Hiy38~ax$V4D!0jhyERn?I#l$Sq&L<?$e89yNZk6I`zL!-t^$a#O<!B< zzuOtQeM!B!pW4;70(i%+l}rpPW>^I<)Ytv)2nm7*pXbsHT`PaoCJh?1X~C};Edlr4 zc&O8odrgi?ZfW^Hr%S{j8BieGLMD)hIfOg}h&y+2tpGce_D88GB><zKSVLX3E~*Am zE)`XRXhI?%mRblP;{)xIiY5zyq2}V^{$Oes!PQvmsuJ{>*~q+LGRS+EAk!w}ooO=| zk`pWkO<e`36jDVkc=$&(cWSM>)3lq%q+L`|J7)w}tiPab$&KftI!#+pt2d|8%BgF7 zjoJoP1eS~r1IsGxAzG(mGyjL?hk-d2SHLd20+{?tP{1y#WWN53hUzNX`~h#MmTf4> zG*rtrlr(7Qk~LHVLPPrGN7_&=q>_e4tf3O%VXW!zF4L9)w7yYhtM^KyiJSwyewxj8 zHQ%8UzHu48Q>9JGU%TX2z8tbv{r}i|8}PWU`p$o5t|BIhNCi=d0&3BMN|i*Kk!>Xi zs!-XH6L~bY$I=)CRk0N7Wt7OWu*ZoK<QEhr5k+m4R_uz_*rK>aw5FKivcibgZC&cN zZV|1Uh$5(4)Yfgyq6V=wAYi}WbG~Qp9oZ?+fA@KI_uu>I=yQJOci!Lbz31LJm)SoJ zgO11yPnw#^MM;lWVK5MgZ^0n(29mV^d(uTfyNiK#m+1@gi#B#%VRb$O{kQ;0(>XAI z(y7=uwGz~_C*=;g1tMXU^e-}!6p@9o{eiX<Rzb|>6tq=-(S#ssU~CB5x~zi8<P@|` zSOqbaQ_yzBDu}B&h08E=*KRV=O1Rv$9;fY;RS+(Bt;cCAHBq(_E_bcRX**&S1e3O% zg|@3!;gT&uB$tg-u3_gP(g|k@b7pd08M5R{rZ$M%VemNS^x@;QRTzoGF6cc9SBxBj zo+6=xhR(D9q736MGM-xq>-pKPV9fr9Lg~5Kcy1-+ITQ5kUk@;?2IDzJ+z(@OO<T%H z!CcdOEevu^&=YeV^z7%Fp6iU~7Q%Xdwkzn_&ow>Q8_%tTJZFNQ{aiC+{l;^O*b8HG zP1~@Mg1M&m4jAN`peN=!=-JOTJ$D(;Erj*_Y*)~;pKE%~7|*SQJZFNQ{aiC+Q^s?O z_$3&dYuaXv6wEcfkHa9>1U)g=LC=1!>3PC<ZXvAaXS;%){an-Yr19KJ$a5y>+0QjI zmb}Dlq=<GHJIZN$%ikIW(FS7`w2fH>F`iS<Hf0sW(VT*|Q&vHI+*o%IvoJPR+AbSK zide}hXe;`%$p=viV?)qZVHHGWPC;9(RS<PK1#N9sK`iDJv@Kf&@ik-JL0pBg$r;;{ z$wvVYg|Q0SO00q?%_(SGwhCe;r=YF$?@Uxg8H|mJwkoS2YI6$O8m)pz<`lHGTLsaT zQ_xoT_a+UZ9>%6YThc0sv7Cao^HxDz$SG*MXcfdlPC;AAWs?R`3S-lt?TS?p%Q*#Y z6aQ#J5R))A1Z~q+L7d1bXbb(52|*Olm<t@*>aBuk%qfiRpG}AYAPQqc&{kv>L~%|* z+pk|SA&8SOHUw>_t%8`%DQKIs3gT=|LEAa2AkOC$w9Q)uaWSW$?aNj{Eaeomtyl#S z`ijdHZIv(>vP8yLz!wjW=__Ue*g=f{HT|{|6UMrONM16o{xEM34s*Qfi*c8MK}h0= zv9=Hs)|KGM_OPScaa!!SZV!&@9mhGY=U@;GVTX7N2lZ9!N|c%b*FuyTYdgVlY$B(n z%DNME&YhNe>rN~hYYSmVaC>kBV{<zwR*j!_g5%aiPfHODvPf{)8h2V&tvgX{hFJ?y zVXW;OmG#!jahSGNj=UjjC5B-T-4n-YsnpoP-h8le#Nh&xaD!^c@yn2k{=q1Sa${{L zDy%C}WCm9|$63^jniirB21!MZ)6!+#i7Dq!3kMV)FCRKi%Z$^|GV3(7tirgblN@Rs zRmdx`s-d>yIBgtNP!JqPIGqvm)|FT=)^=jrbmta=1I^^sjX0MW#~g<jT7%%YLG%Pi z3S8ZQF`+qRH~?H|)BiOD&Y2<5Ld+X$nplA0=x#YqTca5TX^w*Q-!S@g2he4$gFxE! z(llYuhAkWzwi~C}jjK!}ra7%PSSy=$(OTJ<tVzVnO0;#A_Uo#Jbv0wkl_u;g)WSNr zWL*h6J+$}}LYh-RDNNu3pMySaO4CZX6M5@#e}uONM>u}9fZU&i!TJcnamy=^;P}OL zHe9cmLDNcbMA1`lWMO|yxZ13@y5?jRw;pFfZ0=iwlUwU?mWAyWSi_q{uBTwQgE^Tp zjj(eJn1JE-<Yc4C@y=O{$Rab!c5*~=(Bb}w)mdu#+fHH<shEArX_<myBz_0WUG%ey zT!2AGBiK!N{m-3;T$c&d^dx4_29wcYQ_WqnhjchSVq@J?4Xe{msSMbNGQ>ihg`wRY zPLCi?9SB_p-=|<uZ!B`9>1M5N27zm3ZgyyOV>M96e(<y(JnaWh`@z$G@Z62KAH2m6 zo}0grO+R>UrnqkAQ-1IiQ$KIYks^4tVb8v_UH7`fPbKANGWXzs@lC>Tr_Ux$SHWFB zogOolQ^V@2zXtWU1cMNfwQd1#<(PRdz|b2nYF1=#!(iu>8w?)s>jnIJ0l%J0%1z^J zUqoZ)j#fA2!S#C%BR__;A48fk{Gc<6A5#ls%EF*A30|#X`Ykw43r`(zCv0|uGjzdm zmti|Y7X(Ir`?ZBmF`*y)0@0?M@~bK3QnfwFpE*-2sE8lnQYwS|u#l*EKlU|^;ELh< zeUa+E*5eL8(j6|#wxSA;2Yp|+O8l^Eit9q2z!Z2AhMn;eIBsS@zh65&`n6LBx;Urj zqOY>(DWVL<)+TMY|BF!&r7%`OTa#4~$((|=Hme}oa|+r9t%BHZtUHJy7#k~XGe(gj zPUjS~U9bvbA*Y~i$tsA;IR$MiRzY0NDQGKw!4!!&3S$$e?UYpzA2-$=#4L>UL)$r{ zND=3A3feAO1+kD*(01x;COP6XjE#!61*;$ya|+t7SOu|?QyANdiK+l7g0WH2R%R7M zMNUE6id7I-a|+s`UpG+^jW9MU+R|1*wB;1Ebyx+_l~d3*{Xb1q#0eN16>UTRY81pU zj8)K9cGW0|au}<it;#Bhnw)~RajPIEathkcTLm$nQ_yz$8zv267RIJQ+j*-XF60!n z&07U=F{hwy@3%};#2}1~ingp(5JNcyZNpYU9LXtY8?y>xJg1=Tm#l&~np4nr(kh7A zoPxGXRzZ}nx?H&#fn)llx$N3OB>x9X&`zX`bq5hLgT9@^ym;Aor~&MVZx4?69mh*C zZYp6A3DIDzEkw$?5**|>TO2x0iyh+a!6Clm_z)DsFo=ejG1eB2?^)|gELc}!(Yg{G z(k60Ru2^^Cs&l7h)w&ZL&^TKWb}+XG2Q%(hp_ns%+6fL}6Fn^#tUJLGY}{#?GXt}o zm^aoIV#&I4fUa6Ahhzy1ipfD(X{|&ZjJYYJWeJ9zX~%Il43S}uK{vj39M3|Uf`NiK zX{_zUDeFp1nE}|&AvbA;Tnn)TgPcc>)3R*ci3$u3<4#MB5pa`8ORdw;(&#j_jKR1& zuL;;Wz>p>4q=pJ=6t=TDi8hWZcq2HDaLyqnziC{FqsH1!beZnlLU5p&9J&$blIED> zC_<bB#|^634IdMP1Bk=H1qlv_Q8OS~hzVm&6H_p3g_h&SX2wLCW1_^2iF7$oVXYh< zC8mp|2|H3+N@2A<InADY8Lf(&2u`xA*2>n+nC42eJz1IXz<RV5l=dsAg%#9q%9SSU z)YHO(Pgz&OP8Kcx^pNI+FmF8sOI%_~(@MD0I({w=$!5JZILKSgAn!NDYb7{zc?%dE z!mVZqpETp6mEfQ<H<KWT6l)SUld##Wx4Jg83KqoXzBM@2;X7eau-yXpFlpqo4TkrL zq@AO7HlYzxFucVh3rvo84q@nBFvD*r2PMZH?h{#^i>B-CB-)UQxlg2}9fpy(3S++* zH~pf8VBc^zhpwLlZVuC$Kyl3#W{p;uoDPRwY)+59>eR40ZJRRA(9HP}7~0qB5yYtj zp%+oTgQl#lEGOp?)SH_*U_G6i6<XaGg{vE&fjahMO8YUT{g~2zOld!+v>#L2<=Bs@ zg)!MVuZ6JLYxg5<_an_sAsEMgq`4agKhl(+y%b|goAHz)zK_ckKf#n=ij<#V%9Y|G z2IV+93fsb|gYDw<Xbh(gw96cFGl*FjA#yi*&Mk1keG*>UFcZ@oFNcoE?k4JBaNqAf za}j0z?lZGHXY=4Id~Vi9`%-1+nN~MF!u5L&IX{N9A48fkaN0rdC%&)Q$B(InF@?;W z*Fx|*4^uU^mw|<68dM-*vm2bv3y!-C+u6JzFiYgRh@Vi33H{)gmNwm#Uri~ODyOWJ zN%N#BeTtZcu?pJ$&5N)V<cEbs&HJ&hX$05te7`SJ-Pd~D;YYf|W!YAge^1G1uUjR4 z*fqs<>11$D9)w|MJOQRq+F-|Ydh~0j4s>x&<qc*!PZ1q3w$f<JSOw9aQ_wbK6~u5( zLEEHN5NC4=+7_&WDE_uf!xiCsdSH+`7~J_1myPu;E;zO2#%Tv(wQWJI4cp>}ecQF# zR$sf*X=@Oj4ST(GscC{K#yfN7t(Dh)DZIYovCwOd)3pl*!zX;4mLo8jIf*Ije)#w_ zEWd7r@bPo7TrdJYRzr&|MZ3!hW6Z$Zwl*#Mx(rqQR&76p?y_RlE~ys@eHtNcdb#=a zB%D4DgBo{PppSy@7$>6GSX+rom?+0!Lw!ZraY{8tnIdXoY?q>~&MJudoWiBh1eYV$ z12KlwF_jS~jWw4QdYmyHcMzvxn8c3bw9Q)u!C+PqOrpbhXdxJyS4F{CT5_>a6O6`x zqThsYHkwvHnrD;2Xj%i&Jev$g<3H<fS2X+y7ULO)!7O_OU{tXB1!`dwwn}n6pW*2l ztwg+dg)waLcj<9w9dOlJiB*^g-n5KDR{;}vr|BGodE<ni5rjh}VbdJ0CaHbiXm=1+ zn;SX4w#8}L5Pl6VAk3->o@-S`(Pa`z5xvH`gUG_zKIBrT-v;Y}7&O+m63(yxt_J-! z84oRl_1hNo>t~C8lg4i=!Nl1Mf|>A}Zyeew<2gkv8f)%Ci`wJHX$N7oxeD^NEl!(X zLDL9x&IHd@5TmGyuoY57+*o%I^)UGrM88q%fv7Xqw-U~;UqSR+Y&^6O)^A(TuU|p* zTVnjS5=@*G6wHKQK}_m?<2gm7Ve)h7d)N{5;AhSE&=U0E=g0TZ8uZ}jp$uKdJ~$|F zoyTOv2}f_hAb^=K#O(BvP^bYW4bujbfpN!0=&P>de(J_hsQe~Oc`y|>V={!Pg>lF7 z9hmA~iTiYzDHwO8Uxo8FOcrJcW*BA^W(=kYnNGr_VcK9iU<P5LKkPzdf`I)T%z2m# zF!L}AFpDrpe*~+2Ff%YGVNS!GgK2-YAATA3XgN+BuSFhU+|dTNc9;&BqW^-ty#{j( zj5|)jZ5HOdbk4n^0%eD(f?0rBfmwxdN8^v8Trl%6!>@zCA47e^oP)Ul<Bn<Q${?Q( z=-Mis7V*M<6=oG?=1zo%xd7vilDn{S3^NUryc=~6a{{Kg3h~0YqZ0N>m>HOp)kqJf zJm$2x8-n{~m@6>T(7B@ye(GUP!kiBHKOINCz%<q18VtrAbL&vY>rpow&_`h0QBaHe zhbe+7g{g$8gK<ad9<)8oILrjhBuvA-PK$P_Lp{PAfl0r?cR%&x$QR7zdgL8u1?DQu zD$LA%zQ0BIS%N8sdkIV_%sCi$WZ#4|U{+xYegb_PW*){J?Hkc=U=|v2bq(W=b8tHk za{*>(6VkXJ`G9dp8SE7>wJ_AVV`4MP2r~uK_yGDJOa{gsCt*JYQ}-ak!Av%xU0_yV zR$<&x1Uq$0FitnN#c7dt0(A{j1+xIN0<#L^j)rEW4|4%#D2aB4nT1(}iEeeiP-n0o zftiGv+J?Nq6m9qQ^Kicivj8&=ojWSvrxIogW;)=18q@p<nA#oaUoh^N!CFLHE7D7& z|H8QAGVE7imSI+5igrQ|<BqB~BQBT>Oh3#ZOj+*A0e$AJh!>_ErY3hijJ&p^zrmdU zDbxYXMVJMcMVPU-yV$YD3P0yymSI+4uELyvA9tj8A%2)em?fBk4zwSPJBoIr@4=M7 zRKirj)WFoj)WNu;1NJVM4B3S?ff<K!$7$GSVWQoL3#JsN45kLA7N(BualUb10>9^A zmSIBBxuXq!+F@p3PQ%Q?%)!jVT!dL5d!29O1#$*v0%jV<9g7)^J(w#n%P^rn)HO`* zcm!<)Qvy>7<BrL_NE>Eh5cLJ)jt<zfFc;nd9gI7U?n7VRk94w#|51z=n1aVpr!ez} z&?jJ0htUQw8JIzsOCv5c>hJ*afH0Sa5atQg8_Xq`>4Rt|7<V+l594?7IQJ!_a|LGf zov3exVY+M6nHcu<bMUvwJRL#3!36U&FMrf0rC$c!(FD75KMlJ(+y~~}*X8+TcYc@M zeUyFlXV7n9+?Uy1IQO}6_pNb$U3?LS9}~X}a}|c)(sqaYR5-uI9rWk)?!(gVOVQ5V zeSdlWS=80fJ6E(P?DH`0o2TxBr|xT~&gaQV^g|ea4wPRb<##tLVcg+9yvc8Jh63*W zu=5LD?(=BQ|3$bhz_{;mId}IhF86UQ=kC6L#E+`197nyt@N*^nkOe=v<32o6@*$i* zXE5$yPW>9j4-CIv!=2N!r*N)<;U>=Ra35*m7eV+H5O=swRk*J=Fdcrn!F{*EeYC-S zvB7<=fjhvv-Sr1Qf;kWAxpeu72KRji_i+aIWrke3$51aYjK2%UeS5*_t5EJ5827OS z=kC6wP>Q-JgK?izaC&|nU<t-;-Ou`Pc`ibp-Nyme=6w=*<`)#)2LasI09?GIA4J`s zK>hwY<`cx@{5$;u^ouZVH+|>N=^2*0-@Bdd`7r?2A?uDGt#iBPJO3T<+Xdrx#dqPH zzV<rdR}fFfZy;WnG|Iv@aR=SIV7OWR_4IBV`lXLzJi@rW=v{d3#$OEMHk^06%{%>h z<mUp6+fv@`C-3y^w^10kfxL5f`?R}F+T9NAIX(J!Jxl`(`=HyS-Rb#hmT?%jk-Bqt z+l0G)zn#0=P1|jBn{)pyv>%My!PaeG>-Mg7{<x>}IT&v4%DrW|i)sx_?wCa#!ElGw zXuv%SJ2y~s+uJ$+i*UOH<F-q4?rxjQ+26)o1mh035f!(#S^Yh@{yyf0bC|PWxc8CU z{-yMfalZN!oQq-3{weYc6a6!^Ax!;6Tyw#+!??q3mBSraxa*2L7S5s{{Vv8T40j80 zyQ#PhHr(zSqezFFk+^*|_$%!5Fx+mS1jcQrQHC_DV3IK00LC3|7Y)XjfpJ@9IDH+` zu7_bd+%Ll&ZfA@#l)W6rZGYkP+`{29jN4yfS@qyHaR}y-+c#ukxao!4v*0xB6`w;r z!Z7dd82b$B^AF(<W#ldz&cD+yLVpRy?Q^hJ&#>H=z~#s7Z}4L2b-`~2#_d<&!nyQZ z`167Mo<N?9{~TinrT}>l=AZ5*Fx+O~dV04(z~o<Go`-R}1i18Ae`PRks{pqTfYZAl z`A>cp;bGh_{hgluv<SxiwBNbAU(mas&(9zY_9b`lckm4`jWFyB?$`59&ptQ~<9_z; z+!s-P{-T;c-d=!lKTdY~OVBUD@CV9u(7S`b2X2Sq&yxAOV0T=FeU<WaxbA~-M+WwO z82&VOG2njod87~He$MLr&wn2E^H=CYF#NeCf6B<;TDs%xmyll=zT(GMsNLay&EQ_P zZNG&19mXAeRd^D{y-w@irFD9~%1Sr)A}Zes<xBYP-BR~rsq;VjcNpI^@WZ!D-K(Qc z&u~>R?)_2c&R6uyVE7W~5{&sR49enO{&fDL0XLSFFZV6L@TE<@wc`%=l3`H40zd9> z@AUC?`$ZVO*vB`Y-EjnQ@r4FH-r}nU?r`q_x#!dF;k489k$M`&J)w4wpPinMWa;Lf z$GXS5?h&hdzUm&2x^N9E=*uwf3F=xs!_UIF=cO(j-)fnG;e*h@f5n^yGXdismO6iv z0XLSJ54a{^_{6e&)%n7?1OE6>E~q~VKkjhPwfIiTGz=eZ@l64DlzkiFVJcuMVQOLc z?1j%l_$b32=f8vg@LlL(xB%{sP3yRBcm`r5{H<GF8Vcip02A)-dngn?uzz11mU!>( z-SN(Sd#d~U1`Z5W_YNHB?tG{((-W_a)y4Y;cK09X>PAEC>Cf(cB(|Hut$kPDp27Y+ zhk^Z8+@J00>h6hUkb0<lXs|Q8t9vNhy>FniA8xtuLA#C1C<i+CbZ0vsvf5DS2E>8K zP~Q%POSZ+M&sN7Djz=nP9rLYT(a5c#NI|6V82%UZ(8_;>#+IO4g4P>ojqsm$jIwtI z|H2~(=Z%MZZmo_z>D?UjUKM!_R)gW#bF8qd*~=v2Nw2KOD~&G2y+IR$i8pKl7kZDz zyqiX>f5vvk_+aeeGlkyGiMZDtvs(I(^dP{QcyjCA&GC3`-0O?QlMgq0MG3Dw=6&jL z%)2GweKee4R%*N-iZq1d4CFn*NW)dl-V<>0elpga+2cJPyXVO-#=T;bo_8a&5H3WL zkNH_dxo(Vkk3GjYY+cY{q4`1UU~_8!7kY0_cyEt2|Ef0>yZ1@&hoj|j?^Ow}KheCy zyCvo&V$I&iJ>{!7vT1F;9%oifw5Sa4(YzFIie2My-7K&G2~<y_$$Py?Dc&1-&8<&Y z$E&IFo``v+3GWe=?gbX1$Nn$$UiL!V8(=ku3loK7$>!)!j^69NBj$Z8+*49jv(0-= z<lb<+xoSf->*MW-YVWl%?=6XDuQKMf#qMIbySx~hYG=Z`b)-3-?7KT2k9+%K2;;pH z?yWJeEP?tkk=-15And&wu9-x0^Y)zYhfMl+J^WO&_oFeik@xBt+dk>-?eWSJ-Vep@ z@oo%zkHuog?~O-4!t58?9&~Zk2<RC%p2@Xdp?Av*8E@aQOmC*wdj%5P7t3U-<LkW} z(M$>Ba%<w&c>L~l-W}0;uQ$=_y(U`zOuW{6N5bn!n9|(T6Wdy~-TO=^;e7&K>$aFT z81srFZ({FeMR^s``sBisy<5HR=bGbl53Z|5US-Le9$aW@`?*5z^&`pWy$4v`2*~Wh z?MFwN(IPG0nZtDP-Rq83du=1=nDMHb=3n$~?de4pp1akHKNt5}V!d8fkJmf$flS7G zdCdE%5%AS9?*MoYLschgA`Q1Qg~I0wqp$t%-aRqzfrM9*@QTl5K8Z3!e=6RaJeoW_ z*1LJbw(vUd7WO<Z8}nXvW?N0<b+359yXl2@-&&34yD>TuuTD}`8uKzS@0Bqxn}}D} zRMnX5+U|m3wtvL?p=h=lU2HKMi>;e`n5lb@nKA9%WCkyLV8jf?>QTfzgxY@Tv6^br zG1v8acf8>B_S7_2ANF3|1NELna$Ow#wI;qLj@}z@USCyBYt1@uZ!BKjT%Cz~e-c9D zB;y0gDrDd}R2K491HX4C<JG9PC%s!nPzZ$mWW0LR`w@%>3V%80eK(Xa4NzzXyvZb+ zsvtVSJW}=|Z7-*tgD@P;8s|dHm$tw!*lCEmo@g6qsQ<v|&}!b9gUsx@crv+;i4^t} z*xA(klQ1UMf(Y~D{nnwFb%tvU^8BI5o5MI)6ol73X+oiQ-iRMi!f#;@>^JwYjjf0{ zy$^*G2=$ML64f<|XCj=4w3Wi~j}Kuo<ruKO3!CEA-fLo*-r`9Uv+dYV)>Lzt=6qoU zp@MDC7%3ceehYi!7`a|&0#h(Ld$V_fle7HgN_HFipbGYgE7xr-RzFJhNHt<82=9Q{ zWAhZPH(9$U*^NF|#DbWjg$qpqBMmQiHCE)}SmB&M_wL^4kN0{%)>FN~Mz@zmi4>Yi zu&~N|tOt$B|2HN^n;-OckFZPs7^81CQ+u?sH@d&q`=od5+7di_5OcbU@YRSb!?OpO zf#nEF(QixPjT~fz|71?0kwTT^UQ?21jOrT^+t1dP<rzP&uUB*EKbq)gK@{VPIbr*S zd9;ToMf1P;LHK(5;0V(F6%S|WI0qv7mHCfT#O--!h`9H#S{~izW#~5MyntThD)sqc zlz<iIeaLeK{rqq&@@96P4|<qedk{q`*}VNulL8Ck6-IyJpgWr&H=liiweYbUR8$xB zXP>}%28zGBA>q9_X6E3|1kWL*F>~hWP2g-{B2_2EWHGqrY~;PloOL=AcRhSpmw(nl zqVF|{{`1;I-}?m4M@aP9!i4wMn0L21F>&@q4PTqwLy5b*qMqiYH`Jr^)LnOZx51t< zqXuWG+i>bzhw~Ipm2N2NbY(ML^`u7J!sD!j4;Mz-!rqUdqWAJ*j}24U>n!Gs)t8WX zrtkrHFilbDebI#eATs^h#Fn`Ckn_Y5cT*4MP@UsSs%!2x6Umd&x44u){CJO=@cBa5 zgdcvKef7JAJ=OOpf8QEPq~P>5bHZY_aJKPcBc}Iw?-=nOKjxK>tgG5mdzbgep_tdq z)1xUsf-}tWP^6L7I{gxMCwq2-^Po8gdd0>k0w}G28bazUocCW}lIP}q<|P<C%^yfE zcn`nO+;?}4w>M$1KH>fM!#&<-k@DPOrOOC-vQ6-0YcCE=Uxr&<Pqmj$WVTe}3X%UG z#R-uo*!Usu&K@)#^VqxfsL85E2JBv80)=6;h2C!rxk~%<To!+02+fTA9c;qXfy}=r zn!tHFTJE*lLZc}IG1@b?btwFRm}}~wM{{QXw>+3rzC4)8{ZU&5J%x(T=-d^7^@xcP zmPp}-=xZ?=KK$4jWcb~<o_ip%9rAA)`HRs+pVxOxt@5$QT#-K;b*=KT$JkH49!05b zv~2A6xX2XnUmtaI#Mg5H-(v!fvbr9LZp1~%MGfV`-MkjrjA=K#4jK6}!+P((G0>O( z@ljlK!SPpa#Hi$@%81hWtnvF>jI$(q;Vye45oY7w6s_OmPj#*hKk;aE0`Yw5#t~cy z|67+e&-1e8VP5_`(c}G9mb2!6o{`z`2T;}KymOuNF?$!U03uCswBz?YF*7QAy7e9( z@lViu82B#sfwkx7g!fWhL3AYkgU-v}wC8329J=<boL`>r=k#o%<XQKo1j@wIG|FO6 z`PZDF6PSruk|)h+|3A;n-v8gu%;xTsb7*h$Exnr1{#|EgT&VHP-1DDj=Ktr;%#UD# z_`m+l?A;W3ow-=}4?Z!YZhrr9GuI9!aM2yFT33bt%^SAFx8Lgh0~RE|F#8~`Dt6zC zbIE5TBkMWVyjS&X^*Uo%F5D7-pr&fw-MCDzj(cy%<>75uSBc$=1(8R?Td{D5MJ|{} zuyFST7NQ=Db-tq7-Z<GyyJi#HZT33$VT)HA6{5E(aWTQJ8+wIYqw*Nui*Lsz>{f42 z%(E*BNTPS^-3+lVl6^&deX~~*^WK{Hfm7pE>%T8G)XHBTOw{xyqi?C%mV=2d(Nh@5 zDqjqXK2;g-reo&ZhI>zzFoGqp=6kW;*?SKbQ)_xJdhZIOHDXV_zb}4gf#*GQ;Mn%6 zyEjzTbZ(EE%iw#x#}mz}M63}sCwp-l@x8ntbLT@Nw?1F(-F)m;-cUu%s!?GNE?*11 zQ->q#!}qdzu!0+pY`Qg*`NilPN3lv*72eKkyjR3{U$w2O8Y@a~O5Aa1Jr|0*616PL zjmMJBST;iYLQJf?=eE0h`f9wFVKD;9gwgy=&D&}kb%R|yHpMpg2V5z~mG6d_^?;gp z>(i+-TbjMU3}I#Z-PId#(_zDyRfgPx>y~IeJlz+I_j)gn)P$RP_ZLsT&yT*)t!mnE zSi!*(?Mu-a-;Cwmn~!-f#VzN13$T`g)j_PezdEqy?yXCBzkL{2O8XPu&mYDD>i-C# zNZw0FunzyS9`CN`Qgsd1K>f7rozlO#5Wlt8+rtv0n1x=iTY$Gc*tp$&CXQS7IQnj{ z_wK_Z5E9-Uus_PA=MEwlrz5at7Q7ShL@B;;18#V+{N(K$@qP^VOK(khe-w&ThLOcL zLSwT3a3cPs*M~sSH+r9g*N<U^s_M4w@N$5We(GQX3;HFr_9P;8cX(fnMBBU%9!x~v zb{x)?VRKLZxk$AB&h63H+duDR3GXzbI*`aTdv`>(g}20Oj(fL7v*43n(Xoe<y-Dvq zSoHILjSD)>-lxO3<7iAonvgD*t)lluU%$c2_ISr5J@Moi*1)|FA5M6GKOFnOCsT3n z^B!vbZbW~^`{u#Kr#2(e4c>icBKO|zRm8ksJlsS1Y^dk>A+DI>_9D)Q6nBL&C~7cC z;;8^E4>x0e;G!_sIMM59M-6=jH@dK7^DUo=94o2n$*>FjC@!Zn-YwDcYVQN#7#0B5 zH{XesGjze{5A}HWVX^r)4<~wSyf1|UP0uL`y|^6t-i7M$`^1QuPE1c9DfBj>v;%QW zir%qs!uwm)U>uFO6QSY>?@te*b<uha;fvn8!_T2}JsQKm(ZlG`-p$c$d@gPhz$!d$ zr?A-4?0qF<a<?aebzM9jVX{~=!c{->{I*1Vv&~5Um^pq3L*RX3JW;{oFp|b(;(Y~K zc|2NfM(4J0<aKwz^&3ycA7HV(#W3pa1bj?~qxEs`4qI+qEmdQgX)C=%8th{)Q`o{P zrdnfH5v|L`@7tw%o%aie(W|gn^>e7AUq-5U+VY3t5$}_S5>?*u$79LpA7g|xV|k`J zQQI7;d71Yz&Q0ETZ-{xni3a<FAynxvVLj(5ghvl}=5Y+E@u-<+ytnpv6GJ0?(MP@C zIeg}ocD{@CMjp5=6D>P}WgRZOp$@+^%*CYQ9;}MNZN@tWw}oLY1$hHK==@yV+n)JU z9P=I~L#*`k@5UD(cHx$pOCp>F`|L7qZpH5eN3ND<7O@Ozx`}rpqBXzg588^=V&(?3 znECz)^Yi6{=2Tc1E3{AEicN=dGi$5XR=oFP#Wdo5@gQ#q<1bY62Jo9^S^G-|Z9ABb zfF)X-?QdjaZuQcuN_g)-oY;aTA3S2Slde@4_BMOJ3XPd$-8!5%gu#YLb|8VHkrAZ% z)r07izr|M8dT7=3nzeGH^L`;>SH~H-cjaJ@m&IIDiU&srj&UBw`an<fbruNz`JlgK z|K8lP@IN0^&HY9s!O41iU_cgb$Ys{8-ycJdEjt$XdN7^t@4-E=x8JqFXUwAT??=$; zCZER&@%Rc)NBYr~9$T|ukG0ZUl~AF#&tI+Y@mK3vy25Sze;0iB#b(X<110{#A-hKU zd<2(7c4Y=Dj=!zNt-`0-Vjnem`E|4#E+-DfB5&h*@UNmT-+@W18;^x!HFx3xVh^AG zz5Go4!Q5HlfpBIIW`=!d5b&=KMY9O@^+Sp1<9tF}!zKRjhOi9fy$g@vp1>UGU5G@p zRbF=jvq;Q)Fy`HkdFE4b_TXDlY@9W`tudUJQ2-<reT*lJzYQ_fKO4qK#8Sh}c>Gin ziP;mx<H+4Y<jkE&XZ8^L?B|i?k02WltoQx`!}8Y;!S|~Wyf<3Mc^dxS#_YU~<$POg z+g-^joR{ISF3}qul#fmH@h1A%6!7sG#QceaXPUh~Lc158i9UgAC$0ee@*#G`FPWPA zWjxr4c$dQ%3S5BpM#Go|K604D8GRM1&lqoKP{C%w{dW;(9cQ-(6W+Pd8ShsPC+sQq zQ*4tDnOWhRd|2c?ZAR3$`JgE7eFE$BM-Gqh%;inMzC0Z3`^)|~PY&?<-H>8m#WeOx zbYaHzWvC+FpPS@=!zKTx;Y9RJXv?>t7Qch%q-o5_9~edx{0t)fmk^uu%Lfw}w0Itf z&^I$92Ux<QV@UrD<NaEQ%gm|hN9`H*SvX~IZN|hti0N|=B18G(TeoFCmGnM@hVhPu z6Q5?tZccBvGs-?jS$fPHIuqyE&K%>y^~)1D?R#Iw$?vaFNn9-cBjoUha87tfPv7xm ze>}z0Exf<?FggPQd@jVeK6*INWZw++(36=lAL%jY=^^w5rvB51&GPtF#EJ8A8_vs# zN7$OEGsN|66W5c6nX&JLj(N96Dom*Vff_Ysd*RTC_YqXmUtoIv82ZDLyl7et;p*;> z-kI>8hRercK8woxDEMDc3w$s)8BQc;%?TLiw5<212NOwe;b7wb@G}DECVye@f77Xf z^=c+CbB-ze&r<`t-v9fj22LyX)PNg-fA^{30!HEglV=9Jb9Hm#|KnK!liC+??`6(6 z-}f2ePMqgHa`**vR`{Rq)EVK@!4XaQb`qS7jCen1PHq>?tQkB%Al2*{o*BH?Mo*fl z(fdO?GbS+&j_7RR-FJ*rJ3X7}xFivO@cp0K40#Wy;k9RnU%~kRbM>(ZGV}uG(_@@P zKX;u;77<*;44pd-{Zj4}^js*KO`6-j|AS5?P3CN|8XCcEmpyCXoPsiZAd=v!hWAsk z_`Bl0eYn@odOPuuJBI&TnxA~iyYq#o@8WH2EzXQDc%M9+co%NEYe(?T2VNX%#8skK zAH&nkX>Vi9`-vF-n^5<?(DE>DCu829;S%iQhhy)GAMeAX*yzda>+i09(p-6W)9DML z*xgt<%3!7E%{^Wm=Ta|&i)Nf+d9uaoP3&t=;ePwMZFkjT6=nk;w;}1;qj-I6UGKxs zA8M|~MGc=&)>N&(ySE0f{xnA$yc=;V^TPAZP-1mwd*T6DklBs6PQ#rk%87(eg=0_G zRK=T{zZRXubEFi`+;|uhz0a=Nec}*rD8k+RXV&yk5uXdcaJ(1idR(gZ;+7O%vF7pF z$a7d&N^Hdg_8-P$$LK^Kyl`3Rro^cC#spqK?0jy=G#($PGI*T}Z;2(0hn~b3Z>;_t zS?|Z&jR~)-hvE7Xxbi@5wl(9KbG#Y1awAwK`@`%=^V}oNbKZd-L-gABy#%k__0(MF zhT@~ck+i!N`&{nzi;oU-u3s+T{nL8$dW(0-yzKD#f<*MKri8dgWogZwU6XOaN={_k ztzPzp<8h2hD3R_v5s$HbwE&kw#`Y}TyfG8EyZOh}{EZ{HEJ91fy*ga-O&v~rA@9u$ z??m{F_v~T2Z14{FC{8pdosUBAV~2S?e$R8wI7>HgH!BF}tlu1tBzPV6PX+cq#WWJ` z`fziX)=GglfPs5EmkD;rcwal1u(zCF;fpEWFL*KUN;r}Vd)s?>bM=wKSoy$GK@!Ub z9Mtcmr=RtDqCbN7IG~7QrPy3Ic;7fQ65R+dPY(0R_&96VTX8S8JmXnUFJLJ_HS?}_ z;ws<N(HC+p@hhe!{@#l`WUlt!XR`D~@0eKtKzw5!t^*PKH-~$;7=YWBI}^=YYoGLr zaap<-w=ZYSE4X1^O}e*0kVLr9bX@bV%KJ9v%CPqplhjiMk+<P`ek0bk!U?mc!8dgZ zy|H(idv@;|fx3)ng(H`L*V^C7wf4w6b>;tguLr9a39eo+eeYS^3Vj@x&{&vgPt<sy zz)J7e9>WWX2e2sd^KtK^h0pzGkF{@Kg}<*JTVtM)fA22KDXogHa{b@kQ|-kAhMnn5 zi{Tg0r6xFjyr&8<1pjw-Uvmbzez!#?-V=T9mC0?*nE0_2S%Y;&tg<Jte8!hU_QjHT zS+2SoFRIpTsb04&&c{nt<}p*%x+V}$CKCPT@xc?Z{u-?1W2!$eqN%ozMKy~#=79wl zW%z2`-b8QnQ#j3>I{e(NNO)bfeYF*f9k`7y!VB!N67Tb&o*s^6`^xN=!jZyc?`SX2 zzn?yQ3^N86KXx?FZNIxF-o&?(cg8*y-+ot(S>XBUO!Tc=YL4Tii#H{XZLP+Wg_q*& zS%cR#U!K529F$<)IzG|TflyVr3HH2ItZ0=y?A?r4vwQH8Z9EPQb$F@y2|N`mA4z-- zi@9yy`wsVfAKp;2-@-em@pv*4!EYu8_U_x$*}scFOW4|(-JR*)zj6QWzP`|bfxg{) zySjHh^mw*=SN8G2?vQ-$-`zQo>I-d3?|LvDdZ@2={VuxP-_@DzZ0+8i?b|yL>Ko|G zw$gF$K(>1zyRFstw=tXD&#*12jV+;_=?8YLyEnOc*XC{ahjwQ=_ia0{$M@RQJ#;_Z zTDp5e`}>|iCJ?XvnZ>RH*`B&x-2=#A-$3uKf&HQW&TQYnx?S15JF`9O?qve^Z{NCg zW9Yyj^3|Q%yT8w7Y=7#&L;Zcbw{+QL)~Nl`C|wn~Gn?Jl_t1fC_nSNW4|J#ZJ`&p5 zx@%+W{adz}oFlbuJGX`g_jTiEA$<egU7H88ec8vip-My9y|y~{^bM>J;opXksY{a* z>pa;#(3{OL!^zDX8`nF_24|@anX>ln-?nFec3*aVzPQ0u_2z-yp|(B!TTtse2Ob&N z``7?nOx4i&!R{<7rEZJr&Z*ESw)$NWHt*QEG1(gG+uu6axjWa|gZuXO@9kxg`vy$u zT}mz<SM}Y2)<7ko4r~^XPOx$6(6LMwZClm7NSmVG9!X{Qg__^8i@B_`&E=Xm&=c?9 zyJru&nBQv}yLb09kEzam`@2EP$b(DORV3?oV{4i|ThY0;_pGfsHtN>abW7Ux`@UWz z+pR9n3JEkH@>sWP_oJQIMkZ(7;9F}$93lhV`%Ks0x-t2{_Li+KUiN$RadiEMy7#Tk zd1!wY{nvSAEE_q1`u7g>mSZ%qejY`%9CYkLtvfcYZ6A~!Wi-RWG)cGVG8~;L)3j`# zzHGL?TjN+g|G?lNa<i{{|AGFj?Q^d3QOX0|Y#X)0b-O(>vpwCkxy5<f|483pYiMIS z-LhrV&h+L`Z+F&pkSzmU-9veK2n>A0v$^g5q$wO{i~%zWQk}is`~9Bd^6$D}D4yB7 zr#n8_7vH~o*Z%H(k8X%}?(HAi(;qj#)(Q<~_pRf<^?9i#`%HDB!UwuKQNi6I)$Hbh zE*7`H`_b-xW+au|*&5oiZ40ut?f&hJTedxz8<ZH(8~jL3naxOdIpb7y00NujMaCrt z;FbZ@abMT^P^W3@K<k*s@8tZPoBeV%j21P0-_-^?3+Cwq1N+f)ySq$x;aq}A83ogb z*==WNcIQDiNxBFE{o6V14$SflgQA$KVRy_+sBb^#9Dh`@a#3{~x2A~J?a5GnDOfS4 zrcmTHQ!TThLSmqHnM&E(ITS2+YVU!8u5I*($kQzww<P^WfUD7{x2~D-d8XQ#e~#Fn z*}E^BUz&$HO%GsB^3IWFD4=_=9?X3E046>RoBeAN&B>;S*BvlMV@FBffXT2GT+R3S zXD;+mG~WPzbBHEj^}Ey=Y`+`-YvwZy^PYWs_oPBQw>59u{+4ZK)>q%;$?DDS%*HOV zE6@k?<qfW@tB=;2SdF9K*m=#-x_RpstHQO#?nhF6>CSx^{kcrLb`11HH5Gi>$xZ{{ z+OC1tzQ2W2q#Loe7TNK;_wD9s!A^a3o7q0y?ree!gq+7DYSLZ-alGVR#qgrToUGkB zV?D;EJq_c$D_d=7?_l>pUL2Z1_hvKb3drKtE!!|*V5T0}%ZhTTyW*Lwn8~#+*K707 z39b(?ht~{obiZ_GuPu;&vUWkPIcXt3Ej&y3=R>ums$@;iMI8n^2S<RNd=byK?c3V6 zCROxY)>RS|cT4N`U3GQ$ykXZm8}~JN$u)w?ked|O-Fuy@6<4Hd+Ufe0b=^_sm)Z<5 zG$IOQniVvS3fB6)gV&zfy~(~kDBeSHoI$eYH^RB$!63PjfGTO)+!orsxBtMN0iDj_ zmV5x7FdL%X%?QvntvuvrO_m~eYSx9bf10?qMuJ_A*)-!+m5*}aWMw*EGM#G~b3)L# zz%P*dyZv&yt0-g_r?y<XnMs1vhOGg6mEdL@Ud`6#B6q!6*Lpcmxl4A}d``m|zi<D8 z-MA|1>`!Advlq>XaG+atbN}{jZ{FOJ##MxCH+Kz^+TOY)y=D8hT!q<d8CNHP$+CN( z3+H-X3#RsWAL!bP8O5GoI5M|w+`2i`*@K%37m{_9v=;*I5}zJ7BEj5@wLfsl6f8~f zs@FD0P-{9n$4}lF#I$-~0@6spiG>q8yyO06Q(tyZ=ODAOW9MdEvbvgFb1H+ram#~S z(wGnTb-!bGpKaaz!J*4(-gB|}HsRiGKc-4{Nq=(Ow3%t8Hn-frEuE`*SCm}ptSR<8 zmm5=aS@eE;brE#-&j<FTzh<)YXDwZDnM(>y`uQgf<m>+JNwhmG=o*`FMfl*ho#pqJ z<G1{=_2t!jI`{3)+=n0gKYA~Op8ma^*=qdQ|2~wjiw=Va?t8Rn5Vmap{_3v2&VJmm z-iI9l%By?JtG6Qp{Is9)8{SY}-P1j^yL*tgjp(Slp>^Ga?Wj99)2?f;i*gr+YTEo# z<mNqGo(1d4jlw{G2wVy?O>~c7<y_O9<j3}v?YUbQwGCSTaa<rENshTzG@!X9vA2Pn z>|MB-MskhqMzy&IGqXYN_GVoOmm$!HGM!!b;~p`04qRIou7qn&C0%=icWCBjibX>n zbE&(KflCAD<R$`BmAL>$3JiXGvlOUKcUjPS|Hf_GFt2ReZVKfh*oG<&-QTz|y-~MP zTa&wZcW6)Bn3T<h^8wsaG-9>Gbp{ujwT^S5Sr-Tm_IKhA!qlca%Q$~&Gxs_P8w5Uh z|NU<)uWaeuKlo5z=YZ|Y)$7+C+Bev@0cPEu)+w~H23tjRa`%c*_;s+}aBrxvFdDuw zd{gA*1tsCz!nb>+;XA^wjJ(P#3;zgTI}H`V+jnu`fx+-CMK3inoXio$|B`?`3Hzp7 z3Puqu=bnbW{W|Wa;C4O#+#V$8pXu|!OHiR%u*^u<!w1`5q+uFwDIG0*>V~Hap7F*a zKO4^Jy9%&(jc4>v7LMNVRKe5UGeJG~{jIX$udAQD5&MWBO~jw4cje{&zbT{7FYhQa z+-}^Xqrvnpy)+kJUVckeo+CemJ%?a#x}|uu;3>Q#@{C`Wnquq^gtBZ3mi67?Tw7#r z#XeaG>++U{g?U)p7N>5*UQ_V5=@#VeDL;J0E3l_aApAV!G2<`4Y;Ct=ZyUHbs*PRV z>tGo-{{6g{L*{V~x^k13^3mv1FL}D~nH$Cm-tGN#<UQe#3%_&+_924bO@XqzvT#4; z6m*Tsvva=;_jJI$9CjY{ufl#yrvA%DU-DGp(>FX*Fy_5G^3!n2rN=#%ZTX5uy{95i zQ&$edV*<MG6`p%6uMM9o3v@H4-}!O7K0E$e#EpKL*Jsg=PR~7%&)Gif_Yvq_nYp(y zo=WBF-??*7V}7s3)sf4~(KyOu+|@1^A5K?=y>A8)SMnA=pH6pl11bXHf_<@^m4oAG zEyf|ru<4d->$k{yF?$t{BfQJsr8i<PDWtWwKQ7+q`i<>pE_~)q*nbJ(oy<Ln#}T)S zue||#2SHxj4^taoyzZ|yqApC`m$=zr3`ykbp8E$MF?FA>cWH88;Oo^r_XECO-H)Nu zzF6Itw!C=VkEO9+74p>-XqR%xJcf3D@4Dwczrnhn`$+^uxz^VG+}p2T_f5O<>;6=S z?dz@{>N>Aq_f-#Jjz&_O0{M3BHwqo?PM(0=1=+>90{H|Q!{yQWn}R30JGs8c&Y>>c zVy~SWFrPiixz@Q?Wv=f&4EHLNN9(^Fb{;cuKM8KSWz8HF7%$x4m-A3=jtZP>PCz%4 zuiJFXj6bfE4_{yJ%C!Q0Ey6pQdj=nc?B<1YkZt|spNpLT%pUYX_%Dayu>`r;^!2=R zW8*F5-2ciREAPNLqnKmpnld-uQt8KaX#{)A;au04Ki+>f3}3Fkxrc5t5(+)A=DadB zfiZyOT$+{7VxO+U7fG|m_m}!_s0+;RFP1l#F87+fUb-_Mx9Os|=BPW3@|bk<<}8+> z#^tT;4954rk*4$4ei38P%o7!(H$D}8`X$d4j@|I?f}i%@gC5v;OPfoxWC7<&Gw#-; zx#<>e_iv7sFW5OH@4O!9$5+4T`fI_@hT+MTyW&gNcTc^D`|uifmq&iS{Om2)Z(HYw z`{2zQKiBpp*Z;Vu+cHYz>WE+KLGiCQo=o3z;kZXz8vdNj&&AO0;^8M)y3nsS-Ey6} z-gHZi3&(H3(C*|}$?kl{FO{TBeu|$g;29rvTn?EBzXs9)t~sBvz8hS8{N6|~{v(oI z{QS_zi^b26X}nncu08pI3&!Q<u~2OP<9o2c0^*6CVaD0^b@#`zSnLSJxRM@<J+yy+ zD7LX>YYcAmNxc>Ox`wQ{Z?E-ARaf^z2YPq)4fO0q1jgR^&_nyWAGJQMOaI>8L9ugR z=K!CU$iI{P*tp>0w8&;Cwp)+XVgq}#-7(x><F2@K_aio+xkXsS=*Q8sk9ST#z=6vw zv?@OfXpdTeA0Kf?fh@Qj4B=8f)FAoj?Oy2AbSOl3`li1q%#TXOkTu6xATBz%nD2(2 z{=b($OlKwxy01AHpX=9jaQVZf4gC#{7+*LK!QT)fcj-BQKMsAc9C%YaG!1_&2kXF< zV;k%Y>(Z?#42PEKNr#Is0XZ1ol}~x08aU7^%je?5<wPzou!c%rgD(bUXtRgQ=bIr0 z<170EFLd^eHolvnbMf`S?!qvJC0v>Byn!}*INcCLXQ$>3xS0Cj73+upoh}P|Fx|!P zdiYwGP4}gsOZS;T7+6D#_#}5ZEjnC$PeKmHcO?)XZqah_{a4ss7)G&*_;M3;KsOVx z(_hK6k<bIU_I8Jh;{+Un>8>JOwgcPa<uI-sr(tIp_Aef9`@KkL<Ym^*|J2d^j_CX? z{zW8oC*0iO{GEpb?e4hYqU$-<#pxCxqPq<S{RN7Vi-S$%!q9IW;>+Ut!5u6IkIOK@ z@)n?k%jn1~FXuv6UKS1M=8ltp9SMCSC;4eH&0x-J{w@+KuC&)s`=DTa>=#Tk7+=Fn zy-+(lsE%OXof{c+F9`k1cY``FPs{j&DNrs51(Gnav2XHV8{;h+V|V|&P+&m7(ZdMG zt$W}oG<C$VNf?HwK9%zkHtD4UGUqqS?J&;&$$*~uI~9=EOAf|=HK3<|oc48uLmMRr z<4@;`W%I)|9DCUFrCZZsembCVYdS7}jkyN3;d#Gm4_n@afXw`Gy~pVvgT<`@x%iH{ z&WH3&d*rIw##bAVsh<kSPeXQVMlQZ-tRdOM#usISn8U_bACMW}bU=O|WVgoT;ycgI zX%6MjWReaxzM9-PvU>j;RAF=f;nt*Fd>w22p9;voi&))SmGgh9$RuvkW76fWlOp}+ zA-gp!=f4!!h4!%dsSn6sg~F|AIsa80fab9Nxvu48TqcFwI+yd`AJ8*D3jw(p{@uD4 z{Z~PD>s~H=w#1L$gb&CZFDG+@%I1gbWA?x&)DWLrFJpY{%Wj>_#ovf^GUuQ1&jjQi z_;>4Q&VL%~XF>m5Pjm8q_;>4T&i|2sp7BowWGoAX+`1e6zZbGwYjfcjv99LgXLzo& zIr*32->tjR|0&3Bt&Q^UKz3_vl({D6*48M00kT_1qx{d1-P#%De}(MU$tZK}WC<5- zTpOdzs;(+mb|5o<Z2_73{(ww9zg1=r8@?$ZQ=bjU48IVNspogj?16i8<j1YYx%`}c zt*@v5iV9z5e02etdVT}V9yUK2PO|2(<+%`$8GbP!Gd#bMW)B-aUFplz``<+4M**$O z^+A{4@iqSW-86gH_@cQJzReH6r54oJ-Q~+n?`S|~eoqEu>iMlTd)W9(t9+Sy|J!T$ zawGEV)+=3plWY8s24tppH6Sy-scJud>dRujOuhdtH=Iw9o?8cX>9w!%&+oa}BOH1d z{@wbh^S==H^^Bk2d9z12^e*^!Yo^ZsVD19Q*6(CMW_~XOWX8vD#MvVp`bDO%bygSO zRIRV4f3CIKBOLk&{X^#3tMk7U(9=J^C+GY#{po;Az5i`F+kWG9@~-h$^#))5G}7ZY z=eU;0^!^I6TgP?j7yY>JpYaa{WTszHpRf17J*WPO^<R6ae+FcRUkJ#IpX<f;z<h)J zxb<V^hv$B`ZtU_m^(Nmx!}B|L_OR*K@aD@L;Sg>M&A0EyAu~Mv``^N|{@WUiXZ*AJ z_JI7O2v2zhT9^JrK+pJQ0&+e4yY*`4e`+H<nZw3^E+Cuw2*`|YXp_7nKh&QN$kbm7 z$kaF9@B63T|27{!7mfV5HFB4qs?GWS`Tah7*z`^WWX9L{K)!xHAX8uaV7|UFAe;OI zWaf8ti|?O${~Led(A$w;w`TA1JGaI^zXNCwo8P*C%=q|iz@WaX*_Ww5ACOJ`2W0B` z?Ld3j_zSlBGWGtq1jC`d$gg{b;PP9y#{XbIW_n8jnemNo^W&#Jy4{zl=d%cVgw0p) z-LnaoUQ<9%|NK6o^ZyI1&y;;;;ryS2?DX`{?-n}wL-6mOV>tiqExw-qj|61qcQznX z&u<>uBOLlP(@)!VL>FInr?01fKL4;sIP|CR@1BP^|7Qbw`seo%oqwi39FVE^zm;g) zFY{J;*Z7Wd@xvUL|B#-0w!-vQAiHNPF8#|t>HBB=N!|>ZL;d5Ye3^RxTZ&eHd5zxx z7NgbAzCAxYpW)bpKj%Y!AiMdi6ta7k<MKDO%lFUp`Q1i)*!YV(e7O?gPeC4o6T{O# zWqVlvwVl39J)aHPBOKa*@a|cWOTRy$r~lD_{2=_hXGrwF9kP3F<id|X<j2qOe2!#~ zaOffUch8la|K)(5{`s8A`9A>v?zxlmKeXG|(|@|lm)U<N12Xk|K4p(^=%*2%dtT+@ zYwY&*^k3fN%Z#rsAXCrhTlNTtrV*ce-sR$33h3$oY_IR1@ht>o>iK-k9^uf(5ubZr z=Hjc&_<Dx-j~h&T^EsM5!lB<oc=ue*g&zv&nI507IsbnF|L%Dk{r??g_neLL*CD%S zYA(L%K0iF;<8w88ghPclSa}8x&VS>>zMlU1oXsBL(5>+Ap1V2!R|0za=W{pb|26RM zp2N}qddTiM9OX@r-E%k>-_=L_@Qg3h@5}A*@1D!i|6$1Pxtt4MKH&Rj_|bsO_LvLE z)R*t|{Zl_R=*!geyQ208hkgd>xo3PXy{dh_p8necGUGcNkg4alN9|$9dq+T~emo#E ze8mBIM|r6q3&_-;3dq#++oble@uwd1W$I4{WQNZU<?9y$GWF5N^Y#4!*@S;0Uq2I& zsh@jizP^0em#M!RkeNSz6V)Cz|7Gv;W$IG_nc+tRGWC}OGW821_-77Ve|+}p<l|^h z%6t~<+OzCQU(fhv0y5*99L?94Jmt&OF9l?VZ+bdkU;B(NQ-2~LGkn#%^YteKGWE6Z z$=6Q>Wa`iJWMvLp-pc`*`i7sCTK&oYRx8#kP#^BOv#XCIYy2+<WX9L_bNTUI4ak3j z_}ueq#`jgo?s>I~zw6oj@cizpJ#70g24vRP@XzP#mjg2O>0ij#9|_3Rmrv&F>)-3k zCjNlT@>TxVeEs==Onvgd<?H#J-5%l4cTisU+})LTCZK0}{I0C?&-g9}Wa`JJq(=Qw zzZj6IkG?NoKNOIuFa5=Qee#!lnR<S=)*d$gile?v{kee5^c&xwub&CX)Q67c>$?In z^{M0e`qKfK`l0E3{bE3-zUc$``jY{f`hs81*VhGP>dQZvuOAJ_)K~pVzWzc$roQx7 z^Yya<nfmO9^7SP=xthb)??gam{nmU~YPIjtfJ}Y;ujT9ePx><T{PwIpZ2WTpnfmhq z*_7`$eE-z*d$RVh;Y&X1%hV4A<d+rVe*9zT^AUf(oPcZ(JKuzU)0dfECLlAu=*NBi zU5L-USHkhJ6|#G;#EqBiY2QD?F9c-9e<dJOKmJ?3f9h8QGW8vw$k&etWa_K_d%nJL z)|aUt4akhY=9BsQ`G8D)`b@r_@5I<69C|Ct>)w%Z<vkV9Gd+G+*7;|A%K@4CiBCzb z{<9R2sV|<(*B=SU)R%ucU!VSMU#6blt+j{kA638O%hX>8$jo2zY`*?fK&C$WyZL&4 zlhz(K{<h!qWyU`jkQx5S@8|260y6cfbNPCHQ`a6g{^%e0GUKlg$P8ccnS4FJ4{Hw_ zzUI6yGyHr&X85u{%Gb{YWa@|hIA34-C%#PmL_lWzH5c;rM+36S|DWdTFMigSslODE z8Gq<=`Feg6*B-WfivgM8`F+`-{#-z&zVa`8eINR>dzZ`g=i&ulPyc*}%O2s-A^3Oi zbUFWvU-0$x&-c0Pf$MMhckg#O|I1(W_4Lp8yX+AT9fN=OzL)b~{v}^e|9tPu9#{{C zfA=1k^Pddp>7Va|Isc!AfA@Zv^FI{O(?8!6bN>Gf{@r_H&i{#kp8om%nDc)L{@wdz z&VT5yeLem2`?2=0?Kd5esc*O>wdRNUfJ}YrZ}Rmg0y6cDf19uG|FSPrzZj6&zmiM& z`cna!`kBAW*H`|%FH>Lt558>T56IM4UC!5E2*}je{bRnK->0>Qt)KKi`7+~Q3CIlJ z@Xz^reuvf`HvE-<%<$t^^7U<B@n!1$Z{CJOFQ7f$yML}d&#v*$@7LPHrq>aW8DHqD zQmZ{D0y6c*%lZ1QfJ}YCzvSzyUhrk=j|ODcN72{v^@9PK`mU9H{Zc@t{`}YT^_l<a z%hb;XWTxNtulf3O0hxM!7uO!PelA`0W$KT7!<QL<!8d)GdVc@b9ya``fJ}YrTlxCp zRbQsw|JH6e6n+Wn``frCfxBzZ#_#0&=lhoSu<4DV-JHz$_@1Scncvd^nR>o=8PuN* z$kg*a%%DEXhyLcU*JFGa)5(l~Fd#EL-@^>*hXXS8d@nPo9}CFT^F7U=em)>m&v!M0 z`nrfOQ_uG_on96LzNy9h`bRWWjQTdm4SZS@4gD}>*jWXXe~dE5n3Fe9h8dK8BkfUN z-U0d2jrQFrhVO#hRU8W4Y@&#U_Caog3@;}BLy%LDZ4%MYGmx)B2^jseurvnzzaMg4 zK>jd2qR?gX|8dAQukiEpdyog=-{p56a_UxJ{u{_;f$(2}TzrSGM-f8PxBK$TAs>0A zFTWP@rI-0~E#$K$zT5=44)MG4wLxwO$Qj5@0eJ{=3Nm2I|0FDJkX?QK9ON#@u0G!n zc@T1e{GWiFh3rZGHONDdUHN|(@?`{e@)sbtz0{Y#4*C2ozKm#chi6vHaw5_w@&(wu z5F!d3Ug(Dc67{I4z~PxU27L!F_sa<D=7nBi`YW1GN2#+IdbwW-S!Zue@Ag8shhEN# z)4_P|Tq8F?cJGD195ucTvU}f~@=rl_?|V~z6ta8YoAS><cJFmlo`LM%>!y4TvU{(a z@<qt*U2e)tkllORl*4E%_ue+;S3`F1ZBt$c*}bbx`F_amy==<<_q{7Rxp#y4d3;4z z{tq+*zt+s{bMYeEF3GEY`@g~c6m;!xUjsiq<!_|}qWdLkz$uB}olDHUWu4oWLy9#& zqLu44J1aPMf71}TxF7UNyzV9m(&aWSk$mlsjs2a&^jl~b(rkPqVa>19O~vU4;JzJu zBjj%q6_lX7?(fFe{ER&BC&AL09|Svv`|a@BMsn`_mGs(Qw7X^s`e8dc`PznZnl&xu zoUduBoWgG_=j0m8$=7Wyr_42%bGW9xf(kX5bIRXqW=)fsN?coM#?jSSPH@$gb4a4D zjBss58Rs>%WZbT)BJ1kckC9#F7~#4#V>G#HG14`4l5-9In%~xjQLU*8x3$7`whg+@ z-X0nO`CBl!D$jQ{iRC-FJumFf$8#GoKs0+`1svQCE-r-Y@Tj8A+L*|0vX!?(MNq(w z7Wp$;ZlAf_?j~+*V~}W{f*7{d$i~*YIV*3EgIM4GeVwrl)=RDP!v2Ci4_v+Ydr!&5 z-wDFi5<}!Ahl%2PJ44v?UT@R$_t8;;xgdUuroyj@eO-;)H6yT9k&S!ZIve@A_5QXg zD2r`4Ki=zZHL_-}1Gk%mBEBcLy@Yl#aeB84jFYVzZRH%~A+R5bUxOxNzL?iH>hgCM z;i#~?`UJOEGabV1QsAcNoa`*y5O#m;^|kkG;MNWP)-h%~5p9y_wic;#7R>0mok%uq z_U*~d{w6DHHVCs7?NZHkf}Df1n9W)2W{}Q_JI!3X+gM)la@&su!?<1(bn`cdh}G7< z{@%c55wUyjxu-TL-&=d{JuI3wHKEnTM0;S@DoEUy1HcYZxeasjGUz+6&6Tgo3t+a_ zaoc6C4MXLwU1leVT?Ymp!=`1sb`K8j8r)ZNedl#+_R+GtYOT9>v)xt;;`R4XgksAN zv?=Akx#5vwGl^nb9Qw`MLIm=IFS^%dPI>K4N*F$CqP8x<$bCOM^LN;UB8BVc$fk(- z4Km4P0+R2Xll&b-1g1$e&op4?JFj%-J{V-1*e-U6U1CP;7y0`MhFcUbiA&;T@rt-C zu83E~RgpJGjE}#wAg9F>;*5AwJSCnM&AY7#Hz)b5cuqVoat{T@KQCSs7sN&JlDH&Z z7O#lQ;)-}xTow6y5T;Wn){6~dqu3-S#gv#9+eE$-!uUGGE-@qai-TfT91@4cBjTty zCXR~};-ol@dvB(DLYxs#il@ZW;;c9)o)yoD=fw*m@BJD7MR7q~6fcQO;$`uQxGb)S zSH)G4H|>nSK;-XgC^v|WBG&}yo)lAJTI3o5_3dJZ*d=n!fck!s>o1hEBG(Wo4~s{{ zQE^Nh7bnC?aY{TY^7lTB?}9il@?Mti3*w^4^&h(P-j=*9UJ;kY6_M*b^tUSV_dt}p z#EfX(DS`W-Wd2@{{)WV1@rXDoj)~*qgg7ZqiATk0@q{=do)r1}Bc^*=oE7K9v*J1N zym&#J7cYtn;-Yv-ToNyfSHxv;MZ7Amid=?a{tCpXh;5OKd$Cv|mWpLg#`+J#mx<+K zg;*(8i8W%aSSRv#QH+P{Z)8>+5{Jbj;;1+#j*AoGq&OuW6{p1$;*5AwJSCnMXT>@3 ztawg5FJ2Jm#fu_;uf_5ViNoR%aa0@=$HfV8Qk)Wxiqql=aYj5To)S-sv*Mh{bw}pw zoOoWmAkK>yMgA^~{+q<4m=e=so7gUPh+Sev>=y^ctT-eNi$}y!aZDT+C&Wo{N<1n~ zizh_>{*2`q701MJaYCFFtIDna8nITa6YIqWu~BRilVVCti~ZuDm=%Y_VeyDKDvpWc z;)FOUPKigwY4L<OBc2pbiKoR`aZWrdo)gcD7sPq-qPQR~ikHMC@v?YDTozZvtKzB{ z`Y*Qr3&g0%-^sBZlVVCti)~`N*dca_8L?j+6#4r)#=9t95|_lw;uUdOToJE|t77Oi z%D)&Di^O8FL@X7{#B#AhtQ4!n8nITa6YIqWu~BRilVVCti)~`N*dca_8L?j+6tg0K zZ^-&PC!QBCi1Xq_aY0-ZFNsUyW$}u*EUt)G#Z{3TQZW4jF)9{`#bSwADwc`mB7Yaj zc<RLlu~BRilVVCti)~`N*dca_8L?j+6tm)xI4m9!N5wI5T$~Um#VPTqI4zzKXT+1@ zDe<&8E6#~$#dG3$@q#!nUKIJeQPy9-I4EYtA#qqdB94k<;<z{=PKs0FQE^&4A<l>= z#Z%&GaaNoY&x+^7^CExW%5q#1m&D8B6>(Wy5wD7?V(4}1mts^b5{tzWu~aM*%f$+@ zQmhhd#9FaVtQQ-^MzKjuiYYNIwu$Xxhu9@%#C~y5%!)%IfBzfV6bbQny{yLxaZ;QT zkBZac32{a|DV`Efi?iaKcvd_oo)<5O^WsHuL0l9siA&;T@rt-C@^{EAPmx$GmWZWd znOH7Xh?QcMSR>Yobz;5PAU29kVp2?rX|YXg7dyl*F(dYigJM=35{Jbj;;1+#j*AoG zq&OuW6{p1$B7djN`l}Zk#7416Oo}NnEw+j6Vu#ozX2gDRP|S)$;;?u`92LjJadASN z6sJV~o}A@4C7u>%#X0e;cuqVoUJ&QSi{gT~C|(km#LMCpaamjuuZpW;=x&?O0x>EU ziN#`xSSpr@<zj_cDOQO!Vy##w){6~dqu3<!_x6!Zkr01J&w5OWX|YXg7dyl*F(dYi zgJM=35{Jbj;#F}~3{|Us#HdK<ffsaPhKixpy}SS8kowPKxEFE)scVw0E@Q({_d z6WhfOu}jQ|{o<gQ6^F!O@rXDoj)~*qgg7a39|E>lhu9@%#C~y5%!)(euy{lq701MJ zaYCFFr^KV;w0J_C5xMUH^S3Bo5|_lw;uUdOToJE|t0Fh2VtfT+R4fvU#S*bpEECJc z3b9hG5^Ka-u}-WP8^lJD`!p~=S#d}l7LSOd;+QxtPKeykf$_|X7sUl}QM@EBiI>GI z;<C6RUKLlx(0bLM7!`}eVzERl70bkOu|ljAtHc_yR;&~2#Rd^y6Eo#)5|d&|Op9$| zyVxP(14Jf#M&y1KtiQ|R6>(Wy5wD7?V(1>#hZq%$#A2~TEEUVda<M|J6syD<u~w`T z>%|7KQEU>EBKO%~xlV{P;z{w8cv_ql=ftz(Iq|%BL7W#aiVNbRcu8CmFN;^iWpPEk zDz1v5dsV+;R4fvU#S*bpEECJc3b9hG5^Ka-u}-WPxep2JZ$g|Dr^KV;w0J_C5l@Pz z#M9!eI47PJ&xz;73*x+ZQCtug#Y^Incv-w6E{iMTRdH1ey+QRXM#UnrSS%4s#WJy6 ztPm?j?!&_RD;7({Qn5@d7c0a{u}Z8FYsEUTUThE>#U?Q+ro^<^Cbo+mVwac^`$g^- z!*W!LRbq`;E7pniVuRQyHi=0wC8otTv0dyCyTpvxFAj=XaY!5%kBFn<m^dy@h?C-! zcvPGgPlz+(N%53;TAUT<#Is`bK3ji9VzF2vmWpL!xmY1qidABbSS!|v^<snAC^m^n zF(szOHnCmo5WB>T*e?!>S#d}l7LSOd;+QxtPKcA@lz3E}7Ed_+n{53Z6{p1$;*5Aw zJSCnMXT>@3tawg5FJ2Jm#f##CxF}u{m&D8B6>(Wy5wD8e*NEe&R;&~2#RjoaY!Z`V zN=%DwV!PNOc8M9WUmO&(;*dBj9uY^yF>zd+5GTbc@u)a0o)Blmlj14yv^XoyiD$)g z;(76cIMHD1Z&I8RkBZac38&wvej`qcC&U@?q<Bg^EzXK_;#qM)Tof;fOX6kminuJU zh*!l`F|^6%vp|fBMPjj7B9@9}V!2o$R*F?(jaVzziS=TG*eEuMNiij+#Wt~B>=3)e zjMy&@idpfrI4jPHXT@{kdGUfcFJ2TE#6^+&XhkA;z9%Ndl$aLV#CEYm>=H9#zc?sn z#UXK6JR**YW8%0tAx?@@;!$y0JR#1AC&g3ZX>nGZ6VHn0#Pi|>abCPAE{KcbC6W7z zvHohrTCq;77aPPzu}Q>RekOcM#OGj*+$Oe*9b%W55&OkKF)I#<!{QNfR2&n>#S`L; zcv3tio)%}tIq|G`PCPGO5a-2<;)1v+UJ{qY%i<MrSzHmXimPJi0b5@MVpJ>=i^USL zR4fzA#R{=ftP*R)TCq;77aK(G566CRQCtug#Y^Incv-w6E{iMTRdH1eJ*aYuQL#uY z7E8oZu}mx%E5u5%N~{sNkDZwh#H5%K(_)+0E_R4rVn*y22gR&7Bo2#5#8Gif92Y0V zNpVU%Do%?h#2N9VcuG7i&Wdy5S@E2BUc4aAix<TOaZ$V^a-YA*rbvkU_pu(&is!`h z;stSDyeKY+i{d45NxUpx5tqdk@v68gh7vX(1!7bz5{tzWu~aM*%SG-t$nw;S4Pv9% zBqqg_m=@c_cCkb35;J1II4EYtA#qqdB94k<;<z{=PKs0FQE^&4A<l>=#Z%&GaaNoY z&x+^7^Wp_@Uc4xBKStJHM(h^{#jH3a4vR;`QE^Nh7bnC?aY{TYPKzhR8S$ieN<1yj zigV&w@tn9IE{d1LCGoO&MO+qF#H-?}$W7l_F9l*$EE0>w60uY)6U)U4u~MuOYs6Zy zPOKLj#7416Oo}NnEw+j6Vu#ozX2gDRP|S+lS2MCH65@WDW;}@vVx!n3CdHJP7Td&j zu|w<<Gh)BU{WqE3W$}u*EUt)G#Z@u1&4w!wqhgU*ES89+VwqSjR*02il~^OzigjYW z*dR8FO=40^iD|J-Y!^GkE-@qai-TfT91@4cBO>=3W&I_^l$aLV#CEacf3bJ}@vV;c z<Hzsz^qdpt1UG^@im)OmatJc=nK+6b;s|0of@}*qIx@mCvWc@GCL;)nn%IJFy6LQ} zv$EQ<t)`~4&Wf5IdbXmrvTn<)cE0a-?pMx<e%NQ9J$xUJ?;qbj9_{mfU)OcN@9Vnm zpXupIFp3@6i7||00+X1+G-fc1In1NJzp3_b7)Njv$8a1ca1y6*8fS18=dg_PXq?FL zfi|?Gi4JVUCUjymy08V^sPD(B<BMPvJFpXD7{>%AQQx;!^9<q;mT(wHa1_UI94BxR zr*Il)a2DsVjPq!m%>1DZ?P#I{8?gzU*o-c0K{tBPi$3&YE4E<(gBU`6Us|2N5)R`C zj^Y@O;{;CP6i(v|&f*-FaUPA2Ghb*!JDTXgMr=YSHlqvm{d9F)DNJJqvzWs?c40Rb zu!ud_i+$LS12~97Si)f(!BHH;ah$+OoWg0G!C9QcGR~uMD)Wmrw4;d*Y(#y(VV%ED zjA0xTn8XyOF@ssmVII4%8w*&(9_+<F?8gBd#33x<Fpl6Tj^Q{?;3Q7rG|u2G&S4qn z(KwBHMt#3!oxd5J#W^hFJnDzvX!{1Vp&d<hU?Vo66PwY6E$BuMdeMh|Y{fQgIK%3f z4ee;60~@gko!E>nY(Y1A(2G9wV=J~{0D~C9b_`<#qu7C+7{fRwFo`KlV+OOB!#s9j zHx_UjXK)thu#EF)oXK&3HngLO4s66GbYe5Qum#=dK`;8ykFD5-0SsaY+cAt0jA93N zVhrP$z$B(HU9CUMnvW!=FpU|^Vh;1zh22=dBKBY}_F+E`;2;iR35Rh6M{x|t(TrH* za9|@gp%a_Yg)Qht4|>suer&}y3}6sL*p6Y0U=%yB6Jr?11ST<sY0O|2bC}02?8X8X zu?Krm-=AHtk1>?bm#oAIOkxW4{n+bQ)f@Ug>#Dwgx~`wZ6s9qQS<GP`yRaJzSi~Oe z#XjuE0UX33Ea5PY;3$saI8NXsPT@4p;4IEz8Rt<y<XGpU0c~hU6CK!yP3S~<o0&=; z7q*}qJ?KRr`mq(;Fo3~o{n=LjHVj}8L)eaCj9?TyuoGh##{?!Zg=x%S7IT=#F6_nv z7O@9=u@C!k00(ghOE`=pIErI9juSYEQ#g$?IE!;w#(6Z(;rKus+R;P@HewU%=K<*P zHH|Yki*s1Uc{I*tyJ$l@n&`krY(ghCqYGQmjUM!(5B=DRZ5Y5HhOiyO7{MrZU?;{f zjtNX+3e%XuEaoteUD%BUEMgD#VjuS701l#l?n1p@FHt}DKx6$p1GNqH^9nScMg6>i zdfDIeXmna}1KQAzCOWVYo6w2P=)x9sqX)g{LqE1+8wN0lA#BGmMlg!{c?debW^`c- zy3vDP^r0VHu?+(l#1OV)7$X?P4(!Aj#xa3OOrd^mgN|beOE`=pIErI9juSYEQ#g$? zIE!;w#(6X@<oG}v+R;P@HewU%=S%1~y0L&o?7?2_!+spVK^(#o4&w-p;uz}ZRp|EJ z=s_>~(2uRyh5-y>2=#L=G;axqaRf(k499T-Cvgg=aRz5`4$C-?#>MOxw4ohMbYLSk zp%eA<ICLCQ?7&WpVH^{f#1y76gZeohn%9Lb=td8E(T9F)#WoCJ5JT9GVT@oDJFpXD z7{>%AF@<T=&l}Nk^y2^y;t-Z_7)Njv$8a1ca1y6*8fS18=dg_PXk5y1fHt(FiTb%H zI*t&wV;CbC#SZMm7{)PyNlalHGnmC3=CKRAv4BPF!Cve`{rnakM*@?W!Zc<ui#g0= z7j|O-i`av`*oXZ%fP*-MB^<^P9K|uz&zaG2*wI7>HewSxu^C<1f^PJn7k%i*R&2un z1~G)~7{&-ju><3mu|F`0DNJJqvzWs?c40Rbu!#D(IyzrNSi)f(!BHH;ah$+OoWg0G z!C9QcGR~uswEEG2HngLO4s66G)X)FXam=IfMe?By?P#I{8&N+eNb@+c8C}?dZuFoR zedxzlY{LMiF@ssmVII4%8w*&(9_+<F?8gBd#33x<Fpl6Tj^Q{?;3Q5}%h$?$t*STl z^NuR>hRx{07IdQrz34+fwqhFwFo+>+$1p}PiXGUAF^ppZlbFIZW-yC6%wrdJV*!h( zpYx>i(uLhvz#{fwFZN+S4&WdTVF`zE1V?cU$8iEDaSEq#24`^&%Q%n5Ro1u~(1vz2 zaSEq#24`^&%Q%n5)#OJT+R;P@HewSxu^C<1f^PJn7k%i*R`gtB^~Z}o^kXZwVE}^| z!gdT}1f$r2ofyM7CNPO9Ok)PKn8Q4FVK)}A<yvceZuFoRedxzlY{LKsF@)_H#t25S z13NK>aZF$mQ<%mKW-*6(?80s=U=e#zKMzgMQ!o0^kFD5-0SsaY+cAt0jA93NVhrP$ zz$B(HjTy{h4)ds=+ot0f!BHH;ah$+OoI?GaHeElB8O&l1^Vo&mSimCoU@!JzKMvp^ z4q*w0aRf(k499T-Cvgg=aR&8s=5%~vj9?TyuoGh##{?!Zg=x%S7IT=#F6_nv7O@9= zu@C!k00(ghOE`=pIErI9juSYEQ#g$?IE!<rpR=d)*MXfF!#E}|i78BD2D6yMJa%C> z7O;pt*o%GGj{`V}Ls&xnJU|`CBu?Qp&fqN0VHxMqxXH@XfHt(Fi4JVUCUjymy08V^ z=s_>~(2uRyh5-y>2-`7?5sYF7c47?Un7~<_!!pjJaWnIRHngLO4s66GbYe5Qum#=d zK`;8ykFD5-0Suyku4CnThZ)Rb4)fTB-B`dP_FymeVLuMwAP!*(hj9c)aSX?C0w-|_ zr*Q^naSqEkk4B#Tgf_IJi4JVUCe+Wp)cNycE4E<(gBZeg3}XbN*nyoG!#F0;b*r`g z7IdQrz34+fwqhFwFo+>+$1p}PiXGUAF^ppZlbFIZW-yC6%wrdJV*!iUgT2^?{WySw zID{qC&mFB_Rd49$iRymr#XjuE0UX33Ea5PY;3(?nkZRr;oW(gT<2)K&R{I9Dp&d<h zU?Vo66PwY6E$BuMdeMh|Y{fPVU=Tytj$w>o6g#jJV;IK-CNYI+oWMz(!fBkrS)9W% z&ZBWV^NRZUuDV~6n8Gw>FpD|NV;6Q~0gKp!z1WBSIDmsVge4rt5gf%a9LEWq#3`J{ z8JxvAEaN;HcQ8L_Lpz%2K>hq%oxdQ4upPq~!6<fMC&n<22~1)N)0n|5<}i<4*o_4& zVh{GBeon8B!-XyAMh|+?hkk6uHVj}8L)eaCj9?TyuoGh##{?!Zg=x%S7IT=#F6_nv z7O@9=u@C!k00(gh^>d7M{@O5rK@4F#hB1Os?7&WpVH^{f#1y76gIUaB9=os`3s^+` zyk#9n1KQAzCOWVYo6w2P=)x9sqX)g{LqE1+8wN0lA#BGmMo>Q&TE`K>b_`<#qu7C+ z7{fRwFo`KlV+OOB!#s9jHx{snJ=lwVm?&7|NMZ`pn87UOFppi>jRh=X5B6do_TvB! z;t-Z_7)Njv$8a3=bGCJV1TcspY{xK0Fp3@6i7||00+X1+G-fc1Im}}hc4GmH*n<sU zx5i;ZJDTXgMr=YSHlqt$(2X9{&lT7CYDO2fpc_5tMIZXH727a?K@4F#hB1Os?7&Wp zVH^{f#1yvNYmLK=9`vFQ{n(0a7{DNgupPq~!6<fMC&n<22~1)N)0n|5<}i<4*o_4& zVh{FWANJz_4&o4&a2Ol!v*xb}o!E>nY(Y1A(2G9wV=J~{0D~C9b_`<#qu7C+7{fRw zFo`KlV+OOB!#s9jHx{snJ=lwV*pKo1t@%q}5>uGQ3}!KhdF;Y&EMO6PuowHV9|v#{ zhp>dhID(@%hT}MalQ@ObID@k|hh>~cqsN+;2DG6aP0V2)yRaJzSi~Oe#XjuE0UX33 zEa5PY;3$saI8NXsPT@4p;4IEz8RyaXCi8$cw4;d*Y{VvXVl%q11-r3;MeM;|?8AN> zz(E|s5)R`Cj^Y@O;{;CP6i(v|&f*-FaUP9tF;8eiJDTXgMr=YSHlqt$(2XASVrQ?l z-5AC(fk{kZ8Z(&1L3LHVQNot*Sb5#(K`;8ykFD5-0SsaY+cAue2d(WiViP*C8C}?d zZuFoRedxzlY{LKsF@)_H#t25S13NK>am;<!8b=<xup0|l#2)O$KJ3Q<9K<0k;V_Qi zD30McPT(X?;WW<REY4vW=dt4<YkZv;!#E}|i78BD2D6yMJa%C>7O;pt*o%GGj{`V} zLs-IL9Klf>!*QIzNu0uIoWWU~!!pjJ@jYw48Zh2(#R*Je3e%XuEaoteUD%BUEMgD# zVjuS701o01mT(wHa1_UI24`^&%Q%n5!;BwoXh#zr*oaN&#AbA13%b#RUi6_KTd@rT z7{m~^V;CbC#SZMm7{)PyNlalHGdPdNBg_xl(2gcLuo0WkiOuN37IdQrz34+fwqhFw zFo+>+$1r9whk5M6ZY*FCd$1S#upb9-5QngY!#IMYIELdmfs;6e(>Q~(IEQ7NN8|hK zC$ym*O>|%*HlY)n(S@x8R^B!YU=Tytj$w>o6g#jJV;IK-CNYKXA6VP>pcj4U$5w2^ z00uFH?HI-gMzI4sF@|wWU=mZ9#tddLhk5M6ZY*FCd$1S#upb9-5QngY!#IMWM`ixx zd8tp8-$V4{01o01mT(wHa1_UI9A|M3%Q%n553TJspbhP4q5~VT37y!CE^I+JdeDnL z^kXZwVE}^|!gdT}1f$r2ofyM7CNPO9Ok)PKIEB+VgR?k?Wt>N2ka<NL+A)P`%wQIC zn8z;c#sU_x2Yay(`*8pVaR^H|j3YRTV>pfzIEhm@jWallb6CcCG#+Dq(1vz2(SeQF zgrUc+_1iIw5sYF7c47?Un7|~aFpU|^Vh;1zh22=dBKBY}_F+G^{Ky)I8$IYnANsKs z+c1DZ3}HKlF@jO-z)p-|921zt6s9qQS<GP`yRaJzSi~Oe#XjuE0UX33Ea5N)hOGGu zVhGzYj1i1t2X<l%<CwrCrZ9~e%wi7n*oEC#z#{fwFWR24#$iVj9oUFX=)`7pVGFv^ zgI@HZA6u~v0~o{*wqqD07{v~3|FJcWFh($n9oUI6jAH_mn8Gw>FpD|NV;6Q~0gKp! zz1WBSIDo02SmQ`z2D6yMJa%C>7O;pt*o%GGj{`V}Ls-IL9Klf>!*QIzNeq^(afGlP z!x+IRc3>yQFpddKVhYok!7S!5k6qY}1uS9@_F^B}e#-fQCOWVYo6w2P=)x9sqX)g% z{4;AiE^I+JdeDnL^kXZwVE}^|!gdT}1f$r2ofyM7CNPO9Orv|)8ixnH=tDoYVjBi9 zh#_ppFh($n9oUI6jAH_mn8Gw>FpD|NV;6Q~0gKp!z1WBSIDmsVge4rt5o~(Wnm;Et zqYGQmjUM!(5B=DRZ5Y5HhOiyO7{MrZU?;{fjtNX+3e%XuEaoteUD%BUEMgD#VjuS7 z049E6&0i8zn8pldF^75V!fq^J5qq!~`>-Dea1e*Egu^(3qd11+IDwNmh0{2Lvp9!k zoJZp+Yd#v#hITa3fjP`$7j|O-i`av`*oXZ%fP*-MB^<^P9K|sl#|fOoDV)X`oW(gT z<2)K8%m>=gjwU*=5u4D7&FI1w?8X8Xu?Ksx5BqTd2XP2XIE*7WieosA6F7-eIE^zn zi*s1Uc{HA8p3sJNG|_>L*o01OMi;iA8$Ia7v1eqvtLlvjG=4=t(1vz2(SeQFgif5m zNu0uIoWWU~!!pjJ@hts88``mi!#IMYIELdmfs;6e(>Q~(IEQ7NN8{J@3vFme6CK!y zP3XjCoOn_4$$pr`DV)YxbpFn27r+D-(Ri7Dp$+Y5q5~VT37y!CE^I+JdeDnL^kXZw zVE}^|!gdT}1f$r2ofyM7CNPO9Ok)NMSi~Oe#XjuE0UX33Ea5PY;3$saI8NXsPT@4p z;4IEz8RyZMWWS;f?P#I{8?gzU*o-c0K{tBPi#{C1F&xJUoWv=d#u=Q&IV|Hm8tWJz z+R%<BI<OI&(233H!WML+2fgS+Kel2U2C#@d*o%GGj{`V}Ls-IL9Klf>!*QIzNu0uI zoWWU~!!pjJ@e1>bHngLO4s66GbYe5Qum#=dK`;8ykDaet{fJ>46PUylrZIzA%wZn8 zup0|l#2)O$KJ3Q<9K<0k;V_QiD30Mc2Bxg>1u=x}7{&-ju>(6XhH*?_5>uGQ3}!Kh zdF;Y&EMO6Pu(ukox5m+neb|o!IEX`7!eJc2Q5?f@oWMz(!fBkrS)9W%&ZF^rj&HP~ z9Zhs#BQ~KEo6+|NE1w@*u?+(l#1OV)7$X?P4(!Aj#xa3OOko-`n8h6Cu?xGgfJN-V zUhKnu9Kb;w!V(VS2#(?yj$_NTHGgjOpcj4U$5w2^00uFH?HI-gMzI4sF@|wWU=mZ9 z#tddLhk5M6ZY*FCd$1S#upb9-5QngY!{~j@nm-@<u@&1efI$pZecf8W9m5#GD0W~c z#xRZvOkxVtn87UOFppi>jRh=X5B6do_TvB!;t-Z_7)Njv$8a1ca1y6*8fS18{cl+F z*NSZzz#xXO9m5#GD0W~c#xRZvOkxVtn87UOFppi>jRl;+S)9W%&Z9A7jkf`9Xh#zr z*oaN&#AbA13%b#RUi6_KTd@rT7{m~^V;CbC#SZMm7{)PyNlalHGuZy7%!|Ap8&d1# zee-Y_M{pF!a2zLa5~pw)XK)thu#EF){E_{GHngLO4s66GbYe5Qum#=dK`;8ykFD5- z5sYF7c47?Un7|~aFpU|^Vh;1zh22=dBKBY}_F+E`;2;iR35Rh6M{x|taRMiC3a4=f zXK@b8IFGqMS^G7QUD%BUEMgD#VjuS701o01mT(wHa1_UI94BxRr*Il)a2DsVjPq#B za@?W~?HI)l?8F$xF@Z@;VHz`-#T@3b3%jv^MeM;|?8AN>z(E|s5)R`Cj^Y@O;{;CP z6i(v|&f*-FaUPAgta)vD+tQ65^r8>_*oti!z#xXO9m5#GD0W~c#xRZvOkxVtn87UO zFpphm|Fbnd6CK!yP3XjCbYTm+(Su&}p&whZ4Fed&5Vm6&BN)XF?5vj0S>x!yPK;q3 z6PUylrZIzA%wZn8up0|l#2)O$KJ3Q<9K<0k;V_QiD30McPT(XC|HT^r2#(?yj^hMQ z;uKEf49?;lmT?}9zgpXCKpWc8L<crv6FRXOUD$$d^q?1g=*L!U!vF>`gzXr{2u5)L z2XP2XIE*7WieosA6F7-eIE^zni*s1Uc{KjU{Gtu*Xrcofu?d~nj4o_JH+s;EKJ;TN zwqXE+7{U?`;|Px87>?rvPF5{j<DJ53oWWU~!!pjJ@ptA6ZD>am9oUFX=)`7pVGFv^ zgI@HZA6u~v0~o{*wqqD07{w0k#2Cggfk|w5#~Qy4?P#I{8?gzU*o-c0K{tBPi$3&Y zE4E<(gBZeg3}XbN*oXZ%fP*-MB^<^P9K|sl#|fOoDV)X`oW(gT<2)Mw;5b7Y+R;P@ zHewSxu^C<1f^PJn7k%i*R&2unn)A{>c|Fzlu3<FA<=-1OSZ0j6N_iG@*rje>XLPGu z)folVQD+p@edT?1)NSjGepO$mp{-8hKhzm^_4PW#ROMWZsXNpeNmbfsa8!M>&KOf? z>x^+#+I#E8raHqfHho@R0Ls_if(=b<L?^n?U88Z4e2yovAKNg9?HIuhj9~&(n86%& zVF7!v4+n4vhjA3gaT2F-7RxBpY|R6j*oaPap&PyE$2JUNJ4UbrW0=4cW-y0cSim0a z!vP$^VI0MAoWyCI#WEUl3{;K-G;1_2t~VSSFExxt%A1It#LdJmVmErxk8K#lc8p*L z#xQ{?%wP_?uz)?-hXXi-!#IlLIEm9Zi)AzxF+XTxBRbKAZuFub+c1dj7{LyVp&@f# zzq-z7P+RH@o4UQcU%9%{FidqH!*Hnk$^KCflWUObHw>qGguFk5+A8ncqaI=yE$Tnz z^BB}a4a1`zBi9GjBcF4v9%~qW^*DJy4x6}4-oHrQT;4B5U1AvRswwY}scvH!5z3?L zE_FtSx}AJ3qUx+OVycWMuF7~4s*ES8%6L+$j3=$icrvPtC#%YMa;l6cugZA3R2fgV zD&r}rGM=I;<LOalJiY1~!{}2_FpSB~M7ds0;WW<REY6`JW7qZ#XhS=i=)gv7LMJw( z3tP~Q9!#h*Pf1ngDW%FhrB#`yj4Jb#Rb`%Xs?1Yfm3it?WuCfKnWus(^Hfx2o_bW7 zr(RX&sZW)8>Q|37i~&{lduh2S%fqVd_Yqb0`=~1WeN2`8K2G_BD*Js>mHj@Y%6^|# z|6FIxs2A25v+5~^F{fT>7-jWxc|UgbONJca;*IkDLh2oIe^T$1V)br0?$vAMxK|g| z8I5XAj(hbRhT&ANmg8PMQI31{BspGX3_7o2RpvFK%DhHZnb!_=A30uCnb(*q^BPxW zUK6U!Yf_bYO{p@kX;tPmqsqKyRhieED)X9GWnR0~<77W<A<De=s8ZIe%DnceGOzur z%<BN<gR0EykSg<9Qe|F;RhicjRpxb6m3bXgWnRZsnb!$b=5<n)d7V;aUZ+)=*BMpj zbyk&mol|9A%c{)lyeji*Y$?jTHmEYMHdW>|CVj3q>y5bjT{*AS`(&QfXJww$5t%3T z8JQ>b6`3dX4Vfo(M&?PKm3dNMkmFai$#asrPUcOWlX+8rEAytFEc2#@WPDqR(vK-s z`Z29aKW0?v$E+&-m{X-6WmWnyuS!3RtwrfagE}kYQ>7nvRr+D7(hr9!{b*FBA5E(C z!>LL?g0k;)zl2oTFYT)Am#`}PC8ElHiK?<+I@BBGxKm}n#8lZYaaHz9LY4iJRAs-U z)SS$xD*Gj)%6`eJC(3-PC&}kDI7I13NtJ#KtJ04VRr)ciN<YR_>BqP#{g_atACs!| zV@j2NOsmq58CCi*t4crSROv@qm43{t(hp->QTpMQV^+^Qk1FS#SC#Y5r>>Oyj4J0{ ztGb`OKbm@&+;>#J%%^&U+;>zt@7h&4@4~8_cM<hanNL;DyAIVO^Qi`9KGhTCIw;%J zeiT*dM~^Dsy{h!1PnCZ3tJ04FRr)cgN<W5F=|@SGehjOJ$b72Ok5N_nF{VmC##QOZ zgev`*RHYy04x;qKp-Mj*RjF%Ir5{dJ`q8XPKU}KxqeYc|xK-(gN0okf)k9=HRq2Oc zm439U(vLP(`Vmmq$b72OkJJiL`jJ+p9~o8pkyWK1IaT_RSEV0as`R5<m3|ad=|@qO ze)Oo)k6u;!(Wf3N^QlTd22|<CpeonHA@w+!za2%n9*(MVJseY)$o#3M%%3X9^d#j| zs$37JRoS;Qs<Y0JRgC&`>-F|w)OXe!TcI3=l~{&t)XOv7uIl;q#=evviZYZ+yEZ%? zPs6kDeEdA7@ix>;rEdR0{2~4te}}K(Ur=7ARo0W2h*p1bcU+18g|h1^?M}f@;%D&- zcop7=ci}hj5wywNXunr2viu}ofNSx3d<37t7jYW@g7pnnzAdo{_rinmNc=R$@KQ|T zTFl_}n8!P?fcIf9K7<4KIF|4iIEv5V1ipgP_(z<>chFdDje7~&acgYEov|7BMmHXe zK3s)u*p6r7+1QD3T#Gm0UHAb00RM*X;vzY*^tjjzx5RC6N8A-%csyQ&-@pfP65qgg z@qne)_CAK6!`tx}_#7_P=X&Yi*0?jCjA!9m{2u-YXYn7nbTccT58Lp3{5iggmFIog ze&zXItUS+)KDnl8zfQulFou=qc&V>Ehl`cxZt)M)Z?oK5e+BM}``|&UoU?1xj(X!P z%0EN-TFP(0Td2RA`T@#+iceAh8|wc^`9H8uF04A9<*IDA@_a4ZU8%8n2=zx$e;VcI zQ+_GsIm!#zhYzcge~9>}s%+;)d<&P#JwnTO!UOSWRo1^8E6?K+KSulu{EaH>|4Eg8 zZ@?|LuwsWQ>+M49Ql)*1dY<f8%8$Y|cq&FzX&+UkeT?!i;99&6Z&Iaw<@JF0IPtGk z=||=HUCRGT`z2dSx%7KG+)<Twdl2uVO8X=5R6I|Wc9#&RiEmIP-`)5i{s>E|toLhG z#<Py{->b5ndE8p=)f(@iO8b?>$ElM4bUYs`uN$P@<;0cO2@+Rc7f7DUbHBt7XuZT! zs>E;OKPlf<ZuDC2RHfaas%-CAJPprMrQLbN7ZP7ae1$6O-+~X|<EpIpB=M`N<o`1+ z(&v7OE3X%%-S!%byQz}TM|}WKr2Z_t6qC3Xuf@D7`EMsK5`UAppZHPYpQ^Immnr`f zZotL*`at?;s?u(6Rr2po`Ju#z6CX=ld0ivxovyL0cM0W}(e5hZuMl_PHz@xmalb0- z|B~|G;j7fYjqj?`ZhME-zddnZRr=vkr9MpgmngrA^1CT7QvMJ=MtSA+kK}oc_>a{8 zop=NB5`7&b+xdtp?N{RQc#bObcRul@#FrDVRb~Ba@OJ78)Zb6}6O{jq@-dvn4XT`f zo9pWt*`7m{{_Lnq{(~q#l=8~!D5<Z!E)wIEUrzg5XnzOgJy^mqd{LGBe^F(-?@(@& z*9yA*X53$udJpm8#I36Ido|@D%A<HOuElFr$(vJUyWgVxLCPP)%Ih!L-iyR<;M=OK zXKxgxek)b-?ShBl(bOMD{Bh#bRq1bp^7ARb9KV9MV?mYt_p7qqCn*0J<zx6V<!=+$ z>+3LCZ*x`F+f$YP9)ibU<#n61J56KhS109{s<Pf?lz)ZtoAEB{@1g$Nls|%xsgn0? z+<+c^T_)v6U_h1aoTEzrF2$?yI#t@=rAoVdRO#n;secqp)DKfXPWd`~gZe*F{}0L= z^!1%=cXQkhcTr_~$EvdZQ;095{tCPS^QyGFPnGq)rAj{^rT!=QH1)rt{w2zPk8i4y zr>shzrA=16wJQDG4G+Loc#JCRokV=9D%(Gs_ySe(T}1hpD8B}8P-Xo)RB6{wc?rkx zc~#m?5x++KcU9JVSC#E<zLO~Z-42^nsduZg{$a#%;<b1a<+rMm=i9_3>YpKgO_ltA z$IW)O;w@Ck--LTo-lEF(R}lw@gQ{#NO!?W^sY;&DtFqpWl;4Bj#Ya?WH>^s#5moYy zQ@;+URcZHURoZR7izxly33pSa-i^oL@pv+xhG(m?{&~cg5MM@o74h||Z0{yj`t^0n zAHavH{{i*Ss?v{_DF2%(+ga+g+#YvQrJYNa{HrKGhVqk$PbK~o@%gH>zfhI_TtRsT zZ=(KI>c39;1Ne|C+kH%xJin!Ug7QBQ&k(<Zi+7dwGLGe{tiPQq>$@rU<5AR~O8x1o z^z&TmFQ)!W)OS(dgWsY4Vd`I^ynZ)pdt0m0j~#J0Rr<3p^~X?tDxQm-s<gXImHuQY zzg4X_j5{d*7Ukc=$JBbcZ>X}~)097lFR7Au>yKFOf+74QcB=J;akVP_zZLJp2UN-P zm@4g_P-T0+qW%S(qJEnCGUav6R^H{RtiPoy>+eW;GwzEA<Ke2bKTnnIUqXBX^>^cg z*sn^vpQ*CmFI3si3)H`gZ&Lpj_3u)?WOr#V<KJABJdLX4*^~GH>Q~`O_$fSBmGv$n z{=6#Nzl!*JRr1|L`PV4FA0Jd@{YO=4H%9ps&f(uxY1goaDE-|`m3RkL*4s&y?e0tc z!RVtts7m|OiSxu?$A>6?M3p>G6Hih9C*sZalzQ3z4!9TYr%HYw9z%IRmHvH-xRW@h z%65{JUxis!^4zA%df%n|3H%j4r%JnNRocy{lCMmCol9crr%jc1+o;lRU&{XrS5Y6t zbMdoyF<ypOsgn0A#J3RNL3}UqcU0NlL#p)a$CN*XzoGtl>fctSpYKw>{a)5~_QXT* zzf@`0rb_-#QGPDv7ZHD+crEdDs<gjBmHymKc@I8B{Ug->nDVFaSyi_Ck}7%rM)^GD zOZS#?nHRe%?N;FKl<z})uqx{ZDUaaU)PJ7(%T?*;HPqis{nw};pnMpAN&RoAf0y#z z_OZ5ifGYhv3|Fbr&*P~-hw@ACGRnV7+>PH*Wxa1vU!r^rr*IDcuF80KY!O$<^PVc} z@2g6=kN6l>`gc5WJM|Y)z80^c{wCtvRGFu55<f`%1o6*R+0H1wpvv~w6K_yuyIbyS z=}@J97vg4B@*hm>BMz#P_cT@7pG|y)D*0}}JoR@I7gfpk2=O5Cs4DqhP_=)=8&t`+ z`F@sLt5Uxc@jmEQW&PFEhlnqrK8aUSpC!Hn?^b2~Z&N=&{4Dj8xSsl1;(y|z{jK#K zxU(w#+@1JvRmRau`3b}!;<Jb^#5m<&#_K7+S(W*_hq#CO@2S%N9}_=K{j<a`tE=jb zHz|KxmG+HpQTn-?D)C{e^z&H!1g^zvRB87R{zR3$&k)b5lJ6bjZB|Mw`F6vVcp9Fi zO1`h)ovP%!pLh_TQ6<lds*Hb%_)RRUl4tn=R=e$0iJOTJCSFZ^5}uAx{ERB=U4ge? zFaAiCeoUz{&OcJV^gye8JKP=jR;8VX_!#07iBD5yduOULt_vvtJf`qkyk3=dw-I-% zvi>lRQ2!$JQ}`zS75|}1o(7L7<JnA=JS*`SJOeMrYw>P;7@xv*IH$_E_d3Y(AUqMT z#+z{%$Iv*~TF-?Cs?xvXRq5{;_*uM2mF<0z_-a+!e?^sX-a+{{uooZ3M^$O}6XFq7 z*8dIu4qs8F-P@}4;~&^?h!t;+TdT6Z3qOV-JP%WN8{Vl({s&aa-;a;s&+sW#^8X%R zS7p6-s9)r@*0<xfxI&e7A0cj0CC@>4C>}@siK?_ellarbG2%;z*Aic&O1>iYV+ntS z>+mi7CvNdkYyF*ZKl~W3!3cgqm3dl=*I|zOyNG+#Rr2rbls}0t<6m(3q1N_y#Y6CT z{4{<6Z@_!;hxiPx#|^mcVOIWq@CZB=&r{_%z7y}q349IbRGH^3e4>nhXWS1DR3*>H zh}Yn$s;qaqD*N?(%H#M&yc(}lrTsnleS8{U#lNHZUsijED*2mL>EFJ1FdmL=s^kx- z(*9J+BlsD-2tTh%`!4(rmhc5EWAn$X_CY)clXw&M;Nv)kucL9em1jFV5<jlW_|C!( zOi-UxWn9-#p2It-{|@m_@HeXLx0k6eQ@+%1ZD%{&QI&SP6MKnQ5g(_@Je{D*_RpmJ zT>KpMmr$Rk{Hu5y^><SL0OkGo82${OQe``1#Lug;{iR1(E?1>~g(~y)5p2PO@K9CS z9ZB4#N}fwFP5D<bugW|;iNC?OaF111{ejqlaV+34{#va!j5k&3=exN1kygC5D%;zM zcsEu0>mmM_D(kPJ{3Oax$Fr&b4E0~2d@W|F&rx5X{G0d?{t$;$+5VHn&#JQh7jX)w zRcTjNWn6WwmdjOXzojbmyHM`Jm3Sx~sY?4}RB3-I<q<rO`U|MPjPftz_0-=){nsgf z03W9Q2h=}F`Lj5Q>#6@E@!wSGmvNNkVpaOLwJPJ?k@8(A--mJ!9!7Z^@rkPBJB9MI zDZc>YlwV1FwJPmzBkm@C44+V?KTlKt9Im5&J@s!<{thla+RD3`D(ml{%6N9e7V6#9 z`zSvOPo(}7>d&V90!&b!q&`deE%-IOAA409=X3aiD*gHs^<}I(#_H!1RqD4SUZJj% z>y|2c_M-ly)UU!e>Mz9Gv6uRX@p1em_0OuZy_YEeJ-$VKLz~pg{Oy4IsB%6Zq)LC* zP<{q>;^$OpcRBI(#9hSqsIvaOs%*cX^2hM!)IUZ23zWZ#Z&Lpj^>wQykMwgHZi7v@ zt18>sn|Oa!wtohGlKL3+U%<6^9p+TYb35_ZRLS!czCih___`|du*<QQ``|H{#B1?! z{006McRtQqe=k+Gccd!gJsCfZ9ja{aV&a4<{rw7YUX}H`DDR>CyZA%ue?<K=l#k;p z)c>CPzf!&dZ2_xaTj6%9Y=0MGmnz#|iHG9HRB5+Hm2sVlpQQe5>Mx=EOLz_D@OD-5 z-=#{vZ&UsV4pCpCew6a(af<qB>dTbZ9dGq(xhna$RCQdGyYOH<jQUpM<5gMj<9Ist z9n^o0@=GYclJc+Mjg)_l_<mLLJwW*nDKFtKDE}?-gevXdBz~KCn>AMX_Nt8MBdW}Q z3m!uKVbmW(c@R&h{w(S*q&$IZslS@~n<&2%@2CC&>VHUi34clbv(&#r`5QQg@1p+g zwT`m|-Kvc1C{@O_22aH>^=A{u)KzlbQYFt7)ZajT7k-WUpW>fT{}x@hvm70`6Sk?6 zH%xpsUVs-<pT&Mv`u`mDlf<tP|4o&A|Db&NiPrWVxD)QCN}fYhY5yrahw@8R>Gu_w z!LL&Pbye1T8h=IkI#t$t9si7F>Nh{hTF;9<Rr(Q7WxZ4IO#C$U301atFaCh~ALCOv zO8x7&?a9`9JE*dq-BsDnes~D_s6R=S?IcyXZeBxtEAc(5tbZTzcZr|CU*S6Zy()SB zf(;=n-UfHWm3RW4iJw)a-&d%z-Ha;z>n6Szzk}bSegyxFi%zlDI~3QblJ8WE;MvrF z3Gc-h@DJ)L`FDHby*_T`Jy@0URm3L{pHAFC94G!F@wbVGRO!!?SbwS&FI8o{jl??> ze^ixuJ(4&~{rPwqUZG06Yl*K{CEr7;^!Ekorzn3{m44XUEq6qxDtY!M-d~kGC##a@ za_X<5{A;S@`8E#X6RPBSig;9&Jaek#Y5Ig!zlSR2hpUoj4W5CYQYB9(@#j=&e~T)4 z9;5z`_zv!Wnzfz}k5Og4PpYz=&*7DLwJO`Wk@z0GPnF|xfcVF%<oOxp&r$v|zDE6< z)W1vllGCm2nyRetP$h3O<@@5ncsRDH(mtR{`!MBa<Au~;O#Ky<XYgj~Z=?Qx%KPw9 z>K~{6mz4h&C-F6WTb2I&Rh9nKg+-aqWw;GC;jXH*ccVv@^;)Sv9#5wJJiHS}a8i~1 zv(*`vJK;%q7M`cd_R^~KE00C|rYd>*iA(sTD*bwqc)colUZec)l-HkW<+ZC)Z>qAM zlk&arK<W>n{us)G_zC<Jp07&23suQ?1?3sMiTYcq|2pLl;3L#OO8qY=|24iu{W|L3 zqWm3Pbe3#a=F5)Ts?whwROwGM<@@5ncsRDI(*9&TRh9M5r9Ot2QvX$a9RGw%BUYXj zs`O_M;zNlKCq7n{{dgkr`P9cKznnNld>!$fSfKnte3bHEs?zUYQ~o>3XYegm#<}Q| zR{w0O#QUhypM!~yA`YrDjwtbk)L%w?74hAwv@25nAaOtOkBCde&k(<aZ{Vyd{r@NN zqEAUI{o5XWs`T?{;uDEaCq9QbMtqGb{mN2)EAgGg_YyyZ-&gAm;~7=9^E~l1@!P88 ztNXO2iMwF4D(fA9eq4iLJP#9Uy}Yhd<$X(jP5DcdPZPgQ{4Vj*sI}hCs`Te0s%&>( z;sc0%#H(?QD%*=te;)A{h`+2#zMJqK?8Apu+0IY!SNJl%iT}XO&bGF<mn!eG5>;jW z3n{-=mF-<m`R&ACBmO4wcZh#LJfg}t8qTrund&O}y({q^#BO3A@zKO56Q4nR9`S|5 zN#ZMsuP45lxIla_@k7MlCoT~`N&Fn~i^S8!ZxX*lyn)z$t~H*mRGF`xi9bT@CO(LG z74fOWQQ|KVUq^f|@k7Le#7`2xN<2&a4)M|s`lD)ph+V`75uZRDCO(JwV&X3ne}%Y6 z+(-N<@z03+?zFbM$K#eu4DlTKe;TUn|DU5ny-@zHjkuZEMeHN?6U*avrM*1PRq}Ka z$B5I!8R9%~7jZxF0Pz^{IPn~DnONS^$m*Xe{g(e)T#4Ppt;B7_QQ{8b6mgokKwKo& z_rKBc_Y)5jj}T81PZ8_;-DvwcVw?0yW4kKfPGWr@8;yO$e&PsmlsHM8BF+<c5%&`J z5swm&5zi3M5}S*x{y0=AYaw<M>-)xNe*?t&J~0}15@(3B#0BCa@c{84@fh(q@htHi zvAw~{Z>rKCH?fD<Puxn}P8=qV5yy#B#A)Ijah|w`xR<!{|8Qk|!^Bh6SN^}P^rvC5 z)jyjmaTBqV*hB0k4iblmEB`N6^2dlX)Mtr%iTj8LiHC^Ch{uU%h-ZoCiS<9EYya%3 zY|kWaCa(NHS*iCEw^AP@4iQI)qr?f~Byol~OWZ}=P25M^PdrRKLOe-4MclBI`BkNV zPU2=_KXEH@gg8nZBaRcNh||Oc;v#V$aX;}G@i_53v0<Y>s?29Iv6t9K+(sNAjuBVh zcSy!ldEX#ezw*985?9_ANaB9l57E9vJViWBY~Re<zNyOk9%3(XJ8_seL7XJc5$B0} zh<k~Lh)cxd#1q8x#Ktn_L)G~puKfRFi9N*a)Q5>Xh&zcB#7W`;agn(4{y;iE#6#4V zh$o0AiH+q}e;QPoACuTY>?Cd`_7VGuBg9eS#AiD%y0G)?{Vv?!S@~M&IncB6K+i#5 zkJGu*?RMAvJlG>;2YbB-NTGa1mR)gF;OM$Kx$yH<XSj?_k^D~Wr<IDuo(e9b$=JbI zK6Jz@rhnhp41Zx=y-`@VwGn>R{?^_4=RB{^NV^gFo{;Yj`PO@AO1|g+m*0cZUjB#c zt7hu4=|1<}>vh?1r`Kz2bKbSS)x2r_B4=Tp&3)JUE6vp8BI!rd(9P>J($=?O|8?@$ zwy!oC#<HZuQnzv4n8ecOjd4g~c?X@1ajV4Mn%E=pAvLk-&P!iTepTjZMU!#jt8z<N z)+B8VV{&7T!=%0TvoeI5A6v@2#j5ibDXd!*EUa6`-0doJr}uNcH;>A9H_I9?{LV_5 zjwvSF=yl$`eyR4)nO?84Df3ZpN^a(3vCL6c`d6J3c~)AMl65L`!a8w@ZSTpEd(Rkk zoshJtjIm}rOBQTL=c>A$w>NB9=31~Fofqw+PKjJ9-t#5fsC+dHUAbwFWPTROJUN-8 zLuHQiSwQda|H-#ZT4g;OYOcnAGgpvy5mAo^9fuw#)_5#+?seW<&70Tjv1ng;w;Y>m zCzr@RsLspQGM8nUr{y}|ay;w$GZI(!2eFU5ru)77VJlg;ByB7EfwsC$&0o9SqO`fv zylS$#&Bd}_Udnc@*=BWLyx;nr3)Yt*FAGcAo;B;g-+I0U>-}1effgy-s%AYoC*Sks zByyn}%SZ0}+SYP@89BMeq-1<CISzt%t=IY6Udrv_mZBU-%NEYl9#YmV+qLHD+V$lx zKQ^snSM~Z}&4X2*j7U3w;nk+0Th=d@eP@$nda2B3gZq(<$MP0(uGjg~uh@*xt8*JR ztf;oBuA}3w&h?~>*}Y&J%@S{Kq+c=I);4wSwJ!{{@;;%}ach}F#<lS}!8xGg-tm7J z_x93ebisM5W7T79P|A0g<=X2+?J-j)$EnU)?XjxIO<LCbNX>fx>bR+sV=i1X7kb>Z z%KFVU>%ZS|qwBe9)_Yp!uu0ad>?f`_)wv4GLR7wE6zDOsajqhAoXC7_BisF-j*%Ut zjh-j9=aL@ZI#)T_cAdK*$5?8*g);5;!t1J@C)NEfk6_CpvfiGup3bpN&d<GB_dRna z$Cu8#ULW+@tj9_<#|w<RHpgD%sE$9uLQ2&8N$q`j1=mTxUMJ<m(D!%L??!ahltpWn ztL>`l^It-~GykGZwXNpXc{63+`eiH!%JK)@r|W9&)7hGF>%K@yyid)#dQYmCxzzc$ z8|i7yACfknnl`NxA6ygb{pX;X`2FtHPH9u!=bBUZjjGd{)*m%rTe^>U#gKipz1;5? z$@7i;bNlQ1%&O0g3%{c^<?)*3h3yu`1!-HB?-BXd=Tn`_o#pw(A@`1zm9eZ{uW^Ii z3+miQzM{__4epf8v$0~%<ajeva=fMFzmHh!E^ON(ZHE`M-TwpH?jmiw7qoSMKwG(% zuZS&ZyB}?JUmYOJhTH1@!fUiVx-Rod8*5)!ZL0mRZm-(MYEIo(Iu|v&NEWR!y$<O8 zaW8R8QSS{hog42B@|azDUOUWPSftmr7CF8Q_oSSwsmeWD^DdI(P0vkTHl@CyaxQPG zuWna!OWQ^Avb%Ck7FT$s{gMUkt7ER+_TS_j*W3%Y{XgYi{2}DtO8UK>^m&JWbB_G) z)6d#DYL@z?3;N}dGTVZ(>e$rfa!zf{`Q()IsY`C;qw-zC0o1bp&394SA0peW?!Tb) zL$4pT``4(c_tq@G-+r2r{bYZi@#`3B_rK0*b^k9M_xt7jclQ5QW?_-uJN1|rSLk)k zkn_8)dTjDsxbe7>_LaQa&Xi-irmgl@zqHQ_@00qxpxcnCTk(GPH@zlT?@jUyv`nwb zm1nt)uL0ise5%hV3tuN_`<Pr`EBE~c_db0#tmdDU`F1YIU%hY2EoS3a^>u=dXRG%) z2e)0Y&;OHsp!-ygm30mo&wqR7a_X2*dR1P6Rjw!ctf9wR<vQm4a^+gBW7cbk&y@Lc z$}y<dXSvR7L%BJWTi+~odj7~?5xrXHENtbFI)nA!|2ikX*YoeYUSA(I`0rZ3N6o#y zMJ7ex8}`Ha4*oClc>hJ)h}7x(+}bxCtCi=Y+UuT-W2$mJ=UlADKAji#qn1_A>1r-L zH}zg<m*ZU9y|H1#>ka;|uGh8~%x`$TdayW#?p|-#eL1A(j<MpS%zv-6*EV_#mG$+w zJTunE<hd+TSSPOq7Huy3RL=`>MdO0!z9sTJkf<KF{@^QmuhHi~eGOr_uUg+A=V-Zd zyj$nS#&cBi>N%><EQVjt(M@f28%t}>4c&%5r&Q04w`4tst|#mKUizM`4p7XqtYeY6 zsN9qE`d+;z9r_`h57pfIjH|iD6*>;Po(t@QI_KI~>^1k&|Kz;W?QARC(DP5u`4xJe z1Wmo4<kkmj&XwA0`Uh=CuO+p|njUAGr+O^aOkw3X&})hOdbe`Eiz_64RgXh`uG;29 zn8Od_`9xnARQs>b5UvINs*b7p+`5AM>`J-MI^|-P<l9xVTrKmyPg%7tAa!B+?)(>R zs%<rQ^%+*r6YKTBre|1vp09I%`IQEq3-vkCdS<uU=y7E|<6E)b`>bbtE3WSE>h)Le zla+I$^7}Wd&BE(vbw0LbKK7LPXp#dh`aa*GnlfL_^82-2Sk^4<t7DIv?|n9}KEnnU zlvkg5^;uZg{h;S%9cQDoseN8vI8NRF|2K}a13%z6+g8p~x#m>vlg+X$&k>t`C$r!_ zsn^NM^Q7)4?sL_-YSB4y%GkM2R_Cfwj`7Nz{EPeIhcVt=7o1nSeZY9D$5HjXa>;R& zkcTLJUu=CZwiL@6f7sueTYn#-*D*b3wyQl><T}|Zb6B~z=<|fTuvO)ECm-<IOOK_d zf8$uv<4MO{9q(>3-VS-um*G1u>UTB%Fx9-Z`$b=0?XqCMRIdda@3C?X*WWw;tJhb0 z%<5~PM)BWyo%nvQfol7u&u|*o-jnn-(84mE%j%cj=cK-Juh!pFRqxdc*LlD3{X4H8 zs=4*tsOEMq=;MEq`~S7M(`WPQ`1be^#;5b8$HsQze|l^zmwr_5(RyrXyztoAY(ZJ| zxKOnZ3ty+nE%m>@4&k}FdLNY2Wm(t8bK3fM1^qV$eeIR5>4!eg*eQR%*L=0Vzg;Xj zgOaoM-zuuF$=>hvT<!00UzGDuuQ9djR>xU=Jtr>@Dqng&$UIffhuVF*#e#YIPmb9S z%DwrAkXxTqtG|C;A#<hs?mhRw1^Y;U&)HG4kM#GBIzOt-;P=b&?BAr<b7@!m{IAak z)w$I6rkPu>|GuVkZpe1!cO6@8S-B@z|3<3&N!#fJcU#lE@n>~T^m$kNtk1i8oK~NA z%@1L2s@stBv$BoqdAjUF$o>D%kxkdV|JTov>Tw|F{Ci&4Ri0Pm_|@NkY$?Zt{tl$} zI{888y53tCzOLJNV9UY>{cVE$Zt8W{uJSt+`PTPKY~wpfnU?>%-(G3E@ZT1iWPI@j z=k_6-gI?6<w%Wfv(BEBG&i#M!_YBRlPW3t<ul*~p0p$K7&)xt1Jg?3}qp5RLnbXQM zwJER5^>-x>`L6uFMH*VqNY=f{)O$iro#yH5>q&X*)NiH2@_?mA<s|;L?YpUn+!!?0 zzo$|&@(TfNFBh@O-;U_#Zpo^Z&)ZV<?_Ja|>ig<z?30USrCxr~QmMy&QS+wdmyTLK zi3zzWYpkDdqz;P@NPqJ3i+_#v^NZAW+1ctSdgPaM8W*rnZm1e}%j-4OCO3UGi)EaV zXKpPYl$)!npBtlgV;Pfj@z-*Fzg{)Gqt*YQ926S&qHQN@o`ys%Z{FE5CF*$N@{ccC zK8h_)EAAF`eha%=aS2;bI5PB!;8DiOpEx;m)ba8cFQ=>utUglS4q#1ab?6iF{`R3z zVD-r%<EX$<$4i;~zsb-Mq17j>kxdxm@;xlyL-IW!-!jC?-|h5?MfqNRd@!*3s8-{o zqfR_!^+~cIUq`QQuPhvOd{EOHN63G03Le>dMCb@<zvjrmDXm8ttB+Z8!bwNT|0%bM zjWx%IPB`wUH7D!(EE}s^Pde&oDXA#st0jA-&#RBBv?HYvK19w*UD0T$)4%bm+eTiw zyetQ!eoe|G=vRHi;?G<VHx@N4)j!c#RA(EIqi|8fV*O*(hE6%s7Ig-snbbcn^@}f( zAGZ2fLW-8`BrWSNlFrNWH{=+uzgU+Wj0Trh#I-L=&H76RwSKvDr2g}|Xe_y2Qr9PR zxnaq7wEPRYY+F+Kd(g`clx4eNYxuFanFbBFY5U8+tc$DV)TsZ`OR~85ZaIqr^;dnX zPBLzxEv}Z2E|ujeZE{VWl$cAN)a;qPWw~)l<*z}nTO-R&Oa3k`>u-=hl{cJAHkUm0 zxwW#~yyRV7_eTBuTGx^zbVRpko0cW7NaFfiHIIAA7j^meXJy&5B&*AJJuKP0OU{s) zslP}6;la1$5}CL9`;L}n{}Q*%eEkEvOUu?JquQod2i3Nu@>hx9*5%bk!>PJLN)y={ zekebeY5V78VR_|;&d>77k0~jWHZKdCJzH7SV!O`5JMz7`{#c}YOFulNQoNP)v{GDW zWz|tE$SMi7Rb`_(K?|xYTb4HNY8#!DO>Lwmq&3<RoyPanTu@!-zW3BD*YPdaGFkiQ zm7f_2witPDtICkIOj_w7XKQ#!Tm5ZgE1eE&Vk%|YUK+hC^|l6`T3f@ouHce+x4N}y zg-Y3BQX!4@6KoA0`MIcm={a)H*cy(IU^6YTHEbq7w`^!|=+R^zFI&9A+(r%#LqE6M zs52MqzBBjMmCcoM<TscflZK1U8)e5YF~2WAmzsNOPIE+RH#6Us<z?nEvb@|pQ8L)g zU&vv%x%rxuY+-sN|CZ+AviD4LCt2Rgd`=F~t<6W}=QiemY}a94F5BAHyiL~K&b(Yo zwm0=pMjOq7l<#2vQ%Y8teks|}?3d9unO8}+oy_Z`pF5jBkmX&>v!vE(o+}x4HMf^G zyP4mVK77RdocwGye=B)*H}zv>_AsxN?e1ybEXyu4F3WqFVd>}I=HZfUA9GjPR*Si> zl<#YvE<g7(SIN))&28kT+uTXotTf-0<pazIWm^ZDcgngR^GovcAoC#E?!o4NN#;Y$ zr(~pFvn<>FsQFJRKh%6yX6Z0<Sl03xi}jOd8XHd44>DTvko;(9KSq8UOFkiu8qR2u z#fBy8B}K!TyUVg|$(53#A)@8>CBKy}Hhfac%_XzC{3%^_SV#L2l4g13hZb5#Qsto2 z(@u81?s8j$ZnxnAnYf0iRdBo%Z1u7f)a|fXSFF=N@!tAO*{T$@%knny3(v1s8jjy< z%jYW%N2PMxO2g;1-FB6BFKE?vvG_$s-HW>Q?asa+YSc}z_-Ui=rAl|UDr=t2>MDtL zmSt;;o7HXF;<8HRHkDM%>ombOm0b4fvLxHQ&dOFNlTo+A%GS9t+lrcOJJw`ts%DU$ z?NnWsY&(-}nP%I^%J%5SZ2Qz?YpKb$Z#9Et+poGT+4i@xIex1nEma0uFNv)gD{Y#w zpKhA5pKY44pKqG6VQY*NvK#9Tw|W(nMAnQQUehaoO|Ooq_C$KMs=6$_I+8J7uD!ak zzS6C)ZOnFK{igZ9sZwdp|IPKA=09IumTb4wTYcM1`}TD!+swvnU$4pbjhbx5Y6j`s zz13yOb|2a9)xJGyWjj>PFKeWa)@1u(O}4>m2FdnVby>1KPPT2dZ!cNdG8?nKRFmy@ zHQ8RSW{_-?)n&=Hj%<E8uj_8L_QG=;v)x*=7jCQB3tiQjmu$CJmnGXB?1gV@-=1iw z?1g5zj#(ppqG8is_;IDu+6zBv*t8c))n&={(*|oVJfYd%u(DmWG20t8*=B08y;;p5 zefwi|S+f0!Y~R;x&s*7sHfDRiCff@&*<P$>kZcpxWy$su*-nt7qVAtowk_m3X^r%s zHQ6@QWHT0T8fjg1S+dnHwnnNSi&poPwNLd=^{s4A)$G%entl3obw5hqepy|XY|pSy zzaUq}y5|>F_QJO|W_y0oroHe&rPA69FD}~Dw~6Yqj&zaLx9@AV&sifaZ_M_&nvq^q zGt!Hzb0vL?SC=K*CCpo|+%D=?TG@`4Wox7>YqA|slkLE22Fd2BE=#t9$ab&x?N}>Y zeq**{YqA|zlPyrqAlZ(uE=#sGWRpv>{6~2!+bbKhg=?~%QIqY=Y6i)6R&`mjMacFU zJ+t1n_Nm)m9qHRO`}F@*_C9b{RaO80y>mfFK}EqthjLU@7+@F#6blOk6mWz)_YOKH z1;~to4S#}B2Sp`C#YDxTq?#NmEJ`XWo}#3pBEzH}N-8W$>hUQ`N=i)Xq56H^d#!!W zK@h*c`{M9k|MuEz@AK!LbMBdYU(T%4{c$}i+bdC4w!iy2oyykR#n$N^NwzMTb=ozv zPLGM}QQ3}-va(hBI-N_lOD)^BB-^E#Y-2Ln#>NcFHZID_cA00pg=|wS+ZnpRwRJir zlkKWZwyR?XWowGEvR&iZmXK|>Wt){`o1MvaV<y{sVg_Yvjk2=M@oe{#?N-b7)g;@k znQXUZvMr7ol<oE?E888O?E_?cz_NAGrMr#vflRjLnQRZn49fOUl$Gsa&$fnaTP<5D z$+k6<?deRmAI1#I_DqzOZJTFX#3{~K?MS{l$@bOEk^F0!Bl*U7^j5a7M_Jjv;YV`a zZ_pW!W&2B#?N^y>yE55+9WyA~Z=$Sh&wDoAO~~b6wQM7GtHb8))l9YnnQZ@v8I<jx zQC7D9^K564t<v_a_b1sZGkex?nLX?HxHl<Vw<s%Hci*%6lkIfNwlm3gdM4W$nQT=t zgR=FBva-F|vkf6zon_<4@NA@YnQTKc*)E6~lx=8~m2H@3)7w-o|3jO%wj|pRGxPRL zX5O~Nxl*<tMOoQ??DKXp*)Fx(zMEvbG*jD{Ol@OhJ<2vN%F1?`*EX7L@3w3`w7J+w z-<`=eEt73}%%E&DqO5G!dA12;n`hbHon)Jr$u>We?Y%LBvMq?RvMuy%=WF8fODx;E zB-@fqw)bVS-4!z^+uc!CwxyP>*ZpLBJiMLq`{8!R`*?cB`)OQujqn-XOYItAt&2+Z z+3-$!+WSIP1oPq+WWM8Z-N@@5E;^Qwkk{$q!sC6!>F!zX^l-&+7un{chKq)~Q7={o zsZ>e_|EJ{)ehBuUd?U5wKXIS3SIv{@3LP9$;Wk-j%aZG}M*qDzU+${+Duhzu<$U?g z`C{P_{?PQampCnXkwPf8ua<nrT|HyLFH-P*N@E4@C63!zR`8#xumv>~{1;U2u~@+` zQE(T%d%uN(cT3@w@0!0@=|iFX<#8%dF;|qiGdC)Bnu0>rI$@>iiktL*L&eSd-%9UO zt+GOdHuED!<f^}^#`$8{eYgu;sU_d>5#2vME3A%U*vW2DpJ#{l(GVgBtB$k73Mqvh z>|yjUz;e)^GhM5sG3<2bXa>U&`J*mwMCR|#_fa2VWMkw^1%}AAUhd2hiXEw-FaR1c z#B^|Hu9KgKmV&?faQ|NUd1xv4`yJ-*(^rEEzPiJFx#||y^6BAyhnwPTOZkpRbvxOn z<@E6G^nTT8({e_L%;{{{rll&pGmS$J)6ysCOHJ3byg9sE{aAXK7XBWbD)MhH3{@Xt zHvS@KDljdlv7XNvum5gRP~V#rkndagjO4BbHuQ66>ryooGF*{;_J;A5DsIsz8!FoM ze^FbA9KDt6kb%E8qB~nDdBa_~V{^wb@am5-C96aJ>B_)&8ss}Zr90_1C9A`fj91S# zC7%e9-$D;t$|u7VoUEPSrsPvWf3NA9k~LvU9+w`bg!>iKRYrbG;WG6RX5#yDrUFy) z7g=&=z98v(1%*LPmE|>CN?)y~d!xVkFn^z^@`tt@Sq^QRtG-Lqn13-0hL1yROSnfL z9N4g548!iOD*_w#-Vk{gdKmVf!!Un_ZbyKi57&A1dEuD#QW$o{BQ|ROK%Lu&`L10? zs*5n#I~AJ>jC!psx<#h-f1QFt<up3tA)rxFA!5nvMC7U;V1&nob9z4LnI2Z`CEDX` zgvW(5|EJWajqvyo`2u<vVYhJBf1%EwZG_!}&d=CO*NQzMTnTKEem+OJwb~*^sh0ep zF8my27+IxGtx|y@o+nGL4}ZTNieGBQA97r--b~#OhidjHFq}tr>`3Z<IMh8>iLCAw zA@W9@+gRO?ggW^tU#t5AR<{n7R`&-(-RDT}N8S8g&kE{(vP&qH-||fbYJON2?I+Fb zmnVh0ZhTIr%Cw)1(7B&Y=SkuA+vgQ~UO1xm2$A`Q^TK4F94?FVC2bsf8$QLfvTZ6o z!)3BIm0W-Jj+IK@8j?S!<W;L=`mwUsd`d#Tq3R35S$dzY`nrT`5w=M9f`kF<)UvNy zhL|76n3rNq58f`x(iefe7fBe%B*d2aKZK!UPX*?HCVKVfE+U@_vNz^C+V#0v)o*3u zgS#4Tx2nK@2p=FpS8ep$5KflxX9)xPsbwgTm=p9iS3^t}y(@Qypju3xhP0PTA4Gkz zVg60|P#2CwsG-1o1LbjVk`F7bywmh?Ue#ckW|H@95>(#h!pCV|mhcONX%Y@d7_c;! zM@(<M#ncdE<q>o-CQn1!E2W3>V#ECTRvwN}9zv!(-T?UwmCZii@pa0(U8cE2-7i7q zeMtBv%|9VwkdDt)pO?T7>kil+%OmFdxQO|Ej5(IWDOsuz$XhER)E8Uk-)8mU2=xVl z>7xx3$PH9J-Q5x@<aa!)ekjvqxodtVK^5*6_yOH2e%<~=j%I(Cz)$23;O~CI`Xy$v zEH%W~1QIkKlcyo=Qt4s)iw*NX3uR$Xgv|VLM>eMej;-FmQyrg&JWkp(**zPo1_;m7 z{2~dbb08Wc;jIz|^i#`F9Wn2erG^-*jv#&oH>M%&!_sZ*^M?6)n?4+&JcLYn+~=LD z*rqUfAJ&J(RWoE-Pxu@Oe<FO5gnX&$9-$li_ahR<Nf@xid&x$$#E5$l$njAGvOXmt zR2SRjAFBvO;YbBmE^YMc&z)mFqTe3sd!J6ftG+1HA87ETgv;5Te<0y;gl8pm)h1f= zyaXMc&RMHwBWOg(WHw$x<{%LAVFc2A6@kP%B!puu?*p{Xf7MFF5lRdKCDKOkefw11 zyVXT_bKnSj#P`0U(uD{P%twmI_2;%WPa)WrQmxPBtNta^ztm05aZ0Q$<y7G!Hled5 zycc1Rgbzp<uud(*mO{*zWvL;?wiJS%#pG#7`v>V^UBrg@AJ{-~gn=StwiND@^Kir} z4ItmKnewiXiRTQeu9k2I!b}O@LzpMwO-%f45-yTZyIJjme<o)9ABcW_6E@`dIRaVt zO9-pspnBX%kAJc1aD?iDz-pk4Uj4cA&O;k@;hdqNT5%tdsUL+tE@36Ymn85Du2o!X zR1)*Fga;)I<`0Z?EXZ9hrH;5dV(ReM(Y}ssVa8%)eto`<OF8?GTJ#CtYNg?dELY9@ zME?G8k-|eHN~?L>BG{Yn{o!)vkJ9a&;Qb-;oU`IN!2{v)Wh{Dl1705V7U}jD{9w48 z(MCRGi?TENTz@_<;6asbp|7tfw(1Wu-HY(Dgl{1HN5X!DZaQNfdbU>bX%duZa9_Rc zvJKrB!)}l_gz+n?RfMfVAk{hql7Cx5n3mW&|1&!)!4Xzf5SSj?XpgB>H!IXd*dLb5 z63=rR!Ucj~Ft#cxM67(Bh+Ka@(BOHTsfx&Vl<04`Oh1)SGg^Z7m@9?u=g4u5gv$_G zB-|ijz$PDUh`CRe8e(jZA!scoPea;G(!)Sw!~6joD2^~tgv=hpCnP*3G%J+%66M`3 z)31qoSc1y?m~fh=yy`O&8YI+wMS|AF0M1^*{!GXMJcNYmJf=M+A?XJdVQazL<^N#C z;RwYcWQyYh7fylNLvbHu2tSdDpL?zPwS;5OmGDOiLlIt)(2kJT`PwrQ1}u;D5%X${ z>3yEZT#P`TD-p;%T|%fZw#;|y8VbXa3T!8|(W^fn<M3QnbEvV7($19WeR9_fke~^? zNO+P2V<fzSW3mJ$FsGeRE%dG`!<){RhY*`Ui)oKZNP3YXLV2-W{y971;0Wa*WG0YL zg?QMjH5B(#ikl--6H$vKsJMHCCushN1pReMuIl3wM)cG4)yL|HX_6(xEJ7fLUpuWL z3qNxj@_t7`s4uq6|Dh1d!jTG0A8qvN&nHbhhSnpmYC0CMj-Hh1cXHSKK!PfKR`_Ut zIi8pBB*Kdlc1ak({fc2qQ$viVt<+gVknJBt4XjD?khflXs4%w7KVX|6j!+>&W(N7} zipS&js+W96FV^C5I$vBu_^A@Q50G${g!do}lCT`%VhNv@Fn~Xa8bO7`ScL>xg+x84 zs2Vb9q-5r|LPLeIW&Sd&5J#vGAyXlrhw<Q^tz&+=w~B|4_-)aenG%$Dp0GrE)ol{K zfpDLM69%ci4Qd&-Kw<{T5@IGH5Hk;fEO#T2_rnrGeX(V}$?C%q>I(wvm^OO#=QB1Q zDO@Tg-*FY&*yA#NjRs$mFsN3-Hzizy@U(<=2tSkXBMG(p)Gqk{5&iuJyT2ZR9IXgs zeZPe8uH08WR<c#ivHEa?`hq}xw9%_SpW5-Lqs<^c9$fXZOy82b=06fNgWbC8`H(s} zPLps2!Z{KilQ3Y7T80@U=36o5`52QMqF}Q0LLl$?62c6|mie6RB{)KbL7+m~P$8cL z@(|{JDfy1D<BgVSJPod-TZC&Qyo%5wq4xz6-Yel^2?O}!tC4D3LyT>O1ld+d)O!_G zLne)t%#TP9HO7|tQ>{iEp+<zvR>-G|JRZ6|RCqCa>BBO8pQw*n-p>fVhsyC42_=MY zOIRpj0DmYI=8%{V%2Gp&l}FG9OrD0c{Lp16FE-3KSa~=?c?g;E__&g%R&5jf73KX} zrauz(M+qACE5Z~VOseuH=zSI81PQ%{t2}O!gz|_PB}<5zfk4b%2xR#%0(n0xA=DRJ z=3A^j9HG7-u!?D;SARYN<#}2=Pq>xi%K({vD0j_85>(+Bq05DGOqTF=gli>ClQ3YG zT80XVxl@)JVr&8lT8+umkamOgP+)ABzu5}J5eh`eOdy}B@|drcclrQDEs}{}#;mzV zg35bDIO!reJ}zMb!e=G$8<zvN#PW!FzbrMxSa}5TLzgiPX}>K!louQ3@3Zo7gz^wF z<?$gcPaoU*eUkEiAk%K5o|T~To)_wMD6V=@LMOtj61rWi@_OjHEX*D;7s(Q0nh=Ot zgg}-D5y-n*LZ~mc%zw=4!x8EW0_&GHtY1F(<+*5^z;_N*+^I5sNA8-lB&fnc!vB%r zVhO|FDq)<2t0W9q6DuU<W?5>8u?ZyTQB0nOv`<J61;&Q?pIL!8LV*aG3FMPx9@n-B zJV<#nW!gs6JP9iAHetlu<hW150|+0K@T!CX`_wW_ATj6YNE2elA`sJpK$b-a<XtWy z)E8UkpR#)ZI6{3vU;=5w1oG)L50cw4@DGC&_a&J=PlIntIOh@xPfNHN;b#(lE}`bP z5_GC{PPN_&9-|Q<)o=HZw<8d80|II8Lm=_v62cqFQguq}{L5A%j!<F{D3LbYS6AQ` zb#e5o?CL%q(L-&He3i{d=R7MvRT24)du!F-e`NZxx~b`QQdk+M36<}V;~WW>A`F%= zQ^J6DwG1nRn7d`EA;z{9g4SU2G^E`qJ*<n^FyF<_DshB?B4oA|K8xoOek+e3x30QU zrss&dMuN7L7NO@TIo>PbN`%`b%#|=;M=Xz+hh(WC#>yk;i<mqOX}>2ulouQ3Pqp%J zgz^wF<?-P@SNt1u%-$=574<QhULgE465csl!dE10MEJIZvo4kJjD$NSgpX7DseSmU zbzsGZ2FuAMbSF`Xz<S>*OK$K|#a2t$P9Popo<KVICjuQ*jnP5}BN3>kC?VIURZYXz z(jiUTg59uh5K8ew$y|RPFW@gEniZ4p_y8vsf0SviGSs{xLDQYrwzQViCrJ1mj?*P* zvmdZe4a3GjNMWozgoN4lnD&^2q<s}(`=z(bzuhJqM;JUpX0mx&fj`@@ZGj*5uDVDj z{w$(qj06=oS-6wtd<4KxI#%5v;g=Ey)T?D*4J*X_Q<fTHY+E3xYFwIzw1cIG@?yjM zFKnO05z0fzl*i)_{56RkH2QGza*s^<8xdX1NO%h2;}ZBu#j4LrSR|q5za((bDCTuj ziZK!Ly%_Ra1VWC#Tmoro5J=1~7KVeyT6Ie6{5x&_aD)Pbz{W!xZZw>!bAEMk^n=D& zMTH3U!G?0!XV<y@Je$EE%-EWElA%5;(|grT&GQnpCSDYtppaK3{4YY`WIc2}UTdO5 zEyJ21<~&(yh_N+6(B+ss4Qa2H9@a!`n17EA6h{~+LS{|yum^v~W99LS=T&^%vY4nr z5>(#B!dGcNPQpHf1_>umP<aPpdBhBnrG^+QkDwAJPea=4rHArj!~9|^4@W2uAyXbt zj|{A~hb8hI{4jdeJelqz{5A>SLAX!CpAkMN;rxjbIwg#kFrZm&!~795OO_g9tU!YJ zDa0BQX`Cefxb#q9Y?y!03d9i#M937#11TNqqzfBW$CI3&a*yX*g#SRoE`*;-sJ%kM zuO<8(VUL7i^?G-lrFI{u6)}yngqYhAh*^g~o^1$Z{*#0Y_>ic}SsD?&ZVq)}PX)GQ zn&@EGrns<;q9q42e=20?Cn}VoZ&&_gi+Rd->{c<u!b1~%!$*AiVs0p(Gv$YL-J+mA zA*icPe=TT84C=0RlRH&*|I?V^)4Hh9S?9^pwXj6K<7gD3-WH>d%?-ctSVf&vAEK&> z8W5v6j}N)J=7txJQ`ET&Lex&8_^JBg3oB(ke_61~Xl;kjq}cwC1#7>=y8n1t2W$w| z_Lw15^R#TCpUT|uIn2hOUxuh{M15Uih<YhT9g`crR+F2r%jq1uYoRw$&&xUdtb(i; zyeU}cAJW4B*+LKcDbsgR-LR1%YAaDy5{ExZ+Y3v<x;eHT{xhl>F)LVk*R+0KVx7P3 zj$mDxSj)t|ePyt+FNb*?&Nq?gM}IC@mnYV{y2(0rbFg+`4YPR-YvQt>2kZJIb||sq z_Xg`4tjx&p;ly51q0{)Tg}TJrg&HRH4%Veu!@T^S*kWz4>Imi5Dz=W&*kEl=GJJ&C zDenwctz3)E<xkF^dt%RSg%hhzJUM^LF+EPxyFlMuw{CCmR!~sEMV&Hrc~h=%;#<4D zt=oj2s;p<eaALP^sClW!oRIiNXiUfU%%{G}la!4%$DNl0$Df)%|MUqxY1XZ4uyoJo zO+Vo*>4TNvL}G|IsY@nPkACW<&j~s_)~a{)-IYYup@LJoS_NI{LVvhZsKk%b%Y(b6 z!KZp~DC<og9F)_t!OX{~-j7}yD$x@$arhOQqtnw?sAs%6Kcpw|P2H{u^;C7u4e5!e z&;57hHOD$Sy#KCzuA=uNmujni3*n{wl+zU6m2sYFQHa&q!5vb<SzdyMMdq`;1Xs`L zrhFvmJ1m)s3iWlaRG$o5otJ4P@A;X+LnZyPrRfr+)(4hML`@i(nhxluah;-FZeS*d zR^FhDs-3x(x^x<2(G*xm2EC<e%(;{EAG-8(v<ou*D#_5={5wvMEBTOF7?zm@RWaO0 ztJTM7!;3v3pW|EX?1VPgXm<O5S@1RhcF;m@akox{O<KC-Ud}gkB88i?xdu?J#T-cC z6gk(RkmNOAQa)D#?LjPpB|$8KRY5F**h?w&vc(*LL!y#^9cBf)%nDvGE7)sRu-~lU zpjm-cU(8lt>ZJPcXkxAiY#=2?C$Bb1`CJ(+(ZZn1ok%OR$N@eT#1hz~#bS^)Yf%hf z5avMIu0;;8D{&z0)*=UBDAodLpB6d5!Nh?iD-J;U)&hHcEta4kJq+b<b(tD=x=gow zT&AZ3E|Z*$w2d!pHj$0h-eEr7lu~a)>P<EaaxK%M%@FWy{b~zVnicT<{<4C#W(C{L z3U-<m>^3XlCwi0@jNn}%*9iDQ9$5iTX=W;=mNlVG16Zd;8~sV02=u}%HgqCc=7yNr z93;1lhm3B8;<dd38^={(y;;HbAYKJ_m=)|cE3n>5vA2Bgs<f+Qv!wXdp-mZB(kb8t zvjQt`N?dWYS*3-QNm098rc*+*D>*Hsc=TCJ0~^vZlNljx7fv*CMZm8MXbphwW(7UW z3VN9p@aqGL1=VH+MYDn?vx4bn1<hs!JTj{cV6j=j7PEq_W(Cb%LTsEW>h2r74WOSE zZ5xX_5$M}C0VK=Z5Hp*D<lD65a}9vx=E&yf50JH`02|emG+!y^%jc$~$x1Pqtl3O` zLZ&jXOjm(MvjUr+t3az+fsOg9Y^JF)vl$SHJG)8Dl8v&oE-8swlL#m)vty-!4QcJk zCPCUYVYZ84LlCb48_fzfnH6j?E7)dMu*0li6sN|yYrxnb7QuA0#=$i!knXfb0NvRd zL9%2GF_}5YXGxAwdMPH!=bF+CrI<n1w0W}6Qo~9uI#L7L<#Shq&1MBQ#;emYmUqZ% zg<PE-P56Z?ttujMXIB+ZMcZhL)baY$k_I-U1t;UBXUv&(OHUoaR0QkH3)Y(zY%nX> zWLB`ntYDj2!9lZv9M>tiBH(%9Blg<Rp+LH`m4w6tlUl8SEanJONYc>7^O++~VLFgf zOsTz!d>cc)60nk|fZb*V<W_9jMJaZX*)PezJOq{jiFG6gTg?h=n8_YUo6TBSmGp@_ zyIPmYMzNYCI?v1(1!U$c4QxoOOjavt`5iCzUSX%T1-r}&cAFLKGb`9{R*>VmNoz}} z3t}S}W>&xx(V3dkUK?VswnpgqV9475$YKtp5g|zfAm5?uFilyCDK*FBdm-d20W0|` zP#KbyfR%hz+C?dLp$u^wA^*mZsSHT0H4OHc6<Gc$;DA|y4L&(aZ;*)+HDPp_nI#)w zW9%{wY)ETM)*M+^g+UYn&u(XC7;jxLHGr{N!U+vRvlg2?q)l41%K*N&!W>AJ@sR%b z6$`yhf$AU@K|iyCQDz0Pmr^Ivd~<+yE%Z|AL|S4Fuq=oru)?fhm07`Rvx2o|1vY?U zb^xVL2CzNE6v3V#CP!apr%y1IK|d{2RPIC?VGh9ad>Su^!zqX1v|0>k*J6#47MlYs zOB_hc%>h;=4x|oqfVGJOX`MO1p2QKi4MxycRt^dM#HB7T6IZ%S_BAe(kSy6l2)0dH zwApNPcV-Jpy$z{1*&4_-ox3}^B4`d`3ACCO@B<&3KG0!Su-dF(t69M|vx5C*1^ncP zGJtCCpyi5y9{`aR3^Xg?PYYxPMYDn?vjQG_QU);Htf1MffFHC|2GD9&FyE}8&8(o^ ztYEQO!E&?4wZtqf4?}1G4B7TCq>bhPjM^MXFPH-`aC0E_2-zC|V>btqb$iIl*%wx9 z3E(BR)S0boZwM%Z7*IYWV7_`}b7A$>DFrf<+vqY=O3Umfg}<mp(+mjFgdTm8Xk&p5 z1iof0s4GI6B3P+~u@sY1vFxw_urmoj+HDT-LgGN$Zw|m8SR9^mYX~TTn6lJ~w8tDE zwoE5>rL5~iKpDiA<<N4MIY2C?+=;Z;93ZAlR|P4zYhjwnx6kFcF4svvVzJqPBi57+ z@E+Q;HhR-LL)Nq-n2I2dEnO4T-dBrOKH#rNY+jLy<^cT3$e|NX%ibZN1Y*llC(>AR zfY>sfa9UP|fHH^y>GTm$t%d0$TfNJ1RBzZrrcp9G*p50N>R6&hQvsH0u@NJMudT=x z!N$Z9>!D?v7VS15wk&lbtu_aUEz_x>WpfB9gBXxb1p$k-FcoB5>vHV+4SUEmN~Qwa zQ3pgF2efD^z(FlG6+!AA99@J;E#^S#Z4S^UaUcye2jDMf4&9FEYj5bQ1Y%#MPNeRk zWeLQTrB0-3bAXsKomEoq2r0`TrYwh)Jax~#HX)W@?nLTg4iNh)hrarn1H``46+~bA zwXlNdsF$LUNzu>cxU%>oqazMA8*s$JvjN^)vNp*|&zapG6D#hp^%wInj@4Qe0M=-+ zwSu(49DtuJG6<bAT<018JK%0Dq@sEszeF1MpW#hpu^wSQ`RLAof-2MA~Z(5L>1z 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�qyZDN6 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 diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/BSD/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/BSD/libexpat.a deleted file mode 100644 index 7994b76c86ebbfeb40347e115034b70e40d1bd2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 396228 zcmeFae|(h1wLiYk?gA^UK2f4ZjW(22p;AjKRU*`egbiqo4TKF?iQ*NkUJ)qlDprFV zb~j`k7Ng>?)>?W?TibH)rHU8<F+iGyN^3-_2-wCJ+kM<rqqT_WHQ)F9%(M9c*xvj4 z{QIRf&-^@d=FFKhXU?3N9Wn8S#W&u3`Oq&H4g6O!4*whfmC{QtEh-u-S^fVO6@8`T z(o0N@IYT`j&oqxG(DwiT2O4<qUiW|gZ_v#39{e|}>Z<F*OXgMIuz1P5#gmpyy<x%J z`3Nljw#Ut>T)24NE#F=+dB$W(shJm<J}(koyx{7Z8H;aOG=E+smkcP2C*KgcLE=;9 zMapkjGA|ddSv2p)TW-2#-rPx%$l_c6EgG3uu`s&8R7KG%`qHmhFn8Y49LUi8dAH45 z5OI;prPf4lSR6TVR%pT86K7Q1e8b`!Zj2ZVkAYXcc;SunmMpnt!MCqiuq3iLdSm34 zg$s@;Q?c;26JSy?7yYf7ccKb{<Uh#=rvD^&^1PdFh|WK@;{#JeOBZ3VazvTD@W#lU zi{?$9cjNqHP!~)-I~$06c4m0NA~MF@(1OS<kvmTS{OW~~8%VAbW!-Swyd{fnxbZV_ zy853K09OAj8_l9y3+CQ1f8m08$MiR}6vMpWhWQ5P>GN*-U*_j{9vohC>n)2G<$8Tg z_3(mQ7c9JEL1@8^3+IAmj>&bo?*!xk=g+@oN#q1MpGn+Vx6MC6aZJ@4ZZmZ_Yk@<K z2d3Vz<mQ?i=DRa8vT%`^)sj7Z-je8T?lhMKOuNwH#S0f#ES%drO)H{{7tdP|DZeu^ zuWufrV88T%^LD|aXryA{g2=q3y>r<ud(|xq=3O1V?ce4t&b8)dR4kkyy=_6itjfjn zAPoRxL8J<}%$M?2^KPrUVgCGuH|Ao~=M9Lml4MCAY9LfxGH_NzYUhD23m2FI{SvNN zaMMCbM4u|>-2gE*?<$OmB)OBz#Zr<C`Ffi|C70mfy-0M4lmWN&3Oa;yY>{iFJbKej zE(rwMvGIQGV1!&@I*@}678Q$uujz9CgzKxS`hhTouC6&Q$pcmjM{XJ~=mCnvN-pV( z*4*;ldEdP07~W>ND;C@mIYBaLL3meS*vworvw<~CR>>tN$|JNs65Tdmx`H}n^S-*r zfn|?A8?edk589;k2i{lan9jIG7cZQ@@Y@_#F#auI2%t7FY2cW6JWFqzzlfsoqJ>6_ z>D65>E-ES+JGP|X-%G}gL+p~VmyE}^sA$g6dqP)LT9$PZbQt+(d3+u#7r{62k%^6y zv{9aOJ!kjJ^?1U`J?gC*wIdqH7N#QSd(?0Am3|#xidxBCs@$(0WH6e!wr)o=^TX<` znd-G#)QEQlldVyIwm|(|FY)V&JmoL$nVGK&`8Rnunu)gsuf6X2x*e&FY%#Uv0)9|m zhXSh1-v>`u1#~#58#>WY{D>8?<41gvp-uNYh?lh1?Wk)Z$}Skz4+r$}T;Wq$IH*Iw z#eQh{-%zl(!54Dvp?p<Pm-{DpBYrisZigDGuI%4_C{U+kH>0&3>af8N@z^o(ME^MO zRn_BkI8RlNKS6uICxCpkB=FEV#!+%WeBv?jvSZ?tkBLu}_OANO_NE?F9wpuO0-#U( z@^R>aN0nCt00y$(cz`~+eCtH{A&!r#o+0he`pouc^tNaEi;@HSJNuaUoLt<6KUd)2 z{F(6Q=E}SDM9Bg0=N}VaG$5Yb6B(qcBS<UbpTqt8Z}453EAQfSH}PpcA}n=+^35^H z$)4QY|DW)uz-vzYi~Od4k-zdY^ZW7t>E!=BjGtQGh4F3S7-Pzmw0_2X=~uq{v&-8X zF=5;}=8a5X8|Nf;Mb3$B%CLdRl=SjK1ipYUXJ}$q^n$b$_aeo`!AyHou-GlA4x9K0 z#K)qdspRXc)C~H?y9!j@5nUHh(NE%=InjNQf^?h>ex7g+t8R__=qIWRyi$QImcjo$ zYI1Q<SB%0ZpeqU>i4gMlJXnCdWUCSgk+XHY2=S7`={VCnhM-!!7@_QwS^z-=-98yT z-pam225m)_Cl!AbAN^o+ZzBcLNPHBMRlaFw`ZzW!NzOGrJw36_hgdiAynrxR5~ec| zna!yU=OgUOL&zI;kNn(%%pM3i2*vw}DEKy@Ixd_v$~UPPGSkQ>-As&;m8WA;s5LUU zZuEB5(Qo8aIr&#ZSPiCFbkMaNFg-1R${*;u;OGwJ(~}ByRUSf?>VTX-R$liX53L2x zuE<dRH2Yrq-jd<k5GVQxMg>C>Z?$&lI4PBSkW^DMii7H^;(&@2`?*9wZpsK4N@cgX zgy@@(|DwG-9e*5P`&i)r&{$iJevoI7dQ<c3dfq&)eF$sHJLU&Zm~YmrP#%h?P*7iy zhf)K_Ggtov@Jq1XVn9-pdg4bexMPUUPZbTql*Q1Q^|gguq29_3gBkC1S%AsuGCz9m zNqfjfb=&<O@=L4#`11YuNxfBDV{gn$?1`R|ovjXIbR-t3jvYNYb-O3}PHL*9Ud*23 zlA)=l$KH6V`h(gT-(e;8M9xPxN=E<MUePnu&50cy8hz8=IL$(l)FhOO?r$ILx%N6& ze$K2_uZn&!QP&4z-<|4FRh`k>OPk3Oc7jq*$HtH`Li^&aeib^XE5@Y4-73_rE5-`9 z+zoCS$4Ql!3U$gHuAQhuojQC_d3DVg9qL9gKNwafx^PuZwG`N=yruP>(f^FMO%&Y& ziKEks@E{3vg<CY2o07?sdXSR|*r@P9XAx$fI{|X@C*Czx)qS9L*c&nA^`EHMRP=~G zwRE!xgQ|T^q1RB+PV8aFo@U2VmFN|*O`%Iw`_vg}j+&89Py~Rwn#kS-dS(W77)3hO zsh~vs$VIp3t20{8B%rzvG+IGxka0c5N!Hijs7~&R*t+VV+DDmlG;`mlJv|_X4)244 zqrA#0X*B}VYd_Q)&sg!!k=bWjz#krUMs{7S{xwgF2(=$+5FIs8KKqa)4@Q~Dy;w#_ z<Ghkq=PuHLYJw(lQcrW*s|V$8Ri{(bOC|7U-*}TkrA9~!U9^QkwG*3BS8o=|eABOh z{tzA7mu8ndsc;uZ920^ff&(k#?(eC^9PDCO4Q0mMeug?zDAPN3Mt*`eTL4FY<ErE? zJ8>^tGNb&m4t1S?FwqwPpk*Yg2!BZD^AU^ujD#djkYCc;mzkpss0<SKWvVj?h_p3~ z_Kk_qm#aGM#9xsVTQ=1bxe^c|lV=QIzHle-0#!f*ceU}_iCaKUtT=Y^Z!)03dtg&T zax)~OF+*fpWblESLF)Mp%>q4~BtkPwCP{{Q111R@@179qivFi_JDSwQIdWMllxYuT zhNi)gARpN@H&b4AzR7`>`H|WzgKtDPCd#EmwW1nocjAkLRn={{^8L(5ANTY)XE4oV zFJZ~P?ETEX9%;G#L=BdDDH<u)np^^;3iKque((^{fiylz?Yp+l`4K8MYgwz!GUTqu zm{QDMj%;=K1nU>~E2_OF-c<<xj@1V|O;zvM4~5<(>if}xzAl(Nu<SftnP0N2biCRg z4Q9Wo%Y*Ul!O|m<P<)$J`g-);SpB=6=pE{C>2-OL%P~GF|FzpXy}rtPRUNQ5hTl=+ z6MLGf{ZW7Wlz<hl3|cLuWxTCWxC38_OC)(9G9~3d2TYLiKMEj1Z~*cbL*eY1o|kL| zAs`QtRGSCnvdy|OfUQ;{cF##3JNaEuRxJxSi}6iY=5b+2`-|tWBdm^%5Nbx#nA#0Q z+D;a7D6R`SlknyGH&dl$Nl-f=-)E@y>}bL5mCm1^<SFw+MwWgY3C8Z~DT)kk_Z30J z+Z$`Gcsmz^g4C6VV;`My`%6v3C2@yIk7iJ1SV=1@*{fSe?`Zd#NrCkxtedE3+8e#< ztwd|&j9Ye9l-r25mTa>(mRs@dR-!ffcAeVUr>{buaI}KD484ww(t}HSQiac>e;!?% z7f)N-UqC%#dO!~@T^30D3z&7s!E|Mif!<wbuYP4Vt9iPbI!{5#VLcq1Rh|D7`UElB zQynN>61d}S?b9`~g`FOVx8-p$%kgJjdzl|gue$<EBSv_s>bxCcJycH*V7*p>RQ~;{ z+P~viePTP-d+&sDKO}d6>zx<u{SG@^SF#I#kKaGk8R%H-*`IV-p81%D4H~LCzmHxu zda7UT0Mv0hfWLYARER)q>n-&Szj`^^ou+>6Nmm#+6$Va)bO*CVdsKx#d!V2GV#uGT z^FXds_1TyghD^x=YJc=yT?^PJNOy@Q>w(O*`arVBPP~hz^|SNA0@)E<PjqFmK99pU zGhbJZ!5a3<cfrmO`hPH1gFotL7f}QpwiA@==@pFeU-s8(U*;l+jZ{2=Xl5j(N~kk) z4wEWIWroXlVrH0pt1}ma+fx-cXD%f7M-LL<=K;!?C-jOYh7B4kI{Ly>0&e1zF}d88 zeYq>T(XyNV$R`Mc62tV058Tu}Sk}>t+@#klD9p0M^eh*s+J{;Eo?bB)$>8i@T0*Go z$sW)vma?6rneV>?d{;zFWECQ*6>AX5+{k{d;7rZTLNNA120_g3687(ha}h}%uoEL0 zTX7JvR20k1!Bj;)R1vjZb!Vpk59K2Qw;({-w+>)*HAnevT}JT(+?%t1&~d7uZZG3& zd&AB)l+W$YqDNFam7@Aj^rLKBZ)PP9_#g1q@pbrH8efmUi@&TNB#`7DJMjd*x3-SY zZJ25y>g>c%k@)hDSwTr_TC<vda0CBtW>x5zN?_f(tuVPKHEu}cO9shXCpUjmn93ib z%PBO6+}c{Gt{PvUzm=an5cR1mgYoiwOI?|lt`rfGuH-`Rfy^`?nFvs{)XqLt3z9U3 z>C#gRF&eSc(vKn(cjkbw&*8tG>~D2!FM3SD4U(~-5{gAS&AfF!1)cia3ue}0K42KS zbd01@Rhe6VQ>eokUy~3QYKH~2c9K7SnI8tX$US;ezOKutiXhg-ls|@sAhD28lSj+f zH9^a(Lm6F03@4TJK%Rv&>OIQEP%z$}@4GTj78LAF@{6e;?9VJEQ=pk<ws-4}LOnaL z0F_F=8@yu&0H=*Ch_~e%O{OlWeX2ZwJ)#~4x!pt^U-@E}c_Qb=w|ObGn<fEXP+{SN z1mETg@xK6My4*;Yav^aJ;&J-4+204Tzt_<Kmcv5*a3?5ZZ)`k70u67f@b_)+pqB&* zmHNr~L*(l}hjD*#8+J~aPdF%B`^hiRo7Txfh(+pzLjh9Q+)mgGE($<{?;hPTVG^|T zZhPhT080;p;2f5k6e#Vm6Q3gv-J_3utp}WN&w{NUzsK_e|7;52kH(C`ssV;m+w4Ra zDyv0)?Mr<p!1cq@6+tzuv?Edg#fz#LkcM;<B$1EY(H$xOU<_``f4Qm%$jYmh<mF^W zb84JNeVD2ZWFIk9!?JWLq54&gpGtu*-pU<B0DBs4W(;5~Xu%6B^5WaUFJ3Z^56t4L z_8aImSkR0bg7sK0%_9YlIwyf_h^qj&uflJ3DBv?6fT&k}i*j}IR83GV>4kuu!8CGH zP5$Ult;4BG*;lC`R%1Wd@lB8dvc?B=00tPP#(f2t7^K{;2An(q=s!Qqb}<`}^%je= zt_e=42}I7eHx6#{LO}oqvCBQtw`gLnk(C)MK|UrK^oc<zoP8C#PR3n!vHoDTfmED5 z5N*Xe&Pf+<t<Kz!c1!jE&47yEjI^hq>ifmwk(M}y654}*6S6$lst)YHv0mliK}7|~ zoPj9vHJZf61ODeyaS_ks0GyH_gUZ}|wfV1wk^>8uq`07k1Xy#Ci!BBkfPU0(|5TV- z3Z*Bgs=9&Xm)!BM;7|v_M=<iayW#-$m7L?E@CQmm-I3El5ii6#bgAEAu-*L&2$mc9 z{`8jF;U_eIG3rsDM0;mr&?Z!X?Cqo$cmkF*RQLBo7lnU-*#@%z4TZC>y7Uoy4QxrU z*Kt+Al2A4o0K>X`a%wAylL|JZ{AHtes3TZ?r9HKyq!shN2oSHu`meEJo-O>`Q#)B5 z$z1SZPmj=Qz&2R;LochAoMcbrPpX^n?gaoz%D!yq8SffJOkU+)J&i?5&nn~6$aO}4 zYqIK26<(wE_tX}t*VX&hKC0oe!YT+=&=p#ED3kd;*bBoM>WVDTE7qY8oO>(QGf+9% zY8?&Yb@$X3tM}D5Lr7LyV=C>4T$V|46^HPh?QZ_2h~;5s8H-(U_(Z*P`IoG$XS#jd z6FEre?{lDzWPSvgrlalXXn%Xzc=oam@)TCl0J@#3?@l)s0NK{FAfBEmBHE43?0+~f z9qJ}G3R98hlqFcl^0-4=Rg9AHRvf^bcl#MFJX2~OFal^6`)z7uy0RKWe7b&^P%#d{ zV)c5)!%kOq>qZK5^`ctEhT})D!F?5_WP=+8v*}R23ZS2B4Uq1EKsNskd*Q8wfO=FI z05Q8;hx1EX)!EK%s2|(PRl?K4ow=R7mJq}FW0}j{YAzQ`19HFSwpRebMNP>VLj*Br z1oH-T;04i)BIlt==aS=cPnF#0pJWW2KVz^#4>2V;uQDRXTsi%B3~XQ2ykJhL+GlS( zGqJ}`CV@8WD=mfW)oBnO5UXQk%`G`BQm5oV$*y#$i@j?PWj!PIj}K?<<m-qhtGZf7 zAvyY6jZOUbmLe&(X&?St@jvvCyLs|8VM&2~-(~{G`Wfz2%UO(4b4fmouLGA1SSmK& zPXO4~!Mu>yG-EIZ<{&I4$_Jh<!+I0M`V{-RCweB-Y~4&Lnp*xSpqK8n6SahlzJ1Hj zqcyG|FzKkXsLzdL7HU+_rOJ0YV^s&^clxcfT0iU<A;vgVfcS#l3tA7EZx86;%B<AY z1*+;0j6t~*Mec{~#6Qrk!mcfJNL3U#+|gqB7dlpT_Dq8+WbAKhN2;=b))nrhJI!Xe zBF|1ZBnpyIw+lnXj&iGXQmk~To%k^_Np5>%UA6`2dY<E-lEd-8Tk0@`ogM$Q_@2OJ z50`=ABHof#9E6;nI1o8C{^_~uFf&dv8N0A{*&FjOhdp$c+Fo)1Ce%M!sB5p@fpw!~ z7s}hKw?U>j+`E7wKLta@>a!qBywe+RJ>U5o64J{bN9+9O{0PMaA!jd3-f7*Y4%<nt zzp*>L^X=pmgzSxzd=nQ$&P%k~t3z35Jdz+3LE4^a`KIopQrEvEdN6k9AWzE$fNUp& zC@1pNxf9u9=<7Y76@9f(KRO>|0JhMjFVEfs7QuwanqF*ma3G>EUR<VXidDrZ>s1Zi z1nU%bajwcEYKg+B@Hvq36*v~rHN{v|Qsca(OQ>~4zN{-o>H2QpU4hXZrRil`MV*1Z z8txJUh}!P1N5#=bFk-d=>zMQ=XH9XrMb7_>yr<+d8xj#eB6fa=zEbQY8WGTyh5EW8 z1rFMGVd&6=P_X`by{tf29fEab^heOj)kmYZHGD)xPyGh{#xlHY&?ZJ{7DSyc>t$b6 zrgYmq*OZ34?fVV^X1b9QlmF6<6m}*w$_;^AkCUHcThom^>KTEe**~enC2qW!@jatI zjt<()CanXduitZ&n^oChr0vAdQ9#!gq+tB0EQ0Kqp<cQ0x<JFnEPYQII)}~Y=#J6* zv7+@K1ayuwtQNcN!V57smO(`vV(qg&R;Y0u=E@=GQt*N_ntje%R!B(80&1CLiRq{+ zqw6r*L#fMRO&k3Rn&9*WiChJA^mT>$>cY_gS9QqA2y>fWk`T^ENa(MB2!G91p;lcU zP~k1As)f_{zu3QUiw?DBc47(8bz4gI=xZTEJ5;+4ZBcby@vNo(IN}f5^WkeF>pN84 zULddQ4yA(6penajy6|b(DC*km#ARq$*R|<kx~|3E=)25{j>H5>^swB%>?z!{v|0&Q zY}y-VS(ja7MI21rv)I&8d*f7eZ*SbOUU_?4#yetr{5P1{+e_Q+IQMwIXxHfWYywL& z5#NFoY(U$~{e#oxfilD(nmj-NYif84lnAV2Ux(S9`xhqTiy;FdIqlta`jswpx@rq{ zUGcZA5!<)@$*aOpNVZ^u2J5)5K$qoF&j!p46zsY!*ckXZCCiZ84<ya#W>bJdsJVqS z^%uk^1ud1QLTx(K7H^v^(`a<N^E`$o9cm*w{W7Fuk>8_ndt<d98mYbUH>5>|-4$E) zc9Nqhd;lF(+tMN08$7SfJE-dps?cr_W80s-<XzyW+9N9|{~Zg)ajHZ8a5Z?MD-}Y> zFLBVYa8&Kq!(A=q!wyyqZBSL~!GnOR{b#GXo#^(zYb*w>nIB|9HLQsB8%Au$+7ey| zrU|V}6*g)g3c)5Dg{87;y*diO1IIG7&W=;k0%xmk-RRJ|zIxG}q}!>wYNrO*`#^_y zsM`VprLzL|iY1sXq(9bGu^!^k<AA!DTh{PFUEir{0=llFWDl6Mt`mHk3jToPC3^;+ z;C^%zXb!wiM?VFv<G5_c65CgIaP*FB8?bV|gys-#0dEnGJ6g^-KoKm>iB*4naHe{R z7Kbq^47G_9C>83;%mAS<PzFRNKMwJNTKV1gjXCI6k{`=|IS9K~&w>pla(-zY4z?yD zL+wY&YPaMhw<JfqQ<dkle02e2(&;F4p<9STPQVpNHVikC9dxt*2aQWMEFpVgM;L)f z6aO;ud5L_UcyD>zDB^qV#9mfGQ+a6R*Y6pmsdHhv6|*bbG&&sW$UKIF0P61h?8GB( z6<WFMq|K3I-vSz2_9--=EJz->=k#nTwwjPGP2N<wrKSWUqqz&68JsXP5Pb`cJ&7F# z^nfZPp_FV(O~L4EdS)I0?NL+mV3dLig!vNQ3&AFR3pgHWl0*_65x}_L!8UD0pUQ*K zdP`=c*}uqng*ibjbWKK~E*N4`53b=zgfpoJ#XJ~3gz~^^F4W7|(O|?6u9^qa8wyQ` zKZ(C~q7{GJsnT1ps<E=<s(qADBu%(0bL&x3E8=f2E3#r=w{)E4;(zQ>pPIt<#vwrW z@c|2P?C95Emmkp5ZK&0hhlXH?%2gcfT*vOa<)r=XcA^d?bNJnWFz^E&Cqj`7AKyMP zv-2Yv&~~$r(0LOc6j(f3yc7To%CI{~L-xigR_YFGVlWb*S_9m#D}B&VqlsOXLM6MT z)kA32B?;C{7Y<cNoMmOc@&Q|o-sC2`zz2iigGJFBtUh#>VHO(bk*VY%u+4*{zp-0L z5XlpRb}|A=xOgOuJuZ`}#yW>(DS0#UaB}M!X}CqaL~^3*WH*TT`4W%pH`qI)Ir))n zn`E3!pXuh@DLGw(sHa2Ea^7)EzJ=8Vm_OzgYcj=X6}bzWHq4g6c5(v}p_LL-Fjn9G z(zO>fccWvN#Uo>zY4tL0J`sCUCw5vOR|WJ)SUilyz~wIy@FjcVM|$iBw?l7qS3IK~ z#tAR`)bZyZ6kd5e6YM)6eG%=6BKMyNfLrf``O&H<=6N&CGT$ih)f6_xxh)*%52UGz zshUDnGYTq8P&T{RT5xR|;1y&i5&-;Jo<TU;P~AKc0$KFaT<ma~kh~LgLcb4yY8=FW z=ODtVh;k4A_hfg8ew|Aifh5)K9+Kn|MQr5~U3*W?#B}>qbol?p2dNip`1WA0v-wyr zr1ObC{S&D_!+wCXe=*_cD7_qXJuKGUy+aV04{RdWfb?HUqLZC&C+(ydK#wMSnjR$e zqcyURrBS`3BLbKLr8|d{*@Chd6b0vHF(du`(7|E1v&BaKc>{A$CjH<>cy2JS| z#xnVRRLfy**^Shk$vjEg@c;LoT$|`B;ktA25Xp>>crn51M5{B6i7+aYj@VvPYQRnd zL1Os3K9BAj(IDucz|0^?SDnLZE}NnM1t3|U1Df+|u#(WPpRd@jkY-x$_2+W!Tfd`y z>oty?oWM{Su9=;xsGd+W3(In3e7hGLmjLXiP<>R*Y;}}In)fmvLlK}_29Ldv%wy>B z1B^VG=Q1KIIsr}{&bFkM0>YsbX3$5N)<F;@bE$|%7|bG@abON38EoHk&_?!Y)IniY zGbh#}z#~7hH&$8`vCDn{6(ND{pLkj1N>{t1d=|~Bs@vW;xdbP{c47etH1V=1O>xQA zWkn@D=#HIu7L`%tQm!r{TPM_aqrK>#B$sEy?Cm$^NN>^n>{QJ}Aj<_LbMN0lawyH^ zejr&2W59BxqKM-|Q?Yxj+l&B?-Q%5)`E4h!mt@}pI~kUce~F#^20~a^2B8DDPQ1)c zPC%SQxq3*yhDNX<Y$M^h0FR2YlPuZ5gZi0o|5ao};$93UC?u9BT`^l#%xQM&nT9eI zZke0hGGsZdi{MwHTkg;PLgY!#zEr5!&jt4=ILVxbi3;_A)cYyRzLu)3rj}4UQH2j> zZ7zr)8?#p+8^rw^hrFQl<LDU}-wUxn!Xdv<we(|EJ3DfguAM!hc2@K+Tw>P!MVR4s zq-B3^G9uL=HYt7e929rStiy*eWSMhCy~FlBq$}r?dLx&pN-#th)S^B#L~;($C)iMh zY3O7&^g~@aTUE}<{u-s+oqoUbodNb{NU9bg1gtxS#i=RPnX?^X@Ey^7<0;zDkqYBW zdu?}WW<Jp7p<rgdD3X!Ar3Kij1oV_SYRc^FPCaEdtgch$uuB{?=m8tD>s@<y&b=)! z9peNpyBDiYj50sBzQMMAIC8Q%7*OwL&ceu=gMpN|MRN0;imyiNedi9?6^VME1A#43 z?%3Xsf;hb&XFlW2XQKI(na^bNnQA^)nNPL(%rKu><}=%T=9tf1^SRl4=9|wVe$=&* zbj4Chh{yQBzqA~@n^2RaFm0t9f^AJz6s9XEvw`j?`NU^|EG9I&H#D&~RMs1s+#8zO z8@j4DRNWhz;fC7da~NumQ-cH+kM@>$yf;+X8!GAz759dy8Sq~^KE@5T$HyULrQ_p! zv*!1PsBxR(vEGmv(gnmPCKJFu=nWn0E!XLW+ToIi>~`$<q*hmN393T;=jsRj?Qt-B z!@~|LQ6VhK`aVL%YTkPwr+-KsVWSIVFJv`b#t@eYeX*_?15@si%-O#K{~k_Pj9~-n zhl@}=`nrCEy-x0t`y06O5zxjf0arc(>XET5lhKdJHseTU-)|v`{*~`T%D5@ae*^24 zaZ|VfL1<^{2wV{|ZCLq?n?gUAgclBCW^`xv;RDU$9OI1ePOmcpvYwYL?85eC{&aw= zcLJSgkH^`UOb1dZI(IUsVpOJ8z7sPo@~zHvqB31T2;VpifKgZz|I)JgXQ(~Ch9As4 z`lN^pLRt>=`%+s#57b!86#PraH<$oI>v}`$dqYpUp>~-%R(rgG3GHz%JQ!m4EOx{B zjONb&c$;RAoEdbhsxCV*4^2WweSlBTX;`m!*a^-I&7)%;m%#)J%U%U`>2~7FENc$& z(-lR8nvUO%v^<7fTU3qsDKsI~PF&$N>3+bL^olVsOCWI&jfu$~RWTNE6jhrkT2o7c zIa!vLi$SIZGLi|AT})_iZ>S>|s<_)^9WiA<hJDBy(H`$&LVKJC7r=LAu6(@N4YkKt zGn9FIKgXRz09pD5B4&HG1p8J|5+bMQ%^4J=^9g&cqg@ccGfe}Q=wet$Rs0aj(49fr zhnE<f26;QlC9;$wog;_RWkD3}bG*uD%y|&Y0M-wq+X=7%Ft(tKAtr3KyAUDO%Bq3# z7m5Frn-MBP2+PWm%+FqDQa+M?AfZtRJt(1x2q}hEBmhIb-@d}IdK78xE7l;*)4n2x zzgGK-1`}J(PkKc!W3PCe3HX;@(P9D!t?do<vhIpr)?Lxdx+`+5YewGjQyHlkla@1d zg5WHv!7L#onK1WKHTfk6oS&mCA|(feM9%jNy^Oxn(8b1JSEL7vc){rD<CG}mJm7q2 zt|&VJT{d1%pQvO*Ea~%e>1BHQWR;|Iwxn~9N>F7}_4KQhyP*c0yL0K)dO9r3F%_nj zR!Yv%)90#C6RU?;O3KZ8`g|2?mXy_!vPe%~szQ%S%Hxu9w|*eTZim)L;#wxgI5hf! zCP{x%($`7)N=ctZ(uCHl@CIbX>w}iA_Mde?j~)2~?mraFv0*sQ#Kw_Tr$?GXF9?KI zfxs0(KaejFV5$YGJ56cM68%6oGMYj!Nk)gOVdG?g#kT__CswNJ{rL7^Q|NsRg%0Iq z9{(6^ra3nv$kj=q^h2~bs43%gk_1*W$LohkS~X>&7DI)?LG?qlQm84Db&^C?GpFis zOij5;hZ1ULwGKByPtu{4YUUgrZdOy~>d<O6^JX1>R85($LyxPOi*$I6nzB@f)~cCz zE8$rk2DR2rh_<Lp)gwa0@Org^bks2MK0@-T6(pZ=8&vnemKG=t!{7o_ubL8ppY01x zkC1TK_`lS&LWsiQ?NH+Krb9c`BczcIx2YARBE6IzAyK(e`!O4OL?l`$qhO_bhyy|c z)1|MHulDM?y|9R=<ZLGIm?-)-oTD@2kxc-r2p~^Oex?Ge8y2lIAwL2{T>Jp`X9}V0 zL0jC3)0mPTnF$ST<b8ESq)jt=1h-Ea8;n!te?9_j)6Q(pojd$a5G|)xcz|&GiVXf* zIekzaNv|kCLLP`@017zM1>hLpJ}UE_-*Zyz)iSM+V2nTyRde`~R}nJw1NP@;6yz4r zPW%UZM0@4z3FX*kt!2ZKLc>`3Y|~YJMy3`kC@Daj0XiH+HQWo)0vp_zIUmZqS)}|Z zfh}L4sUm=73Itk(*hx(lCm}XLu&@(i=nwDZ(!}-yfWT3B^DQ7+;U|XedtD5Z*8yI? zUgl>svN%>@j8#5*sgko$L_IVEf3tO<??GLT<AliBec&aJXx_sXD#0))6I7M>f1WNU zl4k>4UwMPhbSdoDl{{U(?`P~XFdJhq3&Acv8r14#hjGw3NFhp0Kq^3Su*5^ejV%uX zFhlY`!~S6qVDT#C!#BotCY;Gdx-#ER()j?#sZdCqr&&I<*9>Nb-<g00To%m3qQGrk zvw-9%I+wHg&_2>N9qQzVZPj)9uFKaj)Z?VY@6C18kcHIG+;oUYb@HskE$yq$haujt zr(-1P@Oz2d=2fx)cfvIQe!+UOS59thAP^7jgPmYsJk%L1tqj_$UIHfB<*r(iebbB~ zT@q8AUSvA7d$r6KJMp_u*eOm&WDKHc0OOmI4ckRhpzsK{@Q+wn=B~YQIhRM&X)=La zYAly3fm~`sE>!}#RIZ-_K?1qdHMvv?NUC1G)+8zua1*&?qP|)#0XLCTUJ@nXCUWVO zL<zWwT%#q?1fVWwj-aC)*A~cbGwnP79U92fi1yuIgH<mbqU7<^InVwBT-2*i!afAK zmpf-`3VoUieTqFN2RbKCcEP#5UwItS@LW!y<?8hnb<IzG{sFu{(9ku;55&vv#_YMJ z1v9~udL~1BCpThvzz(g}*DNGQ-${ou#L~4kxuzfSN1@Gq#S!G8t)7{H6#X)EJ1`sY z$uMnC%W24MXk$|%?@Ulqjr_YlXcRIOeg$)9yOM26<f_;UU2OC@{)rBf4`EI=cV=*T zDgrAodff9eYekxv`A9PgEAi%rVyRYeQwIZl3^+*#>CR#_5EnW2T8=pS@7H+0;-y+? zu|`1&ovmJRS8BKGy@U|5xX9t2o9l`+xwshTUcjx$c=;8kU{9M|Tma#NPku`L3=qO8 zT>w*@w1)G9xmAYlQ5{2{qNl|_w$3^b-|;z|_PUxbHi<*y^_`ZT_!=<RjVpmZWe~Mh z^f4XUjQ}nDU(>5diquwiTkY(bRz$BZ@szT5VqCzY&%7q`EVSEBlnJml7H!<ga8)K9 z>JU)7A{Ury1{5r27nV;p03t4c4s$AxZ5;X()S=z@fKxm0f#?<QpofX5euCt}ndB^# zDLF7Kgo<?FN;MM6%s;TnbxuVbK4or4a!9mBc98Qwa_I~7yEC<Eib?6OTP*v8uIj?Z z`W{nEPntZTe6pSRZ#Et3-aH&%C8T$LNdeqQHKIL6kzvKRQp2$9BsJi4BP0AL8nB_{ ziD~#9Q7dp@9{oIT$a$P;gv<$GC(dM7s&*T?0j+0owh6qKVQwk-QDz3AzwwVxvy<nt z4!G6eW+SF#@Em$DV!smJL|o*F2RNbY7^&zU;6&lw!aNZCSi_V|KFn;G8Q^!vTOtp# zqS{B7?mFi~O!PkaL4WHP<6RS7izL?Os=X@Q0il+vycx%^y7FeD)217!ld-Fqbm2}r zF~dvh?sd<l2dzOC{ReP67Plh71H3s*A4T{y5TojRxg}Y2dx<Cj9jM2<lDV6u695g` zJRAu2DrpIe8Sdzbpn%(==+;#ozH26{x^7*$XhLPgPAnk?m63MOP-;At5ghV6ca!!Y z>FZQ1u?&UwWol*BkG_c(iGKDmgFvq3-AF_hq?AW4PNM6&s-yH?&Z6jF)c1<|<zEZv zZimHR5!l9_qps(P+URp>11s5yUn2$W!-p0ekqY`oZ|B^ghg3&qykKK&<<vX(rXEh9 zlDn>F9y>_h*{jmJVLhN=Ki{wpUpw)8{EgjH1RM8<D6Xf#J;UttQCd%0gz>(zy^#wl z@(S9g6wyl$$J=@M1of2s-j#tfbW(&PG7XjN#C?E^;-1)6sca`Vg7@Ie&)Lz`7{gy@ zt*~ha{BEnqph{C7s^IRY2=Dk2kHV(;OeDd-Z559&OAg?+koZ$#aO{mUF6^R-n#ap9 zQFGj85T1--^bHQspbjpX(U+T@Yow)pnZLgzbOulyJJ`vGprSZgqf3E?7=a*i+yP9s zBSSsPVRAN08C(S=TXIBIgQWi$>7<GNrk{h~e27^)eR5$437NlRYJ#mp2T2J#LAA|U zNLbJ;LkIcBoZ$oKThhS3%yb|~%<5T^(EIaL<Z4tp1(lo&nS=4ku?G0*F_)hte;D!y z()uG{LL>m;bVA^vlj&Rz=4(h9Fn{4K!u@9`n2L6599(^mOo(HJEEK|Std&7oVjz;a zybMpa-jhM`*rr3IZWIc1^b(x$ZlcR=<nzhar~Hw^_>oUH4QBi_de7~r1fE!&`5gp@ z+75>YxZTtE!oyp51Lu|O$-ZsIJ9oY@hUbyd06du??{e}jds1`Gt=RZ8(~B8C&93t} zk9YeyGUNQ{OYtMYNHl)rlxP~8VR*_nN4L5T!qI2oHLQl>bh;OtTn=^GB)PA*QwO9| zzwhnTi_pIC3WaeV4#M3snE5;GQ2@nmK@I8HfqVY0TeS0`aK`rNL&h^2u8EPWc%1rG zU;z3WS8Y!vDDI`mBW!aETAaDQ1%~bq7&UZNKJO{#sEE*}kw6!h7KEswAiSVh#N5+1 zieBG&KJHh(3VZTI9`{1sH|Ch|!KSJMI5)%wxM91j`%r1&Is~uqtGF&3K`dzDqA_M7 zuB%^oJN$JH%B}3ur$p8bHawn_x>$ecFAf>&yN*&fR(}9fqXJx`>+*1O13fLB7Jwi_ ziFR)hhKScas&NqAolTPS;Gr)PI4`r8R_xa3TcU|&pMXCS{O?7S+=t2rZ~%ah5h{z3 zxokbe$$2in;}p>d6E7M^Ymg_?f{|5-=xM<T(*jYve2{teMNZAggFr}E2eU8g+R4Ob z92_iD`NO$j@|d@$c5I@Rl8fh$y#VaQHlU%7h%*s+vpndG;ffMIXozGdzeNH7-g3_4 zfw#!34wn8(7J%ee2}Nf5fD(wfCt?P<3Dr2!+zl3qeHWK+lfOVny!zrtio||lC*P(( zbi0?=Y$tx$TeyRTo0(nNyUK8h3GIay@)a2UDcm*k-IWDv4R4SiH1-nQ&BqEujZZaD z`;!R<t?VGF5$cS!G$7!KewVf<b|!Yu=P~#*B*Zm{qot=5a;}jMdJ5!-owyu95wmp% zAzR_Qcfec&2g88wye5J}I;w@l<I9kJlyt1P6JaNgKjPvqZq2cl<wOD3aVTda7=&a` zbh+~c3aOngKV)9qWj0$PfrTrb??{2nuiPAksNq-V3nW$p7cVT9Pk|b-P0~bUjJ|&i zQ}^KhbM}7VR=VB{BNt{Pd|O0ZzX{O`@9fxf4T9S0R=HWoX(a2BOd~t-3`#j0@uy`N ziaG0~(!mxRksN<KiZsI?PKpH!STN3l;e+e*TvkiWM}l)3^QHA05pp};Cl7MxspkHO zJaO@oy>S<XDn$fu4#44I2Shj4w;j>5)e+2%3t$&1tqeehRR-I^#nhf)Qm4}gJQB>i z72FmfdqQPiWN&O~PZ91WWmqiR4pp{hr>xkmqWWfk-ETh%`Sd&NFRAsb&|2364#vdL zIz?+elA##|;yWNa*Xp6T-}vM!f?8<3ojApZ%&N6Iyk0jnVL<eBJmj)L6qp7c4&?TI zI<$uROZ6xgeoS&gJAI)IrTgsrMiB-;*X>M)Xx7I<Dmw)oBSd%@hg$4aUnlVJTGz<Z zuzd}Ihhxp~042!Knr(met51Eu5+u%}-cw}lpxy5j*hK+7bMYSpX&B+2gpAT2kR~=B z)8Zq<+C7#Y4BuK^)uR01rnMA{;cj0Gp~dbAqS#LuS{CqN0ID`5cP+b!UA{7ZLW!NQ z03kIk2%&eXI;_3wWf&Uax}4ytBh;t~bsM6NTyfAakW-g~4#VA+nN|k7x4`q9nHQrD z6i^_ND!d>4)yt_;!cMfDDy5Q`+z5AP_A<UuFpHH!-SN<Fx>+muFb{4o>+!-gWWlGl z6jx7@+?|ldQTQjXSL<V}L9-o9jHE^$q#1<8*$5{OFZ%+TFKL}{Do(|Q$d(+MLCb{v zMmrHkJl^V^5ZZEgmkw_zfo4s;4D;}w%bdBW-Q4c+!c$sENqlhI9R$T)g~|8(<J;k4 z4cFd7aF4)Jw4t=>5YE!re006~m=?2P+A_m}1Jfk|oGR_n(_jp<6TFfWyYnPZ1Vb5g z7i$jcr&u^38GhN&M(#B#4z|uAP_GGOhVDqoMH0s{i!lK(p>R8awnd@su{2GtBbmb8 zGW=Vd&5S{t;^i2hdQXJl+RVMuW^^U4WW?XGRCJ3RRoNS_@H@O4kKGiE?i$aiRA=sM z7xXT}ETXvJ-eE1~&&^Ptf%Qn7S|FkKTw#L<ll2+(2D9ztTEtDqWD%C$#ar`~Oss94 zeqkb+b(~t$u)Bz06S%gtZl_vK#<f@d6cA)CR_&CDh<%-ouA!l`c9f&oT$EF%RPL%p zzpWc(_V|aG-L2bpppUX^(+vp#hG6e;{)bYUlbH;vr()@#+y6P(6r7Sh7i<rof2`Jr zBd6LME3C^VS&=Lkg%>g0$HL|8^N}UUoGs)J4Vkh*`JWQTdCDJe_kveIX*>BcTMf08 z>_XwRe?3qG=kF#Tze`5Kgn@}<<5R1N)AyS3*J@So*&AP0FTZkxG%Z6CED-qXLDIaA zBwXq{?BrNK;dFq47qU;$4y{(AOv-<I%AfoI-BneO>*(WY|6uk#o(ba404;3?G2k+< za5bx$&B1pa&8%8RWU8?1;V#}I&iG9qzO1Senx0lIdfa*y-5Xoh<F%7#O4DoAd%C3? z0NN{i(2aFDxl2(rDsw56F<pk60a&ud&-z!aRF==C<Qb&!+LFULnYc1Ls_AU-6`1&z z9zOm7FIm-0R)>$Yy>UlLx^!{Ay-KcOSMAf2^6ZU;IPh7krObrpCs8u`JkFXjMcd6% zeTO^L_Y+9=Ke#b|4?s!L==-3#>YnIrT27kVjr(OjueCR>V%#M)2n{l){L^W7r|4@W zb;-5nNrE%j05<=U?3nj!;FnGwQdN85LDdaLh0SA!)zB`2KMK3UT8xyvaY>Jh_x;3M zb=!%Pfk6|l?5}luPf^}w2%z4_HHwlnI1=YgV9)4tfWaFK7?&n9<RgxZ_*CI+4dY$) zILE&*$stVnhv8O5X~0g#0lsvpA7(VnA9#SDOH9J6?Tt;sbfKo>?iaMz5Aj7iaD(MP z@!!wMU&36%Qs_iW{5HtRMj4=o*RvCi{0j>yI8Nm^K)F$OUyO^R7sDuXG2Sd<W>p4H z15hegZAs;?sy|hG5sz;VK<;~xcK5rGTl!Sk7IEMb)E*{lTp8aZl#FfdVxR1UV2pK) zXEJu;CJx<FKlR6H3__5dWt`P80(kXcZETY`57<dA&)QChS_uYQO{fR%Jqa}n>sr3T zodzsDt#od=GG9mA?2Z2O$cE825dB@8F8ZeATip|;6yV$fAmXhBD)gj?>b2$)A(l@I z3XraPQat|i)i(>c1pxE#+MAd$gk|T080eLqz1vl@<euk3bb7*+yy*LCaWD(-yXH*z z1;fhguxk{)sp!$d&W=bFo3t_yE9H6>Z3WV22+~kzqwhNTnCk7q<v!<ZFf6Y})g5#` zC7Q6=aGe42`Ra~5eMi2oYV+M;_Q^D+^`hKLA+(KDo012rDO_)KzK%0V&Z6a%t<F!5 zh*$U*nHbv3fs2PSUaY94;f%d<3tDrExXeV?#<rT_NIU~<V3OEJ#t3&cm7|CIK>x9z zkZa?6G+W%eAHyYo+@_EQ$#b~sZzsOZ{=k_YyeU+fAhRionek}m?5&1$-w}*lF_C>1 z_m@ySg=?(##s)TxIX46{M@L(+=u?S>)gN<R#>zPv#B1Rz63#UAPe<43t#q3puhE~E zJXGL31}t*^3(R#L5T55D0G$Zr&>Tn6`Kqd^^ginQ`hmG@IkZBBo1xfYsWOH117nb` z!mH!k{VMz@!B=65)~~=LJ<oGvf)v<1Y3L9GK#-Vn_pj@l<WU*FC}EHCHMBwTBd6Uy zOA8kIj%sKn!?~Hnc;gYZBRHAQEL~54-H-x0CAh-);?2FU>y3<r?IF5~1?uzEkcKvP zt@l19_UlE^f8|=U$&z(GR=>hyC;tN$9=G9d;^{CuF&}m<9cqd#or>J=pM=PiF)5${ zBkYv1=!5%yA8a(DwV-poJ%XzNanseX^mKAAxi6IoQ6T{+ji*n9*e8ePpA69T!4_Z! zIj~xl%C5;Ebuy8vTM0*~Rpl%uUDow0OP?DLn&W0P)}|I@c+583WM4Cpj#EKmT;CMC z2d}kVC~~8lgdZ)Bwz(r`FnLAH{;+50`qg;4O^{4gb*A8wS3ZW_Egwre3A@a}xZ8*Z zkcQo;MmHdn9(6|pYeA=;HpcXqJ$G+Gzk*T|Lfz5Fov(93(af`2S!O%?9j2He?|mQX z3}Qc68FxQJwyLId<rs7|_sET2PJ!e;e4_@do$4tjV5a+~O;)vj9_<)*#;JIvKfZz_ zvve&-(Ausmixu}>UD<KEauntd%pZjw*%wNso|(|`;CYfrarv)Wt164-dg>@%7KMv( z<)~Cu7s<kHA1PD6CMD-Qewq{MLxKx*9OEvHrxdo0ei=_Us;afo2NW)W*K%8#!V^&# zkQBC-!r!Q4*e0{rTmVbX!W?x8Gjkke<~nQ%+~=LRw?Rz+FngPxJ*Kh<q0IIT5M95g z(g~n&&<{1a>X8qRL~y^RpOMM)x>@6K>6Ie230v2eEuy)HTJ6Mx+$$QE5+l13le;;q zgC|4lv1p&`qAh3GW;|z((<><WaEVMFm}o)R17}F{L>2o0F#Y;a(&}>NmE$=Dzcm;b zl#hd|I8;|X3iib1dc3b_stlM+<AM5bpGJS{GB`*3rfXk!k+@mbW*<alzoxk68xT|d zT3!>tHAXyhh}UT32?D;P7Jx;z+#h{5M+I^ar|ex^hag~Rp~W6a`XL5Uz|T}Z58D3# zC7NCMRVz#HHPdw(M`V+5=@3=_q!JF+%NGHx8lpDw%K^jNB83z^K3FI?SQB6@N?yaU zzr$bJs{Z(i+V=OK;)*;|Tq=x@|3cUs*d?x^(5QMcwn;P(DxJwQIFwl5CmD`0bdf!A z4;-Z6x>OExBm4uyZcnF?WM^P&U`Xb^WT5MxgbdVBj#0xEMNg{oF(6gLQuYC~dyD~6 z4*nHW1Zeb^t~6{RhFFD?6R8-$dgv|(TnZppI5vV9jp-KH(3ypDl!N9qjKmeJMq!hu zyaOaV%S4x8{iMlV@KSkt(nQjNZ-U~;xjoc16h}M(Ake=@(<bWZO1_@<Rv#&QM=SYb zX)h=%2~>yQU`-ZmKwgO6&9X#8<YS#d?mCG!LHf9-Ky&**E}qCX&PRz<-68Br!38~H z)+gf_IvNVU>WmOD?uyqZ5xkqsHr0#l7Iwm!$k3?_edWYezW$u4@)C4_?2BSA&8<pP zDNCXpr!rZJAUe2C3m?m{__-5@=|9{A8@Vf#-u;Dvw}U!GRX3(*GQyw?8E*QE3s>t( zAoL?7oA#<ek8T_{n?=Wmr5e|CFwQ;GU|nv)#m~efV&P8Hi9~CV8L$C^Wf*mj<7azj zWnCmBeFdivd}Vdpfbr$3V>&i%qSJvQrcOh;2#u-w)q{%p4L#~ilfw%;@h1!j9u8J7 z=_?9--wfi_kkbYKChVuH<q<GksHZw_CR+$oOSC~;B#w-RxcLHnb@l;f6YkFr=U#kI z<TSPK*xK!u$5~1NV7hyKHCO57W;HaT)Mz*l{|v1E?|p0Hlxi|^4c7w5ntrO#Z7eu} z>4wg5_q=8@Od+H9tJi%{RCu7;l=<sM5$N!--hrb1tliD-z*fEh2=&b>^f+#a#9n9s zPkG<~X(#t{<qJQ~QMrU7CG>b~Db3t`5=0_JP>kMZPWW+MF2?Qx5j~G%(I?Jrpo!^i z?1ga%qxdo=&0I>D%?NUs*&gJ2Khf-*a~LQYVqb}Of$`266LN}R-?X^(r=Y+)a1au) zAhONXZw!qM<Gk!V!0KkA-B}Gg`3C1XRDz8p@oP>VcM1xfH=KAjS#0T1<{ADglfv6Y zLL4_+_x=Qhf66>lc$N(HY;y1MefSv*m-TUWbv238$xcDB#28|0h+&Me*l&=E5gbd3 z33+4#2kR$R8>AO8-N?Uoc{m123x*405^pV1m7|=eNQdy_u;>V4nG3%l>sjKL9{~8< z_|w04NuG{4%}jL{nME8_-lWBLz2tEFq#{di;+{Z@TehlS$NZOxgz0xbBZr-M14~f5 z_iKh9X!Lu8iUG_ou@^XZEG=)t=tcSQS8=7oUX=ixhBPe@cx~qSrI1fq7_`^v2CDRU zFakTq0vHys6Oyq8#L~YTn31d85$(UdYSZFLooT`T0Ve))-B~C|Wbr=oYE{qziS2Rz z%$shZ$J@(_JkI?XL%CWCG*j^ZgCl1KV$gI?G%Y0_#K_AS`3N(kohZz0?jwIu??V`T z@pydf#0%(IyEkZHkshwuXuUo=Ho+79Ty}bM?)KU-WsnWaxMAA<UF<OK%$eW+x8dze zK(hhe{O{u{*$HT(GA=S?+*29`%3%|G&WsM0b9ZQ#&4%@Tw48t7<qBK~{HJ5_<^C8< zcti|dX&2EkE}|*2lo^S2LT=-SWSA(tvb1?TXk{nvAX%|d;(o_$lrF`MJahQ-C4^k4 zul|?mzC7Y=<bc4IXPaf0<@7*PjlHlOa3GS-qB0kH9K4%6pFu;|X(FQ*qhL-($=<-# zgq%B(0Reh9NSvAHHb_T{{=IeRzhn-%R-w3@a5)Kt3^!$d@FarLNyAE^82RXDNTn_Y z$5EgcTUz9aWImgV%1_Ki=a7ZY%U=CYIOr?KGXqSqu-!lWpN4)P_N`TBY@RY>GZTH5 z13jmu8zDKH`!9r~6Pa0V?dMp#ACEeoV-k$n!(4yGoy%Sxhiq}DLNiTskTN`ZObq5a zKB)l91XMd7mj>~aC^wi023)F75x<?85L1ylS7w<b9XZf(e*G?VoN>jbFx-z@0N&&L z9jWa057(J)3!eSi<_F|Xxr;B4$L~P-^`|>q2yCb6^IW&;ugO0Bs}_S){rx9--%Tz- z!$lz<`!e@eG_<CD1*fahEtp)`CA`PaB~g}q+z_jNhinlEij$iAJ~EO=KO<PL#@ht> z=26D}?eYHmc=K`|9WKp7dc6Oh=el>)b(<IT*f7=_Ze7Xdc<~a7n|hdv5+68_3(j;m zse_kD1e@A?<JZxAGnVj1&Q6k2Y7-FM+F*sF9ZGFK=Dxh^ha&zn(LckJW9%MvR(8MW zTg2dXp$~R*_x)bx!S?9ZKF^Xb(6i(M`mx;!*v&auSl~R-M}QSz6=YX!8i{yzg%}y= zDDqvFC0Sta`q%Ve2V61$A5a1W5I37hH9LP%Z|6O?xLsy<Sqoj}ecAyR&RrBE#j=Mn z#Lm8vv!CMCosXmcm2=Jc3EhS8m|ymJH$PYTuPyAMTX_u(HOHNA_q}hBFYg=RH6%Xs zao|;9nv(~h1iF~p`FU`>R#BLYk0>w%j<wBAesCNv^V5GKOn&_gR)q@?`b>;Zz^p&c zO1py%vjUOjPo0QO#r`Poq0fh<v49tX9;QB_s$lNiSt`Dsc>1v^v;)um*a@C_>W9a$ zK)6GUjeAq8$a#2W3l>rwFV*AdV=pZP*df}hQXm@Oz(@nTl@S^BZNi+i(1dXOT-@`p z)K90%toV_y-M-Ac+K5L1#l~FK20y6q&W!(YGmU#0(M~h~Hkt8877ewfT==ju(+r4; zJjcZ0AYIDT4yTS&;c%>ehbKBBRe?7s?c1kgtN7so70z>J<@gi!$@$Qdu%kGD2fmD- z(^=V}XaZrpSurHuHs5tF6MjZic-{4lYDWFJ)Y(IMoAAL}*`bDHUliB1Y@5uu?DNKH zcS6-poK`fFma(PzSX=onaBOP^e?8HmrBypO0S`~)K9DcfC?p~g>*Rqe$nhSK4us@P z4;T_|I+p~&@2@1-8;r(SgRyf3qMPa4;n2+IUf<C5yJIh`K_XgKB3|)&IAlCLk#%S% z#M6aK@s??3{#vq;-6Y3$;oZ0H!%z9_GdC5~RX#sn$7eU;iZ&5iavMi#Q>)ZSyan{p z2*`%ZziV0ODqjHllz%8R9Go!x1Lta1^OMNXjWPV?;(s0xaX!Wxp4wUjI;7<JI|Uks z_ByM%w1?Zs?idRvA~<)L89>g0iryyHPOuvuGMhG@-BD*?`3n6Jk8ACYZDuPTEK7|O z0ULt6M%V9zC4+dwEBJb|Z?j&f2t1m(_~+~fb$~*2BvbrDv@R9ZtO7m+RX$sl&%p_@ zi}_q44fz(U|04)mi<omU{=C33MDf_BH3%T*JoduvuU_85w1;-6*W>S5O;vx?_wwcj z-Xp_(H6Ef$R6juC-5P8vRCk|>HDR~j#8TKoJ%|_Pl5gM&0}|VpuR)?GEw@A%lHYI8 zPjsNGdX*o4LHS`5$Kd@;a6*5K3Sq(EQFT7P>NWj<Tpp3Do$~y-PsT1j9)1Mx=b-^y z;zfPw0SL=cOYBE_yMNf-PLGTUMn|^Dn7Ns%mxPMj?WA1LHV%#9oz7Rm!Lh9l&;m{9 zCJs)qH~z2zA#?H6(hqkbmuiPRw^At^AFk2r=ySio?$_MgQQg>c6(cp{!=?h`1#9tq z)YFYO<1e1Yaxb{*a-+7C8yQqS(Al_Bl$Kg)VlpN`?1eZ$0<%dHS<VQaDXpC^Moe>S zK;CBAiVQeenw7ZhR<tPgH1lIKb!}LVDC;tpVh^LXJKLz6G;%C_jU1QQ_`7i?301n? zgF}klv6eM#$W9zZap$j~5T>dZDNZ%QD9|2jKn!Q6LKzI%mqB<8B}^Ygv1xe>e|x!I zu(p%8lHrKCotVR5ANI*=#5ZArc$^D>nX%WRNnqx2-arb%WMAiH;yq9t{{wq*PT1Rk zs%Q(&A%u=8ROS|%imdGGIe+UptoKzUiTrd<X1&Te>Bbps7yr_Y)ozHq^^VvA^2|fe zE?eOcYG>v_Y{oI(QrJ##Z)(nz&1tf;m-V(163^Ve0q-<@-5gqb$`}mqOg*s%d0Zvx zw!qj6F<@<j-GV=SMCe~N(7{dT8Ck09xu^+}9An5E$Zp{=N*=)iX}K#UwR1Q(;2e?J z@;Jwm1YE@q(vY$NBd%-ba72F2Al{LLH~m=#ICeTgQsIBqfJ>DlnOe5efL7WY`Cx^W zZoCSgAJIreF&`sD+{QdYA|(*!5IlvLb03oi4(-ur4Pj>k0v07q>GsAs2xDLfl>baC zaE&lIZgXqVT=qV=l>m2WC7&si|3R)5igAEXCI)poO;=oLTmfsPwT*K42u!s<|FIwh zN&Em9HuJs5FqxhpF`c25H+>yUwt;kz^txh>s+gS?X-#yUpL63<wLA7)j8QxB7~>C% z=*F{s%yk;^hw?jzHzqG;E*1zm9vutMkN=h_Di9*y1ER3<ky*^5H>elKcQ|j2Ov2Pu z+aLsQ{-tzayAq7-#EU3WT3{!BV5V;$qPlzzZpAuBX(GCM2F<%C6Sub+?_IzkZyE1h zx~B9Js~gMK?%l{+B@5gxE?y59X)jWtd@0^@g0WzF1V8vUWvQCERBt5_)Fk|rN~9LY z?_5Ijz=B0crD3qp{c?kulc|%7^YtV+xN#Hc=TPH`;1T%pq5r-aAk>uw0(0)K7-O~H z*+#tk4Z~@SyNfYywo1%hPZNh}e0!Mv(DiM&IISk+&@!UDP>U!pz^zkcfRKW3ZtCRo z#Ye%(_}{n}y$IadM97r3F;=n@D;a-6C<auQG1fb{(1xqpGNXQ!!v!zU7%OXH2&Xh& z5}h<#O`3z}gviPzWIq>M6hr&C6no6Na~x8&vz<|BQwFFXZ8nfaw+dE}Uq59GTA5K+ zW=#hEc!`&q3WOCs?~-eJQG}xff35_&Iwfmv9dxD=M85_eqEQiQPu))VE^&SXjINn1 z_=WgmjTlSS?E^z#8t%`G+e;p{li!vT`Q3Wf9BeDgL<f3!Hfp;-bmJ^U#2o_D2lIe5 z&b+o-Dkt_(DCY!FVmL7nnL=y_A%+8h*wIn2GJ%k(RTR*%qgSh{Eq3BslD4W1uNd~6 zkNpMr>3lCZACnYvm~siRpl&28a$p9TOibLvGk5$c`Y4nycm%WRDHs`zNc%nnm-7m! zWumJYZR?Gu7=5NUnqZWMWmEWWMjz>oE@89@(f%CvMVd2vyIm+TqP+RrD9ygNfT*d5 z*<Uz}(rh%+`6UdYlt(%15v`LCuR{rB<3OATTN0h{u$c4qv0HP#Z_FpRQlv_5wza?9 z_zxK9oR4J;VxR<DzK=G$W90t^kyb)J$bZ7B-<@7TwUGbPy{~zg_d+b^7J<>HzD!`e zF@~~aYUtVXzz6w=nzyF0rv8S!D9c{&&tCbFk0((u%>2lF=3tM;NYlsHtIm>L-3bOY zh8h$!z|wue#JPi<)lZ@NISqbI>;afIMy1<TswX#nQkeGViIOfDlf@rHY3FwQk@cW) zFNj_$THE3qNV2y<d#e>c6{aMM^F)g}$Gxm*g;^u#l%(qW*&Y<fVr|Oj7rS18t~22C zEM2$T{K$`fSQK_?uH6rl99OqB0DwXNGYouKP4+)5<Fn0finHb;efqizHscqJ^doCg zJT3!fp>yCdS6^r6wg8Cp82;q!9|H&ff1c_$_{kSAPR_ZeH@%DJY*fz8cA5Hpa~_gd z#?jvR1l16_^&f0DQ~x!})!sQ!02qB!f2cq-Q~!(r_+E4~PW?Je{iEb{cWEL^;Jteq z>3YS!^9e;U_S<NYK9&#@pweFWa<aeAV!NWZHZ!Y!r?ZuYM)_$8_%sc$FRaz<RcJ>F zm!rg*LZb?HTlgIgBV{wwR~m@(2r)znn_LKRcuP`#3S-T^nE8KXLXR^HGvEa;+H@?2 zh?w&sd9Zc{wZ5}aii;N0b>mcgOpnnbMA&4+1%<{k6Ur%-d+@HVq@fyquj>Jf%{#D2 z>W5iQrrMs!Wx2)B!0iVyXQnlxuy%%#uegkKHUP=|k(SBf<JrUG_G7tSN8%Sm+w8}F zh~Q`J$Cmtua1v(wK?po|uNOI~cR|AZY>&w{>$o*C$3{Yh{(G}0i5NH2?)GdgxXryG zbHeS}=g@L{qwF$u?JSbMj*RDSft>Y!gBRe(!A(5E$G#Y}jDKAC)KEK7fS^3j>6{{o zr`XAxP?qw*xeI|D%(~s??JY}RH-meN5{x+%vs9yqa@<RR$r}3M%*mrWte44}eEdE0 z`lCV_A-A2_3Jx(l7Y>5!3(Gz(2Uaju=~Z1A-sG+mcJOjm7A*;#OKzc94eyriaqq_1 z?2|KxpdfI&M2!M3bfI3lOtd=Dd~+T8jLJV7P?=9`%jh)#K}%Q8AkTb<oCud@?tfj? zAM>!!0#_sEn4=glUE%(0kI`mC(?4RAj2Eyj8=K3Mm@S$0DZms*Vf6%ONgsinF>J1K zhH!l=9)k?!x%^zU#fSjtMO+eZGZ1Ck*oo<!g90!u(~cDG1Dci*VVZLZ!Pn<GA9oqe z%sCfRmW?$#P3XN@s~N|7?VL_}hz~Of@eVmGCtF-B?huiUpAZqTw;o+lqO&*`!ANVG zrAdPT9S`?3@Ble7V1MxwBlMxruL2CbwYu#%`v(kEw14D=_$HL&CgaCg+|09+&f7#3 zkIqAjgyMJ2Wbh^$fvbY3k=E;(ubWmvop#~^qH6Xpt`_Gq()XV*89U5oMK@B6VUfpg zw+qLbTQz#s7$)yB2eF(R*8-2&T}2){*-4CQ<etmbD1;v_>6yqMF2R+{%(<>cbUL18 zhsESReDo7@QA*1X^rhtI>U{AhF-Tl)b3a~jCx*u@QPowl2gOqU6>t&cBWQSz6NY$j zqWTC`(8jK26oxl1HWfY|Gn`0MjFAg|g3*VAUs~4fBBX#4{Pc8iCUK$0%dOCloTFfu z-tz+2sHL$g;h4aAn#$lR3U%)17MN{A(_;;Q<IG`9wqP_;_#EPeoBeJ0(KOjU6#dJ+ z4n!puOj$7U9h;h^5zJqrB<ho}6$R}TMckg@7vi|S1$D(|TflySx+qRb%gK?Gw#lDD z@(nOGISVronLS0DZ^5YHM=`L(Z=Q#sGZvvuayR^UC;>d09+m#SOoDO`!Wf8m2>W^R zMkQK|-37mv<bIl@D3_eos0sSTmRjGmlb=wsiAHOtxzT!MXYeK{+wL6={n$;EVz9Cx z-Ic3YU#np?lX)k(%Ds0$CEQs9*rt{5lYS>|<r|;T%6a`;(E^t0su5ali_*&10ee#s zJGS|+LIh5BJ!z?$6meeXT+8hxOIq8@M_78*K|oHIi->k5JSNja0MLY=FX%Np|Lree zzu({wG)PXPjq(U&Q#^)(cJf!usFhRnpCU+R0aPqeo#6XkwZeIl#j0RNY*<eC4Xo@$ zO`_T03Q~9@<#?oEfxcC2Z!+Iop_@6^BEE@=ywgD#kizLzvN1{SfoyYr3z-MC<7r82 z#_eXr4b{zyCMf@iTYe(T^Cvh^KAtO|>MPI3u!PUZuFk)qwM}xLbrwSId<@I=arcSS zF}U%sw+g11Z|?#{eLbcE9&Qd=+kJ4D#I>eSXY8&Kpxx`ph2YSu4zbuwT18}YB1(zz zGUiPcktmmTQ1;r%AFyb+yENPxIobTi7_8=(k##toa1ByUdvxPiBq>C<G9b+*+SnW% z_2g=r(I{ILN{Kx=58?~Q8}vLwg1;vZ-a}$acTXoNJ$X2UJNdj!k303;yo*n#QF4P2 zd#B+IF87{4v|O~rj!Ahu%q1sg(i;fMo;>D1%zX4(_F~7u?F26T`SkA0raxnl_?x6+ z&&6?%oEgTql2>3eEWn4Bar>d|C9S>qQiDJ7$z^xO`CT8P%@@}2m%?&*%X{*;zuR7; zUf~M^EhHcw7NGcKP-x5m#hp1@OIMgZC3X=&XNsR6&|b@txe{hj*9Y<Y8qod^G)>9J z$^<s>)qoj<6QZ|~3mzU%=)w#Cj1evZ>S{YK=-{_Hx=TZyk&|3Dh}`whSOAyqd(Ra6 zkBkfpcrrKa|CeDI`6pRH7hy797&>UiA=Ze#<F_+=o5O-e3DZ*@l-(2c7goTFfxHV! zeb+s&r`v-3EF^ydFlf%V-JeH~@;U;qar>#nVOV=k1A9KmEtl(C0TXIJ4kc^u%kdL< z6mQ1g@g_t7ngDS3X7~U8eEqIxIrk!;alS5d=(En(i_ld$Uw40@06m1yEqmym;OBfp zq%-WH*?Qvl;OQSdX&GCNj>5#m_I?E1M9i7Kv>9<-7}#5EgP#F82lTMteRTRm2z}W! zG(R|pM1y#kM4Q*V`RkmZF=nXH7+MeZo@(2&nRs>t_DYZ$9{c^t-46?DJ?|N$q4RM| zi%Cc6AigbNt9_Y||9A{$Zl|LsgQ_R7(pb1dyb=GXM?4@RuOxS^_eXvk|LD{8gQLmj z><)t_ZU+;0A`7r&1|Zy%r?!~~%>MV|`O9a7s&|;*RW(~g{JKm&<{#dv8VmGI|C%eo z%bzu}XKVuZn)iKj<%{$`DStb;-IPCu4gX*Gqh5OQ6~iAF=6<Du?kg^*(02#4>i_yp z=Gp_tj7M*2IbS@c^c!#BXsrW0V4Z4x;gsRSe5agq%Bj|A7Og(sV$ZN)mm>-1jcyRS zqW=t!@081iO&E3s&Nc^`bdP7Sjj~J`GTic=GHehFScnErHl+t$F?>9XlqdO_J1mzw zbQE$6afUTaYW1cE-CBUiS|^`wT@WO+QwDk1hRw$C*68^XJ9W6#2k|r(y<#{E4|fqo z(;iPg3K6M6%sCz41B@8(XIPf0apnjB{4yXH^r9){&vILk$l3mW&7Ffb2uZq*j^rZ5 z`rPx;IktTsIv40e@pEn+!K<jZ;{trdMW7EcyCBF>C>u<4KR>9KhF%QI$YE9(pW<=7 zo$z?RFbv~&8d&`Ni>$8)j|Xu<KM+7|RR2;}4DV}dG|IV@VN+l17e%!T(WGE^#c<}1 z=@&)rmoD=3HJt<M@m$nb%H#QRU;lC?*u$}XeIekIeo+Aais>8+Ud+BTFs=_!kucg< z`%v|G;Od@3)Z@8y80a$oT&rYwc<`)Y*9e_U2YE^W<+5@3c+tcJ2JqVx#Py2d<AO~4 zT3-`a3^$EjPAH^S4$jvJhbWiz!S{G3^)Ke}luIipR58pV?vsbQ*qsW*Jfr4drs0d3 zW$he;iC6`FqrFH{Jo8fK>$L`-36#86;A*g^*E{It^Z6O_=7pG>{z11ah<N;S@z$Jo zd<`mi{X^Q$#wReSnQ4I`myM9by=dGU^gnkV+IkbtKHlr6va~h$bC`l&|DZ|GaR&K^ z_@hYmU3xqI4)!<Tum7?O@aH-S=HW=sf4u}Bg)Zd3wTT6ufRg8*4{7A_-wpH!owZ*o zcjE7m@n7_KKClKAECK}rrAV=UXC)v=ydyn<_s&A}B{%91d<A$|9TwGK@5n&lVitbc zdYNdC3<gdvM)VcyA~fI~SrB*uZCbx~3l|2q;<l{ynwwh`xRIpXXFVsNiUZGn9?{p` z+);tyMTqXVrU@Ej0-ygfq6ggQ*g!Qfwhmem++XyL92ZzL645uTA4zn4-~;r-`h(Rb z(TRa2fMNa7>XK+#;EN!N)oJB(v_?)2{2CTV>rJajqEiF&i1VMU%O!eMz+$_9wyu<D zb>J3u@Q_t2(HVi3FCqGt)g;kbfj<z9zgYVvIy;cZ4*u0TmHaSrPN2|2G-FjrbZ$Uh zgs5YEQ=&Hqe#hLmt!pJZKk#GbX03XOE()AR$X(V;LaRvNBk-2>H|uH1T^fjhU95Mk zZwT4%4pftL?^<=}wr^z23XB1ZS>4wC5>Hrx&jE_{p0yfi`bIWcfj@#U*85gk@>g1c zqZm!=@0PZi-)sc}P#~=jtRfgueIr*}f&GN{4>$ji6=;ARz&dO-O8tx#_~=5!KeWhA zzL8y4U_6#5>xdiwn-%y9^FI=n@{R1a0uHHo)Qx{&1@@p}>ti>5#0pfh{wLNL!S@p@ za0mJ5f2_-ZCi>?MOvFU7KD9o;gz}Ai)El^;`90S6r2WUefiu5=xW`Mb^o?BO4g3HF zEz6Cs^#-0LLwMczlit7u%=dYZ3cPjRz`YztzZ+lg4ZH@jTZ6o&e;d4kyGZZB-bo;< zZ)A%%Fw=+l5bv{6e~UNpbJh=d4Sia@fj@Cdo#e*byn#5|8|ub)dIP*6VGVQRyS;%s zL3k_Z#yh-$PIBzYZhWsdu$oMHir0f~`$q2b2G+5^ws)|^4|)STAiS(R7vE0QXMaz1 z<8PvU=AY&bO8G;Gb0!XV;b**o*l5J_y{AcjmpAYd`**q<@Ad}XXaCOdo(4AXjr_nH zIGHlyOgDbS8>l9K6u9*H#2Xlffw0bU<1t_0Z{)YL-FU(m_!7te9B(aVBKXr6IQ@%= z7kUe%{guAJ3*?7$y*CTJn|*<W<j3>8zyjr0`vPg!|GYPdV&Df~;EUw1k=_i7Vf=l8 zUy$F6-FS;H&_VpZ;H6CSjqLCRo+EwF_tr>!uP@LEfofgg{jtRN`2x2Q|54tTB!18r z*g$?5?R^o+zLA~2!2ieGdq6jJH2uSOwUT@-%f=0CLK8N{SaJaeY{{kuuuTXd0aF4A z*p_TVz(uy{ST-b(f=x*yu_@`87E(<@3Q2&F<V`{X=?&7KG$6eJ-*09m#qhv)-tV06 zf6m{q(w*6v+1c6I+1b5U(vPIC-EZG-q~4k89e(&fNHl1CQw;Ai{r6IT5ff6R`TKK1 zYQ|JFXzEJ+3C)9V8%-(X%a-@)K`zUicoCL+Fop&#G!;!5O@lT-qGfXuRewv9!SWw; z$zXYzTCn89Zbr)?7{O#ILQ`hT3|J<_LihP~%eXYOV!46jTYB_Co@Ysb`&cc}n55yB zs}WfuEE3W>Sbnl0p|fPcIif5-z?RXLZZK4gWjP{OtYr$6>uBi)nogFPaOgNo4SEr8 z`2Z3+TOLLHy2$b@B19L<MR@IMc^P_kvrL2z-7Q6Ev4>?J%w)5ifu21r^D#vdEQ6tK zqUBE1_OfIE)7x?vI@-tb2yQj^wTuU4k`{UbqiHmGUMCZ*gb9QN(*>PB(UUqK1;A+O z0|t}jFdWLPg+}%zhVq|@VGPWuS&$=w?Niv&U@1Z^hG04rHmy7jny~xP*I3g^T8XSi z(3@@|b7O6^mZ1sL&D63X(P%vmJx#0Bf~8y6!+xel@*ymY)`hT?scAAq7!o6~W|J?O zjiiF{AfE0ttuI5B*;tO(a1MMCwEjj=$cP{=t%K2QT!o8B;xv9rJlk6Un~nG2HJpQY zJ052I_k}`}W?Y4NW_so==6a90e#Yy$Tud8fHSOyI!&)oD!Lxr5E~&$xLX7Fa6$}}z zb#NEcOT`T7S~TlTlo9KwIkS-jC@gWPcKlU2K!gioWi*H<<JuUG0XH2at&G>hGfby_ zz?zNMGc|oVL_1{(L>+Z9#$yAq5IdOqQKqKF|6gh?CYQz|L>yw0cbJ3{f`3UOxZ^Rm z!wXE|;t!@f&2*G0w4<XIwU`tvil!)TGG+peZVWF_X5#=*hjaeGJX*}NeNh|BwJ{gd z5cFm(Vlv4o(?k*I&Bik3qD11HmXr@D-5$c6F%49bd~|)K*v#AyFgN8L?YN2OUv72v zuS=+2tR~$`#aArldzM1!N;@fMbFdUGW*`EK$t${n)ND+|YdEJh7i807CQxUWvRPv; z?uY9JWx5?Sa;rosOPY(<XhC{Y-ow(gn4YPicwF4b6sv<2l>0<b2tI$uvdM4vv7uwF zM$=y+6e@R|TUe=?{^o1SZQUgLAAh1zuj?}e;8Vg$VKebMU7u+Oe46czg-F*rk!qb$ z8@C!4XZ*TSUZHwUS1`!Mc#CY{OCpYWg1q{Scn%uJ?56+{W0(xQ*?2WxRe$MmsCL#P z5cNax7XKiElhJgEycdAw4LGD`$)^R+@&phDOD}X(YMph{7)c9|-iFw2x>PQuN_4Rc zMT)VKauviVEoMG-`7#z3-wo@&(KJW?PLk`Oon~1EPZpMuxHO=nrY~eF#Ovu448N4r zdy+XEG1c^yA2jO8P|)<XAJny&tEh|Lu+;dU;a^76NqG~*Sax9CHOqcn3d<OTK7-{d zV5G&?6GWD0prXl=g2l>gISHB&ixq-(OES6~YWW+n+d?X7#^*_;oAF{2Mi<^lC62uY zu0l8UPthZjG~U1p>#*cYpo`oIFvdmA7>%TmaULSJaL`DFm7`tVTuC{DbuLKE-hIrh zSt+eFS1ZV<87pBSbIs>qkBT(Un?m%|xOu+X^k~*j@O1M61sSarE6fWOq+87}vUw3T zh($p&K7au*FOGu@<NG9|t{j(Pn_=Fu=B3j*K=j3M9rKD7T%woOJ4x8e?F>a)???i4 z(>n~sTQjjno16Y-sH=4z1esTNg3%0#Hfu#1pf&v&>SY}c?=jyxouMS_My$`~+Z3h4 z`dA-8>y^xOtBatP<xF|8^%81ta|ySQW!14Bo9};!>vF80k@{P|XK0vpF|1?Wrrc$u z^)uqzt~#A(?Ty}<cPJ=dGd?K+E+?U8;~c!I=|EeL2!0{UMexh*z=3Ej-Xe>sdqzTc zA~TUicuGnIKOKODUmkVn9C_d;GSwcL?VNgU6ht2diO5F(5}`@}5zQM`GVNJaUAc-Z zKw0d+RlLYV5Dxt0JZ57ifN-(&Y%=aK;Xpt>X*L!yS!<At%%Kd!IAQ?R27bMfY2Q8% zE#r=%0<<6E&1`h>_1CzLRF{wAvh#SeNnC`H(z_>v$Sla<G|vS5*&M=EhQzU8r$LHo z!dht71$}trB4bEwD`Jl2V@w;Lr4@XdB^JISEKg(YGg#KZ=cPqpsWDofh1ZxYCep(~ z-?A5C*?<Y6Tk_#|p_U~0jm2_#FUm<**f1F^E?S^0vp^YPc>-YpIVq-Xq$Ly)C(2R* zEut+i^n^l|UodZCEg9hLXn7yr*vWD?l!~)7CQwf5hSPPn3_?`9$kK{lcCqvVrmN*4 zwAjt^CggOtyaNe6EH|JPn}udTPfH<I+yu)n2w91iJ`T!BGm+u;w%h{weJoj!-`DaJ zc#|vxQ#7rg#RE*TWg`a0Zn1&OVTr@cOR+qNnVM?(27O7h&`_jXj>CxkErW4Az*2(1 zm|=MpwHI3?xCUBoh7AW<Owc6L@(eIp7P?dAwA_qqm*syzpKZApAuC4<+k|e!hfKD> z($?G2aL9B@I4E?SP6l-K1dIlyss=>XkZZ_2afo9*))&xBRcEzk!<Zq3sxH#H9zzjQ zq@Y;;Y)OU82!0{Fazb`kat8PWjlbDQN*MdXiXm=7bh&iYR835ybRx<qt}aC_2TpO# zC|p8C&3F|$A!dvR7!@lDpTm3Cd73Dq3+lplI_024Bksc61i9DwyFfSZg-1cwu5&$e zHBs^^^HH|FA6I50HEA}|QB~wD7}NL{R1u|Kz)`wbW<=QTT8W?H@Hf}hQ|{KpbqYe< ze;zG~>yLptj54IIVoe=5tbf3L#M%dONh;bf7-HQHhK$xZu%x&}LArGeoI>3C2iIA< z)_P}Y;x@Heh_r^G`{H)Lm95Xybh$%8@md%)p{q8O#hS^8)Ep@yT4>)*YrEM<8kvn9 z@EW!m&S6!}DW>mKTYind{~4}Go?s`N|De(X-Fgcqr1()mp%8T%qPmf&M{!}KkJgLz zB;ITcL8Hb`dIGV5T8)Yqo9cn;T3zGS#O8p4J22hE-3l@)Tiv4|-TD<wDehIhv?>eS zr=UpdM6&Ar3X0W?7h}eY2NEH_dre`fmM$Lu3)j}|WTz+Sl8n(2(^IsOA5y>Qdw0Zc zB|%pfc#;&vy4$s=wnP(8QK&Q|_Oj-tfpU+6lC0w}gT&Lyqz?4+X7F^GI6PMq&(LL5 zFY(+?Odch1Z=j#Kr0?^Ae*Q>pzYu8q8+fdEQ9)Mg-Ix$!pQ4Pk=26{#1;tuVVxo%! z3W~RWh?$3v-SAL%we}#r4yuu{S*MciURF>~Ybf>n6$K?|#$Gg}uZBU(sIKC*UKnWJ zwu;x=Z(GG1?YFJskZMP_Mvx9~2DE*QrpQ|ginKn5X)F#aDAxJ~jqMQy#cRe#(Vlqw zNxX&)f<9L9KAm=3C!_-X0Uvy0jCj(1sCbNBt8s)ooBfbdv@~3Gx)+182p7DX!^4)s zx5UR(1rPi5GrU{#5y`|+x};Hm1i@DvQ;<>3+0Xoa=~_v?__^|XtMy@;z+d=hoC*<N zst^&2)~QirHo3xA*W=P`jK^pjt7y(1C+Cl{ij#v7+`G;~RQQRmsP*|Yem^VA8?BUe zieLP#Lqra!BL5`88xYRLuSUR-^Scl4)-sy%f0VHkYSx_u{iz_MwUt!;D<H`DEt&T3 zvBVuOPJKt*lyZvGio!po&-kabKAh?_p>)*sUnmL*-c`{NeR)rS20s|7FC>4If`l3p z$q>VF6*H4u$S7{Yb?2vrS@g$Zt`}f^5+ULp_#XPM_o3OR`@vYfGdWJEA57AhlZRUT zV2-|tS`8C)1ZPMbueU(3u=>F={U+*fg#UoJUg$MRfTR3ygV22xR-^s!GNJ!XuGi5I zFBf_YIaw!e4Er{rKLK?`yr3b(0ie)L<V6?x={F1g4w|lAxK}dqKB2eR0CyD=poUD` zBJ>ySfV=tO?LvPW>%8dhhj$5m7saC<Y(ts&n9%2;Az>4lXch;+0#>A12U|j5kC78c zYNDq&g)ZA-(6M-tC>|zznrWPR`EPh=`tKCXd;3A7&J(8(Q__u=B}Cj;(3vugViHaH zq~Iu~k>mE`4ysYi2c6kSkt*g+a;;=Rn3!oagVV&@xQ^!YaoXIdT{JJ?{NhivUuF@{ z@ast^Z#I%En~j4Rqd~OUNS@rYD~-l2QlPUM499<E$jcILBr~m(ZvcaNq9t%_T_-8H z7667`NTQ0c3^EFm=s-(cV-)GAC`PG6d4eP{=ha5y+zOnMe6^7zpF!z87%$UMNZL#$ zLrNx=P;a*zMI~w$qa;DaqY&4Z72C$_hP8yRqj~;_kxfz$N@`>xsC!`GRbvk`bv<wi z;UxB9BhC6v)agFr7aE+sMzIUf5fu6cm#IP4=a}_d;QB71S@9hEg<-7`oF{2&zibpo z!Sy#vC``64$a#=C2Ljg*naM#Toe9zpUP0q2<nl+2eA5N9U5h}WU!vLzX4St>+x720 za_Fy&>@Sg^q-Pp8f%?ZF^_T6adyqSSuc&RHOhtJW)Lr3pO7?d_>ONvA$^Hj}1}b_6 z_IFUagOq;;DEo5!{maO=?A98SIlcPZcsDXJ!&)7t*iJD)n#6d>xCSLrYTAaN9D|7l z8>6M<NRwX<7|kFQp(ZgCOyww-1AZsSs0SETi=igfA{qZ7ipr5DQ3<9xl*M4|fV5Ke zF(Sa&mojP5!Nj){dDP70E^#J7?$CttAQ<z4j2+Kr>}28_kIXn5sg&q$5^KP;5#=x# z8-k2o&t~jqqJu}}C)+XgL?4sb45r6W&VcddAY)>Xk&WET#5XeoM(%Cmo0-bU*b#{o zlh_LxucO$pI2f=5s4hFsmXi{Y16$qK6O0)q-1^nDPf#X<F+0dOAi$`MoZ)YgjC>g_ zkuDQ%xN6$3D9gcE6J*Q^Fe)QEO?;!3Z8ZhHDMpxZ;|`lRl!w5$Bgi=HY{ud37;nSa zi%U(y1}4fJKLq2iLB_lwBikz9#P@Oowi;uiBUt5-mtb2Yt~7~ZkTDJ=#Du9}3)t$4 zv*lbFkb^FNMa#_;cruu-LCFAPX^?SpfKl0MioZp&)%*@%oB>Y;6aApk3@~mEGF}~E zRJOXt#P^xmR-~RNfhXggzo;LK?*|#(XES<Cd`FrYwFEGh!;`^yD++y<s%OtYAFmBE zvaRNr_}+EER&z~!@0$H;1H!7Pg?~cEPL$6f=c=HbnzQB92IQd2r{NM}u}RR9`YcKZ zMAch@jEe${%2td0Et0JSS`f?N$zXaNB^!+Y6J)FpFe+O$nE1XrcX=?Tjkpn>45m*| z=o6Zzgg}>9p3QiJiSNKOqX(f%tcE9piGtiMU>pWUwLmm6<8#3EEA*CXqRB+j`V+uV zmTtw0JK@Wiw)Fclr+{7<Z1aw@+gxwr`}*AGtuzVlHVOLtVqcVg$b_B`GHyJZag*s% zL@ES~zI3oHHnRrGm+LSGM5{@pL&k6v`qh)af^r@V%6Wv0v&BS@4yeH6rmSQad>KrI zC=FoDNDNqOXOQuInk)~Q;0%7ot`s!e;F83IvIC5Bf{c#`89BH<VY)RK>MkcUKZ6(v zrn^zz2jl%g#;4C_e8xmiEs&~7;sXk<`%JvZ?E>QmC??c?4rVn*FEDd|;QEdy;ulTt zDuaQ00fs~zR@_IyX@SMYgR*C@0QZ~By@a^G#EW>#REEJ-ZNEl~;4!mU3@MS|T#eEU zqM1SNqh?ybNZW*U#C_CE3B*^pMB{H!<7X868n7;abJKy(rXc%iX73N2eF70{A=FeU zV6d<31B@d?r7vJ@LZRDZuYp}fc6*3_`2_VVl(-KF;RkQlfbt=fmq7hbu(AG3{j(Bo zq#5c8QDz0{5tL|*7JaLwGOLrxX_29>Q1BZO!g(w`s1O4+XQ66AkbF3k-v(UY*U7zy zhfv~7Zp+)l0H{OQ`!sJZ4-xwy+6F<(Q1*iH!Jx2lER614fqViyT1-{sYe0G&B>@in zPLO;GlhYGgn3WW3L~)2Xfp-JE>^h)3^a+@(h)F5qm`Hofq7c4&%bxZCh{UWAzHt-@ z#srjIU>+M}E(<bqpUOhkp+)5?*F=H2LNTX<F%RV<Fw;q!8m#gFb29H>%R~5Ctbl#W z{jw-$+KOdO)P{)hkWqx9!=2v@%BeY9PE9}#EOirz@g?7a?xj@X`eqcmZ57=Yz4;oB zAZ`euXAWip=eU;q^`?+-XTT|?4P&aMi0P;hdz64RV5S@M_*E&0{vKE25F7xaH{<$Q zlx?V)+!xCy?|R=1p*oP>p90d4Lc|TI+6%H*P-sRH?0As2n;(aq;a2w=!C*Evp(65s zz?{~dmdb%K?DB`e_6dqa#dn}kR_q_+cll(TGYp8~gQ39EmEi~VzQ2)oUmQbw9>ZFz z*0T$oUaX82M<H(<`ke-uJ(6&c3n43FuOLf|Pe(F-17A-=t=98-gbVn+pl}fj{&Ha3 zz@uizp;*%6F5vok%8Ox|SUM&>PB3J?8B2;ev3W)<jusS5cLoxX4{P>U$qGkeNxwUR zw0}fn^ESgz0`5(&L3i}+$0%w4G?v<Z9~JmB8{b1CY0+t@2nlCP*`OUAqW=MkmHh%5 zig41f7n)ES8p27#%TN-QQ*$z$nxCiYp`$UJbiNI+GM|a-;oS+VDYTfwDY89}YCCUY zbtXRsIK8IgT1|w84@Yyq0`3n3Sh&_uJ6&}(jAiNQwd$&sVY<JfrR^eH_^jNMVd%wT zXmJH__a+B=ve5bl2<g6w>d7K2_2gr~swa!B)RPIAfy&xTtkjbm0jr)Y<@#Vx>a5%o zRFkIlOl+vFRGKz0?J-m;O_wn|9Gk<$bSR<vzJ_@UfmD58Yo)$703IOGGHwEDRnR^i ze(`|yUR2$RDlKs{UhK;ewZu*<Z95(Vw)cGq691s6p?<_lLw$tE@z+QEg;h>04uO`~ zR-pWhn%9GdS;V2B2ezMDS_yf|kFgxkkAjk1u?aPI*<mJnz(sr?OV5%$1zZB3T7Mr) z3CxcK^NH8@v1FG7MEZm+6moxHcsRj)2KGZNolF%H%v<drcnUNCPA{yf!HHTdoj2_V zoUs=gRioi_9EblLOU8K*Xs!2rD0M$dDm`^5WJhAKUxjr-7&{WxZ$zc_Ov5x4e{>Wl zKzcQtIstwAi2A{2slRum2|ErrnzDZ~G#^kejOJeqX=!}&HYQG#LEKD8xQPnUI0D+| z$B|P#0US-({5ZN_@iL(PW!PrK5udn1>-j6a-xDX+fS)Gd*PxhAGG2s<#ocjqjpyCD zqxZ(G19g8un51-`*0YiFt{rjWC^);oMMt9Ut|0ez=C1T}?_};K;_mqu=*1Ip!UmpU zD0c(<8u*gY-^ZCtj8C2mwI7e8vrciP*7G#XBlgA#BEJ&lHL#dcFav%>=oHVz(X|+_ z)P6254A7s{l-WpkNX*74AR<ZUwEF}IUy2iScV#97HK16rPn`~m1QvFHg=GQPo9^w> z_NIRg-J5wij+kIJt><XCw|EP7L*-K_lR&)|68diHiHbMl=-S_hHv@ez8|fgi=XX#` zd>kkCf{h}^G9Zsr<IMUIv+ktEUjxDCDC7ml;^?sW50u3Bz@N_ge9p))inx&bIwGSu z87Cqkb396S;3uaB<ep%;V}K)ZKQU)Dpo|mX9R@Nb@)xdnghVFNM=}-mFUB4stakBn zIH#D3&o*oV*FXrH(utnI98?8E<C^B!KpML#ooMV**`!x>qG8DF<<Z2|ooJTQ++Po0 z6W1CADVv6Q|2gCrq(NbxeY5!prUOE={pCI&oMWUXIY$xvCE0kck)CwD4)B0V2-t=q zz}yQ8RWqrUMZLGta5o!=pvt)zu(N_*Ja|bQhAP(zTp8B7d;g9J8x1A0Zvg^-y^Ddk z0VQ=CP2c6*8uV;~n~LS}9EQ?CKN)@80VTc)D!wfK4e-AYT)Mjk>&|uYRF?=T>2uNl z>*MKIdMt{HwJYL>gM0?yj4~+nDroH-J=QScQdDTY+tAV%D0aSibRXBOp&BicY~S;5 z1GH+37c-%a8<xHob*<?EQ$E5Py#ZW89@G+#a+5z2?536Sv3N=n1q3A=q%nCso_K8p zyU~PrBK{%3V*&T)9_{8HVM!Tq3)-`wy(ZLCEPOeB0vP6iGQGGQcXzlUA3&{lG{~l- zq*r^fY&;!Lv34ERV0KdTW+O$tK4KrHt>_&hDnWY?Wf#%(hbrt9y?90V2)G2gqbGWW zP+c?<@|-VWy|<Be36tDM*`C=*PZp)+LPc>&JfAWj0?T~J&jbBkB$KDyh<KW<^xS7g zJ!DKpMK7LTv*T&f*&8At;acv>vmnwkHiN1fRBCcu&Qv;%Z?xWnAe<UdJkyz{3u@GQ za5YmxCojdU=y*N`tq1wbC?i4kPEe;P)~OOWir!IdtvjiSBykaR5N{cI({>1qU7_Q9 zsEQd7Fw&bmb&LqkbO8G%KWsP}5SUkBZN(>wnb`)$r6`+Fb!CwGc|Q4m6}SXjB#57v zG*Z2gvTJGG(2S7r{CS3YaDI()6>4@7H``LM-YbApsf>uHROTUqc~@YFr_|*=RgcM` z;NJmjX(`lPmXdw~lIccNoDD}083E~oSo$TvDd~e)`h0>}dL~Q1N!3HTf;Rxx(q>^^ zi>FooKwmKO8p<=MSwhm;x1Qql{y&NvKKc}=ywN>T|1czoJ)HEW16FC6g2w^2^U1|C zoLsL4tfieMOKnoEQQUk2^X?whm@f{rwt-uFT}eZ08@RP_Bqpl0jojKGz^XL`*8)!M zL7u;vvlZ3y-Q4oss8cR^5A(hPSWEjKn&C^-eUrV=VhrZaC#YE&)MP<41uP3PG4i#A z(KJHC2;$U!5ySHUt7LO=G$o_hb<iy%e+;W<n%hC6^2LVe;gFbwmZ3l&nm*r$asE3V zjho<F*{Et57%;`RVWdDQa0&ci!na{`Q*Z^roXC9}Mt2482i%VzK=>|<Tyh`PzfPn2 zT^PwSA@Q`gL68uf0Ou2Y5$r1r3^x#5LjErq-UK)ucV0|Zx<T^{L32C^T4qjmL$Kxy zSc9qdB+7J%S5tU^m7<j9*e)UGhp=rk(5@VYCC@P+3Yg!+_A-Wk1qA_!1gAX$0r)fu z2cSsw{aKXJkZu|T{n_zCbn3qsxO93@K!obF)U5@aNC(%cchi~^rjt!mSE1L!%GdU3 z5HG^@4ZuG{#3zWD*N%%A34D?m1%1UDGw=HMqUll_d>_<%gUzotQ}guUoPKP8)n;lb z4KXS)(g2%Pqeg6CWGRsL28v#r7+!<Rj3f|kfwa_EtWe@HGwEZGqOkio6Lm^LWPA!! zJOWKC?iaaY3@T8S0Q4l3R6bYP!d1Wzet^0<JdO<~{(}YvBIt@?oXHNX9uT<H(l)|d z!~~VnRYK4KIAR%O=VS#ed?hEtw*sd!#49<;e3W3mCw(OgJxp-FFbKPnlhvOA)2cR+ zp-YfoWeh`K`$23vvgi`dqIUsp_tLUj%J4@7Ura*E;xKNS4v!l`#{LwVS$hJ1ZQRaG zO&j_#aMh@EzJ&{|_dv|aRw!<FnLsm-d7nYG{h4sU^I3&o3GRazv4Go3u>*EeTMN0~ z12~m75@JytJpz<Clg95Ld1gH`EJt1XY)v#U`R#!4mv{rHQd!I-#>4iPkP_Y13MDGg z;XxeUyKw*>h%nKOm!yH1FWq>R)6(|Cxx|@HoEaTLM;bAs_M?SnC#?DsCb0Os6FJ&R z;1cL@De+Gy+FsD-%@Xp+l}~k|g*c7iQ4;X!PL#(_0qo!`Qj4Q364{#lXPWjRj>5nK zs(u2VFANMDYG>lpQs~evXh(#^(Y<Fo53<hnPk}yFgrP1pj#SIo3*zCpP@yx1i9QFB zHefCsa2d*sVC?{|je}Om!@;L`k{L^n&kZA&JAn#ej~nX7^#mY?UWJR5xNwfc1^t<g zcSB?(-RMsH51dTwQI7?zfyrpL&<Rtr3uaL3Qb#h|o4_UXp;+=%N9wl;CQ#|v(;X?n zG}O*X$GAMhl_OD^5eXZ{LJDQw&vzs{V2=-+gM;jA9r?+N+DeS}ARENC8F)7-^1+fi zJQSGS{9z(&y(s`ZXW)rwgL(}pbJ4;bK^33nj}_es+;Gx+5(pNeh!+gKi||fQMr7xp z0)I*3S&)e-{$pd*oW_iK4LEalpvRL{L;_Alq{$o;YS7CB5+M}49k88O=BZ}RDhTFd z=Bvzf%={f-H1`E*|FMZv9u0Gc?kW#NzPd2j+(&#wUI-j5fFGGi*iM2t9DZb?aQHf4 z)wqJY^oKR4z?ydRMUX$%Oh;NiATgu`6pykx^8J%tXl)yYZUd@Pa{?V4#6$WraQ;N5 zBc(~-09K2CW=GN?3Tc&EgcUpru-a2NdB{Bk(~~`}j&#zo9H8>_Y<7Zs0po*cM1u_* zpFg}ys4av-5V)FA68R4)y#`8(&K-IB?!xsJSl@xV?LnpES?MXjB}{;}^q>k_oex+k zbrCCdJ7A?n7uMo2z=;RZWGcH|cXm7S)E->@7OK(uc$&Z`;{{3FMJ;3OPN2#)IAF3L zcoWkVS&K5+kDUAA^VR;`?>Ogv<5WFta)RMPz)HKHc+=7VSZVh&2e3_4@Acqx=a+bD z`w_re&&x0|MZOg2(Bd`>%7?(#1U1Ry3^@cjfy$8cI799YSi5)yt&M5e9Pa`-ZH`lU zbIcp!)OH)<^nW+R8U77%k|?8ywNdgs+l*!x!T^^*Y{ig(5jJqs6~U%AaMKS1w$t`a zY?72Yyh-q4>ceJ9o8-R$XMBSp=mkN&IK_B?3AGH(2pa>dcDcKlTpLDxrJqj_PfO=2 zTn}A_msBiMiS+yIt~&rB3MWnhkbNHj`WrkOQ&~iG60{)|cR(h0I-EOAyYdcf2`z10 zH0s|sh&RAgj~-qPxx-P4h6W7!Hh+k7E^rA~^aSxc20BStMeugaGVw0g9|PQv_oMIe zhd?zfs&)>TA8<693V1*Z8rX}{9l}#X!omEpff~{V2pA<DB`a9-jj9<=<{pKbI5Z$) z<<JJe>me+$68#;q3eXRL@MkvC6S;$jPykq<7Cw<W3~ME?cJq0)8&r^p+WG2;#L<hd ziH40cznw=cWRJMyFsZ}Km9G<p`P9p!z*FDJ2_Ef|Q&hWv++=kpn(~TrjiS6W68N>9 zC|AZ&3+DW;P87M+LijLynWBG0(eonsXs3}R8GX4J?~&>;siAa9&!L%(W9X6|q)HO| z5&y)yk_T=kZ1WIC-hmZu*d-Vk?(z|K&ndvEmFjJF&jkeYUh*A=*8^4q^&Zn7BACte zz9i@Q6R?9#^#Q}O_Gq2sAZ0xtN_u`q)_zgvC?{n;lJr=Nto^3Wkw6pgV@b!(viAEr z$9jrTpGbO$Mb@6Eb9{+-DvnBeHbvI{Qs-D63;39%M^0qzA9ao*c$oNH((OQ5`%j%i zCrA5I(t{ncw%+GhhUp`|lJxL`ti8_XNW_KsM$$70vi1g_<EBo4|0C&916jMu=lG4h z{5wg{8pzr;K1X>n;2$L2(3iEh`W)ku0RJfIKE146?{mx`eNRZbhc0Vde2(wQRZdE} zH7;v6`y4mYMEDs$`bzM9K1W<U;9ulghPU_}Ll88@uaa&^%i8Te$5-Swze)adeC;lu zV-xlFcS$i$);{L5&!zf5C9PTs$VD7RJK(<<mbJTmjw?C?{+mC6C2ODaIp`Pq#6LV< zhT35c5eM+J<QvhoBOQYc0MAHrH$!cnV*;cK!Oxl*YA<*EN?A*Yv5afS4|oZ)=PQ)Q zM<9c#nTya6Ya|~steve5D}#sMfO#fH8l4+)?OcbKp)2rmDb#c>!bRd1)Vo@7Wmr2i zV;3@23GVFofEe)wUakdU_6b~Q88)N=T~ImVDS$T;{s7?<hXFt0G%g<@oIVUtEM7h# z$c790<EMJZgE?+BAb|-mnkM=o6}c$Bzl;*%(zF&3^<@WtjUyA?edWOQItMPgN6c~S z4Sy}&BkoM&`+$;l2y*^F$$+eHg0k)p${Ikvem{Sb8?uzi9yBPE&4a8R<olbIEDhl) z5oHEsbs8DaYg0g$mUf5+{&96<EggiTV1=7O+yr8kZ$1`Ip}7q>HESOWr$F=_;KW_9 zo1>26Ok4O+a?Q0z=ToHF%{Rw-KkJv5&bJKrhLg<DY%(Sy34ItREf*QCxLUP79xZ<i zml+HS@2EiQ)426nz$L8j4B}}ldL3X&&ZhHyw~wfn@6su_KXMcY55P74`*M}`M~Qg` zt9}JlU*84rOuk2mRN29|bPN5|W%hL!p|*&@8$oT)Bo8iT?k&X4&+@ui7204Nf*n+< zxgnfxI3EQKdPk>eVyNofQS{6S5AT72-5KoN5boWjz)=b`j2rX;($YSM81aR=H9QP_ ze}ZQnY7UPMSmr3-8h#cyl>r@#p``I+zzOvHr1*?)5C22(yQKc-4AU5^4Cu=k+9%Wl zcJOBIs~FmD8EU7fo_rlcJ=sXrJe~g&qo(uBk*|>H>S9yjnu*_lMjc%L%HnCr)uGRC zOdpOx%}5H-w9U|4Wm<p7kpI|Fk;=~l{}ZG3A~QkNpFh<wA(ncHl!ABLd_OG%<muR5 z7BEx_2!A{!KL;sKNvWmLL7wnN@Y#|E{7onygLY|dz-Z<CoN(wc<vtbsv7def@!?h_ z!});K;Z{|I|8Ps~E2_ELhiV6VTMffF_*M>H%b$>2hiYYkdHgxKU4XT;4=5g+m1gvf zV4p#wFHqAxFQA!$HH(Ci$+0DizK0;z%*gNyfc<x?1DdI(Lb$2FP^~o8nS3PtMh#9V z!%ct_Z-ANA2q#9+2zSIVLc!}2q2Oi8-%dcepDx9hI-_cCen7!7>~D7ir~GXU``cc? z>VE2&7`oR(AG=kjua~kz3?rDkpy27``|NLH+257`R{Pd*?2j~^cCm_NvGFY9HW*Cx z^9pvV5a^fj2Z)SNPPxpCn078Rlc_EO6}e0yL*oG9X#{wl^1_wug<k?|XD_^gz3>l$ z>666b#+U{$6k~XL72|N{rkHyH_P%ut9#lY427H;P$cvy!rO)q(S6C+Kw6w53fCnpc zYGbj6p;SWKzk}v<u{m1+D|5QooDWew-=21{IbWc9KFrQ$QwTJ!%&Fj>fR#CO*qp<I z$_-)V<^$H!qC%lfqlM?i8faphj0uSv=VjpL9Qh^-1^NF0PHA(Kg@VcVfD`uOLfmYj z9jFyfk#IYuGB@Lg->?P~%xA8vEOh32Enqd6O%@6+oO<x)aJ5CH8oPXU{wT*93w%|} zfG+mM6l>R7=uxi%f{QRlVjb6CM=*bk>K2AAXp>^Xtqfg75C-@*1&ss5=fSsI=uq}C zz;>GvvhLveZwThknyt6cL2T^hfcc|ccUmYQ-2^ye3NG$JC+w$bxp>h+pK<+^2>Iao zpoNm`pNMch2v-szA21xV&`i2=JRE_??lTKbg~VMTqMh|utiU6vh70Wi`+FpkIgMe& z`5{+j90dK_5Ss2T)I?&~Q1q|E6<`?#@<~CKzRWTX71*{M13C@dKa(!JPuR%4nNQUN zhN7kkr8Df9y2FGn?O;{Zsqjwjo|d7*^1aBGP<2=sjmu_m+j&VG9##f8>`K5s2lz*D z{XD=K!@w3rYzSA=_z3<jpcCs!8l6I19Y)roBlT;-#(?g&2@tY^BJ>OvdJ=HPUQq9V zcJ%B>Sr~mc$Q2XOU<Q33%HK5ld~~`n3~g&`P?O3>tBY7b@7K^Z302eSAlSz$yaAeY zIt;F7Frol_nD!RcLM68_g^^k!eR-a;#HcX(S{@LNCqiVPuZ7XZc{dZ9jrDLBvvCyq z5J?{_G8@O!C4G2s@Tw^EXI@9XbtnD-dJs>i+Kz8PTrb{^&gXLwb>n+MM>?`ho!Jvy z3p<jNT=FQGC}$1lD3jA<!fYnOcKue-Tj-70krqc`%2i8@DV;&T-2^MHSV@pR1h zpgQK$(tOn5vpNR=n*7&eRNq1GQZZsG0JQN<2g4-5{IQ(fd{1FEU=<La)F~j`L@=6o zN~dt}fvUw=?_oF^k`sOtXzFR57S1sQ^V3w%=+xJFfK_<dtE=#^#-|=bdV%ThK)rel z=|zU01e{ogAyJFi8{Ei;K&r*y5UZGW6&(G`88}&=iL{x509?szp>RC{Ra(X_2>1ch zL`@G<C{6Yv)Tp>`4yEj4`ZVH0oDT^l#yWr*S{Q6Ze0<89&3qeCF{}WiG9Hy;aHz8s z*NIyIjHt%dOQ?4FaA8<Ge#Fgq{|^Zo4^!O>K_hkp(>5I!FW|y@H7;Jq#V}lCzlRGg z;|5SZN0co9Hxt1FxcC+qTH;>Rjra;+_iI3Zg6IkT4bUo-q=r%`xf->kd^iX(Jt#i@ z9!hh10Zi0;9ctT9)S~%!s9H3k(tr?P6H#2m1PgwklOeW)Ny~_buxAO+&iMk1`vNs~ z{<P|gq2vpOnW*Qpq<x_@cZLJb7zW0bV5Cnp{U?;7E)Ge7Q*rlAHfb>k?R*ya7Q?Fm zt2ll*l;ZeSzz|glwj>Hm+~)1v=0Q}czTd%p|A%1yl+}7}?4m-zXK04r8A|@=0_@-* zc~>aSX}NZ{FYyKlCjA~!`e_+kfY?V-g?n=a_okdAalpQkTgoW{Odkyp6Ie+P;KW1J zvmg5aIfvDIl!*4C9Wj^Tw*mL=3(s4RqVD2VvMuf3!v#eZU;i2)nnpx?_ijn(1~LKu zGQL3*e~=aUvAS^<I^T#ZhS>C}c(f8lJyv(6g&wQ>5)~NP%ctO;K1wGF;{1SR23H&1 zs7=%(faRV=@FJE-Sga`*cYsRURm50>Xz?q`Sk$!yBgPhv7z=<?ht#b+J)Z)s5|phf zMo|5<9uT&T=k#BIReL*h^4E(z)LMEc5G+xx(QhS(%|>KIO&Zn+6`vMxYZbt$))un# z`vI%g7OCI>xG%T1m|MerX%#D$a;%6dp~h3uRvnX%0-Ts0w7?41=y4#?@+LX~ny6HY zggWn_SW0nvA5>{Pt278WrP38Fa}Hpo(v=L~16ZjvA)u1lJrr;??H>4n(n+l0d!W|R zt|xots<w}!-C@@vUSI$^V|7#JxP;rz0#3C(l7%e-tlA#M@Lg2T<`~Uwe*{<=KaacG z9j3-JOvz|1OSMKVwV>pnW@WIoi@CKj;8be^S^8GMs<lB3ze4rgS|+#lEnwA}lUuW( zC)(h?(P+)#zm>QPO{iOm_Ta5VJD<dBgD)o|ydN(n>v#{tVx^YW_xRvnEv+B$A$~7D zu>X*sT1ri!>HZO4_u`N7e;iLyBo%$a0igfhWIsEAEowKm88r)6U~WOX37B)rzMFYB zHUl{H5aIA{-rL<mFqXf2csn%{oT~r#GVCLm$MQbjj=cz29ZTHL^~n{0d3k(*cW)0? z0_NrM!3YXZhXJeQ@%ac^9u2i))#~^nlUu4_PJVKFAH&H6mr)GbA3-039|L&g_X&V= zJFG0nbyxD>cRSQq<NB8*T$`froQvy=y5l-I+6Z+r^5Fc7C~o{>2l7qU`z;b&DgeL5 zdOZsP8I>Ts1M7XdXAV}$Xv*e40bVVtdNeJnAvJ*cfrQZL;V^eL;PmnZxS3+%2SOH6 z{XY_N!?}JZU~Rw#sQNa_<0PD)v&!#4Bla%Wo`jNJV3)(FRlX!UP}t~M3*L<NQ0ffT zyg}Vt(}Ap*GY@lm7b?{0!Yv*6bV18F2vldz9q8FjEsEM$3|cLN9#>66O)7t_K|~bw z1^Y{2^MO@8d?b>vhnPOH12%?K!(nqkB<b@x*Ce5)k!t#bS%foB%KQLj1XC^p47-E! z08#SF_elqmz6~|QY0?c?h;tbf@pT91{eXwwi5G1FiZ;NsNYiGc90hag9s`IzjiMQ% z4R{CGw8cnF5$n~$ksn11NAEBosX`&gMP**Zk}d~oGoeARhUMxg8n*7#(16k<IB!B3 zOSRn5o^1FsuBDovP-X{fv!cihEmWIPhR)qiH9RcEJS_WBlUR=mH7q6mVHxnf4<CB2 z$99eA3*ynAfjs=_=syM+46joSui9_1K`Xe1zQ&{b)IiO3JZQ^Mqq4f|qiEEB1>8Gf z8S*9+)rkjK&3Q0YYFZi^doYT824qCCm&o{YG6SN?rkg-EoI(^;-hm<pL_1#qoOlAQ zk9ZwdkANim10wkfFCPLL@e?loCiH1s(4XU_IIwPwcnIm0NzxA}Io=@u*dDQuG4~N> zdKfS}Bi?7s-GoW#0?b1ZKQgA7FmGN2%)=3K2FbaVFq3)%^JqjoW9SDU9T*gx=SHM3 z<~qWR#*1i+7{M6&8A!*3ZooVlF_|&dgc(Y$?}?bh82XhQM<KQTOhf}?N(r+PS)O<{ z;&#T+&*x}qy}JYThkBT-egz&<zX7uqE;V9WAdddR50m8rN1r|UmE!;ot<@(XfAfR> z53u|mc$7?y;h)hohUB4+eH4uTQq;B69emgl0B5QN{co;)8PsZ^|A{7l{13tW#O|qR zy7k!&<{98viCr;D-)R(a=))W~J|Y@Tw(EU6YEGc2nh>s;N;O)Vj!_rSsP2wOSD(HS z54WP~F9=f0#vbnOdf*cHRA~?Q;a!5+-JXsncMDqzt+-FmvewB2bEgzMgkVlnp5yu} z83v=+%f0dv%)NS^d-VX|-sw>0Iuxb%2OMGFKn3)cNnl;Cmb<+m8FUj4AW>B{9Y)~& z>a7uPfDkt-Xq0Z_)hakjxBEf=DBTe_c~n`<ovJpF#oWa!NJJeqJB?=Zr|S577@DMC z9_)#lkI}3$*N1%keHn1Hs(!@B->V7Y1H+FQeh9EyH9z4`(VPUVhWIF-wP*OKtq*8I zom8Kyp?2bL#z_KdF1<R?)(`4aHNdGH=12Ze%ND?@wc`vQp?c0?PVgsT&Hz@e{bVJF zO0K8Yem9}Dd}UA@S~9P~L&T`rA8c(D8?**E>e*;E(pG}FXSoa?1*}eU^Uk*En6qtq zDce+Q(9m)ig@7NGO(W6jGbl4r)Bl=4Kfh(0t^$r){*G<<B|+Ts_Y9j5%al!jV4Ge; zfscdyakgn2U@h$`Y&Jx(vguy5<7vc7jhaotwq~$R#qxknXR-}50jt&u8LpsuwrLUD z^nSpqH8<PzL%`}RpCY9H_F5#h(&=8*P>^J#NsD|efTTFdNP`ynasWx8GC=uB07=o3 zk!CIO=KzudW&o+<nj4~+$w*y`>=r;$*kojg7C9h*q{tbd%ncwZcrr3ni<}-nQv773 z&?2h>ND83=<ca{2o*iXmFD<e;fTYJq8QD#X+(k%o0(z>Qk+E9jenLKvfuhefGBQbv z{D6@30Ym!OAtPbB<Afx8#?A~<I!<-R5N|j10m>wg!mA^VxYU+*MljHB#g!0$M_BMG z1Oanq6=`X;)!wvO<;8Pq-JZ0$g~esF$~|Wxk*Um`Q(5S(_M{?l#;wPig_WM_)G|oa zs%zYCPYJFi+-X5&Va*KBf*Oyvyl@V1pk<u8gb>8$;I+46jz<Ad6_T)fUl$^}Cp#S* zTr*Q$Gy2PY!gtW^a5c@iOzzk8T&K%b>nu5Wom}XgUhB+0x%*wGyT*|;MMhUSv%7c( z2VZ1_)9G@%-*q)z>S`Jr_<xxz%jF6nA*(X`6@Gp7T-wXdMO^B1=j9~3cDkCVs%fWd zw;t;+G4$@t{^>orz?m@*O1(WWP2OOra(bopcz%<#w8>d^8Jqistn|sqHaR<2c50K0 z>|YQ5qDgjdlcjB$8}tqRJP!90*Xfr}GxUv=^A9)4j(RKiru#&@tEFME)1~Kh$?uo) za&GoLozvt(yVu*2_VZ_YcF9dSo%I9yF1ox!Kk$vy)ztMD_2S;$bu(SbnB&sXO-{7i zrNdcYy+%fLlNALr%D&t=Om~&a#BTEH0-0!+PjvE8oAQvsIc1BhdZ`RQd_XR&nv|F2 z@QxWYIL{@siub!lyHcNSDuF5Wt@V0+{nR>rlC1E#i(K-dO5LfKq{>CbB{{R)p6skF zhg;99mtB0dvT%R3_cM2v!=Vq6md34eLEBbYs@n_QZh5@!@cv6@xTk={u~u)XmoI8Q z*`Z4A^c}0-x{`P>_^mYN^4fx}GS(;OIAyF|x&d_YNsm)@vCF~&*#oam*`q+_7r2sL zZW&%IyXgh>di6>g8ac55W+Sza)awnhe1COTo}8ikNP}$OR(X}~+$uk*)qS}xZ_95W zEz>>ys^xz!I{s2c_8zZZRI^NWEXZ8#8kL&ta^$VvGD(&c$k1H3J~`i&CCh!MmwR98 zmn}Qm<@8)QfNo!Q;N2G3V(Usd-wr}K-zlwCd0Sm_uff;dotcuiWxG7AHE+|qXStgC zWmlwmzueGN=PH`Kb<fcFJg?X7>e=0qncBtS{&JGnd#PMh&|mL4OfKr?_TtY~i(wh# z$a7?-IIbK(DCu>|=wmHF-JH@d-KE~-4^yfdbC$`lHVj6Koaf7XM}C*sR=usB{&vXi z(~I})Zfe@SyJf3ePW4HP&m|Z5@-{wu;K0_M`X;$Iu~_b%?!>$EjJE+k-L_laX4Jc# zF8$!`BQG_`&|;6LsHh1BcO3Cnd$UL9=-cG%V;k~i)G;}&>a%2binQy_Mpsex6Rtd% zUq;%STt)S+tdzGW(r6U@xO{^w^VMhXo|L&82E)J~nyx#Kx$^YxcghV3hE%b2s|;<G z;d-u&Je8+UZRnTcaZS!l$#UfB)eTz)%gRPscs$wRaJe#5^prEnE}7ISr?$%S<Bmyg zN3v_ugzPLi(78mqs|H?rV2rC@%Id5vkKE?d3#!&;>M4_4*>X{?e0HkdT;<L?;<;|= zhRn(GtEG)qWhckzSB)3~Z@7p3Z(gyq*ySTh#V4{{8}%cLrKL5?G0`QHPc@xsXmYJ` z43rHEF$uEg>3clh15Zk?-fcI$%&DjCgo!4No}{~zT`BG?xBgC2YRV+t^^y+X$=xmA zU92C|y)7lHyr-Mwz{B#=<1(Vk3kS|Es@HqSf<~|2T~CzpZF+aP5HF9)1;_Q5WoNxW zKIPTh8fCXOc}UZJa+l9XZogxbtEi>nHW|^D<vMZ13v*9&W$WAB%V45OhJ@%rsd8$8 zp3>mjd7v)!vt)#UyjIA!=srDFUo5i?DMDURC6i8lBcJd!>(gYKZkJb}{5Ic^ESie4 zWtU>_@+<^Y$aBf*_A$@MMb4r9v)t|j$&U1T8Cf8wI%VGiIol^Y+2yB8s-U?=uhLUI znUnRU!{vg4{@M9*K%?&3kcT#o|0HdP*EsUr$&Oi>p1gy4{pupuB#h<4R%xkn%V~%4 z1@&$j-70VIsW&!eXL@9mZ)<kHtegq6`;3(f3$k5$i=150qOX$n#yq`Vmg(Id8kk?b zJK0gHd*#J?tM15hJgK`UWw}SExa1YBG8Gn{&|0fExv~ZidNMO73k^Dw*6FSf<U-#9 zwCv7u<+ThRnAUgl?mXS0k9=Cr+b^xU{mIb|*N}@{Q~M6i)bsN6JXw8MhWq5$T)Ek2 z=qp->Ts%Z}(3`yt?v}Mp4NtXr8)R59UOflo75nRxU7p<yI{d*SJ0F(6h{kHPQ#VPU z=-QIzk}K+*@-Jbh_Y}9BeM+t{w91yc*31-nxli`D%lf6hyyT{5WMZSdsx9wHy}HnI zIxj!FFk9BP%7MA^Ql}hPAg2__gaX|IGhO4;b3V_^F7%wi#92JJ?48lBJ$jFR*_o^L zjk~>a{{Ahlzjw&#I+*Qpu1{XmHby%1Vp*s+p44Y=O?JqVVp)IHsnr|a{X&)(@7B9t zEpHFei+zJ-tlsJ#nVFsAk@K9J+^)fTem{@f{e<jPET^>TyX8VSOlljvSK8ZT#WA(M zt(LWoUio32UZ7)KBXwueM$A&TJf_*F$aTJBFz3R<@5l~^5$l{;?x8GHucnppHF)^$ zjk+Ue5dO`SyL|;{Y*DLxygO!(qiFD%%<Rl;3^=U_ovP&6<G;Gd&M8Sbjs^sq)tC<X zGCWsSwd&dVO>emnfzqBN9zB1%EcVGzLpHv2PlmSX3m=hHdX*fl+nb7Vl5$=tL+Jc$ z%z-S|L^zSY>}|00=$DdG<AOzG+%Y-JDdP%cRe|1VC12a+vmyIeXS$2Bw<o2_P<xuJ z)w}7g{G?Q90<V5$A|gY}5q<fOEwb}*S?1)RPJuo6hjj>lE*F;iz@OKvyZAbY+TitW zXn_&C*^+!YvRkt(@wuNWLTsFy?#1GRmfa01nL2<Fk4XAkuL60~H0LDwYp>$Zz4_i7 zy<=;Nypw4)xc-`!4b`5a7HKJ#^9wehAxM|sUR5QV>yB+tTH{#_2b$!T5yi{A)h#U; zGHY>5vg_K({j%NC)`&F_9N+;Ls;eg**r1Q~dNJK@mG}9YF)S$%cUU{NL%!0xxh2`L zx}~M5rDbEC_o{`csIF?+$bFN?r#5fP+~D3LyY82ph2HHcSC%`=gMY59lFSl*EybXf z0K(9@P%;P8<ju<Y_q8ZHD?1C;=U2q{D5tE%`r(unc4R)XvN$`-%k=J|oXp{HwE1MM zXs4{fD(!r!smS%}GO+*q4}#A9=Yq#)^(DoS0K4klEgQ02B?C)b?o3aEe6m-ud}*2! z?@k$dN-ol!^$iE|<=$zSS+ULXIp1M~=|<VZSLD5}?<TpcSF4OZHB2rnMk$yr%bT&x zmFOD|EYquDbvVTr@>;zSNO@7Qw4RdTPFd{?ycVx&(O2*G>Z@gGD}|Q>4M<*6JV&0S zktuGK-s5tRzW<1!UsPramae>Qnb~sTF&U;8tTQBZGNi=nQ}jvrN3RHH^iRHVm7c37 z$dyZvJDa>+WkH+ARp&wspV#ch6uG6-u_JoVEj5+ZUfD^n@*ezaikww&Ah|x>klYdJ zZGT60p}R>|=bn&v`t-Ji2=~PqNG7YjwT8hF$Rn_t??s+Bs`-N>M+|*p`wa0sc|_mQ zcW{aRv+Ue_M7odbd4}FmSoY*h-Tu-6+54FOMN*Em+F_e*|FhfMB)x~_{V-#vZgO@3 z(n62H9$i;IQ8tFRZ7mv#AssRZ=?UK5o1xH9xGiN!5mkuo=s>-|bk`f7lE2io$~U#D zHG5=An;h+vIT)atMkt6Zx$TI&(FX_AH|pD$>qtf2aC%Ge-CJ8Idki($Mc&IYMekOB zeSMbW`WZ5`dC`#Z=@+}@Dj&wSCqnAih*<X_Q0Y~9`a@7-NZ!LT3Vo;k_dP6UqJ^Dk zK}MrEkITDibl;k+!ki-6xd3VI>Aat_C&&)12rTHh-c!zPmN$WX&7e}mkb#X3d0DaE z)FfkaL9e^#%W=(m3^-C+<pko83CItwsgenHS>!x|3HV#d`ZPp~Vp&;*L`;@CWoKm2 z`(>8`d3lw5+M>6$y5&BtSnlyTUGjC!iNKD0T|Vw}Vhz1c_)g4{zrtY2Ri!88dm19- zMqh#a9N)nzSNN*D*KL9w%93_Wbk!kD%6NUhzAP!#E%Wr_pUD-XQT~O+ZG|Y1r|Jqm zlgmW0JPpJ$QLr>c-U~sc`hICg>Y>+Qeav#~K_q^%K}I%j-uZA|X0{<QI!}h}mt&e+ zu9uT&h>l~GZIt5;iQ+Svb{rF`o1BXrD85;D$yu$kOS6oFW}nsRRjV@_k*L4|tMzET z&yjlha=G4k*o9q7gi}WlgLhy>DbZV2xn##y*FQ+pu-lP&PMK9D^O{}5u!nH1(Ce|b zL=?a0+M4D5#p8YZ=A$xnzy1!CMS{ImTAE#>J@PSMu{@$3rzFn}C)qFO=RSeFde9mf z)|_3JH%WT;>yCQevDE|L-Xn75?RBmClbEhw$f#Ci68fZkIrA`5qQ(>XddjH5@;QTk ztZ0&aeQ80H?#M@caL#tit~xoV;h6k=X))dl<es_$c~sN8HD&9kv6lM4aj34qCFj~@ zj8o1nCMV%*mz>iqW1X~%iZ340XY;n4%*v8}lOM<KblaW!lzmS<C2g&8rc>IgXb&~9 zVE4xCer|*W*raqDrPwpF3kP4()FQ7jIE0R++oQYm`UctK@XrIM9?jDm3ZL}ulGXx_ zrH!)2PM%nUE$oKd@{kln==-x_&fFrm8>_f0Z`5G7d<r&u1K#$q&q?o)IeK!_s+ymV zxEdzGta|qvS9ZC}?LfYHrhfHj$qo;O?gVzAvITB~#P^i$kSmeU!(-s4t-Euu+@IVj zch?=0FN?!+L={}PN)FI-PaLR5Sa}@24dq=~c}@B|a&q$-xolB$+bpaB*@g3G6lM=D z`^+QXH5AL%rMY;w%k4{xX}97<gVJ|EPjwefI*ENHV%pnFs^s0WN?Hn#d$(>neSqjr z%Wy+)u~j~>RPVNFtHf`G<;p3|P4zOo(a<Lh5#C+o){nT09D23fxOBh#6a%Mc%LrfT z#WfWr<>`G(uu00vtVZ6BP#saAdy&OvVpCgHY)Fc3$#TIBadx2}XgIAe*T<C&su-f5 z>6Z<U0t%j&?Dpy#PkUSRtGq8AI00J~4NM33!h!+t9_(Rs7bcTF79;AecQ+yL)i=Ad zyvtpcF4>`2U;g9)eUkf{!8!e!z=I?LNxEEBXGjuq7d-9_#O;T9!0htfB?YDE#<r|H zecU!Z9~;om<Y{rNso{+LR)Y!TdrS4h@>XB7TrZmut_}ERMH%BWBt<rCl}DE%Dc_!y z<326_6ng8KiFxw5rFvsglU!}szaq0iZzzIBq#u5|Zm93H+_O}#IxRD>i})!i)q{ZS z8Zu{ydz-ZEf9dVFF{6;hHp{mSr{rXW-Xw$t`C1(eTQ4*9*3<F<AH6<=mQEw1(F;yA zypW1qtW*}Xp4h8jeMUYP@08D%+U1`3+|n6?ml=|yvMW}*>M=@{t}Tuthdfwj=r80? zaH{?BZPRc*A{U&Z^|soO9);ZSpGk&+QHEYIGd$T99@p-Dis@QInvl=TYQ~!SFopWf zan16RS%zK$-qHN(*3<HMJc8IwrG$xSmVd@K%dl3t;4os1#{<FW{y&pstzm$W*OxY9 z{gt1BWDxaEG5r?r^vD}Zi}M-`j*f_U#q#xd%!G}z5FdYEdQAQtUnT#5B!P@|LT<Jp zEpqImdoCF)^Y-r<*f_Y*<<`5e#$sj9Y-zz+&irFX<m|(zX|Y&$L{>LeBYJmxGP5ze zh*tk@$Ff@B4D<J|mF2oqb~uiG=vsM=UW{Dcd+ENc7I;7ZlXD7s^efIb^p6}ngBttB ziaexql`JimJ)E+zQFbmKTGk{7Aiy+c_d~FsB$JCN$N$Rg^XeXbm|K3i0Nzq6d-}2* zugFPNdGgkfHUtA%10y23e7V3^{TX&5Rr1#bRr<ZU!;l#*OODBAbF+-9`c-#f`-QDu z^@(K@9ox3bgIc5fdVy}IlPa4}exw~UBuDF0bqXev<TgWNll)df@?A)bwwVj`+8Nv3 zMNLNztZ0!>)E&eA!xih%ZSsc2jri>mhezHh4j*Xo>dUZtI6O^WLu$tZSdCyFiC^wJ zuIIbtZHqDM>rHJfN9gp@DYpwG3`i)B%j*`k$-U+_cyhD662X|pvU#bVixI$?8gh*2 zVm%f=f7mAyvg-|Lov<CQH)M1oqHbQwAFnqZmme(B?Hqo+Eo;2;8AF?)Pt?0QMh^WM z17jaYk1$=|TY@dAzG*jhLJp6f(yzf&@48FgAzS6q#m9frx7In_IU_L->RpA|dG#{P zFiyzqV+Kc5QN8SD7${@~M)!b@AhN9q0r%S_@Fe+*As4uxX69_emhJGb@TmrOgCQ+i z$114rr;U}vFenDmdH)ym_l^FNo+e+3Y&?>kxur=yRD+R~KiBEGN4NtATAn>|1a{<n ztr$6__n<@n;;R$-=kl#Oy%;BUP0O;}EjX`0EIM%l!O-*hD(o5FSfV$Q06C=f1e#Ng z*UL?HIL63pz(Lhvub!fxMyUBfoRVKHM5Kmu{JOAt>pL^`FOpm2;ATpS^|&J#$>nM! zn_4iGCy-nmtJx~=m;2>G15%2~&2rfiy<2t5RzsiYq!Nz|JuWTCR48XH^~k4}wt4BQ zq-7fhfev@DQMyZB*1A>SjrGy}R;m2cbWDC<=aa2IEQ!bETT9#C#!=Zx?UejY!#E;0 z@gUX5;J{B>5#Mq=Iwe!cG7&{XeH(V1mb)U3&8C&0q~yvbk9^Im+w0}#Iyl=TnBZop zhpZs?h}>j2j09)3!Qd2IH)Q1*>~WMd<Q|X@5Xl-7vbMHG&GKt`_~!<BbctTP$uKl} zW@(Y^-nz+<6FqZnkvwE<m2WL>mUm+NbxYq%ubFpRJ|T2_cIHc`WiQ0mf8eZ)$DxgU zP8^q~mNd(0<QPv&dcEeb{M>LV5oeaZA?{_a`Ycz@JqAZ~gFZHIbyMj^Y**ZHv@C%m zNBuLIXmE*7HyBc*rKb_+N^-TY`Bf~%LmO_*FPiU`i>h)8-7Z&+yJWVZe{`N6OEQq( zA(yZiG6kI3>cjxG?30J)x2i~W+Hi4{d;zZWUty`S4smH4!kK<LzZ$VDN4{>*bH5zu z9Q;BKPOfl%d&|)lLsFD<??12xX?Y{U#f?6U0ZAJB(uS-S+FG<PJF;463rhdC$uE{1 z4~qAKSRej;RttXBMhJCpWI$^F)O6f4DXgijw)Grr8&@!PtcH6qY3**XRL@%EsVGUB za@p7!my{KH`)TbEV-<$#===Mb=JIh9M@^YHW5m>nqb4wB+yt$nw#HUbV#5#4RCpI^ z)eFmO3K!V0jjZr$<rOy19M4=&d5x{4qPE<v)#A=iMYYFm!_66dJqqsg)XXZJV=G46 zg~hm)qs^UFJ-4u?xQs~f?IrHo$~m)&3u`<!d}*F{R#9z@N1I(+eyy#r1k^TnMR6@l z_qPK1*dODTlG}zhXVom!yq@A(Z}qHs9zVk7^^|zLcqq%G6++eGGH*qB1?&?f_t!!} zThXlYLhr&r6<RH?m|qUCxWYZFy!79`TrzU_#NoDTPjStxigGQe)2wP+c}0y415oZR zoKu1OT(#vzWCdF#l$f<Zn_F95!z842@ti`hCs4!pzr42U+UiQ&clEf*P}S%!%R37R zMQnvd72X;@5y3FPtZG=0Zgctnz6-?z@F?_);dK3(A12)Y&1D<(I|H4!qIAVmCUi~T zEkf|QB@g(2E>L$a?f*&mCFr&UH`*`yUzP{`bdTblp3yn}zvLtNXZ*C?x~TT(;Vk;x z)sG|aEm0^1xXwhO>vKyS@W1=<bbal}|E4*Y=YIn?K-R8&d^b=Yo;^cp!u2c^x<0qu z1>9UezBg#v&O>u9&;Q>rwci&{i9L<-4IaVRhjJxu_0t2<+x$i1867J1c=+T5=#Joa zcqB?aN+oFNsraKP-=b`;)3g^+0uLW%;bFsR^|<j4+yg%RdfQTbf&gV#4Za@~<wle| z&?MmjzN^b27Y_s8juPp`b2%tWP(tyr<Vlo!QRu<R3Y3it@ZlGfr%_%-`2giVD1Z11 zJp)M3KOOLwM#!hq3vJwny086Z;UYY{hC)x|{fQ!>+ZoW*RX_(k%(-qZp1Z~SE|jNH z4x;>k5_rZhAJ<fF0Nutp|GN_Frwzxu8Rd8I{lER;*%|t_6}ri<g`i~nuO;3uL!mz- z3ZC=j3mtEzbp8L~4_(&KeeFg+&s}(LMcIS$3d$!aHk7|m!k|bW6igY-g?CbaJxT$t z58}N9@BiR^Dc&6@Gf}QXp>H``kMbbOHz@R#Sm`JeQJx3<7RuKszoRSw?mm=XQ0SX> zXaUak)QrbcfG9tK*L5_(e^}B7m(|o%y3*3-&!3+<KO?omTbc%rwEj+KR$6)CTu*gn zAr`&=CK`~Qo=z!2d39Pq+JC?QH`{q+C&7H<E}uAjV*cg$LV|IZO}zZlQOFPc7uu+C z6Z0qLBX8h~sapQXD@To<px*GR@iM9<B5A0x&G*cilTuRQor{$`X;%5X!a1}2IYU2f z)|@$>QX~yn6VWY71JvT(ZfVD|-)<cb@CUODTY2r=A|xC5q<DL}z{4Z~d9%vfWgTpP zTZPwF12UUhuM26x=S8`Y*Lg1|LjF`j3nU6QEaJtpN@k%ekO;e-#f>ZhkHb`Wk*FXJ zaN0y<mEMYCPc;p+?Oe5jIz#{3a^!m8gzP}h0Kf3qQf!rTJcZRBWF^Qq3T;KTr7%w= z@&vTOnUP-!rPR5mgk7p?J=G+(#Dn}1nF(QLc|FzC0m=uFoK%uLQg#$Qi=!16mebI| z%H^fha7_(qUx8GMbt9mxu-aDSDXpccrct-&LQSYUx6pfSZ6){noIwTMxfVOeKeY1> zNIM7Ow){R5bb+Mme%xGb5%NnLK5&SKvX%b+q>E~UmOqbukdDnGt8*%6OTq-|XA35D zMIKu)r*o6jsJst3Wg)aLqf9O^Bl!yU{%?8ZP_ey4e~!rV{*{jPN2$=BG}s)nPRh;E zBnHsm#Mw<(Ymw;t8T<+Q3=MuJ?*_!4cru#*&yM%u5&HFpk>RG{%ca)Uk59*YMxbs4 z>Q>5;%S|ijBZ~Zo=kDo4aEcf80en4h6w6s=JNz!-dYuP<6u2(u!P8<8aUOi+1@N{D z;M0L8-Okl#`~~PKmY=WP$_wD@FMwZj0sLm*&!^Ac3(z0B0RAZO9naG*dXnyZcpLEN zYj+s%=j-qI3*cv70AG0ld_C~zYj^Vn=yzQJzxM+8Ll?jw1wQV4_Q6_vzW&lT;GK`2 z*5;`5$QgeDeB}l3Yc7D_1^oHu%h3zqBasLp%?$c;V7{&a{+o9A(aVjaS3m~Yp8o3b z0O$GoO}~%Q1NA&Va{ryj^j$ga=W8Hl90mTYxX><U*pSE-1!Q6F2XqMPi251lsSoIQ z0`<}D>I3*lB!%b0rvp!V{ny;S0DUF!!B~TM7m&XOcuPP|I~!~UzIy=QE|%@R0R180 z+uJzM@1ww%x05qsxsiq@7;EWgHTJcyUtwG+FIjG~0Y`tfQ0)IO-vj*|z1)<)QjS`I zArH!+pNq(b&j)Bm_+<pft=@`{uz@~MPqE$xnEsBUu0uQdi1nAOFrpRI1^RFz9D6yy zLH={rgPG`f(2p+-HwF0U*8;Hh3-YmE5FMyLih9cT19Ahl35<;mpR2I7s}JCZ0Uz{< zc4IaZ_?`j!_G1iuP(O@iz%F}%&kN84-+m2@#Ns)ueccKPm;To#<5B-<JG-G<Wc8rU z=u6-Gwy$4d%v&k{?K^!1yRm)!IsEj!=2P0Wf9`yu?<l9eM!<G(nX}rj?{v29hp&KF zLH|JC=_|p<wv#^+J`t$1AsAw-9F$FUfibH`U1__zbA64zk-NRz_P#a@4K%jnh0R8< zFph%N)Hvf!qi@0fsyz)8jADPZ5dr?_`>Ahg*LNjnG|LI-NnauTc)K}q?)cDGEboM@ zfc?&`r|&>+Z(k^idH3)5Rod{~8&Ld0{Pfkf&$QDK^D38y2yFaE-{HEVoqlTGVH8mt z9ET*FBLEJx(cVATpsxJ?q3uoJ>#VB%?^7D|2oZvSfas+N$UKw+0!~fS&<5J{BqvQ; zDI{rfN@FvT0q6y3E66C=h+I)oLBI(I5R~B}7WF#)ugGvk5QkPA(CdIA*8$Y``&(=8 z=h^2pE${t*-uL-r<+t`)Yp*@;XFvNHPU62g%qz3ZJOAkLHz#_^*TT52s%w38^!d~# zsq0ve`o`y9l04MblfJ@vLA9QGx}+|~*S9e%X*okbjCy^*@`;!S#%!(s^_*~il*F%{ zL-d8gCCst0j#|Pvh;xNLz(#k;^ii&lsZoVn$?d~vi9F_0-^bcB=2LUUr87@eQc<t3 zlwFnN6TM|6wxz!FwLJP|&Pv---|@O9=}Wa^**;kn<C1o59qGeS?MdEh_4;np4vhU+ zN3jlP;nNNV>}4=fPkg$2^?1_ffi`lUi8khg62|iD>md~uOHm)&A(mg?3aG?1Xy=yX z9At0yr}<~Bk%g+hs#op59^<PHrm@j0@ja<c(&uA7^dkF;XhS~IxlONpKk=%(46&YK z8TBgTgE619VQoF@-M_)8Cyy4N#+*fZI`obm+kaUd5r3;OsTbmUUc^Q(vYi)ge9UBi zVqW$7S=Bsx(T<BWE@u%>hh7r<3>e#My1eM+u3Mr_O*)+Z>`1RImA2~n7^rHU7}g8Y zp9pPhy(;}OXnSi(m3!k$re8}c{&mpy)>L=P|BI}teu&Ms)>O05y#T$~x@i{uV0-JI zx#+jG{!ux4&~I-IvL5~R)*v^a-`*Nz6Z-9~K{lh`?iz%-ZhLExS?IU72AQk)+gO9F zK)0<mi1tpmw+6Wm{kGO1ccOc-HHbdf{$gv87qEG;HOMUH^X;uc=Az%;8l(sP_SPWl z(Qj`Jas&G9twA=Sf3Y>l&#=*l+<WPdah}M|Tbxg}w+5Mo{>9cH^RaocHOOk&Y-bIk zkHBtk4Wf_0Zf_0pP4wGagFKCXduxy)3%2d8K@LGb-CAQV^6AzZ%aCtxt)U-J-QHT` zI`rFGYut%$dut8-`04i68h=8+y|u<3%*)$bYaEAO7YEy0Yb?WNdut8-lI`}^8rLcQ zHr5(<D*XY!#}oT=?K<LdY+h`w@d7q4w$_-%nsi%hjW?p(-dbY?`t7YXE<nG%wZ`@6 zUu><h37Z#NYy1qG7h7u-i?qjf)*6SPf3da3B5by|)}Yl2oQ?`R6ee`ZTu?WK*U&2* zZu}%3@?$618HJMIP-DviSt8|sc4)J7MxkABh_P(~H*ANqL#r7sQY>|$RyImq*k^p6 zx@?;u(h)Qp+bLLRY*}!+O9k2yn^7nWdW`K9$ZL{QIc+piyP((DE`b|nIUPlGHl%tI zjyqozo^O1f)AfWmm~5g>c#-o(;irtRwtcV3rtIZ!>1Pz$_;1I0{s(oP(A8P4ZbNiC zq+AK_aK0$~FXQu+Wcz^0rVOR0f%tF7X8v!1<VyII^F`tF#^<g!6Mn{IQ-;#lxC-hz zp{uhpVanrHo|15;^F`q<#^)(D5Z=x8b;8}9FAD#~_}q3D;r(4-Cp^IUqVOo=bK7GG z&vt#CaE|ju;e6wB+Y;e6*VhTl&KHGe8lT(t5bkw-ov_dOqEK53I}~!;QNm}tzD_vq zd{KCz@wx4K!W&#)C%nk{qVQ_tbK8xCr(9nryvF&W@WaOEwl@&I(e-u0o18BS?=(KQ z-9-2S*VhTZ>U>f7pz*owLxdl8eVy=8=ZnH08=u>5CcMS<b;75dFAASCKDVU;3o{_~ zQsGSJi^4sP&uwQB-rx0g!ULQy3Xd~Bx1CG4(e-u0Cg+R7R^xM9-NI>eeVwrEd{KC& z@wsge;a=C*3HzKc3Wtr)ZFQ^XY}eNb$DQZNX8MEix$Szw8(d!}yvTVTNoKw<KDWJr z@Qtpo6W-)}QTSQob6edey5044!aJNV3hy^Qx7|ee0oT_Fzv_HZ_@ME*t!^hh?D{(4 zqs|wFKQ=zM-As6k>+6J1IbRh1+4ySP-<oWyAe26t-sLK&>vDBA=M`pR4OwpjXF6XL z?qYnNQUl@LTwf>L-T9*MVB>S!V+hZ7eVuTQ^F?8!@wsh@aGUGvgk|T8!d~NZ+fl-2 zyS`31?mX|P&>M`;Z8s90a($if8t03`8;#FxZzFuW>+6JfIA0Y0!1!w02TaCkB<Rz* zAJG<5a~c7ka-IjpxfjHGKb-(KBm0BtrwpY}T<MnFZWd*tPPn`CMd7=R&vPZ)gG@GM zD1D8qpso|TIy)n2(`3qGPt*yoalR<jMM0Wr+3Lb)hr*QMJ@70u1e;7eSrjT7V$Obc z+==KuXhxy)Z$Q0iJNE-lcXj~qIGr)hdPEx_^-iJoui=ZrtBudguiK4NuCEj7Qbo4H z&lz8BdyC1Y3PS0VC5P@%-fn8v6yP1s7lpctNh?FPn@l!k_;q-OpP<%sGqNpaO2+`7 za=s|sokf4@R<?gIJsktw2|YO!)SAvhw!cN6s1qLGd{Oug<MV>c_9T-{87_gRjRc)0 zo-7I#EonOKh)tQA&H-NId{Ov&<MR|``$>~c8QuqvE5TPyJXsVfT9Sh9&;G&G6LrF8 zoi7@4osd>d1L56F#-IRqcfKfmt?_wojv+kT^>xBI&KHFXjn8dMgxg$SCoDT(6s|Nr zw;d&Xw(IMJlg<}~R~lb!yWV6|1)=mwXWK|{%G6XYc%Ab_;RlS*UEM(VM%UK~Z*smU zyx;iTR+nH8xV}#KP3MckZyTT6K1BFo*VhRjb-pP4vGKX>X2M%sUnhLZ`J%A3Slv`F zBdp6W#(W&o+C9}rFg2uw`js9HQ{f)$oTe=;+X0C2Bv2mcGlKJ7DtOYRKLP&g?B9Wz zxFVWBUX!jSr~1Jm=0?E}jqOzQ=UgiIn@i>CWfr|%;GU|A;@N8xgxvR}C6!#$r0_@3 zj6#<{si~mC=UuF%+&{NE{J0QNuv}Ijk|&n-u<cOxgMP)Xxqd~|Uxofl5OGF@UxSjB zf%d8Qhtv|n1Dr1kPv+`2Z3)>P4G~@N0b|QI1F}qNSB58<wq0<8v0b@gRyY~9nzl_4 z63ogbwY_*i<q2OMG9+}{saQ<gaBs$jiY^L+uPmvH^7x}M(v`?WNquw>{E&${m0zVq zzda%(m~`Q{1}zoTb9|Pc$)4z2oBNHBDpuI!d{KCQeRajkwhba5f-e|bz6W^TS-rWi z_s&+wdXeFHXZ0?_d}sCg!VS*e3@Cx5J>-AFJhcnHXl$qazu>I=?_<$B<^Kd{<-gfk z`M=Rw`9Hw?cM1+Qwq4+<W+OwXo^Afy1Tt2~6~4(LwFyF9WNofkdci^iMi`<MV>HQ= zc=TpJ6z>d=R}==nS^Ezoy9;9Qso;NiRt0~Rm8(kyf4#FR_$kh+;2(81FL>9{A>%lU z>8oNxURRu$mn$2G>vH{IlK;UN{}%M3q%S5>Rwq$b$0&)uC(-vr{pZN{Pa$f3weVL~ zj#5<Xk(~{YdZ_Rs=ZnHejn^dWhitDl*_7cY;pt$4&ly`1h%{jcziHyK;6Y<c0+B3) z51Y6ws7+3HzP3Qhn(!&-i^AW(++D=1$@UqDiWBsqW|*!5^xb~gaX^uh!K*kkP1G*v zH?~W0&UQABlQnQ2r%iD}Hipw|NUr{w=(8G((b3l>dNSgN^zZZdMd2;RPc{gj2y)?% zf?Vi%n99<4GqN+Gqz~;%@EQ}f$<rgw#zc=Ns8Z7;qi+X8qN7Pd*<`6FwEkeWtj@q^ zoi7T{;3+FLYxFDIosf|c!Rf|!31pdM@9!8cH&J$ppeMb0A+^15(D|b93gh#1WcxNK z@hH(c6SZFgC`NJtq}!!akemyzalR;g!uZ^|Y(EU)T=1B&+3fZ)g5Nh$-a`m(fvnep zPdQ%{?#pvvX$|SVtUmLNbHU!IlL`A-MEjU1OHU7~?Qc#vQG*9KUli(LwbZ%7jjpc~ zE_A*qY&SkHrEE`ul1l0!*lT9A09bLpDBNIt9$mJQQ;w)kJZ(fXWihC3@EYff!h4O+ zJ#8ZVfa~joUv<7HEH+dZP`2NJNLBEtv1P&IE*1RKr3S>ub_O6<NlkxOMkdOxg1?uE zvJDd5CEpEF%L;dQz9`fk^0e}0dk{o=f>vWY1+qjM2g$1m9&V!cBY~rhEeo1l+6*jk zslcOWd3r6PlU>^aEOs_Jm!?Lf_-&91AuKyz6dwJG>O#o2-}F<4%Xd@Oy9B30Dz8w{ zl5^nOh%pH<(+aLKwk){SrT+sgGgqC8{zGSDo_h(dGEqq|Y;0L@wM(O+9y*w9Ii9E! z&T+md?ApD$B(hx!QSpK=7~5IEstA$OU4c2y3QjV%B#^7*q_Kdgk6HBc&w!bxEi1Yk zmSgsmMsOZQ*CCQ6mwdAUPp>U%--Gt!P|`X6Ba6@;t@J2GFQoPp_Bme^_U}<$YT1rK zcoYQnVCw38Q&)LE&qQs45My;3<IBi(dK11PBq(&-sc34?d>m!^sXAfsm7VGyAbtb# zr03j$Xr_tE(amcJ9&e)d(|}fIqgKz2oDHcmgyYT^h2JzjpIKykiOHr6KMYU13O;J$ z$)ZrvlIBig)hYG|O<fj*SoL|VEY}aAei%}|gpWF36rTIa>PC|7UmzMua3%K$nVH@V z{L0zi0(C^fKybLR<)Z<)N@lTrFg)1elmw?4+j%MQE@$QR8e>a>>s%^NCzz+sSg$vu z`J8F9o{_joBD{%sz14B`EY1c<WfxxLd{Ou<<MTF=?UfKk6MWv-@)rPECPm8)+hzD! z({>6xPDydT;ZlJ|FU9ic`Jaa&YY*^I=ZnHu?^V+t$hMe%%5Wxnaw6C<m<soHv0ytM z>g4J75T`@IbLM!m-q1Xhb^wCodf{FsZWjc{*^tqrO8Y}9hVTIAi$eX>YkC5b?TIFv zGCUogVhDOnJXsWuyI3$8#KQAkEZC0YIwi2kOxp#)alO!fdN#kIx*pL6$a)2Mk@H32 zFO5%n1>tKTdWGO|W6M7To^m!etDJtoMD2nnjO~=+&z#-buuX;`!O>K$Sen*^wHeZ5 zUVkt>i(c?q=ZnHO?p<B)vV8#}^Mco+rrHk#4s-ShK#`K(tvD|+Q8wIiQFeZiXeX?c zOJQxwdf-gI4yY;?HaTAue#iK{ie=jckxRkN#&+Hc$TFG#WO$B=+CL0@-Pu@i(w=3a zwp^QKSX%uAgEA~U&n(NbywO>K5>>~|6VIkmMF^HLMLjY1u*G0z1s`?3DEuOiU#CMr zw$DNoQt(dHoNO)!-s`O3dSgoh#ZS&givBx`-Y$5DX*(6&4Lj33{f`;82|CQMd;uV1 zPWE|{WhMDJm!{EALZoUE%0$HwdXe&zYCAIbUlOc?=tqhF=(G+^aFlg(JxTZgqz)qd zs`EwRsry#foot^r{gmPBcv_imAvh9J{)CE_^p+%6onjwgvC4uFt3HpFHM3&rOB7T< zQ5f>VD$x&l`U^x&3fy#ZRJb36SP&8z6`tl|K^Y>qqr#0Y7U+u^5)13C5N!f|1Vdus zVJ;Sg9A!1RC$U8Ite8nXg4qVCa)o8*i^3gw#X~ig+KwV8x*(`~QuS(6w+n(g+e1=H z9=k1xy)2C_xw@0^Vu)TXxWvShMd8&v`-^xZpahbBUqai77zcGinUMQ>;o8@@T)5u& z$$FvZQFjadxG+y`&GqolxsNqFWBVzOx8_0c7lDuQ_8>e5qGklkosHUk2re>Fo8Sy* zqgH9Y17bkj3%rXYVU=s84jVHKJ4ICG1NKos*?>(wU1Xj*F9WW!=$*Nz&V94!oq6<Z zKG4&)yIGTSoe1vkd{KD6@p)H}?du>4EC}jsiM}7Q+e}@)6S&ven9oB9-fp5!Y5(2X zsMSNg4?s5D!LK@B6rMH9+BEBtvfW~O7Cqpq{gkCn!4Ra*D^#>}xMQgw@K8??cDrf4 z@M`0y>VzS+Y#nnjGPz^qN_~^Fuf_R6mOyp}*%QrPt`)q-*ml8zkOrzy#QI8bd=LxY z>|#ME!)TsbyAoB3aw2TDl-mU%yV+=$hdy&w-U!_1>@HX;BK@W_L`u3)5=ZtjPPC&0 z&xX`A!g1$|!ml4-naY|*w(B5zh#;uv7Q!L*RS*>*ka}ie^1gLJZI5odzAe$;U8O%| ze<e9p5I$r4WYO@oF5dy%!}!UfaNi&o)@Jt>GVum{&`mxJ+-z)F@E4ap59~%n4CHI2 zvmXY!yyT<84?$Fz;Fcg3e$vIUa5sg-XvC6IlUn?JV8~cDLEo3#b|khPiET&p`yp)i zwCuLO4)F4{E7t8UjkQCqs}QfXLbN{uJnifsfqgBr?aP66&b|xqB4i7_FO$@_AjZN^ zfajc@NisWGQf>9XKF%HrcwXA_3}k~v*;D0G0jDP|cKVyiN~oCAlfs@}2uBicMG|kt zsd>B=NxT))#Oq1o^$g|ldXjiOF`lyiXNcx4VR|u?42}Oo@Ovi8S}tage*NinF(nIp z5<?Zu0@43N2p)zsxP*^7Uld+-kkwB%xMcfFh`}WY>MUicx0t$J5Y&s(lzwCCHo*p* za~{<%<6h}(YWPnqG{}Ut*?1P&s}8iRtq}G>)QO<abG$-0Y+lQP;2~>_FJbzK#VQHD zZ*1FIEHAW3S&@op_Hx5xfd$TX0jr#yCeAr%F5jkh9tkY9MA{Ws#b;Q=qN}(nQc@gP z6=9tjmSumrvuT|5ChC;-3TLBsBf%+1?JK;-`J(WZhg7$(Y;S>RU%~9xSw@Zru0Gh< z_W+8N^gzYA-Qu(hj<q<Qit}k_9|qoS(K{9WZ_dW-{Tp%Sm|>UVY&30Go=#UZ)C({B zTYkBk2M=(*DBNItzD$tq9EfrVI*cuM0xMlAP^7dR1g9XYC-55Qi^6{#T2oKRK4p6D zw}OYE$Ccp7U@GM6juHzdgIIW}iv?E%v2e4C1y2RBP-)j>v)<HGb;1LUpR5<Ux2ZZ| z$Z~zGzKvuv#49GY#b4*P4bk=+*!}}zl8vH0FgqOLG_(Xb-Px7ExU=U1mpOYAu*KQm z173h^xu=(pW<aWE;Y{a?!kZ7Tu4maEYWgX|W$@I6px?xk{NxVb(IXmS!Fcc>l((ej z<m_K8)>NG^BsLn0m?TzIqGv!9R}d0w5LV1<rywNOkSA7E%8>JV;VI^<OHhJ1>Fgow zaj_tzv4^nR(&!R|H1^2T$VS9cEZ=GlN^`MXZjrK?OD}NU4ym4ncQ{`Z-g;zpJ<IkH zi18u_>i$?WQh(Rf?Sfs7kY(2^fP<V(4S!&UZGyiV+xa}Ovl(_O&TE}b<4B~*URayA zZxOp_QOb%fb<(KvEin~3*qp~6jNYXW`Bh$Tgvk1rfnIaewH9!nS-mDcM=!wgpAh~> z72`vY_-Xvhw@mRLEn%af-j%!EBGVk;9nKeppE$~#7E{}ABd0k8L7k;3S6?%AyCA3s zW9%;@dj}rryYB>UaW-ld<NF@@JT$UMPCq|Iv%y4VX>N8l#?||Lw?o#Yz&o5T3XeFt zrVPj)hA4v|sPi%)d(70?sZZWrl+8L4{SZ>$5Y{I0O=Q1<sOR4XbyDSjL{vw%l4(p% zeqj+hcS2Kd+LA!7sj*m8y_z^1Qc;C-oG%Kmon2j2*)D=8s^C4SlO8H<hiTgd*O)d- zN3S^EX#OVZgts_f6t109osMkpHvN?0{qPi5u*t+cJq(^pG{l1GJZw1D>a$K5^!2gS zUnlwxAhIv`v$36mF|3n9{T)%!MD2oojcpU`?^3}bE{)FRV$$+fj-vGhH$bXo;YH3D zg=d^lU3%GG4^hj4pw2p!)VG+rUGTc&WZC&=;2+M;IGzuILiBdQk;Zm511p?;EeW<l zNiWFLY)jJ2Mp{&>drI$#b{XK4d7`LPJ*h5%l9O0ihG-{2ZCO8#vrk%KN`k*z3Cg=- zxtm2Q2^x(p%a!6Mt<#HWm1*180He;10c)MT5V*+M%Ydt#eGl+HXFmem>TGN)mFnA; zk*-I8e>$r|HJM>o8{lOs3A`$^`LBm8_CjiEVW0Cw;pg5|-PE%E#_J`UGTe^7PIf_` zbz{Z<g~u-nM@};T4Z<sopDGGNyoOjr*$yG6Ro)5Q=j{E#5@|GCjp44QEw2RDI4k$} zIvWk&hT))zI;H)0XXWt)XQScsCuZ5~hzZhBI--6V=1Pj*f5gf3BM3HX--2ebYXu#~ zwk2_*p+w3Eu9tlmAGf^0`A5M}8`;ii61^4mDu^TnYm9A+PW365+pP&XwSjjyUle}J z_<UuqSFRs+eVy=8=ZnI>7@ynfHS8IXx{Pq9^F`qS#^<(rHG8(}>x6ThFAAIAVuj33 zud;1~D2?FL#&&%cxX;=90Yyq$Tyd^6ZMzI*k(@T)P4GP~x(Sd4+L^f6(cF{-2N>HP zYfUeUw?QhMu<U$M_@l<^9Lx3!h#U)^Hn#J>0a+#!mJHuv+IGQ@jV;UYvvXxwehApf z;*?JSx}CiQxYF4)dn+t@o8VW*cFEKJ=BcY47<Behz&&+s#LLa*sp}EIvzLt<W$y_{ z16x>I&MnB41l@DdZa7tL#s2_QcEu~95N}Z-93$w*AoTshbD?B-ByLM9PzAT8E%3o@ zDRG+(D^=ewA?od}5DoTlGN4$nsxy@s_D(=0hAo6culsL-)WX82oi7ScnrFGq`lM|C z1d(gOL8$R`Ffhkifg&Zvl3{(dNM8|Xgp{PP$@!x2ug%p-%C-l>qadiW8As|fOx-RB z>a1?0?lN_o;3;FvzXYzEZ+ZV7ph!uDD9#rlHNWtO#!nW7iYd8JQEAGe@DIlGDo=1H zd92_zY<~tZ02Iwr>x|kBxu+FB%VTGIK-ZxERFkDND!c<?)as+`Ap@g3k^dvT+D3c9 z{|Njq!B8QiF}d4uCrTRVD|r0AdClg^?_v?^YF9L`Fm3rLKp%~#u2g$UKB+ck^ylWe zOU3-58Fne3=bK@d;38v70*~GmGtVrhyk7~y3a&P`Bv6Tv#sVcXo<2A+1G3o{oauZ~ zc!lwKL&$cP$)*gqqpy=)&}S#?Bz{r)3m~#0xDcYv8-$9M<nRE3$C)VWmHQI>R}+=< z2-$#?Yek}oP5|EK>;$mZS;e{7+1RZ5uErFkY7k!Id{Ow*1(vt0Kg#xVrk^r=8G8Dr zpgx!i+g&VJ9>l_1T`c%~5DOo0vEXY#EPTktf=7c`s4OMtgCs|F%2~*9R`H3xDE-}* z`^g63PmG@`3PZexSSzx<AEG9I1pLO?9Z3A8mVuJW`9^0|wlkbn4j*$idb*jYMH7`3 zr_EW#`INJ&gH6t=+~09FFKgDiAIFo|{^V#Z3zvR*Q6@)Kls{Tt+XSIeMujJv-!?&L zlu_YI7Yjl)j|!i3u^?1UHV>#0<dCW4AmDIkj|b*C+X=`u1_QtvV@rbdF8v&!L@;<9 zPy(>A!t^1RKS1h`!e^Z?3jcUob%&JgOBX77Nf6Z83@G(ZrfwI!)!5E6fGb-RsZ&2B z@fm0J`x19KdoLhYNk5aP{VaN$;G?HnK28@t0MQJO03rR;)1t^+^S*GYc_<5%2~G9F ze|53ox*!(b=3>EJK`i{Giv{|93po*XS>DTnfgl!M;bMUbD{JAWT`W++B^G|s#R64= z#KI3+5z7J<Q)1ztT`br;G>q^ttGcq_*dP{qjb^=BHTo7S)>NG^)Lk}mrGLBYi$eXb z2MIR_e--4yJv^Tc!hImR!Ym+EO+&02nt<QB&+4W@b@MGqa^d5~Pc{huC&-06dU+d! zoyJcUg`plAgg*>&;a`oPY!L2f6;WycUgZ_hAl%Qzs-LAnESxZYswjLq$c0`p`THE| zNXK|?M}=>OD6|R`GCR66i8pvgMumGrjIcbflcPzajpnIOj^-)mdw?gCqKH&t&sG;+ zZldzFfVwLu^w?ElWA{u>^UC<?X4s`(|8-{tj~iPO%(K#TsWk6$R^9cp&Z>*v?X0?` z+KSVqKqV)8v4lut0byhLU}N!MV^NMG>PZ$oTg24l^hcgkb*2AJ_B>BrZ^pNV1xe<^ zAWL0I9qPqbMXGmGj+MmOV0kM20`P%WD&s|E!C(V$wX+`qZg%#Yz;~RDrAz!T!1uDP zlKKJ?O)EIPoC5lMQMwh@=ZMl5U_}^wgS@DUVZRTkzr&7@qB<?CvZVaLDodYq_I5y7 zL#o_8;_Pn$^=+gvv-(EY49J#b;7sR>!pn?LmSlvFgleL@C_9<R<EzZ7P2g;ozzy4u zhh1g{T`K^klJpHlp95(E7fzRnps!2x^=W~Ez9?*mII9Shn&z`S)ofvZG^*KVSrRNY zwwxPgbEv*oHU-(*4ZOzrqHq>nOcQm?iflg)QC|Y7xlMlax>SFU>DvWCe?yi20n@h$ z&RlFIIlq;T3Q?#nOIQ)nl(26BE^;<?|0wZPlfvn;*NF%8b;4fbC+mgZ4szk+K`uO- zYdP5q$Cp}h>xI`EKUF8ZKgfmO3v%IJ)Hc;qFFeTjsXE~iK`#7OkPDv=a^a3vwNrJ% zP>%Xo&Yx2@)dY2W=enb*gHVxoW)*n?H5V-IHVf4j=6A2VIycWB$T<-6PeWMTw@yrj z>L%x-Le-8b#M}x=A-pXr#5@`lLe-na5Tk4;hVmJ5abKE?{IQ{=N#;gtV$OXeull*4 zpjtz9&rPa$Zc=@7V>O*ZK|bXL=@C8#(K7|!3nu%MBv-3=A+tS6@~c&2-+{<Vk8pRU zaQM~2h0ga2Cm_~ne*(VB+#r*K8AXe%15K_Lu7NNS{3M8lp<m4xhQh5*3O7IYA2P4* z<6UNQbyDW}>N265td8Zcr~IKn3ss<c>zb1bg?mG|Q;ObWCl~$<{_ieUf+3ZKiDzbT zKU8gJLJY%S5<}*&it(tkf-S~ov*h7<ZWblgyC`-@>Wglj`|mdYT>`ZXOAEz%6EvgH zHAJnw7ee~cP=QFVB`>N!*jRnAal~P(9BM!z-6f1G*fiBMEUB`RdV?iZ{#@q2ock~5 z{>!l$ScUAHInAa|&0!lL>L;eNgkYH3)@9m~jKVCJRIiHu9m`W^987pp_QEu%>YK8h zX8vD82S48Xx;(A0=%te}64B~k1nzQn7kaA*=__#HEm=AkR+AG_RgYI05&ZZeIX%Ms zm*qcHS)RSD>?-JT2sdl6zi_KOeUs>lr*y*c6O4jK4X{zmTUmog4M82}%~@90RFx;| zzZrO&<sLhLQ1&LgoZ_X7={zeVuLD8R*fv#csHA9^)U`%`gSqK^FYtu1?Qf-vYrxYk zucqi4^K>=A$;NhmKwz2g{5HK)T?d1OWd1a(WB&P()MnBFRRtCEU%m=>pR-Ewjpo0+ zI<Fk{{_mK7t0$#F<xEpgN=ki;QCCu0nwiBX6I|&E5)Lz2={b@MQ&UNWP)CuyS|iLm zc*u(pe0L<iI}+a=|HSvJ@QIHO;YkoP<6)tyBvzHZ+^bD+03@++sfpWF@Q|sFI3Q)B zOwI8Ob_h>~sByty5DPVM!?YEOfWNJZuq-LUvZM&hRD@7H%hcK-C(DwYEK8~<yCtNm z50jf*hZ#+tcf%v|QFII|znb7+<DvsrUOn?&YFbTYNMqjRG|XM<Ht(>SEeozOwxk~9 z9kwk0N2<>A0T_!&g}oQe<ECx@jlgR?Hb&^fE3FoB>BnQF{tJk1_ebD=oP8eH)k;_X z6rS!fr{xDTr!amzfuTolQ}n-D^fpD;Y(NiD^v_uIHbwu5v%eQu_OS9p)ez>$cC@R^ zuv4(c*plEKE)`tnQdRRgHiAlmD~#<FT<g;4zf4fZRD)Xl$IeErI@JD<R?Wf#oG%LB z$r+k%nys2;+YHeNf`=ehPtRN^=5dz`KHn4MV(x{o|1$7ol#6)^LjE+MWXw+?97?Cr z{Iv^${$1IkQTp>u-zNC|a*Kc2Ix#ceYJLv}iulIwW$VNo2+=Bn;P0|3f0yD&%W<LX zRqhy1@))tUKJNB-b;1y@K8aVC#LJe&%K!3iORp$A-}uP}q1So7!6Dl&PorKKGJom1 zLO4bcDnUy6-gSGy1dI1(7L&Qfb?f%aEw0NfROnq8_Y`haxEDls5$Km&B^D02SfC$s zm00)-7Yp>;tr81osWl4iM*{k(SBZt+aIrwY_$smRB@otvb!=HmEW89lEYR=9N-TT= zLM+fv%1SK!lZyrIXS!H;4urKpKO`$_;a6QO_?EFH!DdJn!v8UGyWj<5OM;zgCRqsg zfp9GdtvD*Y-o^SE+ozosg#IzAKJhdpC%*hBw{uQ_}W_<^&6&Bm4lzlIc1_>76$ z1utLeV&Q%enG$?9h=q5#Sn$0d7XH-5f<61($zlDR=pdzYe}xeSiQjz{@0mcxGind@ z31akAaCzVh;kbi7B}!)OWNZy4<6<yIk$xxZOl9@L1DsXQ`<AonVt;j3UFldG>*dpd zms$5ItIK@Jx=dN!<Y(3&%IX@|TKkpN?rH{R{eJ^K;_R1!KRLUz>e8yUB=D*%Z=iCn zuzD)1Cci~J;Xze&Hv}7N309T#B?$JdXR+pmBn{OC8*2-;5RO<g4C3q8#j3GDtp!y- zZQZ?^YEezm?vGJM^<LPok@#OM1KD{mN$S&SQlDOzCiQ@|T&Je<oy}{fTI4`ymCju@ zj5{@S_qV$5RNeoV)qSVx{^wTrovQoSS!Oyl6t8er&F~`|7@cYcujNivt$HMD9reUB zt(H3lUvyUeve_!U^HiXXZi($ZfT|Z(9a8fjY%Gl`CiJAdVyx-hQ&~Sw8d~wKcv4H! zGTpS`#omh7<qeuT4V95Q?NomV*;Ce(um5dElmk+~69^g6*i)DKf0d`L3#zWFY9o5m zUH@-Nr#5g;R!}v-|E6@e=e77etcC`8iWRDk_N4W>(#vQtp9M;4yVpX@A)g0yvVr|? zKqna3kI@TnwVqh|4jt_=>vN^203Z6L#dI|FJ8Vw}`kh?^=x4=|J_-0>Dg7K)KQNAT zkiMyT9QI&}eXMoA(s2}7m8fX6%FnH>O1}owNJ#glV45FcF9)u6_8LHa2x&K^?zfVc z27qB_56tF<QU|PNQfy<@Xl3zDubQNm&L^YSduEjnWg>|aX9LX^$$5Ej7h;4n<6ttG zXEX5sVf_Bc#&AhZeWVvQ<|G+Pnq+5NZI=)1;rTv@*6d*LYN~`)bg!$djgy(@6Y0$J ziEQR6;&BgeLwP;Lyp~G9a%T(S*af4Id><OkAxUSFb~kg=c3h^-*4s%bbk_JEKXc^6 zxUAVoB}qIgPUwh}*k56BvKER3qqbKo-@b;Mq#6BqALbwND0c$iboMvE@0?YN$5@J0 zK3{Ya{{L*|RilOJHgCAj{G`^Y&Z0?!5wBU%yK|=ovG?K5{QTCLpWmt`;ZT3~bGClc zPTVD>dg<21*4kYiS9q9P3a$-e;f*d9ghkb~C&kz>oJns;dtAPeA1z3)Cuuqw(T}Ld z!_BFO{8oW1UUbp&|Hn$@OWRzY=;TS~&705GBt9{{$U<ZRlj#MJ>O**`Pp+{#mN5?A z1xYP@Ka@;6$^4Xzm@*ToCe*}GzYQ}5*}WR@TIY+x=Zw#<I%WG`CYv&R9G=n%eqiFs zqVO3P3%28-PM(53yB<qYC?@)bSn5PypXm39`bY5jeM`Qiocz?;X8}=C?7{#+$ZqL@ zGo3FAcYd2yYcV>NZL8_046lM`^a<W;Vm^WaDq3<HPGZ$5_GJ*2B?z(V^H|x;oWv?B z)<%ofB?z$^@>ukDKNg}s-7HJ*1g>yahW9!96W|Zd#yAHO^ioZZ3YVF>T@X?l72e=t z!L1P8ZB%%#iv{v6vG6x87KB<Hjp@npMXpvJ<(p-({C?couLA#JY)K$@7|7ML&i)zj zO3s$h`emZsthxAx0l2&KMd4${=e<|9r<rWZ@B(<+OK_2iCyPQwOPVo>Rj1f%O<fj* zSoL|VtQnJ7Ma5cYvAP5yRzn^uYsMDT%gnMQ?Ub|c2kvn89^gS|W3_H3xCK&27Cz;C zQK;WrqGhs<EZdivY|5}6o-QePWiS;U?_$Ap9{yn|Ow|d4K5OJ8g`!e=g}LeygcKTt zN4r=MJY*w0@lY=hyP9dIAb8kAc&Lj7!9z9&ycC(2tR%~Q%(4{gOV*8$>Py({d{KD4 z@p*m8c7w^L4BrV)eF-i#@nli>J{JqN<DpKTf<Bw?k`#)GKC6vHU!Ul+vaZAD#g=?Y zIl0`~4*;TMzPo|ojgX2hyvg~ZaP1}4-9)yZgNQD8oHZ!};z{5)&i)=yq-2;V&fONL zU2ylXxm+mx62w6M9x!jh#li&;;$C26(#66F2yw$X>`$HRV&Q*6i2Kf?Pq9d)S1%Oq z1tC5jIAXnvg|i{Vrvo3m*v0klqys^Uc?dYe3%zhQ7%E_4Asi~q{Z^PZK~T?6)oX|3 zYN{Z-%=pQo@UaVAF8rhMlSQHXn2Ij!=guC*H$Liw$6C#n1(!qQvR-(<iv_B5iG}T? zL`M{a#OsBRxLELdZ-9E?rPcst!9Rmoc+iMB5nKq#xA0;Y3;qzq!ebfZBq?Y(+pUF@ z5Msfnf>`*Jiv_<8V&R%Gvld(cDM{f~E*89O+{MC!Abbl(f>^lG#e$oHSa^u_r?NnO zO1_0>yI62}5DV{hvEW4Sef7fAtoM}#>Va}1TnLd9!M_Eu@Y6099O8YoUU-D{)w1BK zAQs-_V!?;$#_}!Pf35iztcN5PUgToIwLvU=^}m|6U@atT;i2c7Snz&GV&Mxe7M$gs zv0iw@+s#_A5|Xv>D=rq?aG{HZ_dpb0@YNs|{=~(Ck1_n@L|C`ptOXi=5(~cq;Y9F% zf>`)H7YmNx;MT$=5Y~c?K`gx9#ez-maBJa?7n!vn4AuHVI5d)H+Q6AA3a>VPvO)NM zh$&8RR}c%o;bK7;L=D1L8#z-&;qAsxHV8GtG1dGA_^fy72H_X2OSiuOoaEiEL8yrj zYjw<3-t8KMn)nc_tDWvWra{<eJ*Hiq=bj)Ie%Zt&&4op;`37MFM0qq99zcCk^9@4H zhhZ+f+3T`F_$jN)_BT*}qg0%%w}89(blLDGFif2d$<*1PsdKeYqYYmI{~UNtqrH&) zgu1smF3gAZ$$Yp+G9T8bw%_*out9j6ch@H2y$}V<qfIu&Xg|a>v{LC5njo})De8Zk z>pNO<eMi*)cdlQimaX#{Z<%m8#642YiGT9kEEE3Ka?>UFM-U5V+TiID6d~$inegQ< z7R>W5yG&g+<a1e?k7vmX=^aMLQ}=|u6;PLiRd@WZvkwDLIIDB=Z=HP)lm7KK|92fo zK~yP3I|I1ES@lpA3#p29o3l>?huhTN^;2N6b=xjY%I|Pi6LB9zG)=x2IjhO{DC^5z z>dXDkYGQrBSxu&=Td(d?uWq)PvP+ZZv(9RwoM#=mOa1#BHr;jo5*V^6u1nL}Je$9| zG?iW9)&3qptw45S3&6%&hgD7gyI1;UOih2XS*lBeV&C-^?R4N?XEhu74Ak{YSj{|m z&`hJYg3V`_uKgJt2SZ3TUjFK=hKp7eNHr?n=j<l{4GyFlA8KsaLO7B>*R4Jm`a*Zq zt9>7{MlJn?2Hn}3uM|(E41{Q?#lk!@Y+D4J@2q-?)(G5U-I1u?5!%u?3ryRtI1|n) z&VM?qF7>ptGqdRJF?!PX?p0^AymjSy>-y6AIM-+8P0I6i;yh`cbX(<lhb3KBhQ9Bt zGW08Fzf5uuSdt}y7BQS9^3=;Qo13tg3+6o)OD<qlEU%gNf5N`RGSa>?@N#Eg0qo)I zTwsl}qripEE+a(^DV*)dXnCm(oRVO7W7~H=+m}Ze+ybkmkP-&8{DIw>-md`x`xM<+ za~kX?=%sg9Pi?;+(CHQFo9Kkz5!?SkcbiFHLwX{h*%@{>I+ypp_7~LMte>^70!Eyj z0KE5AwP2`Ot>yl1`7Ym(Wj3u&b#nD^Dmm7yI?Z<5C~1wj%p-aWv%+aMGn53HGZLpW zm?(-iS+vD;)VH^rj;6EF0WKt}*J)X`p;J`i{6#$_IsO4Nk=A5H*U3*OK3LVO&Tom+ zq)$IcobN*nOr1=<!Ah|l|C{=XOF+{3<$89xZ8|FJtn9N*)(C5uB}Z+-EY)H3GBeDQ ze9>tkFL2v3X4bdbBwG?_qGjGlGv7%=P_(4L7t&`n4NqU-#PA`Ep4g`0i?&PB!qa!p zxKO3OwD!{s4Xe8Hp_0{?@)Y{KE`qMG5uA4PIaK%Y5JeK`6p=Lca_V=;>Nu;JWDf7q z9R2`mPWe5;@40ERvg%1zRy`WKVFlHr^My_pikhsZdeq~>YO1FYju)*jU4xwmk@Fvr z1@DMuovf5RQVnIFIm*hw8t>go-%nO$oveHkDJylKIkH+*SKhie9KUs+zY5X&prj`y zEs*!V@<NP0WQJKHNyUyPCr4%}KN9_5q9<#9=x4$=K-%XJUgmsJ*m{}ObTPI4i0P*a z!fP&7o;wBq2GJ-*;TwsDSn!tML3o;r1+|VpinI5av$7n#!7R&)bgHv42fxBFBsKaV zmcdb0+Dp*i0?{x38+f_-EL{yuIV+z{<}(}q@5AuDrtOmJH<`9ehKrnyiT^9w4eln2 z9wGQdwMf6K-Ug{cg=Oc9!uu|-u29*Y4Ut{J5vZxSqk#`P`(fY{#+C$%pX?zi`mjZB z7aVTdvZ8;$Sw;6aS%1mnv?)%=(dn^3cOg?O+HysdeJPjqMA@H^DIx4eD`1F|HN?5- z?}Rw%MpM{z!4mc}u%5N-OxuV3k%(FP$@TTl=4I%Li4UL|HEq_2n+QGtsn&&Gb-pM( z;fm^7-;?lO5VamX>WAzb&5TV>u*vzNP(NU=uASNrn2aC&0|y}{3&A-io-7Klb+KSN z4`-U`RGl#Bv&vI$LJCFU7(}HALJAGSce_{+JTy#`$9j1fG1E>#@UVyQau*ANhdrW) zvygeoO0ryQmRWtt`bNlhN5Na1FADd*vbw%x`;_UY40l0KeF>&B{k5Cc33ql^^+LDJ zKSiCmEz12K=C(@^+-9|rnAXd5H#6-N1k<e8TTuTNqHics&udofS%~(BRBYh^&KHF* zc~^C@WqZ2m`AR<c35a3~K5yd5qEOKg$7)Yv)hX7k5F=g?V%6udI;V+MRIHGftOB}_ zEjLdk!9~Wl-2!~sS;1F~EeU?=Qo++M75vksGsv;$Iy<{JAll8!&s`;Ocjt@3FBzW? zAK9K{GCqqBjzCm^;9pHVSrmT6#ez=-vG5KT3#M~?l$r9wG`W5>R#K91Q3($~j4DA$ zxIy@S7Yjnd4Z?d|EC>l_wVODuKM8%GnRW_-<2{7exL6Pz?;-r6iv_`P))`-q>@B7) z$<oW7b;eDI9)N7h1OLPMqOfvRb!U|AOq22Zb>N8*l`fcP;>n^=(UQ)nSUZ_|s!n*k z@sssJk2X~oqcKC)$C^%3D=M`&L)5e&q}C9lA)Y2yy<)w=Vs#2atUdBrS=XO|y1^_< z%9a-_tE0caMD?KKh#snXUv3vJUevvGyi)2N8?THtjxX#T?jM91JFBoc*Pb#mRv9>J zcz(zH!hWyzIOWPjdu3vBY`C@DF*YzdSeYm+&sBIFo8LRpTX;{9EvQV)>m9EYHs#^+ zXr*sp)j*}cabjX@VCCdQrD<exc%tyT+@vMfwG8)H&MUn7HCgJ-gO#Dm@I=UPp+DD@ zCwj*wYSbUf)y>2GHOj|wWz*{3vEIH3&wcd0>%U~Fmc~Z<D&yk=!)LV&k57zE_Du|o z3`e_#xn0x9P@209iKd@=DOai@ek)g7=9{Lm*<rsd6O>>&i#OyJ^DC=*CkM02nb?-5 z`MgmYyzrSsKhig`cC<3T(l;23^<1vC+|A$G<fvI`=B6<?D>qm=JgUyt-#k1qFtIjG z=!V>=b!4JfRhz1xNYuSUmGRNuzN&ogzkikq%V+C!MsLlHsK#kcuE|Zv2Cjztdk05` zE3rQQGuJntM^_o{9rUuaS5`%v9bcQ}Wm`5HV{>z}@|uCs(O4_d&DvbQba>71$hpJK z!+j(DbiZivKyDFwby{VA%e9QM!GZCKR6FN@Jd;~B#$c{oHZ+(<(+BD`Z7>BeZS)R# z;WdMhufkKgc46=M>T>VkL}C8}LyU=$QJ-lFJweo78J`>q(@)_eLC9>;JT^8m)-=*z zDSRgvHcgI=G3Mv3ov8SH@WQk@pGOWq$P>j`%kb#rMAOLdMCH7R!g;wo_**nETxp#g zT3Hz@e0(cq)5zfD&~Q*c7SyMVRhX^tH$1VJJPsCieVr$^xH7c3cW`i|udpbWv{zho zT`rP?!owkKWi2xaQhl#D*d1wPPIOkN(~;rA5z`1;hF6X7vQ}2cQ!2eo$CX92ap9)J zTpXr>P|U(dj&iX#fo0(f$7Bvd1Jd6oCdUhp&2|NiY!mnH$7bQ!1q(Z#kVT$1xoQ>F z_r8-|VkrdKOWu&k3i{@tI*;dp*5|~rWUkAqM~YiCjZv;jq12Q{b7A-5#f9sqk++r$ zPfsH*=-}KEPJne5)<2!)<M9d@&U*#U2nAXvJM?Sj--rGV?eVfqTv)dgck`e(ak4)j zx_M_-!Qh9$k3b8d4?u5*njrny@*ALIq2r)eLq|h<LVH2~#Mdjp=fJ-~o1i~J@sPhU zNa?Kz>AgTW9y4Fg<EPLq(EU(6;;)7NU{`i?pm@w;)ux~2JQ6w@ipPoYO;G$*&M4PU zTk3Z$f3h3)RMr!qe%LY|QUB+lm)$c^tz92+^+S;QnaCrcc<i+&j~hTozmn@zXe0a$ zP&~x{9C}7F^zqPdC(U{lWrt2x1BOFC9n%Bd1>FPnLm!9YA$>Cx^_SM@^>Z&PIREJv zRnD3fV|n<sggc>BeidQ;bcKE`L%-NyKU4u9k9Whr4~jqdaS!|f*nJq(uRO#<K0XY| zhkoHB9{QO9{rbQq&}GmCkbe0f9@593Q_znO#N!zz%09x9DSkZuio7|IFMvNa(ccPx zC-hM!ntPy!;15g&hIE^tN73zi2yF^}7+Q(VWner?hw%n2G<>*!8NC9ohV-TMmC!NJ z3Md}W!|!keo0v!Xr@M#X{|Uuo5`KN6zph6AU&Q+<q>o{L7<vwV0F1{Yvw7JKdK!8T zipP$}a*+!)K>I-P=!ZWG(zlS$o)e|?ry##6$S(u0hh(<_ibs^o?&FDk$?@!tLHh9S zUQDO)c<w~r_JQ<C*{hi{^_f|H*EJqd|G781{vF^I&~eaeXea1U=x0p6zlJtJTcCGC zUw}rSi=Z{o5VQ#DfKGzm0v!jP0R0Pe1oQ_c_LqVWfj@vg41EFm0CYX{Zs<KwD|8-o zDzpeX3_2FlS94zj{ssIS^b6=2=t*cZ^a%7gr1E|j(wA^m-Zw#w&>_$<km{ixj7N;8 z^66W+`Yx`@r~KUv{eP9em|o0BZT_M@*3Y)uL3xbrpuGOywnI#>^k$w5g5sBN?}Wbx ziif_As*l8e5Yksp<DqYCUJTvR%*`Q4U+H{5xU`A;5Agb^WecS5R_Y^{SAq{g@rd#D z8A^SFQXkvY$13GV->=kpc@4bc=`)z|kWBvLcPo{?eCX?zN<SX@&fdqMZ$SSE>0^TT zLZ5*?2gT#13rP>Ux5YoYbO-na=wpz+^`wt%-2`0>T@LkNy8&zfmqPKl3tr#Bil5Ya z9Dc`Bqt-vhr*tMxW6pr|;VaqdQ&E40WUDVo$;UwOuTNCP<Bf|MSJ3SxF1sOpLgQ9Q z-z?Yytw5*mRg^(}zCz!TDM9hL555U~{NhEFe+BsqP_2A3wlna1avNg^It+R}bP#kf zv@f(jq&M96hW5Z#9|?$u-pHScJbo@n9~#gr=kbdG?H!aKIs=;}U_4?xeFZ|F3s8K0 z4k5<V%m4bY#-E6%?*aT8{4ErZ+W58c_9TwtDZaj0P#b?Kx@C~QS|Pi2(8bU>&;^h_ zoG}i?Bc}Im@}-XqY|HQK(d*M1F+XpCzZi;#(uyBs_%`(vk3B=3sqXZ#n|SDD_jS;L zJ^qf7-mNUcZvmfz^j_wZU<0W4FJ21iZMqG_nE}QlzU!nH&GfF)p^#qM(HkPWgTJqU z@OpnsFOled61^7mG->I@<n`UWkpabHTmHB*F@JhnNUsX@fO>nV*8lS0Kl)oi_)MsW zyrlWN8y|Y3Rerw!ZOgCT!BoCiZo}_j@H-n+xuf6ng5Q%t<yUX<9t++B{yU`fZi3c8 zD#zbKJ>3i{z2`~y{opy^Gtk-4IHde6gZ740j}MctmxJE`^?s)E`2ZA;7;n0C^k!&n zIx*hb;78?{f|Ty5(6-Wz@nZR6eW?5;D3(9kT}<2Stt0h^g-L$(Dy81&)r*K~+jv~N z!r$6gnbnu#>wyRMa03#G#~k|XN~i*@gW~Z#@ed|kYp<7%ThPT9^`d<N*|E@kXaRH_ zG!Kf0-V{|_^>Ouiy=$zp=sh&OdmN9Q-b(vGdqCGg@z6`Bdha~GW3REG*YM*J$EV8n zWvGEMqOqd!r`N>daoYgv7bw1366JbsQ1`6kE#_z7^(56(pdKTN$0vuV6Xf@<_s5>} zAex>)({nv~J}n-HjIy4E^k9N+!^fk28}j(*%s~^JW1x6kJI46}dU8GIU??8n$3~Cb z=|=u9p?EAqrblDqb1_l=p>tVdoyS~si9gyBpLU7*SFWYLp!o2K($e!N@wl5Z>hZex z+(nfC6#0f}<a)GD&($e!ddlDsXmyg$_{?1|`O#ws@ks>Ps7$J}xlnwXA*QE?9P|`H zKcq(vdZ3k1JO;*38DM{}a8B>wWQ7ew+q-D$SYB%GZfsp%80uyRsAd;)sC%d~gl01C zf!lURV|(M`?&j8xmX77!rN;JhOY4H}#zkF?%gY7!kw<wn()NhP2mZBE(7)~p+Kr7^ zi_+3uF083kM)Te0!r%ZqkG+HCzTV+sc8Lm;V*}dE#2K64g`vsuiFp+gE-Y*;FYNAU zoVTdCyQQPK-8b$!8atMjyO*3+U~@&ARo$!lh6|%3BZEzYmEN(!YWD3qdRGosJgEG$ ziI!}>`3Boiw<R|19;)KBFCo#6=4Bn-^P8I%6{wH?!ddL>`Nn+*g)8)p44+dWzpL%G zL)fk=jP;%?r;94XXHBfO95=VOFKO>y+S;^eNx6A`chmgFj>hhCb5lpllGZ%CEmTRX zw)pyb`&L)_TPx?<)|Gbs*ws?CbPrFrq1)ZPYI3-*ySpGuQY{RFrHL`GEONY!jbdxq zt#?2>8W(i8HZE>1j12a-uwknX(y9Iv{Y|&IomE)uBTMHkYH8|jnNOzsC;AJcc7w(| zSiR0);=QnSNo#YVv7@8CW!}<`=E8Vi@2XXcD(A2zN!@CHQt{c$&u+4`j5q1-!q%Qz zTInCHjqK|#omXz|D6E_u80@FQ`m=mf4>fmAMn<WvEbCb|x@~}DU6*>W?o?PgFs!}n z@sKC4nr+5!ncv=giYjs2cML|yMg~XDQa@ym@VueHtS=VIO^vOs^!KsK=*Sqm-gZBP zbXT$Q+R=NKZIj}<c^ez}+MFL+OLn>Gq+yt6vULfghi=zxH9uS$tE?J0uc9LLRp0aJ zAL(Ofdzjv%4qy(N+Lku9c6dzHnr-rS$6emhvC28_Zl2eZ#bE<>nvH$M_APL6WgpPx zrR7p{>-=W*8D^9L-9U-mcpJA5w(1-${RM8iSZ&c|#$y(yy%AzXu#wr)+O(v-o$<&N z*R*6llN)2`+|tOo><QbvGBUc>H@I8fqlTmP!<su`r6uJS8`OQP>3wYWn>iC^<5sih z($+=I<+94&I=^v|h5_xVJeM_x4t1Y3Hp0)LJ8u)!bm@8d<A5wpt{fcbqY4=Rc3+1* zXqqofyCXg!Y_<3ABepQqyLM%zV`NQbm^A%F5%%PLCU0HbvE;PoR(j+(x8@3(A?6pF z7d0;?z6}`W^z1%_wQ7YMc;OC8Ue#4~p#dV5O$pO#PHASYZ*T5i+|t@zZh337o2NHj z#wWPD>z&kRDSGmBcR}e>ThDcxDH%?&!w!#(4fPIE{;Vdsady_M0j42kGiGLKYYV-k zxx1@rVPkuDM_z=cB}_t8N2nH^&BDz$vq^81<TcXXTyAdf<g`$tI$D->qoMh$COtdZ zWEIt-nL%gayi>)BOmDl`9hS;)pN0@!D~yVG<1J5rDMPMlQDeJK>7E7hO`Z00YO~un zGUWss?uX!Nc)XjtJ-TVmX@7#-Q<`SDqdDGtmU=F;+O}^ptNRS;<Xq^luyPn#8|r?% zFw8l#Tp2A4_Kr{3@bNker_Omx$Y;zS(-L!12aTsSjn4Po<GNADnP$FwO%@J$^ORb= zWHvKoZLQm9K2gN>r7{*Ydv_bJFcvfgv<we;CtyOWxuK}~(KNT6xj1XP{2Y@_#GQ?c zmNrvu6P2OSV@o8JXV`~kchi!^rA5u09_6N`l^LdS5o1B~BqxpZ-lhz~jlJ&bPLrK* zb!H#uX^2YyER7R&jW~bQda_{|@=#u0?r2`D6S~sy1&ugc8|9+;OG}*h8#`EEW+!!N zZ2?nr_MP8+O5@T+9krG$)utQ2@?sgP8D!n<&857?7PK!}TI#lSR`-%phf3F6$eOx8 zp2Dd))^o{oA$@kA&ZgV(2|D3~7O_P1+xUK3D@+cj6=&<)P#-iuovQW*wX$3_ObOV^ zxwW}7tYxbfLzZm~Aioz)o#|F)Ub!V(RQa09&vE_$L<=jW>^A-YotX*C1?MnQ7$TYi zSUjeWtYoJ~pE_%se!4C(II!|)`kO7~j_UJ#rMG!4<0QyghieDZ2evXiIb@Twb%U^6 zc8jVeE!oQ0VxB@jFE6BzPuOIUS3>KOIK7trvPNxO^Slbn=e{+0!3skfThxG7Phq~X z6_gDCxlWfJEB#)uiKlz0VaV>7_a)D`<R@6p9`Sl)Xkb`3`o~L^G4<!dD!;*Pg|k94 z*E8v7!=&5i0m~vj)-WMf&b1DyoW!XqoO*IEd3;;5r?xs@E;&W#lkP=2Qx#SXjK!&y zY1<!KYUyVV@9&RiK;$%(I!iLgGgzvh-e|9Ip~d4+a_v)rE*ciMlovO4G%d85JY4;( zR8g{0R5f;7JCqhJE$8L2WoZ}ymJLnTafxX|&ie>680V<4{K^|(G%kU%i$I&W!zrn1 zpsX!a^pHj#cc`1vk7tV~?>}KS&8;Z9mc=%^((|T$?nU*&l(6lEKM{jRt|z8>6l-2f ztF1!G5bI9rA+CpEYuX~5(C1fO6oqMU;gXi7uw>H3Y&-|}JfgXr<$*npqYDo^&6RcL z_oZ&$Cho1=+_seEaWfaeT(bB2LqnQvw2Lt96I}y(#zS>s?M_c!)KU(Y4^%*-sjP2= zu`yogA4ylac=o}lvpg4tOf5du`?Vt(%Dtx(f7YYosL>$d#CggRvkzCEIuY8uFfhJ! zV%6*u3VqtfV1gSS&#%K6#jKlkVI7uHr2^METr%l8TSeoEnfQDRWy&5LtX`N~^|E(h zorw#4yUfKrtN*+l`FPGRLYHeQ&{{gooHZ9ingDB-B%VjkU(JI<p@Xo;GG5UmkoaOL z$7I09P*~Gxfz!z2Tf_aeO&<qoHY}OV!Xqud$_rN&)gyaxsbjeniTdzUK-Hs}6TN4t zM&h+y>>a)b;1}OM$ZZ+e7gpcfxQt|es6FpeAM}{45z}*<_b2Ogc9I~r&IGB6TD4}e ztom6nHgc}&&bI;v#{F`_78uj_{{9gr(TUJq!V0sdndnyeiF>VPs%)M)Ht!NGJfqsk zz|*xNH?HiGBwLE;+Jtqqy5msyfG!}za-2cwW1H1LcV)1jO%x1mMRAUHb5#3W#?mV- zB_9+``HW$w>S-Q@w7E^!zth(5z&KHS<}A!xw4~`YRgk$#2X?#&L8qDzEt@S^{gg7z zbrFw7DS0kNsve26EZIKSHuCEZnN%Cwm&aYqc*!JZs<v=Cv}>7RdgtO^u0kr~jpKa- z18R3$nfocix=+~U(@^SXLKv=OK74q`W*8kCnHcFCVY*DFTIJXWhAzkRrcP%ut!r0} zjSQ)wv>B$^DQpWcj|}q&E@MxtkT{OKl;!2E9gWLu%F?vS4pW6)uwhRmPKco*!-kF) z%0mNvV<R=^zN!v6C+y)#Xc_k8*dO(6w{V@XknM~`+Cb6Xns)?SYQ=6aZLf*dp(hCA z@}3>AQ%+g3$gekOBvluB`chmJhixOvN1?T>rIck%XWqDZO|nF+eaKVk*{qY)H+9>) z^;E*}pj~~j99Hkz1kT!;&6e)&Ne1DZW7+c7vPtH?b2LCr4cK-<Y<nNO*`C7S$jBOg z&P%!Jb0F)}jgvS}lqXk?S8U*Eu*XGy9Ov@mjk2`$wALkEt@&=2tOvLf2r~k;LN;rs zO~tQSNOQ`KyT94YRA7xovFX?BT~>9GydP&5x3(x{bKlNhx^&I+l=_ZWy_DZ3i!dW3 z^MsF<JcXL`WZ0cb7LwVSOXvB?iB%^uXl%1SYkV<w`I;>0yrsiP^8Lu}5*N&4eZG}! zGnQ>HZsXExsCRsg<<fmn5y{2H>fUoIi&<b52F4foBFgtLY=?EUR}TmK4h840K8+OJ z7iqNTag|v{L2?%(PB8ucJbQWV_&`71Vzu3iuvZ}Zc;1+HW-ENvs%&Uekqpb~b{p!} zXsucuYhlNBN)tPuRvfSY{K?fmd)Yy`ie0XGS&1D~E@?C_n+v_8qZ$h2C}fa5H8L1B zl~`(^u{9mDlxDDezR-NC$Ny`ux^=1x7u`(WX;W*D$Zp2yG{{_=Kk-a=^5#&_n(k^Y zcWA|o6J&DjWS35PL0ek6P-~gr?Yp7*l`WeF$s*lHhbAj_5h~|qBabp?Pln59?C{f0 zi*fn8XkdtyVtC`gH#w`jL-GW;6gIVm`M7!{O1sD|M?>Ovhe>A_rWmV$d2uM3ldZOB z!c}UBUA;{55s`HMkOkjfq+_s$%UB9=YZkF_sN2?KyWc_MS}fb>vo5k~71N)eUgJGH zovQ6s3bqcJ=ygtHjQW;fg<YKq-x*}R7U#=&f6lIVeATOk(U>-Z{nnFRw9-9kL~Ue- zC2lzLSclnqx?w)DtDCB6M@40@F@@GHFlqN~tyPBmx24JMRrq$GDzm$LoQ*0@J(iRi zutBo8dGV6=<>BU0n7FGiGz)!$BjXj;w48rp#duDGc`Wp{_cfCw=QVOuQ+wfBRBh`D zHNVjr_h_~K!b>ON<%ChY-4a%+c8=^H;c8xYSx47;-hAz?5+{krA=}RNX$y-++wjnZ z&cM(pw?hW9t1eX$mun+qYrCztQ6t^uNp3_JN_6%m3&O<3#hKre&a1R>-ja4^ws23; zH-H$B)eA3{2ilmmiilH~&4BUj?PaK*dB@kX-8jVQG-NJY4kk0kR-IY4Hazo_U~}uz z#mU$-Z9epubm!Z*%*U)5wQSAHXJ@JWMwDORPgFRUXlFecMoeG6{ZZSWnZ#?(*=%UX z@s#B^ObEWyWwXw(_BUvVcsb3!Bjc>*jisX}$H$IdJu*}|x_@lsXnM~YUc@<iypODn zoipd?-jPAB+K;YiFES}qQaLqiRQ1w<adKtWvH#e@le_)%mUr;Hf_1>HFSU3!V%)mS z#E4pdnA-!oXL0squTD-nQ-?XxTAu9;O|7VylS2KZHK*%J%LCH^H8|bUFRQz(HS?wn zcWdy^3}dToS^JgTV(l(Q-_xI6M$X}WpE_K+B|1E=^2m>$*V)u7Eoy9H_Lhu0D1v+; zQuTU~3OP+bU>Rbk8O5yWwzkK?KGeWCLx9Tb9b}!Mbu@GNxE@%^hFH~=a=I9y4bEe? zekHZf#zg<xChh&|rcJ)=XM?6+D=EK7t{#s0OK*11y!UNk;+sCBw(j73KA%S#RGiqn z@m85_h1CoM7DAQb{0h_0-%GgD&H1qE+Q}x!r0RJDphL4sD>tKJCtad_fOsLInbs;Q zEDh4GrQC(C7}ku`s_%ZpI!$Yl3qmbzL$Ru-k9@l@Yr$-B!EI~Z$HTXsLZ>-%ncT(- zXKHVO{+et4HI=oMv#sE9IW*l!sEiJ9!I7Vyvc+SGGXzh0kpFG0DY6rsZ6Pvj!^$&O zg!gpr|1ahCOlNbtLtr~9y4KM`Ane{GPd523m&eZ^6>701qYul1PIB6ujSC#6s^Ro1 zBfHU2bI&)N6Raubho@!oq2C;zQ{c*G_6c-DyR^|_DAr@`>&>>XVpj5fj(imvm+vg~ zT3Q+A-n4uNgwsT&6duDcr<Rok&D?zEEEju#-A>f%Nxg}Q+@?e(MV+H{FT<YAQomu& zu>0RlYO8^*o-5+S9Ns)+?~)4uHdI2d*5t)bl|S<`zM98jX6Z^G-kY<mSyzq=JEjfw z$LUu4$(ZeKvpJhyqxJAsFHM`J?%Rlo-Ex}lZFc@#jBPt>O4mhG*htl5Z@P~1Hw9(9 z?VAG9reo5QrZCeDhTe$@jUp<tZ*a1oaivG5^h}*a3J-2HbK5Okr{}{)*IC(GI6VJn zk*s-{S{k!QRqWz@U_5&mLi2moJe*IScCF|e!z>yoMci`1#CyA+mYQvAc$_A+W>t~B z1KI|&f|iZ^+-+xw`0UB*-gGy|T-)aTiG}feb3Lq3;?$h^j2laFg|1z%Oz9gznw4X% zPkYWBwe4(mbH$94vKE^P(@kpjPizsyf~L<eLal5q3tE@(M2jB()6)|^9@)CBa>;X0 z7Pc7N|JPGCcEJ+Y&LO>|rqy*~&O9M56IvM2d1d;-EACR!d2CNe7pRM~Z3|tVTGHMX z>BoE}pkS9ox|p}=yygsNYbig2OuK#ydCiuz3Wp9!hNrpx)#t0Gq|=5?<eG%#DC}Ws zx0GG3wCfcHZB)=}!`!PgyrOuIYh<UiDNc9&BP7P@1s{{u_d1!FEYh^I#2B3|-U#*j z@_|l`hTB`rdevWg&~8A1fm!v07?WdqbKd)eU*g)mBAZUF8uM4sanxDx`LOD4fOdQ- z1}7OU-|dn~PnPPsL*i+^Od!YBW5OlW)?H?0EF@jL`l26~qhYO<zt=tx9@6yPP|LjE zd~eD2ELpN@i-{FUQ1|;bmQ4#<(v|fnC~ZfzP81fjE}hjh>$sziJ!<x>V~;uJ^~bz^ z_DQp5oo<WQ^87R637Tb}b~;yA#+VA@J#C+U$oO`<oIihKoBUaI#2G`6N;6W!8QFVJ zc6UOPWVyr&xqE4QOa3Tpd{Ty;=;SdIrm4^!bh9IDa49`HK$x^`9dGN%ZJcf52|GMY z?E6q#bz3btlFpt#;6Q7IxmoqEw6{5@YrfxV_d;!B(a5qb>vcI9wi?3hXKD=xMmLk6 z_Uo-c(@v>qwslTX=H#Zr)v8|4Upe5<-)i0Ft1DZ^R9{j1!_!L!`z>=?RM}=?Tz>VB zw4_fCkTK<-1hi^cS(!MuQsDto&a7pgN!Al_OO`BBFO}LV%l24KWrw}H@f4Qtx~U!? zNGWK|!CO@enwn0YbqIa-(Cu{D!cpUEhj_RJoEURl9XY0zqijd+D68C~R*sJsj_R+h zoII<$cjZc+vn?DY6PMUs_9U#wFwu`Fs(jBrYPOrZs9JSg>S+}{Ls4;ES<S;T7V<>6 zHcKtJ1u%@3T;=(oUk#rnk;kYGk&nVreg1@Td^zDoaX&0(KracFbHVg$2Ms~KFZi;+ z3l_a{hr-@7{YwanUk4STgCK=b+3|_10uw-XIu3_q|6+E>U?YF=kiWGt62hpPm+-RP ze~LE?d&Kz>?cPi<El2-8I}}zodpT4Gu^f5<FvgLG#ed+flYPYb5p}#oS>^9P&)mVv zrTS9&qQ5iY73Ww;$Ade~C=_>aUjL;NogFZ$HrLN6d^$D`x>=A8UJ9y8_rFN@ww=5j zJEM!~@`6oOy6@V3MqxCmKiMhWcLfCOc;S^Z3M+PrA@`@yWl&mw7Y~qA3aawTJf{00 zc=?UxSa#5i!k{W79J15#eyGad**g>(h$MgNd(q#=;pHzLUpsP!eX=%&qwb3cA}`&S zZl6(@@zQ9O>pqVtP4~UydAse7E~fi!_|)J1ch4xyLKcsx`#OTu-}U%Y{#A}Wq3G`k z_!tMa@MHWn#6gzmei?Z6e;vR3=8VGR(a!6?e2D%S5U``~FEgsXN)prB4Q<lwh0C#f zKEx43J7H`y$?N|yqi`D?>ecXlkjkO#s;sHM`(Cy~VPieQa72GG95I#G75?zgC>PGm za^cdMRVhfX)bnFzVaGfGH#3{XTs)JG8MCDMW(WMg7F3<i31N-Lhv*;byV5s;vv7Me zIHRDElpiw-I~6qEH<68np!6%i&BPxD6@Lv_qMv^)gf;$VQCY8|;L@kZOyXaTU@qhK z4OF`H*Ad=KrgshYpCJ6q%YD2{e=p%4GJ6=P@Rz}jgj+)RL2xtSH-zv{z*)OOA^cl# zF5y>%uo|F;@ctpZ8|iK&9Q`Zbn+U7CO7B3z>aTM{_!z>+;Ot;f`bMya0aO>li@>i@ zpBe+IueTC@Xb-+{5%hiF`d8-pA5(ZQzN8WSzn$<igcpVIRfOm6&D+}{{6WGG5&lI8 z-$i)SK78o{RDQkzmKcOz2=)62;knGG2Vt-L{EYC+2>(k6Gb{=X1U?)5y@Yt9vv~8J z&Mtp1C;ZR>%q!R_{2Ia=adt`Ye+W415Z<T^@sB6GnerbR{5KQ6jn4Rdh~J^`k$m+c z*lRky?I_+v58?9&A9FP4WKii{1kSyJIu82x5nfMc{!!514C?EOp9%U+g!Ow@(f)^o zkKrV^XGs5#giCLsK0*1PK{+=!@`ZsAe-FZQ=kZoFDE&cT;S}mO=ualRk#KwPS0?<- z0&E#0vR^HG8t<}Te}U`?Z`{fCmk^%C+p-lVDA{i$tdAky66`-lSRddW4F2y^{MFb8 z{gZ?X1AO;1=>I}kzl`?vpx={x%w<q&oXY>}2;V^XiC1~}Xu_YO{V6`$oeK*H-$+<) z749H>GhzNL+)wy}NqB<rdkHfInEsuFuS&xIM)+dFFAMrl625?NF@*n}@OYwsknmZA zV}3Rh*2h@S!(RFSGvNXBRG+1{GkvR)*zZSJAE<sX)W_=y>r219plk6L5Y`t{e-Xk! zcFZiiJmba8v{^A1&9s?64Qm$3kC_FXIrC$tjrugqKu(UC1qN<%%q;9v=q7)o$aaQa zK?&EYJn)Bw@RfvbgFi5YKT3Eryw0<-|2$#9a<1_Ggd39Zj|k67!p{-b9LAJn@pq;! zONst<gnN?kTL_OP;nNAPPr~a6Z%o41625_O^nV-SO^N;?!Ve|k-x1zSSo5XwU#E^m zXNcihgl7?s{!S)5moQVl*)JztO2X$5?n%P$BRrafKTmi);pp!{!Z#%P-xIzq3GYJ3 z-IRn6Bm7VjK9%rh!fI*de@Gpj!4&g%IpGGvQU7tm#}L-~MD`C5E+ye736Cb>KM~%T zgm+?K-9|X}j{^yBPQu3#ZeYx;3;vr3ZzTM52zL-(PalZ+t4L3Hzo36R;oAtu{&p?l z&4jgnP<}s2couE8GK9aP_=LMd_(z1FA*_)i`#%zHpiX001Nj)j8VS<xO1PBh_a!_^ zIQH+u32!6}nEe}JZXm4lm*Te(-jwM339ql`t1&@;F5wdA@1M}eWPb_aQ5t_)(0`C{ zJTNQVTob;P@I#!hnZhmpU4&=Rm}i9WHwbScGdjP^|MzO*|EMPXvzqX)YQn#-3IB=k z#zR<d1^;!LC=Mf^A-s#i;ZXkfuL;j4e8X(!|6t!(qd&7IT&W2U)r9q>y?7|Ss|fd; zz!z_51C{^NHTv%m)&~w*qL_XQ;fDxQBn$sZ_MD#&2;m)RyLia|ztn_ZUlVSv3HQ{5 zM{C0Gs0r)ge73K~E4+O)H0|AM-HS}$DXe|N!{1RnYR*X~o)llm89(Z{V~#mKe@Dz; z2dsYYx^~m3<~0SsU6tKi%Y9{cPP7x7Z^zbrrXX(V=i9Z~s?9@j^R`OTs%<#kY_fe_ zyX(YOw7;$#9d5Oan!FPqKN@h<oD)yt(Ow+c1McQ1zkQ`(ctlEU`gVxdP~7qJ(6l?O zh1wgp$?HZmXtpVM)Nv=g{@9xLFC;t8ABoJK2@6lnZuL}9eh0{JIs5+OR!;$)RsHnt zv^%ocB-^y<gU_SWJoRc_GQJiOH#6C{Wbd?kYclG5Q?**R+8*1ixq%(`wd0NF0Xjy_ z6UBC0*B$yj-DG1lGza%{5@B_+(>|Oq-L2v%vv+jDLoI#UV%+)_EWcS^wbjqNR#lt4 z;pSYD!76oC9_Q4=tx_J#y?=YcCU=$H%85zlPfZ_n{4poaj?a)PFvkP-wu!>WMkNn= zD12NJE=zE{3;gc41Scc{zH=hc>s=IXT1s+amBfrrqD|sUk(E)5PMTfV#yf5CmW|&o zkm)f=WZiq0>{xE+F;iq;bIvPd)cR~5j`iYQG?#08d-@l4f+o3<AqlrsY9BHP;_UHz zh2wpKz;Ek5S5R;DE=F)!a~Ca0xx28{x6)&Tt)4^*ifM1;1zo6&>F-L$_|@OZh|**% z#Cr`vWtp7rCVtRw;}(C=*4%EJR+>C{OQUS#z7ZPB$+p#GWZTN^KevE$ZvAfc&GV4k zY>uyeLMi5Hdj{lcd+P1paju$GlBX47&2K{=Zxkzg+j@)yUCnG=)9j(gPE%x73e&xN zfk&Unr->5I05wT4g5z@*u-V;z94%zQVc#ydlIAy!733Cm{>^d;7@_&2IYF@1iw0ZE z{r+^2Z}mbJPJ@q{r_*yq)x(4Gqx-qx)ZpJGmoR@aD1>;NFMA~dr6T#QIX${iw#P|5 zoW7i{xEdz$qvZB=3<=3jdgoQ5Fy!KMa}ud~D`QzwL<$wokkb9l?(W`k47kHy8R`qK zOwbJ3bC1@x;q9A{YPhLM1g&Kiah!+SCkD6$H_pv7Uft5aEb(BTg$r~ErYoLVP!{;0 zyk5&1vgKg)gBF(a@chxxAUWr4*Aw%zvuBE@H~igo?&NyyuCi*~W`t0~Rc9PaDZC!K zb?%z023uaRuyWGp(6hn?S$Iv&D?fLvCkB?Rsu_K;@HJw&@LH)+Sp6x-s5Ri+(2@$0 z7%^6-Td4L-QsMJ&Z0E3_a1qy2GuR|}kC1DYuY~Z&xt^B%t6UcfKgPAJ^j{44B_Z;! zfIEDUy)`yccDSBv)PO(cLQMYWupcP9XSvXp{_xj$cz(bxu4yIzAsYk2##!JEd|7*c z@J7Ba81U_{_3%6{=;ZHAaEFg_jV-*1A2S!;%>95vJ>3%zC;Sn<lq$sU22lB#$DXgS z1n%&0zK|>YM4_<dIPg>KCms*p%2)Tm8Q^P#pJtyz$mZ{C=|9U?7`YbR;r-;}B*&YC zxABEsQ2sy0wWsip;10LrhigyaSA=)6PXNyN0{ex+FS1YY7Vs|GLwGk|9Bc&d;dhFK z<nPz>K+3&tKJmF(arpwm`0rcj^8W%QKV>OMdH)*lkDVUgos9^^zwS)88|(J?y#tPC zzRhvJHI8=-g4jPBaOtRr|65497mSB+z?;wW@Erla67b=Gn*;tn;A_^p{jV-?e?Nb_ zhbPuK-X8Ff4IcjaMUKw|e8Z)L$;XbDIbL<S<GL#xpAES7N)Io8m*eFDUvrg*PYXD5 zIQ4Q%*pFsx)Uzirqu2M(gnNeYK0?x^`x@>qe5vm<$d2x0@#r3gG{0d>K$^qCX9VmI zNVS`MEa15TFAhjCOn*&4y1Iow7m%j6@P7n+DBzZWzYF;HfZYBz`+Wl*7VxBi3j=lq zTorIK;Kc#23HZ@~+!i*!n*x3};Ex0THsA{Zccv~?Z?6h?XuuN#E(q8eQ1@$OKM_#( zZ4`b_z#9W<Z&mXDhqyO^kE%MrzB7{m0i!o+z<>xSpr9y;pc0767C;3z45AQ4Ma32s zaVDTZ9G!_|41s7-u;Px2bwkAzL}S=D7ZB92R3n6%>qHwAF)StT^PKbCB%ro^f8Y1} zK3npi=j_`(+dXH7d#WV&Qc3Qik~JdtP^pu}4q}?vSG-ajBTf)QVzKy~xKJz;H;NTv zjTo1p_{9!ln%GyoQXC^r5JMvOUYU>Q#D!v+xKXSSYeX{+F#jA6zz$-X*jKz#93xH; zLt?S`oVZXd6E}(#VvQJwJzP`%Vh1rz>?>X=juGz>`Ob&_3&fcs-yPAM@07?_#5cru z#U<iL;wo{2xJmp<{D-(pbj5#(zlaA#_6>}`nRu*tqS#t&FLoBs64S*C#0$j%;w2*Y zMHx@FI7+-pyj{FgyjQ$Wd_c?>3&lr8zTaT@&xn5$7m6j~2cnrr!2Me3&&2KGx8ir= z58__2PCO>j#@kvvLp)C$Al@K8Cax6^iF}{I^rwn{5`*Fk;wte6v1JSE?^N+(@iOsR zF)BVTZWsBBGK_bic%?X6%o7)hTSZsgFZRWN#Bhd+d19gXs5nP_T6{zNK>S!N7k7&> zagXT3D@(?gEVdWBi+#i);^pEs;`QPf@iuY1I8mG|=7|w;w)mp>j`)eVRjd?wmV@a% zEFOy&Pt+a6bHq&XQt>)*ta!ILMU0Ab#FxZ(#bx4W;y=WgxL<7M*z~j%JBsPz#o{n= zw0J1l`a1@5G3Mt~@jS7Q*iRfR4ikrq*NHcZJQu+5{w&@jP7<eyVKFMs5+4_z5}y}e z5#JEs6_<z~iL1m7;wJGc@gL$Y(G~wC{vsX}eR%Q5{4^7f6;Bjfi|xhE;#p$4c!7AK zI6%Bayh6+tM~OFyw~Kd*_loz44~Y3<q4=mcM|@g*QT&@&BCZra7c0ac#Y1AB6K%O% zCyo=Ri;s&hieHIMxV}SqCW~#wGsRxwAn|6A?>y=60kKegQd}gKiJyu)#P7vAF%c7Q zhSyr`Ee;V!h-1Zx;)CK`@nvz5xLo{NtQJ#R+4xQq)5MF!q2l%8I5Ag@h>wZSiEoL^ zMZW80zP=W##RFm@-u=?PmDpKK6Enq2#VO)Uah|wZbj1T=n^YTq7qP#XE#4yDBZkDk zh|h~}iKXHv;tugAu^ARlCO=|lv8Omdyjr|Tyhr32Vfuemd|rH8TqbT3zZLh0KJG)n z|MB9f;-%uX;%#D3jEH{`Ul2>h^<sPMZ!r8bNUSZ+61$UF?DdlU0O=vp!=*=(V{isZ z=J${YCn(-WBAkb0UnKpQ^wZKWkns1ixLEdO(ksQaB*NPy`<>#Cvj0ikN5Wm5>|3<8 z+98qOHqxg`cO?=3*<!lvd&@pc`cmmp;w>cn-7fx_M7#mnKOkKs&X)OeB>c@67s&o? z*)JDAmHp@9mn6dfM)o!0A=z_*&u|k+xI30ae%pzsldwNiJcrD|FHMkeH%Poqyo-eU ziDE99gMN~P`<ddi;wvQFzb3v#=HORWNVqQ-D@eGj6syP_{2CMqcRavC9xt{g;r<ly zR1)sblzoPHsdzOB_ansXNw~j7_7lahSV+SCEb%WS+|QH!YvKlRGYR)!iQ7rIuay1I zVnTbEBOgg5+$W1EB;21O`wPV^*<T_KBjIj@>~9rw#XJ(>J|sR&!u>4SKO?>+{+)#T zrQ$~<+^?1WSK_Z?9SQgG9W0xXaGy*fU+u*-u@?#VnPOiO?k|!39pXK*4~qAZaQBex z9~EB^|3)I*H^p~IxL+#!_2PDM7YX;@i7^uH_sTy0RA{8Xqj(kx_ua)FB;04p{xWg2 zIF^L_apHIq?t`*_Tzp#g&x<dSaQCL{KNLR|za$avHt}l`?!S}$KC#(pFuw`s!b!M4 zQ9Ox+`wk@R&ywyV_Lupkq#wUFBVJ9y-zXCP{v=Kj!=xX-WFr=ma6g-b`xnJ`#1-NO z(vM&06E~Caw}XVgn0QD`=xE(1ib*8gw<O`dlX#wZA?c5c>nCQBaDTb%bHuyEToUf@ z7xPHCpDz0+#8<?3Nx1*JxRiwZm9qa#dW-aKaSsW9zli%u`15xHk&k0Z=o6$nirq>0 z>mgo1!d+k4UnYH}^eE|@rSBr)f1;Qx`v+wIi1aM!ze+zZ{RRpDZ;S8AzEt*~iQ8rW zjkt?MI;&;>tMp;%7M*Rl$B8G9aDOt1@;F`kZ0QUV>9|nrCwu<VDBWjEUoU-!c)$2C z3IC6XGfBiZNA@pBzbgG63HM9H4`shv_M4>3r7K9duN13fzeo1Gbi;HWFP=ie{i$MS z66rZd_7{qmi`SEIe}l+hN2U8e%RVapReXVj`<KPPk#PU6>^F<w$bOgj9SL_evOg#t zcLvPaPD!j)Q=~hPh^Ld-g=9Wt-&^JviT!1Nne49<Z<YNW;+-VI$(4PWM7*=5pCb|P zd~pE@_ixL7hgdD{CE>nSJVe5Mn=Y0eNaU{z33uJZG}&j!exUR<;?3ejaS}NO@0Cb| zH(lm4q~}P_BN5MY;!Cn$DEm_B^|Jp|{9N|iW&cm<ed0lxH|>h>k-t{r$t2Qqrg)yr zdrN0YXN$MXe4_Lu>4&5Xq-T@J$6Rrq>|c`oLg_MbmCQFvSBSf1zE`Z1`SEAkbhjmu zpHro~NvD%2@AGBePv%#NBS@t0dU3qWCz9|tiA1?PB=hMc+!u<)vVThUFG;^4`?tmS zWM3-#b<&?nZzmD%H{veYSIhoa=|j@Z&Vqa7H;F|0PLggbeTH;5=?kPYr3Xu2EAp3- znP2{TGQ$m!NY7+(8i{zK;%pM`o|1l%g!@;-*JQs)_8&=qBK||>E(w1>h<jvzK=w_# z*?3MAJCjJq*(Cg>i|5JyBH3ReeXV$l%>PWn-`(Q9vY#sZ>C%sjPs#j6lKB%~ll`Z% z|5E1L#II%lo$P-R<IYAnD7TYH<f9{raL*9Wl6_CvUo1UP_Cv%R+21OChj=H6@N;E9 zSA0(P^Th=u+`TRP52TmLewDac=H(>XN0oF9iS*Z!NdF-*?i?F#a}xF`(x-`MkO-%b zbU*2<q(_qQH$j{(J}<sXBEC1ow@KvVec7*)UN8NH^fu|;(%+K^=SQ(=cW9*RRPh`V z_UDQhivz?VB+@xTyjkYAiGL!Iu6t#lCp}YqT6{tFZ%DsGA{|R*zFOuVlSt1-@eA2k z$i7;7uk35ZL$Ys@X49KYB3&(|J4knyPLn=Qy03JW^p(<MNu+0-c)!e};w+i}MSM}_ ze<x9HAIW@$xJLFHWxrjzLOLd0BYlv>c;77DhIb-~^qeG~Od_A1WZzx7CyDaCMCRAX z{Cb(+B^@9U-ehqaiF6mpzDW8h@f8y8UlZRV5&vS@uaMp(mdm`7gg^dDJXtM!{$f1i z<Ar~Q!(WUy^+v+{R1)qxi(O@ZuIw+A?k_z|dbsqBB>dkZ-Y)wIvY#SdC_W{=CcaG~ z9UqbiXPLN4_MggrtF$Zb7n}EhKjh0H5zfgZ!f7vdlzlhZUm!hL94hl`rEeF<%Y2gb zH0dab@QcJpW&c;%za;&h_`b|nNq-@3lleczJu>(8wE1a9B0ndRi0>rvWZ8F;eRt^# z#bM&rvcHK$JH1W%9@#%A7RY=yiFoFU^JM>$>=#PECtW7JN_wMog}7VhHPXLG$DN0G zP+v_*<S$verE~}BbHt0p0VL8lSiF*i{~Ym8<nb7frKd_4NY5sjKXD$3bi5?{h0<l> zDiY<kUiM##JH;PJ`2UH7yI*DA?0jg}8;ST%5>F=KzLV^`OJ6JwBoWRfvgdg@y1!0( ztn?iu+)b2uo*0$=OcL=vCeD%l3$lMz=5L7a$bOmly|_>I2gJi9($nk$5cxZSgg#07 zH0d*>&y~JFy1(?5Vm66<+%7$yM7Wcrr%F$kE+&z$+2VYeza{;yxR^vZD`dY`db4!7 z^e*Wt>7S)*r4xGD^ff0DUJ8l)o+h3t`|h&8P`pB%AWkKb?vNNE5l)fp=Sn{<y+Ha6 z>BZ6?O0SjvM0$t#oy@DH50WU~xC{{KPZCce5r13hE+pJ#%Dg{`^bQiQm-!eH?j}gz zC!H@nQ+$O)eD9J7=kMZD*{_uSXVP1wzmYy9`g+^=T8eE*gnO2Fp?Ik{f<%1Ri#L$S z=k2neC_P2?4~WynLh(rw@w_Dcs`v(p@JeLAOnQ^}rOdyT{-^XF>3!0^J~o_067i&v zNO!8(R`#7`pC)~gc)2)S_BTl1LZW`g$^2fK-!J_ziFh6nXUcw#>|c<6NBq0YmrH*x z?iBZk`$*)&mx+HUpQa?zks{q%`V8srB;5BQk)Dgi0kR(|`)j2~OW!U%Nt`P4>C!Vu z#QUhsUzYhB(o0Ch_o28<_UmQ;h4gOm7qQ8O@P~Z06x)zUe`o3Q#6B_~Kq8*O;$^bG zM)o&KkCnb#Iw(C?d`B!L5#DlfHJO8bZ4&9&CjE`{_tO88J|JBu-Qpta-yu<6oyBuV zgm<y@m1GX~JEd<HCy;PASDa5GeGA0bN%(tD_GQwmq&G@`AzdL|BmN@uxQlH#O-O{_ zTs(n9{OzSXirr*>p>#iS7>V>;O(MUer0*aR&J=OF_!seS;!<&qxK-RO?h%{!wc)iC zPZh5cb4cXlCh=Ah>AFky_etkTN2O;<KPml;^sCZuN-vQvmHt%xTKrKwEFRa-rnjAV zj(CxHxp;$kmzXEc6rT~_6idZV#jnL5#lzxp{T091l|*@*BYly0xtJr47pI7ih)<IK zxVWdq_sKC>=aL9_oAh_$ewil>u<nj0;jXQ8XXzf|)#Ods7bpGro(1tX+21YuJh4c8 zM*JHIe{YKKkce-o?AMFmi~C5pKOi0^;l9~G5a~Ec>`21h8RA(a-1U_G#nJ<%uaLfm zMEP7N^Lt5zGfA9IBAmx%|Gdm!5?_`5JF@>!db#u`(%Z!fna8ASr0c{MSvEe0ME=@| zXN$dLf1&gc>0#2NN#y4y>G86^SNZ`G`3sBFWnV1&r=(vM-;()K68=6CSIGWj*?%Sd zomegNU!@O8Hyea-P@X4=ZAs+wEb)Aq_mRF-yoyBpBS_?Ll+14<5nir1MfMTd&yx9U z>E~r%D)W!UO4-+th-a@@D|_Eym?ND@B;so$o+);h{YBy>GRLoi8GqxXCyRM9e}qJQ zGsVYb|CH=smR=;T6xYdqmvoi%&(gKh@k4BS6G@cYu_W@5D)aWzXOT!pcd>`;Gi5(m z`dV?c%x{;TBu*D+$bOFWYb4@dDD$N<-ym+3{T}H$vB@RYUkeiHZb`EIr8`TXDSe)F z7K!{^B3>^0>tug}^j+fpB;4nT50QwcQ1(wqzbw8c^AhRR;+Nuf+5b~ICcRJkkaXgu zHr^yLnMAy;N#wVabWbru<^!cKk-kRyI_a^}_en>^*)o4pdcO3l(u<^*NUxOsT&xgl z#9v6HGww2*?j|I3vUE%74$_@Tw1abGo+0y#q%V=aoP@h;Wqz~FZ<oGT_7BRufJFVx z5FaIxj(M_wkwkbU(o0FW|43X(!u@Bm|5E1L#9gxgQTBUfUMu>BTK~t2ZAiq|jYNH> z%RE!MpY%}at4O%NMS7g{gVGO^NZ+H<Pso0O^qbOuC*f|n%-2Y7CXwH-#DB{E7x55@ z_*)DEk=_$X=#xl<*IBxU>_^CaoEQ>kh+D;fi_I@bIEepP@puyPv>_S3^qJD<N#o1u zjl1FEE#f#5{_d5YEFG4fEB&JM0_k_97n8`}hcaI)^K$VYB+~n>__NISlkn%i!p46r z$?}puMY@}qPQra}*=Nc8a+!}3$I3h?-Y@g%(#7JF;(Xb^E&aY&Ci8XDUrFyEQC{E4 z{70F`U1`(bghYOui|xgZ;&~+U*@r}au8_WlM7TFf-z^46xGNBgNVuCT`=_NBNG}#Y zBH?eX>^IB2TzZ#umGsZjwbJod!9UWONFu&e65(|fFO+?M*$<PxS~^GiW)l8xm-$4Q zPm+E}dOGRHI3X6xexCRWiS)cK`-S3rvR_3ao=>H>l5qbuiEwv{-^u<b+3%P6zs06k z!#(nQJPH3NkqEb~%+HW{cj-PP!oOG?Ap4=RzgBv*^zG7<#Hli$E<Hnfj`Y*guab!8 z4e@Q+zc2e$((9$aklrnRFY|=qHebz2<TFLOHHmz-lX+K}r%7j$h`+BmQ1-)QKT<kJ zdYtrRahl9$h%d|hb?L<<!v8=lll?l`Z;{?AT`9d++%NNlYY-0VtvSj3Nw<+cokTom zis#7w0@?SM9xQ#e^v&Y!GM^|tN%|q_0_nesZ;LC$@5DMWDchzql|;JQiXBMgqpR$D zN)HsT7H<|Oijzp>`yuJ+(vL~ck$yqCM0%O@YUxeVUrK)~{ZHv1NTl~CY2J6IJ}lj2 zgw-ubK2OrENVK!|GCz|<KD$fzmcE#TyQ`(ImHo}qw@Xiyen^}y^T(v;l1SG)aiPph zq~8};kVxmJvfn}?{(s24O6EVv{3n^mU2EN?kjO_H>5e4AOOwu!9!SF7r7|Bb^BZJ7 zR_1rge6q}^Nf$`ZB$2*3GJiqluaU^_TVk2a*GO*=w~$ERx6-@CA7y?(`mh*3(z-vM zMEEVmb~5iuvL0pLL(G)@VA&6o`BmcevcFaKe<qQyfXp9|c|_(>na?4Sj;F-=GJlIi zI^H7@PN~e-$^0{!m&<&Y%&Vk-maZic{vpwK9W=@-iA4CvOSdQCuA|sR<~>Nb%anOv zaTtkojgb9V@lJ6HiFgXg<MCcc`mfT@O201swsfiV3h9l~Ur6ti{!V(Y^nU54*W37x zArXJ7^eNJ3N_Usel<p^ex%4&CV@Q<CSaBSQ^0-I#Q>CAleqH>#%s-IcAZ`<P%l>=m zU!)I6HyLH)X+a|X<HXZs-bK2bm?`rCB=UWQ%!iBD%6^RO|13R0dWv*Nx=^}U`YGw> zq+gR>D7{p=OnQU#M(OR+6(sUgDejf|K@#b1Hrm=BBRV9?JC%g}0P$*ZyzD1R=aC5i zA@O0^&yxLLr5A{c#Sdk_R{9g^a_O(7zb6s?kK#|VKPdaANGsEO42kr%l0IELOXlZG z_mLhXJyd!miFihfV`P7a>;uvdiI0hMWdE{QCiB(OpOXmpOL3d*cgg-o=|f`D4K_c= zlgLk7=~Jb<NuMiy5sC2oi-Tl;h3v1FzES#5()WuG$ovuMS<-)%ZizmJ={Su<zw&&X zjSn#KCWwh*l9()}h^b;*v4hx2>>_p()5M-)FELZ>D`MN$qyyVkhFC@$VmV@n>5?J3 zV?#6>!!hDmahy0_oFE3o$>LNoBu2ynafVnd&KBp2^Tg-G`Qifcb#bA%NL(y_AeM<M z#kJzc;zn_cST61mE5u5%N~{)Z#Jyszcu0)%*>X$}6U8JkSxgaA#kOJxv6I+E>?Wp( zJ;h#Prr1{;D4OrR!E-QF`bzN{ailm}93zeu$BE;`31UE;EKU_eVni$uXNbk(Y;mqQ zPkc_CFD?*Y7Z-|)#KqzVVwt#7Tq}MoZWOnO<>C&pLaY?4#A>ld+$+|Khr~FPHT#_e zk-yzTog^lUDPpSFR_q{l68Sq3^xsWP6MKs0dxh{hQ@XD>P#hu-6|WTedlC$Hq&Qj} zBaRiviQ~lyqWQiee4Z>lRSby{u|S+57K^jRx#B$WIdQ(YKzv<XC@vBgiyw$(;!1I? z__4TA+#;5XJH!gHQmhiI#Ts$1SSub9<Kk8SVxpKNCW|Q|e;bSS&{pgqb`raY-NZDp zr`Su(6#I$;#UbKQ@k;R;ailm}93zeu$BE;`31UE;EKU_eVni$uXNbk(Y;mqQPkc_C zFD?*Y7Z-|)#KqzVVwt#7Tq}MoZWOnO<>C&pLaY?4#A>ld+$+|Khs3x9)xVf1CW*;n zikK?46+4KX#4chtF-`0#_7XG2zT!Y}h&WWdQoKeSDUKG$i2VH$w##wicyWRl5GRXM z#gG^g3&a^>u{c|tE6x+26IYT+I3FPH5Ua$!Vy7n7T^F&Nm_}j^(^I;am?`!Z2Z}>T zxF0HgrFe}vQud>z$4HMA$H{!W^aSaE^knI&(jhS-7Kk%Q<hxj$E%UkJJn=bkJ_+{= z#Mi}z;vy3HS}cAbmWipHw_wfFR`Zvh(!Hdwksc{MUV4IbMB1C@&69pk_KTz!OMfiw z&BH3Cy?K_IM<G3N8c$P5=v3)$(rMBIrH4q5mL4M=ke)0(L%LYn%rg+aH_tHh2xxB} zVde?Y-aNs~1E9TmKmz-H=tTAZZKXR%_mu7>JyiNi>9Nw|q^C-Uq-RUdl{Vub;`7Eq zGtNPK<D41CpuKU-j8o9wIF-bH3OZT+RVV2#(wWkIrLU15DLr0#f^<Z>Kzg3E*N>Zi z8u5AkwCRVTy?)sAv(R2Yo51H9I*~-4+e&wk?kVl{d!}E5d#_(J{S~y=Uzz>~+UtK7 z$p7mKuT0wXH;AuX+VnTjHPWWPfllOegYc3_=nm4Iq<cwcN}GNJ?oB@e_okm<`ebkV z0cg_?!2UV;H_tV6ne<AzuavHmPH3v~BAFiPPSOLVhe(f=9w%+SZxHc^r02>0Iq46i z%cQqRmrGYm^S5glKYxeF)E^1mR=R_9FX>F_k<z23CreM2o+~|1da?8e(&f@Sq-&)Q zNv9^-^t2_Bo}SXZr1=|sOz$<)6Ql#uGo*{97fLUZ-XdKtT`O(Arw{R&@8?7KZJXQp zdy&wY(j%ouOHY=bDm_<vp7aOOWzyx+JEUu+4@tLeVdLvSB0YVj2TG5T9xEM^jz~Wz zJzu&^dZl!Qbfq+Zkc;`_@9i+YROz<TY0^EVhe!{V9w$9sx<Gn{^nB?B(krFcN>@r( zNhe@zH0_Z@dOAsWkscy#zK0O@<D|#SzCe10^nB?B(rcwZmadkrkv88qi1J7|*2dqB zgiezlDt)E2`949|PmrD=`(o*Z(u<_GNS903N*|I=J<i70mPG!{_XQ&SzS7>fpQ-VA zv^Z6qCw?GSh;bS}JBel-M)+f;BaO#bn6H$s6wSB^^G^83bPW{8h-Mtb=XuhLMKiwP zbDYK-Gk!r2lpZTa#QEY%@rZE-{yJ$K7$SP(hBsb#<HX0ZuNJ-jznl8uf#PU!syI(H z^Do3#E?q08s^9D-juuV74ELr#1{ceGhZv{+t&`YS93zIr=fss_m6)Xds+(x~LBxaL z<9ztzF<JFJ`OfiyyZ?O7-Q7Fb|I&Nnf4$DlIRE?(9n#a%(i{Cfzh_UVUKgbGN~7B` zEgr}kI>_hqp+~a+`A~Ui2KE0{bwR}Vk8@9c^YqC_{oY@8dRcUL&Wh;1q7TlXi|pv` zaCKs|ZKr6UQ-V|CcS<JuqRY#w{Lww(ie}-R@lMIyP<mWkncF1%&-USOeTx}eQOZ@( zJ%#YGxuU4;wvGu;hq~c-1OlnfSy8m;bOziw{3M1ywNv6p^lKxUh?p+*MQadfSyhwh zhEvxd^6;+sGS?se)+uUxV<Fs!E1YE&NY!i~lMvlw;#RaNn-O2fgvS|kqiFx9{G9dw ze}0gJ|0zGA-pi1s+(f6Ozb{fYxmk`WgB6|2P?8t&PmVLY%qc1JiXHC!@Gu;16OGeR zIV+r!7NPzB3Jh%U6sQdCuLzvvlw9wNY`^cT(EcBSJ<`iU2cLE3l*K+_T$#`2mNmGy zam3z@?xUB`!H<IPW_~#7*=TujY}=9b4Zrb-|96ub_<^a5l-;+xA>_bTle(Hfd&Ua8 zb)o%x18o}|c=<Dlnw9&vSY_s{93<1^IoGz|)Qt7foW0Qv(O_+Kb#&UHK<iNNvjZm= zW+g_G)5{8T_7(<f3#T1oGg(}R|6<ie_xm#T2YzCp2q-kQ>ClsNQ^IR}83zOZa7vna zW|OL&l7UT!)^*B9Nyjm~Ug>4AH|g-3z#=%zJUjSN(O_RjdEn*H1HOx#{0HbRJF#f6 zKk8qMaU(7kik5e+4cEr!T@^hLt*LurJRXAlvf!}rnuJ)fwe#nlXYIyWyC=eH;@x|Y zP-9)?%WGw=IUvC63E?$<_i9)#K8!zZTl_(kc(8lB$@X*9pI+uB;B#?y*G=9NUYL^@ z-XG7$Z%sT#^tix@_IYaCiI0?dhH~TZ6lRVLWMobb?o3Bz_xBZD>dPD!=$?6JaFbKg z&zCtg&@yv;a8>@k;IYR0ns|)Paj_*Rm-mWt<4XC6$5tB@1x}BPtv|ATnCG*Lt*_0f zs^}V4+OP^I@;N-34rpMrq2a0~nW?!cEb!E$DiBqJ>fn;OXreD82#-%1k4;fip2yMj zn1&RsD$J_rx)Fu%%(@Z@GvyUqXbn-U|BBYu%^3-cqI>-)*SArM(KfMSdGhCdMtiP; zi|&nw{iE)mQKU8jTM(%&^mE<OFb%Kv6*IqmkfQv%V4!T9_U87cK~_z4Pc)%ZbX&Bx z>Q>ZTewh;)ZoR@+;ET{j7vcHJ?+YWgph3Q<zc8!DJq)Ku`0Z-_=FhQ7h@R_ihY1s1 z!<^1+g#e;IG3nPJ>5SzE*oRjqxHmFr>(1}Y{1K+s9m^)aEbvZvb-dfB-c6OynYq5+ z%}|B)ya~(ip2%2gi|gi$G3Aqhc=GRro%?tEDZ0Uzk%OvX+MSX?_8Dt7)X8lfUSVx2 zjSWT@JbbX2^qr|b)NC&V2S<JA{Uhrr^P*rWOJsmbr25}B8|5auXTTB5v~G@lvYh-? zun(_Dh&{o)!V&W7uXm(JEG@hu-kqqtmWP?wui?!GWS=u9f2s+{?_NrG<_T-#-VHNW zv^TyjKE#5+AexGXTo_F16HG?4E}WK#9x2ezDQU|5wa6WeBB8g8oa8`jr^L&63+G|} z+P5i{<luLOSt*6t$<buaP~uE`I->K!^W_!OWcVt~N@kV&^KP)!$gCCJfR-9~vM@UZ z{lU4hGJG&CiEF*M*xN-Te0{Q$od|ytoE2jd=R~@j&{7bwarTHp#$$63-fTC+!a^qc z<iI<B8G_z3bDaEhX+Fr`Cky8BFc0PV(GRAWB17Eq=m)zX5SQ+v`)tT~_Wowm%%U#3 z0Z*S3`4)AA0^oz|Hi2W4e=ooD=?>+G{FuUtwsEcdWY%ze-qglTAb1z5-+k1CXYBoX zYplI$e+g^<o_c#EC$n+Q2hRzw@Vi&B&6wwi4Xfw|Ht|R%4BZjT@(4fE<E}EHq(oC~ zow=7m+lRg%J{6n(PUF*NZ+wb==0qMxn6|rXs_w42npo^y+r?~zi|AT*UueM7QG^^l z*c<UtOJtH*9>3E?vNe6<M0%JQ(9$r1nGSW*=Qd#OqZM84%h=>Z9OGtyFLSaJ`4CZ< z=dtO~)=nf9HVhmCXzY2L3^WJVYYwp@V}_EeVY1kXqK7;cSwPLO|BKe5Vqm=q1q%nZ z`v`o)g1r&e-t)YeGg<dS&jV`mIqSjpU4b`Qljqc1`|}>O*0#%XB8O1OtjuHJq-eN5 zV^iQ_r(^&omnPGxnLcOw`Nk?9R-L>8&paV;oAb~qun1QfHz)Apa$m-Q;0{}PuOVEf zo4p(By(0r*eUCSxF`_RUg_fGx+R6WfX)%H9jxF(qz5YIyiGMNH^l@%BTzD3me=qU+ zk1n?VFr7y-I**LQPGqL3lBRg<5J+gMe<=EkM_|V4?T1wlIuclzN`qZ)dra$x`!c?A zBAtw-Kf1Y*^`u=W6+b64+yG^7npKm&y(m~yIIJcEE%F58hcOv<rpY)DZ$OWLhc4P8 zeVu7<m}jkRm`)XYL2~cZw#O9yY(`u(HMYex0ggz?3<GUxTV1i&NB<j+iiRh+SD-kp zJAd8^xzR(qsAzb++ugHg56zI}#_OVAHsSc)W~N$DfllN;d<;$Tp=&z8;vV47sC6P^ zjUjuc-7t*ZS2!#snx4L{*gXptwv$}KzAx%`TQevOU?}6dc-zkv4r7`4>|^9Sd<vfp z^swvD)?<tVt`9nqWTeIG6*<78S7g-tQLeUA%z_~!_NA|L-=%}xxWb&2=zio09Wxe5 zRi7M0aV&G6pydeP5{xx<%+kZq3>oPNP4%G_MEW3Q@N3h2qRZ$|jGO>GFlGrvoqKh? zkw5PTmfBAk8|sQ};W`n9joub{NOR2)O5b>1m&>WYu2^LpnMtQPblSr`WW1Tc66$L+ zGM=WUK+biy;j`^$_<q+$k?O95Df*@KeJs`muwc_YvQ)V}!P04s(s>-ti|+Mh{OUxe z7{>#SYM0adm?Gg^klX5N_E&gr6>?^Z6ZrtU44Ef8k-vgA7bm*sGrbsU_QM~hWXN*W zEx(wOZws6HcFQ_qaiHCL{XjPqExV*1pxUi7v#`OP`sWDky?)8KWBa|O!JX|eoydEp zT>S1XSgFxHg4X3d*mz#;b2y!8vBk>mf7LY}Ed`0nMSa**2A8;Z!`QmP*kR{OUIVZx z3_k82wpnGZJ2Tgs5;1O2^GaR*ooq-xgoUarD#7Cs=UxvZ^c`$_XxDMkc-KXnRr!Ag z6ZDE$Y2a~*ADVfL6B&SFcc#Axi_GRum}DIvk2-#vZJnb8yNDr*A4ToWT5C+vB)C;J zFLol=p~0Ou1WZH^%Azjw+%Z43FjUpqp~s2bW5V;hbKwr7xBDTTWUIUC?Vg6@WVUqj zb69ii#hv_gd|ZNmb#4<_qV%Kt(BAkO1tpNNCa??L%tcP*2{v5we8jsu4j|BBDePT+ zOJE-7u7`;kk-1>B-E~8){sU>SwHiXG^`+6fA@yEqybB{VJUl-6%ka@<hi2WQhFdha z_e$j*<32w2sd2<2*^N9LRU{X{2qSXr)qE^G&V<l2$KDjfDEpg6{oeFnZ7HA(Dv?@b z%4GvVvo*^-cZ^MvU4=|iY(IIe(uowHB+yK)V?98ezdAE7ZE);8KyNTLH^f`VO}&tr zk5d{Pdrwgh<JfN<Z?)|eJ#s!DOt-h!E*Mh<>&HIQUQFjQSp(wTA8IjQt1qp;H#qcS zNn<Pn{O(FPtgotB4eq=?f~8tCAi<pncT4cO&Rva9rfV}}qx*MCujRFI7eHd}!es47 zJK{Ld`Co`)nLE?km^Rq;t8iTtXXX?brLRM+q{sJuaK^d#HtY%EWj-|6@cyR3D)VeD z!9HZ1d$o-O30{KA;=tAyCbqE+!J}K4UBhPnRW!TCiL}DA;XSxR<A*vWTZ;zl4cGc| zvqSq^PC9Nex}><x6|crM?GP7SZTs|Ox8_%7qfsau(dHV3654-U;7R)b^a%eS$4ZO( zbMgVdoU8nmjh79Lvo;^%UYoJiiOfKhnTeCWsOwbpI#LTCEHTsN_}yH@j2c*Lx{hP_ z!#~PyeM8rg2hZWGngsXMdWWd{N|uOq=shK0T8Hs&?LLLb7Php(q2{gEA~e6d8IJO| zJNawyU>9BGmEAT}F}FsJdRV?hv$LhWk)@4#JqDfL2MD65A9L^K<0BUM>Fba&)Xobw z1(@!mJIt^ts2^eT&-QY(#<pfSLyk`HoN3Cm5Xp>p=X*|=mw&O6vJ$<~Jb0VQ$%AkL zQ#63+{%FrmRoOqIBdCpwE^}tx#&qYW*u>eSHDjVL^<{h(9fr2@Jz6|>hP+-rT-7`? z$(jBRQfTwr(@fKtF=RU4U5Aks`3#q#%S67N$g2n-)C*Iw8b*?n0-Gfm(>RtqZQU+G zSe#+O1|?HK!^Z7woJoQIr~<#$v|-K&_(B#>0wOh2ts(G__Oq0Mvfz`fPTx*Zx7Sp> zE%xOm*C;ISQ9ch(FB?+&cK6GAhbZ_bJ%_dv2|UVzhoiSWM=bh)=g8|ojziJ1_~Ed? zbI97h%yZ~PTWTF9m?XQS>)j&e_MTg>`#RAkG2XgO^V~84KeOOi_g(^uI0PaA)@=gZ zau$?`cG(G^Ie-7d^=d~`z23sANoMQZ`t|Brw%R{NscXHOcWdLdY6UA3&mFe%ijUsU zFe9TASp_E;9nk@JYt>KHmb7$8Ufc>!VrBI!(WfEpe%|Z9w-RlKWeoT7)Su^VIbs>Q zlY`!LIN><$U)&a9xi{M}#_T4%e8d`b5hr{j>aG2G(~n$(c3=%)0>U9}G5*!Lt?(yW z!}4rcL2~afx-a(bQR~0x?rTRxzZ@Rj5Ux(*u2EJEHl|ZdSzOa}Xz0MPxyP9@3Rb_* zpkv27CCkyo=bCa!O8-2X8eW+c-8kxo8*^5`A#D3()dWAwIQaf<I1lVB%u0%;A~^1G zx68db{qq=hHSM0sWSb4UBn!TcT*l^DJAdA2Yo~tYab|BaGoV%dh1S|zg>i3)EBkEF zDIMB$sOj+EKN;o9QRBF@zD_>v(m!`E2i`~Xu5$<CkM>8f+%3#WvP)mKNbaO1uF0y# z$WWJYFq&1xcNHcJopMhp%&LMFg2o~fd$rX^G%3@9P(B+`J}iGu)M}$EoXD@}gq;%n zA1y4iMc}*4mVsTF%>&2T&>RyQ_Q&Wv_({wy%&x*`#B(}r{INMSxXibho83`VQ+87H zr^XSxJ&-4a1vl6;Vm&6=?f-2IlKmdSLT>7u$R+%X$yGyRcOG7V{tw+1BJr~3cTa`8 z`ed{=$#9Q_8EP4hPJjW{k6cdiTuS4Ir@b@19I3Gn&{#|ctdA4nBlcN+h$q<)m%=4y z?^tENX^Ln7HU*mwJ;j;+I2Tj(m5F++i0gZ*lm9ek6R+aMW}K6M4L<H$8FC_j;tUv> zAMWQ2W-s5h;CZjXJ^@}UxQSJ^Xt37$9ot7ZTVeu`sehUR>VhPh1$?ACJ91OqZJ63* z_gGkYZSYpx2ED%RWfURWpo+#Ws92j${z3G5wq*Ape7q%D0|PyV^~HgEC!8a_4l6wa z&a6G?^AH~5taJZj1F?;wrFHxO!%@<aN7U_|Flkh`&9U&DKFsu-9G5Cl7dG(tyjN`M zy&nHYGoeoKQr{VI+9V^UIBYYdAmH${>Jy#Fzd2p<T4x8FkbN*iCBwl9PNW?RVp?@q zC;uCGLWrz*cQXUPjD16WK#Lj&)ZPa42F#Q~XQq#(Wp?kpMaY9Do&@({1mcy_%x$a_ z<II~?^@m6H7&m&(I2dsOYn^!uvK}ThzuQYm;`8c6PHCL1b~ah9tQpE7iJuxefMoX| zn-3?4d~!Nl=ifCp>txL~H#X~N%|3#e4U9)O(Y)S-flZ?~y1tB-jjVX}QiSO3b9D_i zE(>#NP^5eW??;&*^$2DoEbEkeoYC5|Fa_dZ{~B_O*-YcjML#peuo7bL$RS4hhZ-Du zsoBZ|(_wrpY8|p<uWNAVJq!yyhkiH5REE#=&9;<MnAtY&GR>>$)YvII^xEhcySj zQ`id3h=DZyh?E{#*CXJOb-j<(YexrX=9+qEUR@71q50j<e$xsVvwdz&J3R|2=SD6T z2JOs)qs`pRR!)RJDD6zY0e`Wvlm81mng@ZkbE>V;AGj7UP2m)q$sP3uri<_GZh!$d z>z2X3agC)q(>K*uZZGWC+D@}8oVjxvmsAW1JhG&Q!yiftsW7hZsCSJ5`>@`%_i$W@ z1lSg3T=(%@vnFTNyY|YBOKw{_#`UqL7`fY+|0q(1C{a6g?mnyoj;xliU}9r2rTPUT zJu=bHn1GpR<6sdS{F+l;?7jw%nW=%ZGEcVeU-D-nccyQT|GnOOY6Yt6dh-n2jg)AV zZs$zD2;rO2<9$?DTy!Jn0dakOPX2{(W*3qdz$C7(6FCu1%_zzDTahj%7&{8Jn{=WH zWAn}jcVg{{S;TiJ0Q<=DG)*+sJ&5%UGQo0ixz^Es?@qL{&=l_Xet?|SH<Q!o$?vYF zL$jZiUH|^h98%$na2z}-9F|m=lZ-h?;k1;Dt${Yt^;n&9SZtZwj*I5a!GA^Dn-@Mf zgu=JyJgvev=-dxC=LP1W1!b&vBC`>pePMM{Y%^ZTofP{dV}0-k&Jea@fNa|d!8HoN z{TQ>h@Nz$5D2mMsFOSEENbE1+<p~*^o%~72Wb9%1e*>$r#c2L@Tq)mY3aq~wwp#?_ zi!Sw>w|G&<y^$`~JNZ*UF1ec-3wKDpJOin7Gawtz1J##DDko*89L#hq#lF=<X|y+` zfsFEXdwk}}xhLBq`99jt7D?mt7Pbf6tI~L^zBF3J$}`rZzJoPPSX2AnaTT&w(U7&k zdt7FkSCoyibzJNj6-O=-9(%+Tl9PW2GnE_XvW!dtI{BQkySL*Hf{jLlC~>~Hzzd98 z7P>hP;*PGQa~~?BXD7Uu|MyRjwXK}|3*arS%uNGqL-F4Ca=t#CbM+id*V#nanY2P1 zN7G-ERf7!TlQ~h6n47B6;a6j5-}yEjnmDP-Yb9fG4ukVutc);=H*@&<9+`Wo_L0>D z{Y#Dy3+ub$x9aURNiX5B;4OI2m(<(aS$gmZ&d|AG$5b5*+=>MA{VgZt)?_$M@Wf=o zgbVf+KD<iK4&PbhbI*s7=?|>Su5^jHpm}X(LgV~AbCi=G$I!BBd~oM-{(x*P2I@@S z?2BZ2GMQd{CX(pJL!#o2D&GV)y=lqVWhok5m$5uBq39~}zO|@-9m*WjX&gjCZ?nQF z!D=JyHV^G@liM+Luv4IK=wRPKAI_zNDbc3kl?mx(CT`95%)$hH(a&pkHw&h`8rQ*( zpOf3SGC8m!bg(&+5$Mdud>}XnK8;)BIkJ87i^kkOOEIjf@S?sZn*5vav3@q~BN^*1 zB-AMx=_?w7sXh{l<=mRAD)xrxukaTz&84XSzcbrRI^RAiJfj<)hOr=WGiM&ts{FyW zg~8;EVD&WYXH+9oI1#scU|Ld~ZI({Sb-to|?A{aO@C}XbiM>%ctt!7R*cmU|GqS1` z>9khx56|&gDXaS?`Jz}~nZzIjf6+a5GsO$R9mhJ#uFC&B_>5wA>U~EO>Hqg4R*3GI z@NF~kG_uP~IQhdFqREJZ8f6PmW{NV?LJuUN<L7RB#uW)pq#B-(r_jL;(O{($c?)v& zV7Ne5vE@?;GgF+*s>>rHg*jFE+mTxn`hU-DLeV{FU8tJ++}_VXf>k)v^gjm@Uv!Us ze^npIc?iU0HIk3IRaR&4tS|DSv^T_wWTJlA1b9fyt>q+$<rI0Zk!KDb|JgH_qwdmr z&p+Z53O2kl*)-emw3=g`{H-*!P3TybdN!L-bZBy7IIH@Psu97)xwqKR*u1QtKyrdP z#(_|dG`!wacukU%&o_awN10tzAD$<?r)J@1p}04rc_w3fmm3sL<V+Z&{^~Hhz(XF* zu5?pj!u^24>?EEN;f`EjWVkjVa2EDD1I^OQauD8%(EYwZ@MovwgoPJ{4%{Ayg$|5g zm>H<VDTNBNe!%&)n*#kZ?+Jbem%-xT+R**}yD=sPKMLLF3oPaYAh;-JMX2{praucV zfU`R><^-RG{e;C_?gwYX{(j#Ch8HZ5fBWRa&Ap2`Y9gn|b58M!*s;Zp|3msm4Clnb zj+{6`#|@i?rG9QZbd<f82U=*5I3@S$QKp}{0Vij<{xQef_M#W)ePZxZ?(B0<=lEVH z1}|(Z(zxN=dw?%^MtGSY{d#N;oSzK0a1<*%YSmuWJ@C}1^fJT{-G}rIM{Tlq!a<&r z7Lj#<Gc(GAr^MQO{mG?1?7G7E#Ef$Ght1IM^-c_YhX8U`WR#D>QP3PD(mQXO9mV;= z;n-j)K{D~m&z{_CKC0`coakD_XY(@>?UX6o8eWzV+Y(+DANvgHW`1L<f3qKELc?q; z9<!|`qoNyefVC9wB)p!R?;rwINL6er(#P^fgBh;r+OU+2Z4*z7T?}iRpK!kfU&gk3 z&#`Y8?B-&VNfkC(A23<VeQWw9pf2meKA&|x@$*qAD_FoJV_N{lWafS?>?v5^a=DLT zNJ!vhBtG^eW*o8E%n#ddR?@YF*{Ns-m_nv;r09inoHbn!WNgf9R@Amt#@7?i&G<Qx zik<hLiV-#<Dqy{3Yzyw``jhV~vt!2rvX^~`W4?^9@5OfLfV$3QXnEnXP#_jtu3|Is zVJt$F(->u1VH=##3iQf29O&tk9Agf1EJMxshh{d#4iEfiHVa&u*(7lKZBFSjG??2k zNUrw7Pw-==pA7@ABT}R1n#hac3R|S>(Zs?#+b`SMG+c3U^NrR|><N^=IpYvm=adeQ zkFLdu@nsb!gm+%td^x?r?Xrp_^BHY4!N{h~mp}MDcaNeQZ+mcOUHr1D7PmdPK5oZt z$HtW-*xRBb{5+}H3-w{1PsEQ+rL_o$!ES`Y6A_QkNQ;*cw*_1`l!qw^oWw)<rxdoz z$W9L6nL|UL+_5k|qc(7S0bhIY%|d*Xw!xhyr}AHTA|_ZHc@V-ye!ji9tg2~vT`0V^ ztiWH?-(P?u>+yxH;6K_b_L5iMrtp(TU~EQ|sf9T75$IZY9A?TLi>~y=n!|NQd30Hz zC1$fY&2d}QSJV%~ZBn#p^ms4w#`7OrnG7%0WP#yzDLf`)PvA5YUg0qeaSu0%8D0T` zW2&&vn;hI_^MZ=hd@5YlB|GyBoFK=^aW0ARpmHZ_3tGM@U!3|raCqXb`eXY!i}~_! zMUI(}v%mdq|AzSuTS>1z(~^U|T#iwp{XQo=7at<qoq}SJJq%6+raBRBeifubn^!r} zeK@+DF)cZ8lT&g9I*j(A{WxpADYvw!Uzf~y=V6|A;sb-HCe<8m#K}zr5G@bybXXI+ zQ0@Nk+7J#mH{TduR}tP2Dj4L$AwvXPa9qI+ezsjk5PTNrC{2-=0%4em40EkH?7+tW zVeT@uyCG!4ENi}zCFw7~B*VOqyBdv(=M@`L6Q4JkDT!xF*7(B}@$lGuIUB=9m@cbD z%4!OlM$2(~f;Sg-CLpB<6~}gX2ondwoe~EDz#qon^=w?<o5r<1glD8=u&?0qcw>n` z3q~+2MS~KsSY5{f6#LD+m6arQ45t40{G0Avtv-2pVVlClXl?YTuH{|Vhbs<eEYCv+ zHmI(1Ei!#!IsOFtpz)lW@lEg;)NiaSx5on=osz3iALxes%XTI<--s|X_S_bY$7&j< zkP&%{;8!O4@Q?mj85{m@=IdUQINyB&k%SJQNj!@WY!ddQvezU6M>GjF2&_i1gt*Zc zI)Dc8Q*K#Nf72lNmZwqW@ttQEcrW`t0R_3fBK%J^i-O}()@ThyDV#sWAy5>2Kh$S@ z!F71naO8@O;wj84_~7|4Z8y2G_1marY=GxREknVft)T<(S_eaOv)JXB{xYSIFBQ?a zybZqT3}ajPpO_!ku!h(8ixO<AcE<mvx%ht5T<{_p?Qd<k%ruxQ;NXv1Of#>wV6{_l zrN3YZIsv>wz@x@y^P<;myv#D^8J;L^=r8|k`#BNq=Wx-8!;P9yFEpX<XhMk%?FaLm ze*eAwM8Ax!)PnjW))d+=7Sp&7fEz*^csBtTIIx!zxE&L)xB!+c_6o<5yDYff5!_vL zzaMYPF6M*dlw6H#CBgRfGp*W_bI)eOI>>7!gK@0{tt;@YQ~J46T2|#^3n{ik`8SKx z*t7NfALttcn32=-H>}^l*EWFQQUnn?aCY!1T<yShk2RsmzPR8Gp$GgI1xNBl;$W1y zdE;Y`H0sVrOWg8sgX~FYfMwmRTOsT^_zZlizW`FrD<4B)g0Rd@j^_5WxykWwRHav6 zN8RUW`d{vIuo#0lT<^!Nj;zed#lh|A`!E~EJT@-45d(-Hmpgjla>vTheerys#C-Pi z<CaHz-12w}E25LkyvyG5V1MzPIb;)CiV64Q_T#GG)Mq!;Ctm%0i5(>D8bz~qM2D5z z6U9!+{k~`|>LdR}RK8QvrZ9VlSrpkLQQ_KDzTY#KH*Bbl-?6Pg{Ctao`iX8e+lt|D z+n2?fY~JaVY=|B-;e<kGVa=4VEI%cmH^Tz&6y;$&K<s}t@m=eSd|r^f%gN^ufbpkr zn4&jlI~jdPEDccs8L@oRzaojz{g^2^rJJi3Vr$gA2Sy@>9Ea~e4VH(emB;6e!bu2t z>0xT#8v64F*>KX$-4AQ%%S*Sld#>9VwaYe!l;z)s&!!o=4nB3AW&(9)1t6mPY*XRp zI#TPDX6<4^&R{~=Se%lqUB4{~rzFJtat);roNZIs$9;n>3CAM#n^TWFqCZvfbp%ds zV@Nlbn_M25I?_edx)_TvqJ7*y!``M5een%QgV$hr-qc$79(c#R+(icau;|;v6>dkF z_pwg?Jh%&8jBTdB;DdQ`IK<#2#_`ZaH~KSj;DztpoRZ7%WDoX7)&<Wn%>+*|n@O#c z+X?eg<8GzgMQ|c29(Tz~F+*Hd)ePIav9C}|ucMaWv=4)Pvfe3gGGU`D_&1Dh%oMv# z^L`KQt1zp)t38qU5ZrUeZH|nPU7o7sCR@ZB@o~Nvd2_FYxi^0_t*5m+5QS#uhuTl& zq-h#<gpxCU4UCG`bgf;0t?)${%G5vQzhW9>GZct&*&??WOXKUnX|^EZQ4W)hwO0-; za!+MBd>#B6Lu53~Y`&Ud4LPqy&KW;GrsB;9`gpqw-Nuf4H71jJZJEJ&NDdEI=51r% zW*SxHdtg2TwYM5#uc~0*#DS97!%pc*>_?x6D0a=h4yG#R!do+B!bHH7|LjB#m`n{| z2b}+v`8*i237ur0T^1<|#3KhbqI$n99jyI}ZcK1yvFEdo01x0>8-LM_xQW06v$0BJ z!g|=mDnNc?n-n!K;<4aRYJ=H|xYfyX2k59XY64@~eLMNjz##NM0vh9Nd_o}=4Q}e) zS9u2}W`4jse<o85#?6H>rd61W_iTpt;_^a>Q+lnRB{B<#Xu`EzCz_Y{_M!e09Kd12 zd?{R=a#a6V6CGCVMCO>*VEf151*UJTIjV2OLXSPoxkvPhsN#XBV%uLf?yusIoY*Sd zuF1$j@V!j%Q}7NR4@-Vuqk3S962&b@Oh4`EcJzQc-j417yV9}8J@5M)Rpk@L^B_NO zjl6-+*b2q6LhTlJN9Mz=?fzQ3SE1gz2CMNxIzDfl*HLnZ*&6!uhI<_)$HU)tX20LB zJNfKEHBz`gpond7XbC+2X`75afrlfvNS*08@N&EwNekEFvc}2qZ+emHz^Qy=kG8nk zDaGrivZ}Rs2@u<4EuH+e3=fX&der5~Ih6PUl(<vU1089No{h)g%jMB~-14izz+?s} z+->IQv^HAnlpqxkAJs2EW$Uwzdlvk4%`v6)K+If+vC8kvng}a%OTn5ThtJcbHIjjn z;{@GjFVTF5F2^YyVOnAnCT0TM)jPo(m^gC^A1824d+^?~Vd8WpCU^<;#Z;AwgP)E$ zV6QSTw`^=71#vm4aft?=ab|2p#JEReeDR!rY%P+Jz>>_vfs5FiD%N`-ienqpQ8qje z=o*(|7qBi|orW$Ft4b%bj|~WWfTou$#L)<^m)r{rT)Q>hps7+^h}jCWqDlUYAUqB; zZg0T2(KObY{Xx;?{)}O;;CJ0{S2Bu?6x?~n`~%ysXpXksV&AH^#iY%s*Cf1F#ARFD zN?wjSbV`ajpWqz530xMXY&5f>%@z6f;<*#~4#9A3$MZcKkr18<z#Ts)GQvcN$IZ-k zg3V2HL2dl@apTvZpzDdY!GXkm;gxC8a@&QP_mfCcFC<A_?m0E6)@H1EbM=oMAKNiH z(4{yj6BkWu@NQl3z`-;e>nXZC!QIQ|peuvU%#p@4-u)V;D5O5ak^_rFdGY8Jzkmtu ztDwK!K)XQ+xY`$(7s_kG`Jt0vVyxL`zK&1kh$qf7@-SD|Y02Sf$%ye8mcy_V<R`=4 zugNjvL;O<q@%DbrBtLhp>u_7ri6r6!Z?|xiScLLqKYR2jv6`zm<3F12eq|#ry4H_n zL*Xzi^b@OI#H>EL!u^0&Y&jS~@>&;7N^mO?4@`<C#nTWE6i>qN)Ki^1tKKn7k}p(? zW4qCmOsbwWDY?NkmWPpUZxHzi&M=6W`;NSuVn>oZnA(vffKRASWZv(dg9yB)nPtMe z90O9puuq-*ou&`Hkr_RzlgDct`c89s0m5`HE2_@>5y>4%%`qqwAM_ZZeT-%MD9QTt zw|yrkf=5n=`(UpR56YUXwa5`R=NFn(<oTipBA+|?H=9!|?a)eXlDtW=^YA?O@}@@9 zT^=_vqXKTJ?ZA;I69hZZf~?P+e17?pQ^K8?qw?iEoQmKJb9Qh!-WpBj`1)}0(!V|s zCx4C!VUT?z#bK!yw|JVuFkFjkJeS~unJ^%P&(LikG+gG0CVA~(%Fm`9@NiStAloD6 zZ9I4DzKlQC1P3k5H71-+?txIE^-j@rcOg->_Re)DnBbGmqs0fbg?j@`F!;ZVlU_XZ zQIyaunw9L{i1Q2H6ktX*T-Yf9r-0bfK!2R|DQE5Xz{<Sju!R@E5N~Hj&zcN3Tn(wk zwVC^9HtQyn>*mf3?r@sUI61g(DL&V^JkPWg|LWXz{M#viEqks%UKSm(AaEjckvQ8H z?D@FZt6Ih3&Ke%~r`W35e>(YXkWqVmEt%zEcBPggT|7r|Iih9-4Dv5U>yE>|NG41a zuDRUql%R2$F7QS*uHUqa=`&C>$Urw7!Lt>FdKksxMf~oF`f5W(X2I0u1Ez|^`-NGT zvvRvJX<2J|Gq#jIx#&aB!danHQorc?w|%5-%fe1*qd5=1OOAb6A2f)`=t}An@;Nf( z{t01P6C|RHChP^22xrz#M!ATuj^f-GSR~o%kI!|xAuN=T?Vi)!Qy`s^cJ)ijobM6V z9C%0mi;;gk$DjSS5`Xg?I}vkuFKY*OiBMfmq>9zKCNVl~OJUZQXjZvXGPy3g8k=?Y z!Ok|1*T}=aeX^&YZX@4|$P2S}bj?y1z8wiQ<)6;{4BOFln4YEO%#gXvu-(0aM{7J! z=s|f)%6%RVew&5*Y1~omFqy&Ul!vpnV3wL}PY1bekQ;A3#rEc3iouHQ?Q1N2aX4%# z%B!wxHdAzrGjkmb)7NpM!^yYznFn6cwD*G{+>LSa55ptgt>FC(@5gLoRd9nldc6CX z4U2iHA4Kl@!E_#zV8uQRPwr=Ya{pe1e4US!def_yX)u;a&nib<mW({CErKFiaDImR z9El^kf4o3HqF;6*A!d0JPOq*-RmHhu+2G7@iUwzj*^DT?-5prkS_|}I=bQ59VA0E6 z0gJ{hE1oGaS8L2@lI*@<9GFa*O@y7_!2u7GhHG)_jdwCkeLulm@dBF)-RIsxk9KDK zCjE?t3uNyDWY3&MWW_~uYMjU|EFtx2&zTly`?P?6Xwe|vCUPF;A-M42md^AH#AoJG z(LFpF))e=O-f=s5hB6BDI5Gl%eFVXa%rq23%uwtI>^}~-`;e&c{+78PA@OE-d1oK$ z67L@y&(VLx0b@4;3+3l)=;*RoY1bSz`%2{1y_-J&=SjR1xft#_563RTVXTP@vo^9H z;{FZ3R|KPNG>F0(guFF$hU-mFH0pOo$?1oY1Qc%v9LuxGLJJrMGuuDAai-4stp=F0 z%<M@E6SX(*{2KONC9FbI^2!Ob<&4#Vso~nhNuMJ42!dB3Y~79Qu6D0OtL4n8+?-O~ zZt|3XJjGs;DblgZn8wp|7M{bRoSKGb=QK?3d4*_&Giw5JfZLO%EVv<!C$|$sqtfVQ zQfa4rr6!eTD+XOMUm-US*WyCaFNh2&UC@xy?ntRQii8at+w&nMP9%oM)y~3LwdQ8g z6nsEKfTN`tb~rG-h{Z6s$9dhzAJuJ{nKa~i+WI#9ta<b?Z8sC5cTLiIU@jBg<CHA3 z%gCxGTqRGRWb0{%N#1a~{>Nc5`&|YH=)Um^qUH}*5JUOon<~@_!d-$XOnr;I8U^Qe zft&iq(3d6~>fNB<t!A}o{5cJ_Z1j7a(oJTVsoK8_?gybPZ3u9`6;HkA{wEZ{f9S4{ z>ZWdDHG0b((^DlOAx_CC9Q;=o_z0uxjs$z}r~YWa;{ww~{D=LH*7ydX-{0@(oAP`6 z9m$BfVZVc~x||Ykzk`cJ6wB}Kcks<6w-U^LhuKrGmyM#{zQv!seG5L*-o8aP22<?C zq`No5@P95rbG_Kxx8NQ|{l3NV3`YCCN%(A^cRm2ftX+tk^;Z|zEyh3XM|^9hIE_2G z<~vaVyp#05_hEcp%FMKJA7d}zZ7Z02Q6ZRkTN7K&cOBJlP4F(F`End>O)z~kdn0CB zG}r}&12wcp>;33gBg}oL1bdP%V^1)}<qI;7Kg{UYPUK}%U3Pl>i1{3khYtr%Ymc3@ z17(ub(v%6WI&IAO*<N)T#rM6q>U5N^q42f8UG8nT`IHgeXLdKSH0;2g&&RFu=bgZv z&*?^SB{&ILFn5$<%@C%&W0jygR_Zk8<J`0Po)f%Kdmqm0a8QL;u*{g&_~KJ=B_b}9 zue;z2*Lugpy^6)W|LVY_ws>ESBc)k5ImG)<oW<5<m~Y6+s>10gd_`8EM|5M?@&(v8 zK7{FzQ*tl9J`bBWIOfr(a9CCJK>apeZKvE+eDzWKKHQJO8RN#saf?xQ15tMHgVs^2 zt*fuT;igT|6n`nk^tg;^ICRG^mhfiIKRfwB6JvYCbHvK9eeTVL!x&LU><L_Z!c6EV zZ|4iIpo7($cNPw-Ha#CUzaF$}(bal26PyJ*nwlA*XX-?Fd4x$pzZ&OqBteqPk!19d zg*g?aoMq#pXeXE#W>>(lR9B-;XfT0m&K7wV70II;%x*ad{K(dwRatZygTnbn+)}bP zx=`|sipk}r28Mo_eWh2JQ;7>-bf1$L`;v)6$aSWi_%_2SnPjTM$=_vGavauGPUh<y z%y1DyZ-<<WY=xZMiya1(@pR+b4ubjSGqOmZW=?a8^Dw_q6BUVXMA~QWmtn{)#f+t{ zPd0p?hM3KyH!`v*XJQql=8n{fZgW_4&8ZAetMuo!w$;<x-D^e=8e;F9_kwuEw9fqp zK6%N>M=-@mSQH!g?M!{!q}^c_ZcR<fwC5H%8)lq0Mmm`f&9Q>V2SiqiebKmRYd69Y zMA`FNdzCHQD9&yUtJJycN={>J{hefM>uM$iMT>cBT^}~VelYO%{qS-U%@M`J256RT zm?PkB)#LDsQvCp>YO{<v(P;<(L8Dc+G4osG&wJnI^6Mk;S}J@PTfsw7y5YmPCUp!9 zO>;y4<sRmY_%QBS-GL%t3J3d3bqi^sXLWglRR^2+$6?iV8jBYR;QZe{f4$tP^%f|1 z-j8>~tRCakZ~Du7>DnZ>w|lu4!!e8@$3$*!X5n%vtgxE+`L`p@Z(jE~`5a5&9YxT` zJ-`WlP6a;I@Du6;IqJ-0``oXs9ZfpXB;Ng)CN|d{ZPwnmZc0-r`?#+`{x%J0Gdxav z)OM2-`30FX@AOcg3lM-Akj>PppQ%wyt*VZiTH*HM#fSs7+6^tkmK4hFY#6bAxT~V# zb7nmNhwi!cCO+;5EJT!UJDC0N!=DrR81Bs&Tj}JFL`<dFtHB~4b9OyR&dd#{fapG# z`;1;woAnGUl;5<$mXBeYE&q{v2iV4Vf)4Ix;H&*+KIA?H69_zK_Wg4HBXqJHf2=NT z#f|f<Z7_TchW4%R&s>G3!>rhiAb7ri8dj8md3dF}7Y~v)rC+rdG`YsY%^JMmzjNQp zkP|T#h-$}?qThWKFTtQxitN_8pK(@>^L9+Zimhg-3ZR5NqlGYXA2Nx;d=C>$^H%(? zG;IZEW?QS0-*RF{V7s@-eLOw0wXN`~W!7y-9=G)JZ-O5-HFVFX+NQ>Zu4*CjCnU%V z>0@{?>lm+Z#Qh>}OL_U`#iHP9yNVp7OGRw<2s$GREw7yoE1nz7JhNbWlKPIe-J}!h z12T7v)}n~<{FY)vjW>*zU`fDdanRvXbEz!eeT61jm8P%bqZRKy4inR9@s?x5c);BU zo-+9Da4-YOLlb`;P5eJRO-F5(yaG??y-K?xST`F{9y!rZE=Nu9ee<thy9uzxxKr#z zUPFr5SLW|Q>9Rk@$cJtiO#w$Va&W`x5V~hx)4gX0tJ=OlTJ;rzx(q&XhYBwOo}t$P z*z-nVZbEAg;l87jUjWn46ut?_!zcDE1Dcke#zOPC5iU$IpF{5JTgn6mdXNQVcN4}y zV>Wa)Oi<jnp||Sg4uwA?uM~?(HV*8$_BJNQI>S91!fTGFTJQWKD0B=B^GmEZ%#Ee` z`{apSg7OR1uv)aQ<Fl&+XR*s-Lk(sg@kWa`yf6p-Cirb(cC~$H-n;SKU<GO|8GWJV zZ_3K!Ut$KeJmY7S_k0up4#<12&R3Yvc$4~m2FBGVY3YUACiXJso%}|hiO6ki7N(>W zw^BTWuvmV<O&GrTW}=SY2X`-M-;@OJv5mOKek+{brQ<CLVotNyytw2mMx^HJND(QX z2E5xguVCz#p2_44wx-r_%wzrD4Q~5|xtNXOun5{l*0&Ai{^}QOP<+cBd&IlHZ@&7{ zyTAXt<$b<a-cEikB5YjdRq<$_xt(pXZ(|O6nSy8jk0^RnGfICPN}px98Nn1cD$Ff3 ze4Pc{Q2J#VKL>X-lwe??_nv8qNdxCwe_VpGhwwhm)=57UkNJiORaiR9mg#ec;S&p) zRr4PTFae#cc^*p5E9P6bAiQ{bIig;UYZQn%p;J?}6tDcujkKT8&T%6xW}YA0N4G~P zdf9L>d@_8jC-6QsT#dDrSx?}eAx?KJ@C9&k`*2auc$U%WrVHfZ8t=v$4oTnyXqlE+ ziMd@_7jSvVl#+3Y8v*~&a$&({Mw>Wko2`#>)Q4S2#YgwqBPA=W_UGZdE8=7C8HFPy zuiE$WPasrAfOXzeihxHFrkl^^P8z5E#zkP7&T!m`#PV+12vb7bvBBN6JI&p+;d1<Q z0PnHQfsej)jO%G#>w`I8HmB1D*VK5@%3f2m-(+jwDB%*GJr@dB=4;2G7sI8!y=L5) zJ8QA8>dy-{ls6Y|$w*hY%Ac_UJxyS$sc-H;V8Roe!rh0)`$$DYehuT&T6><y2)2mU zWOfSl&+Hqx2%QyI;$Bj`p~+lWJJnuTyObB!*6_7Taqzh4PoV?N1J|iPVyWfS1PhpQ zRI@#ebL24LZbJX^pxiT%;0(N!E?pk32-#gr8;1QR;#djRqexF{^WDeh{)lN`SYRd< zP4MGAgCE~7yC$oGk*&$9#9yF_h-P7V$M>hfo3J0yXno4(z0IWa@F*Wb(?KtfYi2m% zm7I}Xseq;-_{v6i)zW0n{oFi1CK}PN`K`8I1c7I@lwDDk#LPV%o>qYybnhWe_~Z|+ z$2;PTVU^RCbM0pii6iXQ1Cx2DEDvGD-of~TLvSz19qzg*_GsE_bJtCgDjBhdYy|vT z1V&){Z0p%6x(*GdA%Lu!&}80j8(>UpGA1NAkx$?c)3M0*X!Z_NeQjn3C$bV|=!{nP zPePxELy1h6dlEdE2qFcvHo0(SoQ%))<$xq%FPUX-E|Tp=_h5arqYqvHtaN6S!Nu?R zz$Jh<^F@?4`<;)h1025ny*fZR2{=Q7)ZK@;Jf9|MUhVyXPjrukIEjQNgBAw=8TDyB z-Go#bUYV+cRt@EiB*wXpwXd(c=;&npEC7qBA^RpX|HMeyxRQU*p(&>iIVYc1g&S*s zqZivga6PUPj~|cc2Y5XWi#e~kAs&;GeCzMnz{j$3`L%*(OLT`l3sy1+^UPp3lf2E* z{h|G++>T5?Uwqmv<UUzd`08Dlp%8k~`{kT+M|l<%dD_6O)J;|WKSfLa0{siGl3`zd zZFKpv@7ot8_&4!vLtqMT#`WUOINWf>eKj86<$U3%(0%?uu$l*ajmGJt<Ly<sZT6}h zZlT9MGv|NT;3y0(%iW2~av#utumpaC!G)pwn#2YF7P>Ft?&!YY3!(d(#Rcbu?rW;c zbB{7IEH0v<jGJKp5PdrNlhIP)`%XLCU<gkBSYwu8FV)#E0I~^n^7$P&a6X~f$-l^a zr2C%M{oVK~Li4Fv9G>_5cII<ad+iSHIY#25eZ&5l#yi|Uz+sY-D}6<i%^_cm$#YO; zP6=+Gpyc_w*V~QB?c+@YUNbJRw*eP+*QH@GP!U(w-F~6}5uGV#AlP#1-7a{$Q<C#D zzW5zK2hgis@H$L&>%~wUQtCa(7aWKm2f%9Yh-5{0RUOH~+eNdkyY6Gm1#W>Eg2bJk zte@%e82Ex;b9@HTdnXX>>hKKsz{L4-_(A(P`aWL|98W)!??VEo;QOXJ@OL)w$^+wf zn~W93fn?eQTj178??jB>fr>x4*w-+hz83qn(bdDFn>Am?T{>>Yn!9vZV&o=uJ?I@- zGV`;KQ95|Qt?K}e+?yHCy&KS+KjE(HV$KP?ufan4j|d#k4Fcz#ZoJFGT^ioR^M*ik z^RK!g=q(C56+z=I-Y4Gt2lvKx87nE{;KXBN{oy4%2=@RF-m5bg!MhNRsdTSRG?}yw z6`O`FG&o)}C;>%V7jEja-X^Xy-4cUo%B%CIs3gv_p&T&<ulF6B!OTu)W*<^Q?_Q5G zD3-VxLeuEgsECI0{)77vz5n<+#QnargO&C7A@~y;+`9dv`w-2{zHV9leTc2=kg6l^ zLp)PIzd@l4VWHrx`Zp|J-iK(0{%sxuIpRLV1Ag9znC$z_eF!$w=>KpZ;&izC<NFYa zutklT`w)lFb$ZYL|LuK<-f=<fBH#y38ty~jhHo5i2yf&KmWKNfFzn~&eTcsN)r<cp z_aV}bI`3N^9k#`Z++>FF-u841*Dd^QmBMVC-8iDJ`mgsP7NdTCXAj{&-G@NzyAWZ~ zh<MCE%pHhJ>Ub^<7b7@z<3+6BCIly}_>L&Ud=VVeTK~##&KmS!TnO3k$Hmvabq#I_ zPuqg^fHSiQ0ebJx*w<Stf8JypT)N9yx;6CW-GVAc9Ot?zF#O}g6G!cfu=C`uZq^PQ z``KcL548_7eRo%*!E~L*B>5jW&n`mjM$L^r?@q<$)yM<iAv9cmD981Pc^IBCGrXR! z>~Id;oyw+He}RH7?zb*(=Nvb~9bF$&eBKi_Grirx^@i9To`yJVdGs;o1Cj7PNOa_C zn1?RLF!(rJ+aHrD#3zJd&erpeLLKJ{ydeSS9pN08DABL8GvfRi4F}J?*`fDtNWh)h zZz(y(^jPcaZ%FK3g=hXNyM7CyzR<Px$=L$!MEH{*xH*hP$$WakJ&F0)IY5f-J&7qu z1I`%fm;g6h+0D(C5zYuaZH(gGJm%9l<SVs1p<G_6u(jUW?ZLd@{`P;mAMu)bLeSkf z`F8VoFq$PsYLmyt_al_O|BL$(Wym!9GxTrO_=s8G{~PxsX0AlB;(o-nXjWxaA*la+ zKjKI8u;Gdea=5{K#&<6Ne{nw|Fv+$Z%%_&2QcOi-pO44a?FETzahMftk(J3l-Mg*R z_=3dSuq)=G*t;LWZRz&77U2$IkhrPMLYT6`8|GYY;oIktmniJ}ZH)i;=@j&j*n>2` zkHPz5)lqC2N75Vm$6zo1E*ahz9({V+J0Z~Kh<&2}!`znuR8@Tc-+Si)7eN*`lt2+s z*%ZNz_dvxJ+{#j1QgZ>93K!s^XvxDslk6$>Ei=)y^&47go2V^nic717mX#H>Le>{s zzqXM7&pC7N<Dura`h9=@{~w)q=ge~E%*>gYGw05^gHCOach}Uve4km<A^mS&Mh6|f z;+uhHCm!tEpggi-#VC0Q-Gj9p2c2++z<>AB3#Gr(F><LPq5B!WZa#1OuR2H*pK(TD z8mcZa+41#+A>83}xqi4r1y&S=@G}Z?1b4_k%=+{?dv^#K#2>G4a^eq^#3KOjuzDj9 z<_!6X7{JzPb@|n@ed#@C^t3u`aPa1YzRxG;JUTZmgN-WzaN?o<WmlkDc-kDDWGBY@ zEi~n=Xi7+<^xar$iIueap1s$YUulQ$S_jr01jCcb&J~uUW>a_mKh2{MDab|rMbjOb zN=uUl+80LW%X+L$q6x*Yv}@^#z=7_20n`U0Rwl(9+mezRE6FFAXrR_+X8hLyq}+<+ zs3)mIRe3E3AL-7sa6i+@aP*J`GEO$_68I%Gzj18O1`f-pC&{D+JVEEjxp(rfp%LWP zGh`M~j#$$yf>Ih?^hW(8%4Q6YsYFo%2S^e}A>iy?W^{joc2dJM$%okQ81@ozroBWZ zu^OFvr_%xQ(h8n6pW`{D*{tcmigeKCq4b0N77pJ>7_K(Am!J=l`tR;Q<`RSW2z(~A z3~2p}?Imhxobf3){}OM!P&Jvm6&pN|>AN{!xA8Aop%b^_5cgqtNYC{_X=3r=IAix< z@|!Q-vY1n7|NUqlQe;!@_@;t&*E7^)@L*<_DahdABfQ8agNI(Od}KFHpI&!fE%<we zO$HAdCOMKdVETahuLXQf1`ihAfBuBdf$;;TKr%|C<D>=V6qR__dj7Lp+7Ln>KVr z03F$<0lXY7$Q*Ui1P`TslWD^@R0j1V*)JrJ{la)zYBOVpBX~mvV+XqNKqjUomOh(G z+<T$^G5mrIHe)E_Ql~@N<iBz!vxB_0iBg+p3{#Ot&i7<PB<FiN86dkzV}>=xJBn+v zq@X)Q&fZB1LbCKoB#b1T1mNN?o~%eZSv>}Z1@|$SN1t!HWCrhQp634!*swW*1?Qo< zVK1T@bVi*Tto~MbjPfxbB@ut@9`<(Wx26qn^(Up@9;k<f4!?i)-+jEv^ws_V4?9>q zyoSm{yrGYw(did{34Mq;7Ie8QX7LFdI<diLRp~Ge*(%V15R=Wr8N(E`=;~?J{wrI9 zuV@xzPIs5w{a4)z^s;pl_yex+(+d`tt-{COb2t8sS9Y$`eKxe>+118TJ(8d4x;JzL znFq1KgNy>3)72mH`&VP!Z4`C@n_;7{4PL`WfxcR4&VqH%yOv~<=Hy8tZuntu*S(6! z`kB;~G|2^!l>#q6&*4OZoaD>_4J(DU6u52&ev8k;N`W{)Hn(A=Q2JAS2xyRY3a#Ly z^GBP}e^*?An=KLkB^O*+{Z|f#|Lnu1-}9T@0Q)Aqp2Ps23(S&hr@@ED!n;b-L}4>3 zUiv+?JWe!&&*|mlYJ{1+IUWOs*Yz4GqG6tXLE1-B*Im9>Zy$o(sD^@5A+EkCp}Nt0 zz_*6EI&(gP>qF4SP5rs90$}}kqBH+Bx_09}H`by9bvPoSN!cR!k7!uZ2IXf_`E20= zUa$~8!)$0fO%8u-2+~}>c?I2!u>qD=>NlZu7sjViOPcJ+LS_;$y38N$LqvU7suLHE ziH9!GsK1Tcbn#!ZovQ`W=3&y4G&;>Q%m;v-#;BX!$Ytja|Jy$W3be&Bv_<oCyvrE{ zbM6XW%2=@W-|co5Jr3b~7X22G&N?Rdv*>dWXt2J{BiukB&zs|e|3Bjt`-f&u<G{Lq z$*Tx)rzHRR`tLv^%TG0Q7#ya?Ag%sGsyq0_)vSZjh-kn1)viuJ%hCsm>!T0@o|Yyg ziS@6Z2iRm$@&Z5}!A%E#bqIlMu7H+_!|@?ZmerRs#AQzFj74$i5Vj~uA*#uu<TT7P z$k1!|Ex(t3L>497D?{WYNP?7<dtJ6-x3>Tmlw5|AUEGv~0|Ih<cz|A4rN<yxp6HRh zg!yjW?bJNI5pgNWe`G|WAq!rb6c0PitIx`jAfTRl753ZB>_^t&_yAtKJdgM$`;lb` zg#E~^*LY$o*#tHu^^k4FDz+b?!>8`{Be1lD>_Xp)9)fH%t+*SX4ZyJ>tjke|qR9ig zg=#vvvt&2u`4Uw!XW%&$Q2!GU;M*8vKZ2NplyVG3NY#X!T-}dCm!m#3AX{TV9!1t> zl6PB5@iC=nX1cMJ(ixKGch4aSSs}2!$L;6_p07qDg!!jwlXQ$yO4AY3&fsBcI6kCq zj?oa##{-O3R`;dBdITF9YB#(ieg&NH1M#4wqO9&_AcwWV60jGEE~nYrU>KvfkX^x6 zBNP%_JcqKiK`GYFX4VFWaX`edHn<6$3B%DJ387(a@J|48f@j-{Mbz}hu4_LN3&GU5 zqsp{4cnS3Zt?k2HwALMX7VSVH9q_uD8-xQ}Q4)CNL$t13cIaXlw7i?SK^KFZX66O~ z6xht%;2j>lhBWd7lXiJ&<o0(^1n3*h^vSJ47}1x4U>Gd_X>)@ZS5F=t#*=RSD%9My zkUb9)>phXiwT4wt$StlA%t~}!N&Q_2zG&Vldj{d7slCRWT!|O@`;pGA7rp|Hrp0Xw zSN3vZ)9t;`z^LjjRQ0dO3GY&I%%k<s0K*lgk7i4tf5{;l3x-j{NnQ!_m|@&T;B!x- zYEwa$Ihr0uK<PoqHw{Qi1F30$_CL^Pki~;EM7UU=(WWzYFDT|BeMTtA_)GeX8@NN7 z>oe&42&UXaXEUVSbCEt{@l>fBNT{F5J*=~h1kMGJ-qO%D;JC42M$q3Ci2XS!c%=e@ zRQxiniaQC7Po)GR5Z!$%YUr+Jpkq+5hoDG4x7}>M>+%#rN$q=uUT!8v=HqiF{8^#; z2eH6{OsQqS?p3KT<0aS7GSF!fQ_HZ#6@gliUZcJbVqIDWvc!-TPOKk|Sn40>v*>-< zCH4)wQ4qzGc#Lx||Kw)o*>eqh`8tp$`-U274CrJpXWziN?sVlc>>K9(*X$dl-tN#& zRF|~2c>A~yk3TkWIE0e-o8#h6WW%dTnv;3GXZ;>uZ3_E_eAB*R`EUC%|6j237ou>$ zJ%hdw#r6&7NQ05Xf^SEh9Kr6R5WB`2x6>oAZh*G$bi#$wUL<eQ2ff|yBc&-koLHF5 zj*ZRa`6n?*j)J%Lvw1^4jMl%yF*tl9f^63Dp7?8)5NR%|X{N;Mw0OpvF;r3lF2=z! z{ejE4VcKV8+VENFc{Xl<=G`!EIAj_(tVgWNxWNpSr$C4hHg3qJX2ls$(2ELzA@_Gh zui`XmH-tl<Pa$}hN~R2LDP#<XuyKPb50A-Qfil;(U_r`twZ=9L5Qx}lp@t55y0sD8 z@8f$)NJrMI891$1<GQWp9V!!LU9dthp;HQ*fs{`r@P7G4?wCo`BNs`1t9GIdan3aX zi{)uZM_Du;Zoo?gH1-|byu(=uGLbQmEDa2%odex8gKTK%_WUIj$W;5k01?UfI9N$A zFv0#DTld=`hohnP<9(M>+M4gBjLtt(y!;GC=T{H`>08hj>d7aA1>Ji}SbNr=LZC^G z2l^g#m0}pqVQP3lRb%3pLJSC#FBtqw?nfY-InZs*w8bsC8y<ATel~MRsHbfP^$VS? zu92<GW)5czGY7hlLK1^@a~BfVPXvud-{R~q^{rLXwx10jsJ+PA4|)%7FB`WV+KXDe z$?##-V?;*=RW7*xJjN0#$81CA2QHlxFEtS;i9jLX#QJZLnWo(f&?X0=If^g9BH}ax znMcd&U#IvBt^G@Cu*)|H50iu!nNe?3l;lN-dc?uA5#_2kSvAy8N9Qn}jZJv4Yoi88 zLOdD~rgS}A*|4YWjvTUziS=z=5$Nk~h~OhZ82^|g>*EPEy}&v{=S4bGEE%)%{A12b zKWvxtbA2RY4B4DdUwnXwdOx6t&cwguV^HL@c;b_FynirH9@Oy7M_s|De6Su@J)`;g zaQ!eeBQXHkxm=C`e#608jPbY#W*dkn`@2x3)q2t*03?2nlx@bA_87lNgVfY8ok*Y` zc6vWf$<aY{vXw_aTc@3|+l;Mg*Gq;Ij>gj$PfW@cx^tssE4YYOo@r<DkL(9Q7wQi~ z=%e)rv~5Odm$Hm&uXT~I)SfzPc^w@HSPottLj&W82W-7qQJw=`3uzi}MN`SQ$Y5JH zrC2BbRTjy)rM83%^#ec!%mbpw&?rWi+Xy+&?LPJ4?s2N4uAVOj8devLuO85lU)z!r z^AOPLe<Xp;*ywmy@DfBHVlab#dJI*jYg2LTo%dVVn(=<?LyE9cyOItY^`Xz<m|F!; zt^~aTFvcD(hA6p(60F-x)g~hbdA|%#%$;SY-9!T6kl(3eq3EK)FbN^p=<%F^V1x`u z2wGl2&+~ihuemY#_1k`IAurT-;Vh?1llGHUNqswj(aViSYD-)JG|6bdMu@I50uAyT zx7g`YD<VE~MPTA_g68^<5PO+!HVt>0NlV6oM$F_%z_k&$lBsbH^29ViYNz_338bXh zyo+HPeGn9)dPS(-WlA&;CNwXx<XX^2OCuXMOeFGoZpRBOKLGWe5G_M61I$5)VGr-+ z3P(lh`fSMyIKkkuJ2?L+LTRS{_s8|GVG}~y-I8a(4Qv(>3|weVn!?ANp+S6+S;S3e zh>zrs>q){y_YT4E4zCLqqFeZN0ovvf;43PmcczmO3IhqeFd%ytnjD6E?hhwcQ0vK% zznLIAl`tMg|48eVk(ghURR5CBs1+sxtit{!qkvhmWd2e-ac&6>&P!*<CBd$7?irS9 z_eEh?5jxa=fvpft9EJr8?TpN!aP|=%9rXDa)OSC&(KLu)XF=afK%P0gUOqy=7zPsR zH_GgSUgti}+0Pccoxl4F_7+%a^ZUzH7JCj}W&e!5#b;n7^L?W+$Rj}q&0l9<q;u+z zqSf3^{qJW#&N=R;$a0EovblH=+FmlVSb&<JU1OZ@r#+3-Pc4QIMgwnPLU5T~WFySz zfkpBS&L0~M)DL6?@_qmmi(WLXF1jGb719k<)wiaQKeoE~xQ6;ovR<!;iC@|3VhvTi z*?#j+*t@X(1xq?VqvU3N@E7ebQm}$iyOQ?c68j6%VYv0gW$Z8H%kO<m1ic^p<EH#? z+F#uLvE&zX7<~31#+~NgA&?3czF*Po5W@f?#x%en`5FcoU(o_!bjtm}Vi;fy04~TQ zwEz20_7~lF=HxRg#uYGsWPj1ftz;hFG3_s+xKx+@#pCD?wy-$=7ws?5hnr;qWPY)l zy*TiLiOsaX_}*S9j{@PmBpn61$o^u%MfMlh%EW^>v77zH_w*KtP84<Hm_K8GF+{EZ z5)Dl!Z_%)q7+}2PHve#Y!%ztZ+5s?0DE>;rz7jf(l48`T_yF{WQZ~Vn4OU$*<%%}b zJQ=na;glf11zjUFfUXg;LVHZ7(TWf2@{@dv6?492bBqqs9Af~PV;rWuI1lZCdxY$? z*~INC5Gl^(7b7?4GLE*pX_cmL!xU7^1|av~ttSjH%JOe(%Id#zD5`#Tzg+2@q`7qQ z7ujF1@x>&(zPX(71=S=I$2f86CLI{LM61X)7`?Dcp8)%qr})`i;15pmw>QE`g@?(p z^n0qXeJfpfN_PDC8bOl=dDT|XT`r9z4w0w?BMDiH`~${W`#p3_KM(d-@<JoF#lVZN z@6SFaiP<QP5th5zVzfWPwirh7208q7ZCTP}qa<m<Yno%QLejKkfQDI`WAsJKLal3^ z1apkHk+1Y;i0~!H$snU;>4{R<)Pyy+$$<PrFXq0l_drf*VR5NVMiXfe9bGmV)x^kT zCc-xwnpPYKkiylLsEm=r7s31mslV7K7H6IX)Xha%X3l07H5b`rn7s+9eN8^PZz-<b zpxV*iO48bfF}c}fG*u2HD)o&JgWUTNCKIs9peDMgGAI8;!j^=QK1D5UGU(0!r8XH; zO`D91D9Mxg*d~Lc_~KDoc(IM6gGEf%5gyz$0|~OXp?x5~vOmCr2%BWk8+Eh+ZH=)` z;J!ob66*GC1~1pR%{P~|$1r9a*ktq}n+zOcmG}9;$boG#1leR*m9qRV=%xi}kny23 z$an{W%G-#`f0fT4&-CXDq+pcsJY}Xc$WP-fLw^3_u*d*t$$tpo!u%~T$-pi2p80n} z7&UA&N?~6CM6k(FXUg#=ZA%SASfB8bNANEYz*1up`3UE=7XOu_2*9OBd;^la1CER} zm;nEkbaW4y$X+Ad%rywPNH0ay;3Eng%oO3PYiLLyGp|Z&07xbq5L=qoN5fvDJ#81s zPy=QgbkrJsLOMC~C@Y`EAbSny>ik#kKsw_Hjj27l*j|HQJh>acVTwzEUJb?-bDG&} zOmer^7-iUN3^DCBh%7eLFvudB<k6Jvn;<!4p|+;EMv|MkMjXQ3%{8R#wgg%Jlf6a~ z%r($Im$BDKQeX`NbB%Nr@qf);gXC?PYc$<8eK~uLZD<`R2Uw#(<{F0n_dc-w740<$ zd7MQ4AMG`e)(&$GiFzJT|9N{2DrO-S!=sh<48#-CUc&+@8l?XTdkw+@A%wB~8G8*$ z=}Q~Y2<uF`cL6d)@WXENfwW&S_b0pC!3YS_4z5;m4&Iv5VTmaID$F@Z`s%}yUde9> zYtYlKOTWyExtiqpqr>zAc=tT5KI|T8-&6c`?^0a&obg-f_{acf#t+VEzryG1#HTYX zk#ul&G%g<<A8ENTHid<y<Y_<H@%iOpzZM_vJq6Pcy?ZeC3y^d&ihmBmg+Sg3Z-bwv zm7XxZS%gK9E^BYC6e;=jQ0af}8n2~q$||y9ihW_-JTQ43-u2;NJnT=gf|IqXyuGqa z+%S~nfYSHt22(00r^<(l#oiD7R~mdasQ7$;`=B~IN07emE|e>C;ST9KUxXK*zmWf) zJQa3;zCNcPr3xr?l_U|#aunT36O1S;w(=zBndMHaL(xZR9zS$82=!Yt9Q3Hr`ryrQ zUEPx$QF^+LzDt5*{k6rvhTF##|Ju!dHGL3)zEp=3vGSEKz9ohHCf@h!aw+eyb9MV< z)-Q0mUVoyWj>FcIDqjkV!S&}5Kwo@#=>xpV788a-{wfW?zK`0aE)J2n4eDk4KxgV! zoZMX;?;O0Jp52^-apRr$;!efC^somP|I*#ww)mInWp=uE(IjjGVV*El&G`E4PE<@q zj1kEV!{4UA?0rq8uNHqDhu1HqP;U$x>RkRc<Q!w`VcbROY*VBj5E**(5hvc0eQTQV zqRWPY(_rv0G*Wk>8HeJAmeZvvk#+Q;TzuxRBpF?T%B_6czoaL;N0EFNR5+w)1547i zF35RdTnMG@OlgO;f#o)RSAc7Udvhd+*AVSXH7=Zs%sAIn+<5SJN+kHFj_y|{OjYP| z)SbLf!b_#@F-k>oh>-<bjDk5i?(6&(UB4abl+u@t*7udI?|*w=CJj^?q=nF(6kz~E zz+|yQhEgp+vxzpNW=%%ee<qi{;sqSRYnFeF`#1-4FP()Xb_Rjp@%RFE2)e{}I0$QS z_8BxL+pcr(A`(%C0U%ZM;2&1h{svS!E05<NrDU&hvdhp;ePPF)HIXadrVDl=k1D9U za@I%EGX!h}lE4FKt3qgr>gfBz7%RBfPPbxL)sI=7N#>h`xhExPMHCf%;)+GTfigh> zzI`8gl!RX8Y#9ccG5^8H^}L?ZpY-shpF0Bi!m3-t_5tw)nySkBUqDR$56;^(g(eDh z@n;lFL%C?*=orM=t0}-`zgD!&LNbSQuw`7nCnS{u``CmJ&bIY`>6p_}j<3Qxrw%%? z0u>BU9PyNPFO`)4DUJYnq$KB`#?j<yd>QJ&Pc6<tC%kbhpeB<SwwS_`?X*J)9~3R~ zRPsMZ9<P*S`)j~mT-P(D?-CeH9)R=_f<>zIG%~`j*f~|NF!H~0_9ax?E#kNl@f2>B zbG1j&G7qAkh+k$Yu#fvA;u9%h6Y&-o@$~r@lX#&01Nvd&OZ0n!e%$5Poc{Cw6Z(mE zAl6`Cmr`KACMDUw<N@>&nLAfI(@(7UnVP<^<Js=U`sr*_ia6)!u_v&A%2-Dr)@^|b zeLAJ|*tGihF$I`S&jNF@{kjAYjSr$yqr-xh8vSGx8XeaLTAZU!cpo$n9Rnp6h*H4y zCgWNQTr$;YQE~P?(|i2v8wtnHu4j35<$==AOAi+GD?aZi4DWxzO97)CJnzXj0@96# z1E=BUvDJgsJ;cg~%BHQ>c$Ay>V@^vraH#(UFs&o%;CbKTV>PSkHbdmE87T9);n4Qr zHH|{a!Hq`_o^M6>$#HUDx8!b_5$7U6?6FYh45s(3f;29)u%|?3b(Y~fX&1~p7tiC) z#jljeIo*{g+(yWh&ndlDqx(VUKv_xCfhjf+{mt|bdkWA5rJtMe=-=Y6S^8L0W=F=- zHjx*~7Ln&*!hwGuq*C*{QjKv;u#7(S2OId}+D-@0do*395Fsy9IDQEH`PcB_-PGU3 z$7jbYh(5c|am*M7|JBj4!Q*Ud&(jF#Vf|7F-`>+^O;9rKlT62bS~$Jp+`M8DdJNpD zL%dDKxS?C%Jgo;ESj=%vrFW?p-xUeT8qB<U@P$&kIkLE3&Hsk+<nJjy9Kv%xEtP9l zaQj&zFRZ8bb7q{Y!|DM+*+lyG8ZSPy7Jz$nTaU(RIOouS#!|1d<<0uXpcj{C!yX<l z{tc4n0E<=RUv+lc8UZ3ogXWa#bfyh!kFbxh4r^~8ic0xc-Z{Jgh0nnv@-7p#$|Pz7 z5w#|$6kjmFRsq)E&hc8~8qo|<er2(Fi}_EcJd3Yq$`-_zrgX?lyKhr4O|Q1tK*fq* z2x<OVe47*DG<~Op*aOg(I49z3ZG+8bAVw7@ECNsFzn}2a*(ob=p&-4iFaFg5e(_(| z0)GG9#YS#_<o1DfdgZ$aruptyb@k8zqdOe%K7FL5vH;zsuHIZppA(!@TC#-d3UPhK z@3aKk`_Rrl<f-CcFXV4Jf=ue1qcX{b3uazCDQ{Dz{8yo;AerWP>FwN9>!?ch>yO?( z8qcxYAe-Di*5w=T@=bzo8^=y{`DVC$WTbG8W9PYi*`_ZorRM_}U+0gerPjbxY$_*N z%*Ucl-z!^rU}+>(LHXk<@Cg!Ha?pJ1Fc7d5;f`hu)YA8$F*QyH(@_1z1EL}dSE^^9 zb6Q@8`P)igdAV9QDx#h9Zf+BlO#C{hbTc>WYT4TLWI@QUhK&z>z6_0jL>tau{EOP* zKyi&$d?1+m=<M#|Uw^wboF~Dk(-dN~x~me<5z*KFQDZ|K!uM!szN764ACI<o?)kx* zHe2q-_6f4~jPF=*X^FvC{HtgF7thn$E<Y*Yk`H*kiQ+F;>B-A|<+XLgzTU$_4_m7- zb@oMT29Ji|56wU_bgm^^(G<AIliqG)?m1Y4iLDx!+Wzu<1H##?x^UErUoQMk(Bo*e z6~FwBCe9yHR5$|mMELRo-|ij?ETpfdYqKCeuNjO_9iPM8i)*`Zl)~*q(~4h|6hd_x z5zwF~%Iu$0GRlUH1+tL{c`KxCYzMJ1q`eVDX6!*Ov?)9L6pm3{MY&kMv(rulrJX&R z^1FZWGeG12((n-!X1VR`Gel#)CndH!no%c<Ve0Cqp%p1felTT)BzKTLMe+jn<QQ-E zXX)c4J5et*7QtD#B5{BICdMX=x`H&bu6*YmR5~My>qH7}9l8O?`NJ02hs}W>6nV(+ zS?=)wv1NRp6gJQ;i2@q`B`HY7k{H*I4PtN~<Ot{B#uRNav~6A~4fZ$uZzq#Ld@sp< zG9|?h6Qh^wbp(Ka_S7VSS(?_fJu~_>gX#Mk__PxbauSPS2R+6&;W+O7*wYg!As&(y zlsi9NCOsV&!1s_`Symy7oVDe8hm9hANFBIw119!qbzP7k;caY$?HyMS8S%7wRP_8O zrjj9+8T{zI4H~o3ywRl{*I<KnVhwWPD{aR5x#H_RR2rCQT7Yv{1HT)jZ5)7eV07n; z^md2$SomJ@@^htAvAd#eUGK;X6H=_xeC>hw5?}Mr21CZ*R}G>52=Jb-(;IkK<5^rd zRI{H#03GHgT92;jy^<Q`EMA0|^FQD3N!uo(5jT6Hs%S=<X_trK^ShWj*W`z-nHE{P zybVsFVU;S)Z(lkMQJ7WZN{2<R85UJKEDY7$Q-i8gP1gVmeUq*;-d&ev>^aZ}M7i}} zYVT(775eWCYJ~p#8FQdJy;tf#Bg+wFxnlp#MuO)3ckVInzc9?SM~D2s?Z5PIF6zHZ zoHj7~k81e8(|_Agb@%?82{w}752OW@7?Oqo@3Vc0A+g`YgvN^sCK<0IMXSKpLB|g% zYM|Q1ueFcxyUH(6ZKVcyDvB1V`1lM!5HvxC7iJokc8c(``6T;{z<Em#RUOe<g~zkA zGNN_7kD_?Vl!~IaR)wFB52d68-Ys3(l3FNAi`HsWoR2>WB6Pl8fkjbTwpF|NO1yp^ z9O6$QgeJhq=RrWAfzx9|Yr@&epbVg*v?iR2(uS$<FsW#Z9J(Z)a<sF!Q4tgc3PbSH zq`eW!Wpr>MU@*7`YDEZ$Kx(K|Pom^14;NkyEf?YjqL@&CMw4j(@f~Ovh{T<GHv_`} z8YB{`&P}n35^j|4(Y*8sqc~KYvP2sA2}E&S+%tu7XLN1KpeWs%k}FD7sG86^!*i0) zWULI)9!df#7efz197~Z@X&D`7kjCxZy@ezj*?Jf?;PCjSL_|zaAC=lG!3UFfqK}#Z zti5_0=zF(-ClC>RnuwspeSN^3tvFvlN~<VIG6Y8^nrJ5iZSK7ztD0<7mH8{hNX|h2 zCNhb#0d62r4K(r@jhNchh)umd$gOV3G8j!j-Rwbi7($gJ>WB7F2l~qJ=DjwohjM9z zq73f}EX2WSu6Q?QQ<QWUKDS^hXoOJ#RF3L1l1C)EW0XOq5v~Le!_da4$52*_aF|I= z@>Y}%blw?%hqlY7rh5K{<G7ltZ^rP~G>=|*hpK5_fyf{%9yczqE0$LgV@Vo^44TEO zo*uf#V$2Yl?$sLmW&~=K*Vob&1JTk8Bg-;9osy}ZAE3E3i^qH*^;m(Rt#F?7<50XT zUY0H(+oRuNz?L?k!ZUjwy!s^2sCzA{h2J{>HSo%%gE3l!;{6s)Jb4nbD3%fgd)aBh zZV}+MxI22odo@b;T0&k*{}H7xkdVcD4T|tuDk0tb7-e2YL}?MeijSoi^7s;HIY+r} z`I@{XsHRup)ris~uyr5pwLBRFd6yHWRky-RrTiQ1>UH~_3<Y?HQrsQ88EWr+0uAJ~ z_5+4Oyo)Gq-A@dKd3yt`S6LvoL|R0o_iT#0JB6Vr?;D7^dt}Nu?-$X}UK=IOp5DFD zs9u{hIc0C}57G8s+lDjFB=38O_DAmFxD@X%(2HK%-)1P)`yj>b7{oOm>isIU)Z<iP zEh61JpW>d7&<MriLu3~dQXdQ5?$uJIY&XN_$3N7Fe*Ci-VMvsNhcDSR`dBE~gPMt2 zggaYEc(Vzs20p6LMfi}PlF9O@*)EFbLXqeNS0ZYorbLLU<tU<pnzmWgZ?0T@n??Bz zLM8kt4Ed9|7C`{~)oIO>ag8aAis9eEoUGK9jG99>42Mw$q+N%2AIl2%^Nj%N^OwoN zVMh^xwDfHWAB&Csufy*vz2)!*jP>$R6?9OblRC{)rDg{o2EId_;Kfl|#Asxvu4?r@ z_|{8TPa|imt1%9}Le-AQ>|>z|5@b7D;q&7krnj}F%^ILwq^i5VMoin;3o;e;DWeqc zdr^w|G)15g??d24bszPCh<Hu&ewD!IC3r&ft|ssW37*uvp9NO+MG2nPyk8>lB?+F< zypIvMUxGE7cLi{&2PF6z@)CGZf_0krega>X;Mbbs5r>xg4Ky*oUBH5`dwz<^CFoY9 zQ-Z$1Fjj-I;ManNVVsGe#b^mj&^EM<M^FWRJ%gU6b_(*vSk{BuV!U|=U4`^5g6dFT zpP)AQ^$ofT;Vpw61_r;NXOYrBXcWo}2r38Zfk7LAp;b^J!dnNeM{~CcDx&5K+Jw^E z1;ybvD5wM}+XvMmyhD(Nc`i7}599Evpt%^SAwll~b7;^Z_&WxHZlzPu^S~JvG!E%I z2Tedoc+h9S6A^R<m5U?^#-@^mb<lRurvyER-vesU0X%Bdpcg?2bPpXyB1eIj`mtpW zQU;bGQmwHh10^v{9-eBgr4=3`;+z(!qj2>T3vq*p_(2P-K|`sZa#j&>UJHbLr>LJ< z76TPvPsM{6lOUtzd78h|1smfZgx=+G1ffAesE{LQ1(WLpVQSD<L`hHwG?)ll36d>A zp5SYbpcQCrPbGLSYN{5hgHR0pAv^yy0@+o}nahdIssBS3De7|KVD&mBnC_TYOE?>9 zq|AaF2-g?+Wwv6<b~A#mLbhVcMyDT?;0(%m2WMOa_&vDwa0^`-ODW@v2%?Ool<@=r zCHO&V$-6jX4d6sXe2V8|u8iv`BVDpb8P`)r`Wl83{1j!}$Qe@+Pyt8h!)sj`@1=}0 z5kwj9rHrI4Q-UeAx{WjLg7-bR+u_=yS!Er!QpRTxL`}1mGE&n#faX;nm4qVbI;43E z&ud-T9-(ZF2%_>Hp=`7agHX!&IA@%JfY;$7;O=l`+(8+yfuoE&DB~;ukVL@g+H}r% z0s#%^>wG*vF*9n@DB}ZgS1q#VD%v#4O4q!h8d-{V1A#Hf6l%i&(Qa6b7!92goJyW& z8Sgnn=b|Cc<2e#s#0{W5O?YXdlX#ydM1u)ryw4DLC%}$F@uNLM`L@H?>0jUh?YTi9 zy#^rWO7aGKQsK2+8V&4W=pSz|=gY3rKBm(8AV`+>F`>VKKrXF@z<yv`S&JH@7Gd^< zH!IpFRKiR|c1{2~?Ndstgr7oXv|cI~ITpn&M4S_eI$>x;5c6vZDwRo}=ZWB!OHe6i z1HoKqBEu(<H<H^fQI*B|Dqa48k*vKfk*l+Su`6Rd!5F(TwiBEi;pl|7*x!w@yv10Q zE;T4id)h$phzrFoHx#?vP(0;^;wgzDJeQjKJBeZus&^ZB><5rL7Ef8lbBrwvydtZ3 zj<Jj&m<f}xioCLl-x^g^qNthZPdl$hXTTpl0zWbR@$)`XM<>7&OBMeZE*#})r_|_; z@JHW?pO_;2bRfu%AN+NB8&7Sg#=W6FiS)9;p3tZZWP?4SQS-|NlYZG?PioZcaq(2y zr?f%9)_tyB(SFgo=Pk@uwBI$Q%lFjRos70@iCI@-4|QwHP`9@1=+>4UxyC(iRJ3p= zF8)0<juxgaM?oIqPAGKIRYd#>1N~SRdWRc&ha37LH}pkDZ~u&3T7XgiFI*`6-0JV= zR)6W2_4jwHe=Avku6UWo?Qo~o^F`q6fhLLNSS2B@lGrnqp#+MUWO`}1%#x{4v2Z(> zMQbg%;$`TRkoJl)29>p=ttA5m3hJPx2$KvHD5#U3BA6LS!WAGuGEggFjFBi}!Y~w~ zbr#X9;E!I0pO^*s`539AXTg&=7V*9Af{&Kq-uJ_kh1st6Bk-ib(}%jUj&K~&cA`qr zLnvoI{KUlKXAtI;=uYq`eW+8~gD~w!tq)K|uL2ys3_mdo@G}*wSoAD-64Q~U*In=( zMo{nj;aSoSo=4$%2%f%UVfC~Mt_6_vdm5oiVjX393EnxNC~+QIqu;B55_iGZ>mB&M zL^%J&5??=uUFN^ww3oE#&j3fC#!t*^_<0(k(Ffp3GSl>;-O>jL=D+aPfV9Q3H^R^p zx4{PYXT-kc>J2;hMi&q$d&ADXaW%o*8xlSTSoTJ~(HrRMO`ufUX>>IZuM1X`TVc|B z4I0tP{PMUM1Ueo=nC$w;xv--I^Mv*U7j{m@V^WiFB%0026Wfzq*!6%DkD+ad@1A0m z&^g?ONmW}ZN52y#Ci8U3Vni|{FDAA^DDak$H-%A_5Hl%V?!t_t{X^2Oo<Mdvyw@{< za`ITu#L3A+`sLuci-}UgX|JKZVN@SgZxNv=_k+|m-~(CR*BIL?2$R))jWMo<EGgSo z!d_@PS>4we^FF}+c@=t->#F5v_n`{bfp9I&GMhN>5a8%a{KV|Q&-=&`y%ioMirPMa z2>Vh*uYf;#F@9oh#?NgaF?t3(=(*K2`#fji#tQ)1L6KPf5&xr$^k;at;)l<PO46U< zedHX1xkaC4I1Jw$kfc9rp>{0*9OtB&VmHSt;Wn(dT7xVp45jqyq9|2JwG<pK8|fP^ z>05-!lD^@bBVcbROZpeXS9LT?`WKg!2UwPLj^mTs05KsSz%8eG5aS&{BGlH2A1%s* zYnzHB8@gf}&`D7~chS(*gQlcG2$M8)^&o~>OEA~A8^a#}mV=<1hcP9^7b2Y&&82Di zi<I!AG}TX&Wzk{O$=%Q?VUTiKF)oM*Q@E`02$N+^Vcd5T%w<Wq5^&^$gnX)5mJ&XW zI`%$^d<GD2jX`I3#+yVJ@_QM13c@7vdl~suz}B~^TQ)MK^TPpO519!t?Xs7H1=?G* zO&-q!QBWk9KnYrfd0Y*my{@LjPY2r|dMl!}{CV*|VD`|;jY?<7^HAU1)CO&7Y=wJr zdv61Y*TzCPMG<{5@eJfq8s<su4Vh6=8RkjN{WFrtCg{xYa<GdM{v{!sD3Q$oqTk`R zAcijeMQSwY1V(loVb)uyP7^q{4?5Z!M0J+%7{E&SUYfEtN^G=A83DHrF|{tzHkhPI zWE&XS^MvdtAkgk*xY31N!UNIMO88Awr-vo-u|Rwm+)apym6It*eTb10|H+C!#MtOl z36hr|VOR<GCNA3V$&3CrV0j(xL!_GP!t@ej@&*$O<jL+O&WY_rYDYAs_O_>b0(qu( z$IOW|2VMEz;CweAOj7VB=ewI==DrgQKg010^B`t=l76Kgu#(ynjG+!w)fvEg98Qly z17hyxK2-;^=z>1A4)8*{AuOfzMiT2;v<qPB<MDta><h;#>QI$5GIvmX4B;Kh@!J7o z1S{%rm6SBE0ED&|(P<q0J76XCNA#*XNmWmPhWC0vlO7ENcDaT?Gm^n{j6;|tWC9bC zM=%pIfie99uq0$6D}SD$cqU{bUQptE0AMC$vP!xiZ?Lf><a*BD4e;P4M8{G!3?w9t z#m_Fd0Sgp$o;nX?4nq<UTa4W5E>*2T<mh-snS|hlSP^8SJ<+_;o@81}kVMk@Bp0?1 zu%vY-H`@CY&$RC3_y7!v#8i~i1J!?8MZZ(Qzfdn6SJkm7bOYRQq&n>?_(=1Dk8;7e zNFob9%82g*EDJuyjr1bLbHT^Bk?H^|srjBL=qpv-hC)7vYYhShVU3eD{IYpLbzIOu zB#{NxaY54o%Yy19TTna~RL}9x0an7}s7BsW;5~<e5_)1oh?rYwL7jJ_qUzcTr1J$^ z49o@(Nsz|G_rzh@nwp9nuO?u_h9tcq4oMQTSz>l^ZZ-?YqmV?Bn9V};&449|*|>5W zt31Usi8B6sz>-5GJO%xoI0*@<DX8#4c$6TpNA|)*f~iUah)n6dmzaktA;DUJXxk(| z<ejgnCqVSDL@ZmV_7)f6^P3Ysp9vp?B$Dv?O!!Q|lJNN&sWk7UcqV+lMx0&=SV^sK ziGm6=bu0?eG2*^K=mdxrvV{to7gWFnbwFdvf(p1GD_~hr0k_a(isyo4{6WC7g(Mt} zIwh`lwNL@K&~*ruEmY9dLee`MQQSfj+zAkb(?(KVs;L1Wx&-cL1k;yhB;iY&6TXxQ z?}9o?!k04P)UcB9rQAa6DV_;m$}RL1U?sS#Kju}bG$}(ld;364M??_BCMXmzxlf}t zt#vO`-M~td6asl-Wu?hxfEO!Gs)5{4n$YY2@qHDg2>2Z?ysR{N96@eMlUE32ysR|o zgN$xUlW_pulqRJBmEaf9!-l$K2Fl2`V*7xIZ(ZfEy5u7Sxv5JU3FLBEU2;u7lm5%7 zOBNuqnYtvKYG$ZQ7NNMs$%?WGiDpSD5=|!6B}Wh@S0kw|2~Psdg-UhFeB_mKmrGre zxCeZLxmN3^K8R8-AO(c_nLa4cRG~bAQlwD-S5zp6Fvqx5D0MCre?^5d1oNS(LMcL( zZyNv+(55K=AQ6{2MXFH7BTQCXs!Z|-=4wkg7I|g0n^Y*&bSF@CQlV^wKl)Dm#L%q= zBa;Ey;fbY+d!S4zmsBVp0FHhWKQV{!b9XYJN_eQjwtFCnsX`$UTsGK$Nrmz$jTlpf zG8O{8#Qr}~q5KoGsD~(`0oi2(iCd-$<sUBee?^5tY~xa)L}RxgDg5uKQ0Sw&e@lgO zoO;Dnp`a6Q9<3-Jq1)b+`w@&AsX}RyVlt3anY>LfGmwNG15E~UsZfTHUUmxzqp=et zXzXl7DkX}TQzz*es+HsLN56=ln5XdbBI2VTfhRE?@x4yL*Au<ayB417hQd<^PZ&IX zs1FVhjvuv!AT|0p;OH0e6Y~^)zDB0#N8m}UV?6K`3?@AA92p5uJv@!@^nD;5yHU7Q zAnElZLM=l;Vq!X)rI!lYj{;1jPcQZI1C)rO6OR$p0nlTB_^%H!9DU~rik^)`%__jr z%kUGk06%HN0nLI(i6XuaqcIEhN;gV$6(#b=PkI_40Z(EQ;(PUiF9$*V7yca<9#gfl z2tAa0HD))&#)WY&pqHd-<p{#$Fqf*7&k5#UlJKpl=_RU_u_}-os+A%jF1<!k%8~F% zAa_@-97UL%Q>1F;3xeHLE5Reo!lY^?3$VLt<tf04V^O&QF4amsf}mdM?+XeH^~%>M zHJN9wKdWAuNsEoCUWxB)4y?bTUfC7^6sCFw)qiIab{k+15pGsls#o$6CaWyfDUTD( z?JMElXg+uK%6Pz1Ng&lLcECf5&;-wdOd1x|JS@(jNTm<ed?WEjn&m@8M~Bl-JN(47 zz>mjRK))l25=9+zj1ofcQUibVDg4B|f}a;D(SCR!!TzKog`sz;L4B^d9$Bwd6xxu> zZj^eL@d%T3l6n_A!CWV)cd=b()=BDJ?gHFg?{Xh45{BMoEJ`^u1<O5Bed{Vo>RmoU zm@G-^U4AE+OOkq*&&Qc1Nxe(|@n%Ve-sM3cu7Y#dyG%nO)Ryj)HuWwwNRl=Ut%0bV z2rdI7MCx7Y5hiJndY8T#CJj>WQVjUYdY7c{fL@u3`4;^b>+v8J4+R~KP(v3p7G)2( z0gESaz3D1n>SBJQ@_5il-AmL2vwR6p18jBE#ViM`gs;+o-B8A)0`sn!cvpy+#gUvF zwUf%2Q-qDNOJz*UiNNNjjM)V~a9740m~1Fx(t+p-%9uDrYxy&pD`T>nD`Vy<;Uj4n z8Oj(U@z^ZrjKC0wkey{@?Xt?46eN*+AeAvw04w2-(y%s^F(-iNL?(7$hzaas)>$fJ z{)sSmWz5F}yD4KvQFn!ZPc3LDV+d1t76uz)766+h?Xt?4!${(;jPXRjOXN}+lMYx3 zPb68;P{#BG;!?Og#O!gADwQ!?5hlAwDr1fTZmx_ON0l~|F=fDV2JTy=`pJb!Dq}*y zViJ>7#ta9nq%ICbZm45wkZZ$iMOlW>v0csPlIoa8T{)#X<|~4E5K47S7}zUfQIk4m z0${v1Cia#al5IeId=6foBH}S1hsX~8;|<9k1WAFOHzc(LGHTwC44Q5V^i6MZL;QeO zzQsKOoLO@rYs~=DbTjethU8iVxot=m63BRYL-Hg*w++c_0Npku8u(BNjv)GLSxdMG zWjJqw?23rnT;=eFWFmsxHYAG)<Z^gJvKdVHhwpEnM`W`N$pV2AjSWc|in}8ldpIQe z9z~+P(PVN%(i+Stds1#l781;b$_>d0^yS4H5;_Udv>};=4nebx^F)E>hNN$lxeWf5 z4ap=ApfKO*E_I>!D;ttuXeb!(bjwiX=N3YJ0RqFK&1%aHNhQK$wdDrn9fG;q5`Gxm zaPfwOnyx*nP8*VFP!}DFpO`@W975`74|t-e;z^VSn~`kzqi5hJhE##pxq#B)p~lLl znwp!DLeTbK-Hf!;f!*AUeCWddKiQ1jHHbDN^lg2mix<_;+>C_9n8g2;&4?F`2lIXI zZWoIG&Su03e1B^*LhoVC&By^TPR4RY*@<qO8fP+(+>CsHFv&b}^YPF;lX)b3{mmxx zG;K!c3`I<=95-?^vJ9#4z69Mfj~W!4kqPiekHk;R0Q_u3d~_l_iQ5q0YZiP<=VR}% z0G@x_;mL>RC_H_r4+5yqf7E_M5z!L>M~}o$%mDH&AUyCSjzyYYv*3FjLA@8i)8`g= z7Q>Sb&yZt?{}Kp#twl%<8Xz&i8&El*GX$j)^eCX~77-UKN!^#=4KQ4<+Ynfl!-0K> z;U*y^HX~ioaM7(17wv_gm|qd|k6b_v@F-El_hpn2n~`VXkA4h4F`Mx-Di2T@Jc*Ba z1N#B^><Hq&@KrQ+jQ6}V&_h!l*ybU2udA2jX5=`+WG~6hM;*aD#3g(On(mU#$T5^> zZboJR@y$h$bdWH)J4P_S{E_c@Pa#ZBqjEFy1Ho>ak*IvLFu57Y1?;{V*$+7J019i` zjQkrx*o^F_iQCwWEJdlwe`zx^-ygZn&BzPLE+>}1vKiS!oMdc97NPp-cPPrl#ptRY zW|ie;q!?kc%5w9uk6><J3IAMRR$0F5?XZ+;OGhZ=X2c43$T>8@ARunqj99>lN*}7Z z-U5WAS#Cmf^iIIh58)@~Ui@@NnrPBWD^b)jsgw|#k@@gP&%#g4MEtx$iAKW%2`Qx| zQW%?&v8Yeg8Zg<dit>xAPI5D{1YxpHax-!-!CWV~8JPxtbAJi^9N^}gk%y`EjLpai zlrqh!D5sFBFrG1C-IbdWwa_d{Zbmv2%q7XqNF!iblH81BfEi^;#%3e}h=;?uZ$|Qw z2(|r|mSW>2@C+n5wiYxX>US3nax<b9nKa1F$khZh4RSM54){N8Msk6^2(H;?WD&{X z#%AOM%6@ho-sl6@l%9+qZ6G%zZC04&%gskB!CbzC^8sJ-V)%Il$c??o0U%ELhoanr zgj#}$T<%2<x{%Ag$j^Y?_ad{30lU2z&Mh(aA}2xR74{-~5dA0iB136TH})c_An}&F zaa<2YTmv$%uow9klE@~Idy!QuQQhz$n(~ajND&Yf-J>XvB4&%L&T=pEHp1NZA}v+{ zcH4_&0#?Ewp%yguB82H}xLt_(#YNg>_abKq*-w;L?mar*ZX%cP48Te_E5(exNDUBM zH$VVG%ut99s2KWQ?nNpQCP$jwi_`#az89gxsODZI6<F?s^Ii?1*@a2&MfxC2Vv>82 z8vrY*(=Eu2y+|2yrQfS4cOmqQE2rFxyyVI$_aa)U+4yoVl0>lEUSt7aCHx>dL)|RT z!i)vxd*L2N488w|$V*Vvaz6TUf->jf^_K*H2AD|a`UYeo$^8P{sDxuC8jy)3TNz9R z2+HG;NQFL(Y(;m$-GJb`fLp%hd4kW`-~}GP3s>dpqOG?eHcL^T<f66p`amKZAidGn z*83{qV~OhLB-MoVd$>D*`8T4P`bB+~G4Dngw<chEi+!A6#x3DG!2M_C&r#Ifg7RwX z^ZMh&ZKa@h*jm0_@t~Ud_BKvsqmn7;3A|Y5&5yDX8y~n|fh7rPB2exDKKauPbEOhK zGZ1Otm1%n-UG05%7l@b|O3PH9U@CJECaHXjseFWBrt)ouJKYJ+`+*9s=5t0j5d3rt zz$Y1glHj}j0iR;{3xes)l==?Co;0z7w$n^oA|O5#sJ_P?rG!WNB59gD>T?b>ZrF^2 z2T1j=KESgJEup4Z^uBnth%oDU9dLg>$m@&QP}XAr9|ejfn8XHkARq0SF5}UYsSF<m z%rl@mh>rrHXRUn*-CzcPMzl2rv#mOW;r^Hpt-e(JP=;3!Ox8o{FxV_9$`b@HZwYv~ zg-#s52e|*@nc0e(&c)$aPdu41sUr+9JAN3FsUr<=Ug9>iAvMg+T%Eu&;@Fn_+MBA| zWbtAe%TR-a(}7L(UfEjP&{AK*4MWxxWU<mE9_j{0mqX~nE#Oq`M|tw+98x~I1?N@} zvk$4c?X(~G<j?a6ljHseKKb(o;6a2<`-#uzv|kVXx)(Bsz&(P@pj&I}IS6GGAWBKx zBkQ6ya`Funri9;&K(q8+$T;VIykkXFQorV<pGBB^=`nXTFMS-~zK4O}J-7&DZYup5 zL@9|Unw9<*g(=~a&{AgUi%@dhR!qx?ditW$yZ)nj=~lq*bzcj(@9jYF9NZRU?%}FC z-bpko`BNmt^sL6w1hHLqQco0H1Lupi<{K&+Jzl|Gl!TChJp3!zv<N2-hN@slMSW9d zrEI;oL3@vcaY^W3GL2E+;LPtMEP^w?!B$3oSRa&O>TF`Mvod=svW|p{Lsa-%#5do{ zh_MLV0yhZ}n}Ao2qH{coN)Q%-Nk~dY_X3K$mumB!g;Mqh@!xa#>a{pezYRgd$u5PA zSHdF{r2ADCu?^_If!huQjjkeo;UeBKiui>`LcObq-&{pBnni@4qWX9k3=Did9>6q< z9OJAe*%oHts11^A3$t%BAW62T2a!#q%!@hmYQ!k1@6)*S_fY90A}8Up5!%XTV)SK< z8xbZ?0=49mbSDVrlRz!G49|O!o{uE?dC<X*u7Ks+e?NJ64zQ#lfN78ueV_-GqphEp zsQ7@**bJvNr@tHNA-St<n9dggC2cUsqgD^*V0A3W=T#vbXbh{I)a5{>CU~gyDU`Vn zD#{ng{J5(+J-9lpHk#Fm=j!w)n5z@d#m@sQtJBkij(e=8cs|U~(}RwCJOfx(Cy}d@ z*dB#ayY^<&p^p(woKFVX>TnOWUotGuK*}2rqyG^{aK!xC^D*0ckWo@JCVJ})G@B0b zpxN_gg4u{^s0SG_ts$6=n1*rsO27kf$|a4P;Zs08W@D!H=nuS!sRk+6a%A`>BE`ot zM5SNm%o?z#S}D2c1Ss-)1WbTr>yg{alk{$GglvRSDF+zQ9f0CD6Z7x!m^X-YHuO;y z94(~g{#arQ04BeGLVJp|2`Ru<K<VG}Apc2($)WYWM+)HY0bA)vr1}BlA6JfeUa-z^ z>A3{+!uuh^j{)W_gZhzimQ#;^#}C=@dJ;{91tw|Cqv&xsYK(B6j;YT5P?#^BD)F%l zCa)(_r>RpgPDKk|UjjgJFx)YekfshpeMA69gds2n?gvB!X8?nUVOfK|yfG0jY%{tP zC__ko5K&YH#HSFdgoq*$2htPbvRshPT2>KloO@M*pG5sdA|ssvgm=J=2GWTBCeohG zkoIhb)PM}62`18XbtP&jY>c%G7(aw70M@0z3L7SoM4pEc(2?3tBvJFdNg(yTuu>Vn z01UfP5y|LiB^c`r8jsp7_@CfTF@jsC259F#hAlIqza`Y%3h6}fWCXFgS)>!Tbp&!d zFt`)o2%4<LC`bv4SYKB-0%VPra^4~;cMO&LInpWVYL*w$%;wrGLUC`x39LQk1E91f z0Z2@t#MJOiz*N~{7TFD~u7_+RyMeX!5L!d&J(QR(TPz@y<Q_3YLTy4x>Jc*~)IOAC z9x+QoA)zGkh)m|U^<kkT?}#iKu-f`auuc#LmcdgeK;`>z@t`zKjU*(Jr)m)R72Fg= z1V2qhNuD}~u%HUqx*<G#pxOO@ho@qw_a#q-0U=!=@(hqJaUuO%JXJ?EmpnBV7`MQE z46LsMtBa?6utK}>R9^y{cxom<7f-DKpai!F1X9UO+kmj!cATt1#K6>M+;jjzZrt<} zflb`hZrh*ZrqM_TZkj<oFS)5FidzSF6JqL9|3BlVq3Y{k4mI187mqTKNnbbE08%G` z-R0sj&yyC9mk}lxj~hLS7e67G7mu4fY4Ok=0L+WW&73|Q@BrTN%=e^)XfR+!u6n@C ztEh+KOQrDAO7>P};CwTXl=f!eZDt@HD>4J`rND7O{31Lfsj~;F%BXulj<@;-#fhRg z%*BtB7arwPcsTC`Wz;N;7VmLC$W*aNRc)s79^8~FRY$7)V1xiy0#f~qRPphceN=~< zz`-;6Lm(roZ?X%HAA`10ON}V{o^t$Klz4*~(gz_5EsYNtA@m)n_|ddNoiGvF5HgDv zoezu<B?cjdEKQoZ(4_HX5Uc)XrU5bWI|=jann749Lb532BO^o^h7d2p^Su$0+8ZHX z(E9ninX4Z{?xI}R3yG&@07B@p0`+Diq-Y4*V+9(tH$2>+UP`<ZV^@u|45v6j-{SR+ zG?Ps+lj%x)E+LAt%;#kE@m$|gX0qGNWG$5VUx8hXv)s+e4pOpQGg*b1OepbW>8d7J zp66ur=~>_V%w#9bWH5>dC2V~xpKvnzOsww#Gugk*WGJ*VVY}bMdni@m#2_U5(oEJ7 zVO&#Gp*L0GL64rC>;p>XN8S}EWSE)E16|kx$sYBX$jLsVWPQwJ*=90NCBBUMqr#(* zlhIjr->GJ@f0)To=r6<&k9$1A$-W|N#b&a7ZplVcO?P>`#>u{?WZTJ0%T=wJ%u^XP z#Tye;=y#loKAq+JmYK>6Ji--4s)xV^BD6h1Jj5BI?B7VGd=P@+uI!<L)L;Et;8#@% z$i8uw5}%)!8-L@1%<TNE+41vdX3o2D!R%&%5EABRLyL|L9WqJ(^c&|d%5E00AWwqR z?MoNU&g(G`<tcggtgP8{;1`NAyI|2w`}Elb_Sv}$W@aPIh0EP9@p9yXne%7cXU>wb zs1ER<YK@B8DZ2X;N3<RR!}sW;j*L&&A_9i%>BA=^<?g&}=&mH&=8y>?n?tfnhNrJh z(z4qQx1}RM8yFCh6|yHJ%c6;=9BElGN8%=kkQ_0uYLTr-1eS{h)?9tUy1d-Hts=ix zyT0X?{o=4v6&Ce)-w|0NJa&SZUM*Tw4Y!FF4&hxn;)s}$BU<E$j=Ez`R8`7s5m+lC za>VGW%>&kos9JHI^K`a0pzUV8p9s;Nda-Td_98Lep%-lwOEtSHTIvql5#d`d@~nIG zNw#&lMPjK#q-d*Ewd45hNo$2qtOzZ)7l}62;%2MpkfC=H!y3d@m0Dy=QBZ4J_vs6w zQ?*Dhx2@Z2TelVXtXj{uBCr9GB1fB{ie<V}w5=2Y4dQ2|A}gjUZuS?eHw!<#VX;_T z)vpNg4l%`Av{(37i$LdVVrh=>*3-1;K>aE)K^v@!8?5R2pj>^oIH=@^rR8F-?#R`X zeh^P-dTqz?x=r{vL}#m*ZWWQ$+eMdJalQ43c*Fs;-d1t0Fhe};ux=M?RXszzrdEhu zjs|g5X%KTOwMDJAZ{05DRf>gG!mfvkyByXPqPL!j_)6P~y|xu1yj+Z^)z{gMqS|e0 zMNg*~TQ2@xs1>N9f4LZ1DOy<*i-Z-ZUvyN87nURcvzp$pLtL#_h?Gi^i^{*b9LWbz zMQcT{wg_s!oAuD`;*6>{hzANQ#TG&64l54v;H|ZV;-FTsS;SY`Mr;-Zm6X($E^gFo zwTPBSwUMn#KvX_5`Z`1_?QT^S1=gctrK&Ae#q@H~P^eew>%<qgTJ^BQJH`8=R;(*T z#d?-!#n@(_Tp>;<dMv70N#OR0B3w_KyJPzf@myhrC|31QZ3zlM6c_QGf|i(AtIcn9 zE-5Z6OSG)wsMaXmyOt2FN3u|{L<bk!X6v7bO^#ae1zL8KLn{GgAHqfxkAJHT-0NS8 zWzNmQUw4#<#SQ59rMly}*F^!i7rh;U-qr?#qsm1et*cs<m0l!TWr%F+j?JQ7j+kF= zTd{6}SW+##wHs7n*CJHWu|m&DUXx4=dO|IKMeHbS5MA`xn7G;CAM2Z<rBjS(6xAv! zyc4Zlr=TldFSLqh)L42R)l<apif$E0=;x}cA~9dD6oV_pK8J3#t<Y?(#ZlEE_7;L0 z)C_(`XNda|^a+CQM-ZOVY@a?PdNqoz4lPFAE?!gg9MJ~o-c_oomBmd!^{I%_t3(14 zh?b38#XJOwXr#HiQbahmiplWCX!+oZ3Gk(si-JaQid9e12Z_)|@lv7Quz4OaPo-Aa z?zUgVJ{5_@ItO}T>r(3q{ax{yCo*<w6hA4Ax9NMt{RP^6X!eCxaUX_21*mvep<(pi z66Xc+D1zQ!l8I*qJ*NyT(yW2+=&y;NJsQPrY9*TcZdG@78rQIQu81xd6Re^~TAsMJ zL4;Qpi#blQEHhn1<%mgE5oHyVDz5D_7ym?1dAjZBcALnnEE272MWCM3X`G&!JXdtB z6_c$Z7AVG737>M&-XRt_b6-ritwZWeXP>QozVGu|y6BQ2rew<BDW9MhE1kmIsdp5e z%Eb)pc6|a(Y116SPs>#Ew&(3gvW*fqR>QYFT?EtY!C5mz`*O6t!#PK{CE38+)@`fA zQfs2Pu2Qr|=La~%M5~BT6W8K5L*!%#?=%VtE*EVbG`Y2n6)h^A1GR1e;$@|A%SpYz z7>srrpbbz(T8_ZPhG(pZtlXjvZ6|yYH8@Acn$O8On?Zi9m=Y@%>9O$lsug2mMK3+} zAu+LHOVJV0E=`XVOJl_>nj6yeQ6i*LwAQ+*m_uT%St6>jm$)t?OLS=z3mlK<4Yzd{ ztt-UT*e&D>s}Oeb&92uwe=8#O&^*zmTx5reHW^}g&Nls+@NE>WD$xe992$Fl+S=UR z+qaAgiHnH~v4z-*GkahbYu{63X9~Y^k)I*j>J76+i*m6zLys3N9gel4ZDyI6mzIuE z>FAd${Hy>(aGJ<ZOG?f?BJ56!D!#Vsu_=8sQ!eC>x-Q8Uvtz;pQIL^~sXx<Z>z5T5 zw^noj$Iqz}ot(C$xHvH@GdD^2=oxwXk7Aj1MONH++xXmckz1vA?<d~CxU8Hs(RR&j zaE}Pc5cbL)aY?qM2}Q!M%9iA`>1&6_9qukV)|$ZX?jp1ysbfr>@QW1%q0>Ze=$A`H zZn^Nw5V^6!&mm4K4Vl^<A^@|KkG4Q{YCx=qV#WR97JykXpTuR+nwwcW*|tXnqN%M# zF*betIs1-tdC$|NrXSj&)4Hq2HeYx#v0&i^TC7kb#LNZ}mLqOT!{Qq|C#qu3Y%Q{t zNT?E{8*;VoZLs`mT~u*xwSKi&mZJ@9*H6Sa#iVjtl_!>C*$USBs9^26mHLE@q9b^~ zwocC~5}6L$?_e$~R^%g~3TyHwm@KiHXk)P?XJm~`UnN5Iij?g<)6klnwnYrf5S=ST zAePQ@u`oj{!J#)Xy-IXw6ya53LWXUHe$pnoU^HcjP7Puv7E#cK&}7>Pa5)xjs>#R< zvDi6L1XYNxnE8LkyqFbJku_WYLip#1>?-|a>RK(PEqDMUZmpijv)GbK;jiVWVsg2@ zyGV4_)B4>bme%S=w3`BPTSq8yWF8(jAVd8g&=sc&?`rXmrdMQ*x7x}ktU{jJ6cm_& zW&4ixv~E{pD%bj}d$45Fr1_fa<TbkoXzG9kpj_NguEn(~()$<bb44-cw_41$3oAtd zmdaC9&!x5ED!p9vq*VgTb#5aXHV>}9m|aP0{5sJaYmE3nsXQxwENsXX9f+)@)`BdI z@hH_?%Ee*LN=y1|Ev6NOjoQ6pCeag3Bexu5x>}5>6e(5WSEW)s;m|{O2;U0fbb!qF zmg{LnTD%|Da);Q87o(pPmgi~-Ek(~p+eAH|mrYvO*NT0GTD&TrR<#uMN!vOqs70mt zOhNTgGYq0<fr*&uBXOt56z6Zv6stuVo*7~pXx2uy(|WWNAy$!<hB22W$~Ck#t^O(c zrk$b;%m1<Epmn!~xVM%!inlb#PCO>Wfm;#wtf&;vpa{LQ-a)KV8${2XtR$@ES$nZg zRf%QQ48^Szr<4p-ts3o`DdyB_V_H3lDHdV^O^L^8)mvOWcdwo`Lflj-f*?o4wZa^1 z2o02Qjuxwmz732n-X%6r%mQN7){UCOj~2B|aK1xJ^%JKw9Wo1X-<QOFH-q~IG56&; zpA!LE9{Q^xx8Hu^wJa@(WW`u*B;*FsrV3I+k#2k5HjyL-y;_U*wUZ1n533KPK9XTY zUJj(Eo~oX=(7LV%#?vMhy_xJ_8R9k-Ep`=V!bBRrFFBlAVjF!eWNuOJ$kD^Fnup@| zK6E$<7n!DTQAI+<DTn~TYg<S1t>{*1I|cEe77MW6D2^4D3-78V5>K>5wGJYL(-0*x z`PnW*53`+uEP$2@*BfppDIru8RIL{a^w9NU1_1vmk%RFDWNj+fLvla}j2%UOrP$*r zhll{e^e*B|VXc;c>E~;en)aSTEm_riwY*0xE7!WV`bg9(dbPem{2PMWhlP6DMA5QB z3nyX6X$U)+{5%2)XE#Vj@5YL{Lhz1)F$$4mq88U0d=Lr=W384NxKE33Ctmlg6`c_D zlcI-~Y4HK#ZYovWrO{wmlB0Krz)=Z-!-}UBPv<ysk5}X7y_f~RB(&=az>I5kV5lyv z5|2U>6~8a3f&ime>RY0d$0d(KW8_F_WQ(}A3Jp}gUd*Y4NGUovL{=pP2?!x;A*XMK z6w&}G1SqoLq8wt9Q$%Hw#L_xL1cTQNgk90)ESsDX;~Ruej%e=`iz<uvK{laDB(u8D z@jiNFk>~;e!zsFCl9;j7DcUqZat+nvXhYLhFL#!ukC=m59P-x;>nE7^y0sJm<vaAO zJiR-MDb74S4*%1|5(h~!Qyh$tC6>GlOyOy3F_IuyV{@lB{!k#UbFi>77Y!2cFhrH> zFl&P;XQ1tZtFhg34$Mu`(=m=AHw@75In_#s6C#UV37KV-NK3;s2G%7}#koZr4N(O( z&Do4eHdb68D{>&2V3!jsM#qZ9cnrYtX(`EARXs@LR1}baGQJX1oRy>(KcwjbFN7LO z9#9T3CbU9i#y%rDXF_Vuga89BoS#GTZ#fAudO4(+*mKB*{cM`vYVRqGa7Zyn^<)tS z3Dh2|kI<9#r?!47y3&N(hU$=QWjQ8evHp%Is76><b)<+uxfB6`CId5EC<K}j8@EsV z-jrxQFYkfzkOPSZ%YTl@wdx~9+s2&kw5bq_GvDn4S+u;;2B{{+kZKy6Ni`Ws$@&o+ zmb48txPHsku`~Ka?#MH1=h}*5(rH7z05a&J|12G}(5<vDuf~se^?wo%*35x?5DodD zQZFF+U|2h?cS{k|z!HKJ5(36pnwxmggT#Y477vbqDqrw+p7or5zilsx2ef4$_1_i` zM(8UH@gSDOgVYSj1`b0uz@841vliaQkPSY;G_Yol76<X55+h}Tp7&Fc*2Ry;Ursqs zTo6p0BCt}wCwHOVQJ<jMXwsgj4ON@V2wIFE%PftCoZz^;obW@TUcFZ&(SqCvwZJZH zJ$qn=xL81#EXF|-VG0J=!Oup!v2ai=2192d<pRu4nV1b&G?+sSS)o?BL<6v<AsV18 zW0${9e6CT^Q=}{~A8TdnN>NGk)+Lfarkf;CiJ8747qhX5tB8jv&|hRDi+3z<^FI+! z7Sd3BNyYLHX+X3jvBZw?QdOu~Rm{*;n3*f_q;YS^NIfyfn@jd=Z2q$*VjU<)h&ZU` zV0R6@1;h!YH^qq@5+|O$yg1R{U7Tq6kJ7}4kS0iu$Y435a=D(tQUr-zuQbU7E2K<d z{R5ex@d`3Qfgk!r&vBDAd}%R*c;Jshk3j!paA8|RMgSKEfeWMBVlVMAWd2662#YR6 zsD)2Ka|EXAD<y^W|0pRmx=RZ2O_IWsDi*SC<))<IY%VGE{L_*G)DRAm7-nnHt+2+{ zUMezFVeeip5}e{+=yUJNKNcL0KsFmoYd@ri04-7#DbT_736k=|O%?0)FexiQa9Ix} zL+HJR905_aQqP7UfT@xs0We&J*7Z_Jpi0SD>Jlza71R!#fMOC24MT?ba(Q*G*1OFe zbG5j3w1s;^(MGUP=n@+s1246%(|WchRYfQZ3Tq)g<u1Hu<4594RV!3YnPCab3>hpl zbh@I<5K1xwl#%<iZh<cdd#$MT#M<-(jliW<rtpwsuJsoS54F%`TqHc`p-^G4^iX>R z>7m-h_;;m;MtAAK`FErT+I^9}gQW+nGnu7_Jt7?Q7KslPQhca_3ejD9h!rzxp<}3W z4%D|paKNNCfMyp%aA??~+b)tEpyasr|AyoMBBbPy!;(WaB!|pBkQ{PIau_+>wu1kQ z)>V)n^by0ezQyVq29CAI4!2zxZUd-alYd1yqRXXnMC|{j98nDw$=;=U#kW~mxwc%} zh*2FTi)CpEFW7QJuFpx?WZPuhet){&GpS=z+)`1H1}U=QGw6Y8MO20u1bv5XRKaB7 zQwzCg`vj6WQ=DR`RitEyYcil8dBQf_b_(+1b5Cp*H`cDO=~=?NQTSEbW@UBX6BE~+ zCcnkCqy_1QX}@A_GE^?M+&tunyDm3bi*KX<lv|WrL_$2i{~Q?rEf-*YyB5`2w9gUO z<<Lsjv0S7&L`;Qf=MXnpMY~urFGK6r1}{CZdu*7ckJv7jRi0rmP*00X>Nq|Q3cKq? zE_7-+Pm0{M(Ey=usn)87r1b3!C0Fw1Tl8LWF=BQGB&3WKqHn6B`zafAqR{q?6iccS zh|p_DWjchkV$Cu*u8?7lZXE@lxGL>7)bUr_=39ifBP1?lg1Eu4#iqBKAX-9?>=5A< z2o#Gl9>y$(4%)EX(M1%*#`fwy8LvD7GsMDB5m>>M&AFooR7$x;CxuUj$cGB40$L`3 zCntA!qI1WX*tqWbxl)I<UMx<-dl;nmtLikad+}^NeT&vLU~<zlZqH*ALMBXc-k5hJ zeYo&}>LJf6T3YSfi6m@F7drH~&1Kk(Myk$rqD4c@1W2u-g;gw$&D}mh?;hR#g|0na zLBcmyZ`Uc>F?rKF`X=F5yK0Yqci)l2igLv~$M&oV6F0LY7+;Z;9G#UFx7qmHk{6RF zrdDr9^s&8KuYl`M7Cr;6$!w%oK|O1e;zTr*@S!MDw8$*eLyn8~wfp+scAYh)dzJ{T z6oFcARS&~kjt0C*sS-UZuigTAdIIaqTcqs}k2|1Kh7M%6!?CZ3)DT(e`s5wZWX;4d zjl~vV5T5TUq$RK2X%S+BU9Y9q5<a1%f`tCwA1}g^Y~Mz|PY+ajS5{KFZ9?9FZdtjx zw(j45(R*HY%It;7C#S_>zi%6FyO28(yOPjGJvS+97T*6<ihL_~R)u)jk@>%c8(g!> zH#1BBBt1{l@G_I$3|{g_mkW>!adS_?Pp66U;4Y4HPxn{-!+?(t5#y2)rNM$z&wtas zYUDGY7vt$dFZto#Lpfg{?QT5Dk>B0nhR<fO8AoZ!<dtB0x;qLRjW8<?1&}L3Ii?E) z{0-n^a2Lm!Y3TU~+?Pm8ZmHo0;5<eV+-rcl;z@CIIp#UI1AxhGfS(-s{qdf=0nay$ zI5W*iyqn*NxW0I9#`DiQvgtC@erDt|pJq5cPr%)Xw0q$;!4dpt-0F+c5^l;zPj_eH znt{Uu?(PiWXW{OK%f2X1$3Zf3-QddLGT=JkRKdUS`~Z&Pw!`5DAjOUYDRd|$5^e<G zKXNS)|1NOsfV()&twxynbdO(zIDZ^HI*a^A;Y`~8>T|P^*L+@_|6`O<3AYZ8%AANN zxnTxOVOMgLw%;E(%C{BnJDe|j9c~L8!Sopca`Z7{f-iRTZDaQ^N;|3*4(7qp)7?=z zDkrQpjAjv+jwiui!cUIMxE%ddhI=@r^#(ssnE7;%r*ifojT3GL9DU60@3?VBUh{b| zj*zxEliLQyjc|QH4}Ec&9QjSx;v(1#H`A8@#~?U*x;u(5K-lk~om?^c&8MCGqH`U> ztKjZ8;y(+*=Oy6ogd2+T{*F5j+?3CJy5peo_aL4eeOfx8{iTk+J?$P&X){630JydW zUG6yC@tc0aVfyJw>2)Ko`E-vbx=w<Y>2L?&M#DX8IP(7)N9oIqwC2-2Ux9(|9G?9< z;B+P&h5Z@ldr?}#Px<KS?o3>-Aw9Wg-Q2)nj2Acy+{JMpA|1Iyh$Gh)XPM}^fu3-Y zI4QOQj>5hHd=Ae5z}Bl^3JYiEbARR{d?y^GrO&qgNa>6x`5C4-IQr_c3U{qh28Bf- zO@F{S9dU>eE&`6i_u*+e_wqIx@$O+}x<=r6AC8{xj?(Tx7^O3Dd%*vK5k}#GotoTX zz@}?-^P6Gxr1b9amHd>p9(hg~`3Qam?g6+0xN@|?-*ID%yyo*_9Mi(E#>4r;QN4dh zdegbL-yiuY?N4wNPfvG8VbrFShWzH!#6|EuopF2}&I<P}(*7M6W8|f$yCYmw*5C-~ zmg8A$_#eje3Ao(`d<f5P4ZoTGO3!Sh{V@_U0^H|tZ^Km?@cnqMG5i$&-*C%-=dLc& zrFNCy6|&%2i?D-m4;XRJc7r?w_XS*sXv}3%5`Gvkxzh+Mhr0oe(wUCJO+P(vM7~%f zulaP3r?A8ShrM@!x2mf8{*SWBr5)|4D43*pE457U3V8zog*?K(z}{vmAROQ%!Vx%X zrAeY<X30)dD-$ni+EvX;OP@4D%e-c0nkH&yni*zVrpf#Jjxpz2^BfOo*86#$=l}lq z=QH?@HRhOO&N=2>bFIA(doTU3;O|SmCOP>n%7d!cmk<y8r{1S)nB*kMthXp1Q@y@~ zc-Z+dfvV(S$x}MsQQT1So}oQuh>lbF$IkkS#($HvsV^7r?()oT`Z7b1<7Hbanbk*G z^m!|MkK!G>r=BAtX_s8O$6J%<L%ql}&TT3?Vz}--B^RrWttHz@N6=Hz_hot<$1;3B z9eiOb_}nF#I>O~P`9?WFwp}Gd`Y4M&@Gp{~d%1j5zR2Sr(EBIJjgm_xl+O|;Oa7*E z<nAEoTgyH`^0uTL`-6MyyGN34$&VD{%?jV^ioSmd^&+DkE|cF6_tEd2NWLW5UdL}n z?(F5eV>pJX5No<@_wUzJHW{fr%eG4Lbg!~bl_B#->8t4C*5Zbem!$tLlr0gvC9mzT zU*41q9Id@fKC6>^<#U$gKuK?(mSBra%O6n8+s5cSwUT9$z2rMXMEG@3j(ZC~7Mj}d zZI%2c5IqWhzg6Gc$LeQbB-=~)3P9Qh$GwF%QXBr0lt*llY5BG)s~n*B3zET-MQZo0 z$Q|k*^&-<4%T(4oSEr~y$W>}H&B^L?e9w_@UqYRkD*MTSx`&V)ruiSNHs6X|p!(E{ zOk>Pb*{cWXJRYwH=}FF0?!G<F1wG0H*`nT?_#dLW(<Lw!e7Bb^%~iVQ{uO<6yRYZS zwC*M<dtCj9^1%<bwA`n5mrHh&zJ-LcjWkw-AE!<0N1b1<jXK2l4#^KBS4fs?UeXvG z_ZDKLHvG>GbtBXAnJQ}@ta~)cPLgkHEL({P`kN7a9}m8fX}v~>SD&EwgOWWYgJgR% zvTZNl?}vIY6=FRr89LGBBGrpBShfu$Eq#>zTz<$OREC^Vao#9CRMkC+_-e3itm79X zE6e(hiEKLtd#oEdTJ}5SgYV|z<&sEr1m8o&Ir2GEa-k&F|AFkkm3&y=9y?94P*TzH zOJWp`qih$-<8kWyisJTDIZOqg8$-P4e~FGq1{>`>FiC4ka+PGZj^Bzb2z4XV7-Lno zM<Qw2wyS9q|I}|yI=&l8S|qWZv6J<^Y{^Us`EH0&V*b}ed^ZnuVJg)7quRnJ#!h2l zPjfm*IejZ~bHnSwRETx9Y}<awWxn|Fpkq5razQx0Qd}AI=)Wc&F5k%?*1gN2E+eH6 z4aX~GdpOu*`M=BC6mQ_+E)N{0_X3jBCEb!)l7@uxmyXb9MUu}+%2Rb6k#PL`AWL=p zyD9pS4+-`t*rN^)RQbT*6PcD{n=xJOO2$jpd5dy^>h&eW!#-<<_8`egl1Xn-h|!l2 z5BrOfV>-0=NYM8dx0YNz)8!x1qns|=MUvzCD2qOCg?lRAd9(H2RWeKRomp>9ctj3$ zBhxq!$o|nzjYU2)#J$BaB7&aE)_vHb|AWC7rb78QB%l0<%hQSxWv*<8NXGV27JcAA zm6zwZ+$kMdTgQJsN}mNvZjn&FMC_If4Dx6BAsp{7*-i59P!@eQovXY^o;kXu<zB^j zv-0u8e^}5X(-{3#_K4#DTyl+Mo{ry)T-3{V&u|P=A=XUUZtdzRZ#zbxCCj!_@=&j` z+I;;MjAV-Bd-8i)a<62hj=v&OcBELAe070-2vqW82|t~=Iyq70lhn>$efa$))Qe1G z+@`YQy7h%n$pp#Hs=uy?{B5BhV@u_>UUq!HFWaXB(W6jriH<KjPM<qS?vl?L>L<S% zioB>Yj(f}UUUqz!9_xOQX`QJmJ4iA@GDPwlwewbF!%#Oejq#LXrn&l_#x_I!LeQf; zq!>}}O?)3cLHU-zRPg<_Z08-{(sHU~uH+cm-imA$>PDt9{;EEtxuR@G<r`V~CfmgK zLHYJ2#QVC+(lvA4$Fw#jJ4r5)oGGFFlOK2C_h-{wM}7BRcKr8Jj&_g?l(3f580p%M zIx(Ui{riWyk!kt;@=x;<`|_`H(1|{#$h7`5YX9U<=r@EUb;-r@Jy1l@-;Ch9R`8EZ z>+!Rr_>4YD_mh%AlD%~NX5?+Xd@l_3U@FAAN7A;)Ws&Mdc~$yzk`)rlqaA)d$gQ#? zb53?%CN5a4&%?yu2iq&+uVuUQlR94{>je9)p>E_5*{@VNzW-3!V(F3S2)-l4ntV=` zoF|F(&y)R!lA}%$C6`Es>iB#y3dd1S4CV1S^<7_On@C_P_^eQy#EbrA>AOo}8&{vI zdz>J5$T!L|*`l5j-}HD*I=-Kgd|VRS_||Fqd{FW^$>GZ3TamG$Ze$u`pvs<IqR$&7 zKaiZJ<FAWRIDR9+w;AffRH*w}h!<n0@u++M>3T0I`MP9B<@&A2g`qA?g;-s(opXlE z@5Mg{9b3OoYyC^mw-aXuJ^HVSzfhg~&(wRkAUBCu1-(l=Ea<WP-{padciv}R8sb+! zqrZoXFN#k|9*|Ie@>1Q?Nj8=IuBpHANI0GoWZTc_?~<||5bTs8*rN`ACAl<|MW*H0 z27F%UyyWF`bYJln<sjAXONfVk;JLa#mFz4jy+t8LUqU?Wmr1rdPoFhP(4Uq3LNffz zZ%#(aZ*{U%Wqrx&{QuMT<J5j%@}lf-Mp`ax(Mi>}lx6QrR_Fhpw(qI-`;up6e>3uu z{8lILTBcvL>O)rN|DU#Rq_+E#V>{+A=$tpVMZZ8bZ${_bS^D*uX>(^xn=?;8NAuB+ z1ub*uwM?FLz)r*V(3DO6fUaqKiTjBAx=bDE$11kh(sycozFqUUj@IyY+7GwUefqZY zd9RA!C%fb#36FZ_hfgosQTG+t-mQ4=SNYDm*9oz5Y_gu-sN_evvPoO(#)G%$xBiwx zw%U4|&EL7<X8CK=jn>}a?e7>o$X=WF@ft9=G<efBln>r^@W1lfv~b>Z@H+=9G_O9| z#k4wmbkEE4f&L51+WkuX-?mPse69EP*7Y}dN85&J<&8FO8IT_9-euFC$32hu#iIY{ zYhW7xUx+*?t@rQftKQ%hVwYZ9wQ7k(tJq(wR-L4p2(K4TdhMU4oMiv%pLeW48}_RH z$!lP-*IF%q?-v90;>ZV9t$GEglTMoS&sFbedF@dSc)j+h{#n(pg@0GATDF<~xqH75 zMm<|~(%SZK9#5uqyu0-KHB<4h*9ogm+PP(_e65?SR_Uy4QEVMAdwJEWe=bMW&sq0t zS+RuUqd7i8SFn~9-&XJb`6vACymbFNIp*iDTUOk*&#wmE_9Ik#t$0+4`RAYQ*vgCJ zk;Sn!t=3-uvL2tbe#?HL=-lmAzV@v->krwom+LAV`wGy@k3%xBpZ$AM%by;y#FW=6 z4?FqmM{48IHr4X8MK78)TWf90R?mOlksS6@r2RP7zh49Bt5!Wa<>4*we#fdUAGU6e zY$vS0d`9At-Wy4MP5sViX4RI7zG@wtpWcHls@o{M&Entv-k|&)Nx7+0wLW^R??sAx zk^&;Df;Vb-+4}WlM-y#gx#<no@5e)rSHFH=Tcs8D!%gu^)-R{tDrGyow0{4*YSlig z`aS1{7gp`J#j3m2)#sM6UYFmuY{a6g?$(0%ov+{fmW*gQ;wI(xIbXjo@c$le&i(Iv z;j9riU3H6&pY`>7%WeBCYFR|Nuh&~1-Dhfxl^4e&i{n+d+%12Od%t}Bu3AT_w1oNk zUA5Pg{qoh?Z&kmGe(dY_wN;P4<43Qp+V8csd&hbG@v1Fxx=8Zcs(q6+v*pZUEv-6k zvwrW~eDJ%r(4)z?C~mu5@BRPXz4rh2{C{l!A3bK&q){JE|JD7)D1AO7`JIH{4dh1w z`NhA!UjNSh%ha9JmSimjM)KEx)BQ{KZ@&7!!Ru|kUhDA62ffx>ZPL5K@d|NdNXk{> z3dz(yR{c`_-E!%^sy9MDAC?@Vd%{DN*CQp<^;yacl}kqI>cr3X^Y}*|L&&o*M-G+G zFn)7Uuh1513;Ex~v>yMg{{C^`|Fidx|JT<4e?$KN&E=oH!Se6lYx%$JEv<jO|7qD@ z*U?>cZ!p@0U!Uc;uh;*K^W*>B_gDWj&X500{{L5;AH7b3e<%O{xz88=|LenB`F!Uh zeYO)n-$^gec76VrKHvGz<iFR_`d@MQ@2vm--2Lf)Cjb8%_n)psx;D?#J?KYt|Ej-{ z@Q}%S^mm>``uoBn{e5ADgooJi#6liwHS%ov>i8c0Ev2k$dfRT{{xn@}|ML5T|4jai z4=vwF`=9gq=Kr<(pZ|va=Z&&nl>hhTe|&A?PQ!=qK4Pa~Et6|IjjD|vKi>WzFg*NO zVE?f};mZtq{X6^9fA0G5pSeFuPtpG^`u~jm=|7YIV*S67_TP7Y^j;VLGxn$dck<6? zOnfA~R?Au^WUZyr>AJBTkW31nM~&JbJ9X_b>-QfV?9{17`~K_q|KMr;7MFA!%lXWz zGc8}zZ*l+er<G#)3YD#?KA&^-RX_HN&%bt1j4|{}?Z-cE@tN3s*~bR^sKx#Au}sy6 zT1O{kL!|S%NA@jM&&H@&;}-WHds=Di5<Yy6{avYplXV>PaKPe{hTPIJL^fWFH2CF; zlg3!mPhnIx1P8si-{%8p^Eq(+{s){^8o#990gL;qYzPi|b?F+qQS|B6mm%h%>x2F_ zd}eEpI0y8OGeikF@(sqcbTiGnV#Yr2e_CltztM~P=k4h4&>z#EL1Vdks&+JqsuT0V z-=^1z?PyFBmh?NVq!Gm!{M~xvq+Br+Kw**?{EfRFeKcnI(389k{;qw!{F8q4DCh6s z`zc`W^0-#``}oyK{n&T@o_=9s-+yt5DQ$^siNCdvPs&+Kv5ddL?;p!_UZiFGZC)Q? z=l!89w#nb=&rHh3hBjk4?=RAIKfYHk_-uULBv%J&k>N5#F?sR+e2y4%F=|P_F{hQr z^jKrOe>@=Z8PkUk_YvHU#5k!>%<D?|jFOL?gUQ~&XUIIGD%RDKviTY!UtWB^+%3j( zjUn%2%merN*CjFHnixU=y?76>Q0yzl5FGScDxV#a7&@<Y%Jp1(H|?(fYbIZdqcOzu zI`(7g9{SE{vbM&ZRvO1v7R&jJ{cZ7l)%uTPjpd8<H?y_ZP@m7~`8}jKj^6dV+EqWs zXFurG{-Oyz*8}sNt_QBA2WU@;@s-Dkr<Fcv=id;Lq!)i5n3v?qlhodG&FJq3XRgL4 zj+MVP%u0QFtzG`U@SNI9`qJY(=I;?*Nv`6Y53pYP-zf$q@ngIEU85zj$9nNx<!>J8 zwTAO?NQlYbLOvut_DT60eOgJgAX|*j-%2zMh0kf)CAA3-k&PFBJNcfN#K_n45FGTn zsN;>-;yp9hycWA=>Hj|^`RTnDct8D*n1?>r;!<r4+okmv_t#o3uF1S7|NI)(;?xuM z-N_i=uT4GbPd!P$fs~Z@UW;9e^#6_1wRl=-;*x$J?77bLSwMFZqp!8dX9b^GjZd62 zK3ABX`t(|he3tM#%}boKxMpH~K6^Mm$yF?mYmv_+_DbT%dVGelrnSiD8>?H3eD3i^ zYmv`I*0dJ+oaDM>T<QKF`&ichsXQ?C3F|qI?IM+Pe;0ET&!ekkAD!68B==S==j%64 zRA$$LvFrCABAwSz*{@FW)YtjNL*Xw^_PDqQ=KZ<A`+ETQbXwQ3KYTXCc^B{X=ua%; z@0w{@dVS{q%-x`RaeS1;ws@NNRk2LhgJ@qN`=mbXBQI)cSufhvx9DG%{orWVxf1Oc zt;W7mc3lecKE=7>3D#dp>~S5&avll2WDVs!qxp!KTf4sXytm?M$$Q57Dj(HrZ)>|u z|5qZJKfeJy*v{EFrnay4or590>~U^}%Ko0%rgD?c%~X}?b}i2XWpS)aRhH&-{NmDq z={@)gl`l!^>fTBBng{o|*X+7N-z7_Y;{9qI3s1T2Yd(3%ZEBBW;UTy0N#dnr8FJ<7 z$HEh5*EE)kRQ^U|8Tz#~k7cRKcTM`nIn675pEpFujAc#lf$-T|@<#7*rpo7y-s7Ai zpEr7sqm;hkdz?GuGejL<(|eqi#Mx~1?{V6+uKBEOb?<S8sQzy9d879*hsbAj?_tR8 z@hb0Y?<D>?Dtn_nlKbE_?UBD$d0+d@O4<9`Z!+x%eeE|xWM9*MGg9TN+iw^P@2}Ui zU*K~JG1hRN;&X+3*0lcR!X>t4?Uscl*x&UGu48(4Cgd+&#^qm*$D9WIk6x<7ja|>+ zk){{b@f{-RRb6jLW#T$+uP*(2jD(1Af$JH3(DWiAzDp%ZL`*+4Qyy`J4j+>c5kBF1 z26xez*KR2yu8?h|B#DUWB{Ss_N2=B+tGTcQN4uWED@`vV;yYE6M8w2<x@6RR1aqx~ zKEm(0p1}uAFCyZ5gG3Q;5^i->J+#*f9X=@`5`4<_3|6%mdW=@K-$|0bQQb}XXs4=H zht*tIg0o!D;GL!yeZzN#B#Bs<@`!AZJYAVS!uwp;v!V0_CativkN7?%QAF^vsr43l z;ki~zJq{el7p$}jUNyA=a3<HnI;J+jdTs@Ew}Kg_mVw7_r18BY74VY9uK|x=0UKEL z8raCx3K;BGu%%nUP`84;-3s^->9tyFpxv#2pQ@G>oZwb)mRrI3ZUy|jwS2+%-3oj( zwKy6+gL_`W6u=i<*AoHtnO~{r6yVFF!Zii&61H(QjkLa*ssN9*^fQ^lZf*sKyA{lG zE1)6yrjfi(rEu&~N&{=RG+W>%R=Eafj5Py2W<E|lH<M_g>?9CZYKP#C`SRg{{7DH3 zfxIb|p24x&3DY%+?}ZX21l(w9<7NTRwOaBuQ#e*}{H8h9zz<BVgS$+v0)91I-2?x0 zE8sW9HKAZrQ>$Pzw*r1}T-CrHrdGiSQ)}RCQ|sVdw}OM;X4OF5)GGLpsWmXu)H?8i z<!NPLr&|vz=L?>U3JAHH8YlHy*~pCY*LAfT{hkE<76s*p#L=TKH#`-~^}-T7#Ptl$ z)0^FN4)C34<xS)D(v^8|qnW!iNVQ}_l3FEdpCD1@z;{fo0V-<408f}&2Tz$=18eJ= zsA_;8GnX$I<yKHPwFW-qRxroZGC0qzU}x)M4eV`d9gKG?Xm=}^Y-$yBm|6oq$b5TE z2AMHPij}&ym}c%7k1?ArvEl;PGkCH-4^PvK?`I@h>fjMm>-?fQp2|TQ)E%pU-%{6_ z1<OpWg3H_re&SZ}kXr$Pl}*4ewkra7yQx*c@4m|lM!Oa8tMIad54#n-&w5w`yO~-A z-tT-R7Xz%&?;ETG4d6YjfE8{9-opym*qUkp?^dPgR-@=vg>Kc{7kCdV;9<9dt*wU@ z;QekC{jSjOvF6YKvrMgkPPYOdSiWCAkaspoT$QFCwN|S|Q&oZ<YmxFrlvLkI{yxAe zRlR#vn(S4FKc+M#?4j^{*E2X+ckk)K!uM7yZyNV*^>R4T^ro?|de?Zp61+~LWeA=y zwFX`=wF>yvbgd2Ijx)6mXhI7OoMmba@ay}sf^WMOT<ccwfLj5-*e_r3s9VAFZUsB8 zZw-UVrq;n6w}N?Y1)nsv3_jylaJH$nFA4m<zlI6E=~lp}-RcAQom&CV1&}ZJn_Iyu zw}P!Vu%3Y(O|65y+`6C8?p83<t>BYx<tOLA<tk4Q;1~SW+BzHRmP#TOY-DN`Y+-6` zn6Q_r^{$QeMp2?o1)Ohc4LoOReT+Ur;Me69EbcF?moV=cJjfE=023wbZ;<7Z?DtH5 zt3(R`Y;9_pwJ_SP;PuObrx9#o`KlGuS1WQ`TVDg`5e(`ezmy+R2gbPdP{C7I2M?LG z23|6?YOvJR))M-gT3t_A=2o7r@UW{qY=KV^H42`+u&t{k^n;#TaEPg8@L{(Co-?2{ zgRM8R2w;?{b#Sy>!D6?9FS-?6<yLT;Tfrl41@H9f16!I}2BX~yc=mz%0FH7iU=hg5 ztY7NZYXm+#)G&($P>TzIsT^RFR!`1lo=p+Xu3~!XJRyOnS7>@zv^?ZODhcx>)Ol0` zk2;X`!varEkb1hngA}BGSKzq{QXdz*vvroI_b^|V|H4|T7oF{UE!C2>R4kxcF`63Z zo{y%+DaiS!9&!r$s;L83j&fKmpgQY_MI>vnmg+1i)>DsVRcCb_<W?S{aj2`{bW^K5 zl7q8d)i|~NoUUG{iTf{`ylR}WcWAc4x!DzWHl3$kaiY+9t^tc4o##Ff96jz9=wzJm z=sbTSToSrsI~%H<a5~4(>Kl<cv!upgQi-*dL@H}+ma9bl_$FpOMc`o*a+tlTCSD@- zX@SQwNL^pxDGyRd2t4#b>Jh?pSC<IB4drV$StNb;Fb-XjlFsr#jnLU0r239nJ54I- zkndUQ=mhU!ug?D6tuaOC<`=>WeL2O>qYBr#D_rH`c89AE3vaj0uksFIgsT&TQ(Qe= z_`Iu^2{*g?OQFB5$I3>+P*?X6s;*8Ed`ql!OZD@!a=BDr(UpFhE!KkG5^gE*2pg$o ztq2yP)H4JYh}3sz<@trBQY5T$xU9b8RgRI$16t(E$$O$i>M4R>ZYtlD%8n!J4}{xX zeOmB~P~~N*ezI4_=h?5EDfNq%{mLx@D@PGd(nPRwq@E-A0;+7GNf=@iQ3fMStsE`z z_z(GBAn=qCsb3d(2#C}d1fRdkKwZv!Emh)FGJl*^y6%5B?`)ODe311eKm8cd;}S)r zlrcz+VfeszE4wFKSc2QQp23s#L9b3Wy*Kd}zWYeDU4zq1t$#+qQyb9h9jiF<a1pIi zFwxX1nCw>2<yNrRt$@H99pI5AiU96(EBK{b!IN$UAF;mFz_F%Qf%mZX`W{y3;cTnk z0N$4h_>^0L_oV{71C62s6*};U`vUJvrRYne=u4&OOC$D$&(oU{yImH~c0Ge<>9h27 z3h@1^L{k7laaS73i>u%v^Q`m06g-m|D&kade9#<g0B5a_qE4Q(ScgwusPr52YyiCJ zW>Krh=vr(P%@X9PE^=*!M+Q4QHQ1pKOa9@-Ulf{Ft~V6o*{)}By={7BNVe;(ylH$; zx&{tbn7KQH?VFn!@LU+JGk`D-*rmUbsUonazO<A9f(QJpL>_?W&uC5nf(LBh+C0D{ zQ_BFs1JeC;UevYF`x4~&AX@m~Zi#BO!e6-=gh92!i8hiN2qS5QgRFBku(PRE(BW1F zve;D+dfy7a;AU`*sZ}uSUDhSQQ*Y=JoaAP3oT*j7^HtP;z@ut#hUG2I40w7BW_W>{ z0S}hJ441nZ@XQ&^@HsbwQ--)1-m;a&zDpQoIj@oDhO74rk4cCDJ^jTJR}w?|Gx)GX zZzDj+a~qs&d2WD^=QcRolGFfXRc8@E)La`p&CCrzg5?21&fDM^>t_SdZFvBM7|^?1 zoL}nC_a!<jTVXgKX2)}frStmb()BU*mxmrHYFC`fWTK>wR$gloJRlP!GgubPkO`6* z{4|&$6C^WuKA0gBBy*ewsj;6dYjUeIF|HPs{$vaN{+LA8D^&FtR=vs;KjhQAoiehw zL=Gg!r@0DfBZ<%ds@%}_3jK*n9OQZi2X1S_%rA8K?qTIkV?(-5QZU8L-5EUJ&EPAh zmI0!iWstzh*`35K5r4QuGYrb6Rso@91q<B@PIN0+;#P2`TfsSQ1)&SA@HRJt$4#w( zC*2C3cPn_=t-yPp-zFqI&**v0JZm6iqzyLR3}{=U0HHf=(BtN_p2Te>?uV^b1BAE( z;0105A=rQ-Sbi!DQMR|TsnorUxV`Hc+;zL2Q;hEzD{mU-NY|MTy3E|2!B$n184NJB z3=pOm5;*y!A&FZe{s9uD0Zccw3PKaD@MJdwp2{R=@Hw{vp4TKRxWujCdbffb+zOVv z6};?L@S0n}y4Kw)2%~6)o0+)+LZ)<U>91r&86%o$!D=83qYaiULJbg59R{I|Ht3nk zr#^|>O59G1TL&TT0JxR~tAh}1KoKmz<9xR~$6J6h`Sm`Qmq_)TmM@U%i7bCj>NOHw zuWuGSW#xCPf%jWm<v4Qw1Hvc?H)e3O>lr-v-96V6zK2?Q(|DnDo%!HmGk0h3W2z=I zI59+kL`(LGBv^@{UzTVq10h%|{HWEcfe@^<2$ttL36>FTnFVWr5UdS;+=4Yg2-a2v z%TF=>-}uE6QUWh^J%b;5PtTO#`-qh{jXQ*LxQFT5UB$lYUGMcu@CJ#N69}&P{jU8t zc6ZHi{hPTqz{_UtZiBn26`iBN8}4p{4L5@jSZ^x*#s7bwCSja#y6YKSwqwt6;(NB0 zH;sLjAM52M_<%&?0lzo34mR7~tbm7?X*GbdTLF(elNJ2ft;>a9x)rRmgGB&5T1~#7 z-K~I!s>uqDb1V3gTfwz%1w3#~zF?rntNwzarq;n8ZUtlA3J!8BIMl6xj3`2y+#57x z-LhoxcGJ7t;H$w7H`1WA&9=c0nBL4FDZmat73`2CV295HJLFp}*x}BmH#0ak*x|xp zhol03cy+Ktl7Str3U=70;bDiQhH*iLjvdYnb{G~&kHt3L``ZdTP46B6mjycv;~M}& zyw)V1-q`z#FK1kA?dc>HFLgbGmG@eovefq~D{q$I4HDf;ft$_T-3o7aGk7?d;md9Y znF4E$!Dgmb!S-$iBist;M6w>}Z|Fk?Lm!L$$bFi`PDXLM>lu8_^zM8-d;w*y*_y^L zO4m9D7nr#_gRi<7tRX^)NN1aC1%wE#@EJFQ5Fx)}CVj|=aE`gwK#0%=Uv@JH5%Ll9 zHJP;}j2QNFJ%i&-FGh^-0JAkqaBqn&ZD3zBcelbZZU!MjYg_|Kgp3FuFxMIg5!&D= zH-iwNM}I>fTH&_lS_Q#1Uz}yxDiVeUC%c}(&zW8f4c|i~8V;CkYHhB7XL562I974= z(tN++%R?7SXcAuPdIs+_y=W5O%Oz?OTy1LYy8@m`llSQGUI{_reXeKlu${0MLGgXk z%A3aRRjx$|c$g!ukZLl=X-R68sO`o1=XyzTM)7;Bb`6A}ZAH-hZXl`ES_I8gHC45z zNf;HJ?s^7)W_mFyd>5ImS%RUwHTFL#&nW+vL<t1fNZ1)6)snm>wOW&?`T9x9+mdp9 z?&hy!749qx*#MWCS^-zNwP-WHt2ss`UZ)Q5&>mPg7E_{<dnGpM;(e}X@WJ={OvaAz zwX(I%)-?82{)E+UmS8B)(?|V3czFgxd4A4O9_qIy_47m}<!zMjq`v4T2<+@#9RvxR zynlI2p6@eLy(rDcPn`E!X{{*D*Vd<0veZiRMap;Q9+QwT_=M{jY~Q(O!tj0G%9|y) zsmgUafX&>s6;drZOQ`jd*UDgsnx`p=+Dg<-ta=TEr~`_q`B0KtZPXfQwHhGQ8dTKE z*Ad?WtVkFwtht`Sb4@SK9(-q;tyzMhJfHrgJfr*^iRK9e*L;YHYb&m2n`<2e*L+bV zu5Gw}&RlCCxaKDkUst?X!eHQ~u4nK`(~H62d!5;uB^b){!6fAw<xfa77!X|Z!6dG& zxISjCH4t3$!6dG2xIS*Kbr4+h!K{?+uM!3W|L%GQhYjty4)J|KqDw$Lm-+hTD09<0 zL2<O}8T|RMp4IU!TY0ktLwTNyq&!Q?+tRicdi_>-y6N2m;CF)^J{|0EUF$=$6~5p5 zGXU-v>@f5r&mR2<?X)HB3`*K*OWGNfw9}TfGbm}NEomoD{XuHyuM*AoOTv%T6{$B1 zKXWw>e6kLYH&ecSOjd=PtZohb#Z|&=V2(9#va8=0ZgiF4x4D`JSDm}8dIh}VDt%vM zjuontqU65x9v$8*VbQ?*T+iUxU3$(szAsvNvjjtVKI=(&M)^LfuU!m`^iXY(YRTr7 z)M`zl=5v^ow^6>YRd0Y0bx;wt*rrrmk=QmR)?CkEwp-6}@ulJER^BYZP@az~DbJGf zwwQOymw5eF_yyCu2f$l{9ljRqaGPD}L$ejOo8CPD&I)!I`jKZMX{Rk|XHe2kThh*; zq@A{;ok2-EZAm-%YCb~!YgPMN!W#%LyZVaoHf2uMIPg<s`l^*yqiMG4J|NNE4p`4h zYlPX}RdB7V&k28XmEa`{UP~jLV3Dd92zR*(e(x$lcem<QM%3vlL7#UuM&e7~8%kIU zaAVgqc#7%8E|2f-W^0yUD9_hIQl3%1w?vB>w3}K5C%P3Zl5iUc38tH_v|pjE)}*Zg zeU!IR{t2tz03qt2B5FP<e0{wsVYKjU*E4wi?$(+7og}_jN^}_jH=0^sF5sD*q&R-h zN~_>zQybt;w}P=&rvWCLS_a>AE4bFJz~lGmw0EQeuD75yKxedHfqUHw9&sz+QR-T4 z;CZ)#SKSKMu~sW!ps6*mi(A1gw}LLW0v_Y8xZqT`g0tKTzTj5CW8mcre7F_hW30vL z<TnFumM}4Jx$7C6v`5d0!S`{ACgxAV%dV!8ytE4NP>R4hilY?<HZipVwstGn->qQ0 zTfxC@1@t6YqjbcBR*E{6v?GtmLpxaud{Ux30D8llKIk#?MBw?fMC+@h*1Svg1M|k~ zF+9JbFik?n;B?nBIA=u9jNyBdL>U92_^>pT7gxb&%(D*8Hnj@A=2mdMsSR+Wsa5b- zQ|sWpd(u_|>}6^dj5W0m+D&bMPrDWDHQcI!v8L9+9JhjbZUxKS3NCRgxXsiWxZTtS z_@i6Fi*5xQD@mG<cM0z|wE=c@D;VWgaDZFEB)5VOxfPJoWb-c)UP%&uNK80MBxPCy zU0+mJ7zO$uMWH|F(U)JtIL2)HU;5(lu4nMry?V|wzPDR>)A%dXyEFJ~u){q+;Pv2V zOm7-54R+|Uo3R`A%h#uRj1s&`q7j1?rq;j{ZUs+DG>}$EqjI)BD7MnRwoo#)@it+M zTS13g!7K?O;78mH=(0k9bKDA+xfNXOR)+CSSHX>@*1&CU1$Vm@Jn2@0GOH%m5=y2v zz+h9$-~(<2drRmg9Bbwpm~3hTkV{32xn!C`Dl_=FWv328(%N7@>rNezA~n$lXSf-J z{ItP~+zc2u-f)C9T?e6`ZP0sEk3DLtxzAfK%Hve(T`$j(dW<A_BgAj7d{V-$0~foV z!ISl6do`P1K=EBBQFRcC^Mzd$S1G>IJnP`wrdGinZUy(b6+Glt@JF|T7u^cB-`f%n zes5|WtaK~baUUG&U=LGkV60ogqizLsJh|K#{jMa#niErbtD66r^`u7g!@SMigl<=h z=94ySG}PZ3%9lyskvfY=MVD(URef!*P89EQ9*JMXX-e$2M?Bm03?9|qbJp;E*2<g4 z{`+}39AtXacww-^+kzc-j&y(c9n+h}p9MR-U=%)0<5i}2XYgmi4)-7Jao{PYH;uOh zJA5G6VPE6;nvbIdAChPb0xy_a2aHO$2Vh%M>)>k=&S=P(R1f^#)H-<D)C%~ATY(<u zLNw5(VQSHUO-!wTL2d=_aVsdh6?98z8J=P01|X4&27cgHKq_Sg&$|`8<W}&iTfsU? zseHkPmgVkNxSg3B-~dzWV7yzwOjFBXzJ$KPub8<3!UVR)38Y6dZ@fPZHo$=rD#GP% z2KNRte7j~)-e90jYIiH#*3DpOFvDHVTmdW(wFnL|wE^b26|i;`8QdwMACM)ZjR|y& zbu(NnQ8;jZFvH)Pxd8?r;NEbiM6tn-gBead(9Ga35}Jgsxfz7Tn!j`6qzj8RgP}Zs z7tKj_nJupJSoOH<oo@**mh302w2tFfT?JQ|+F)f(mT17B)6_a(ooNJdS!n2Srlod= z*_FzSe$J+@4!&b*4KN>aC{kVL%p}FKlHP5`m<mRkS_YT6^}E7#uHGix?&@!Zr(FeY zo_)X^DK7K#Cs&JksFVABEy;D@(@>i&^*XnLpP1SJ_qr84;#T0(R0kW6qqW9!!V9M6 z7tCar7?+&4<6<H;=i_1~(UTKp-1^E|I3>m<=fSvS@sCSZ{J5A;;w0;JT(U^VG03pi z#>JlFf1tV@7Lzo89jZkUcDSyjzg<axyOREP?N#)*E9q}n(%-J6zg<axyOwGCm`(Mi zE9pyq6ELmlOF8LFy5E$OzLb-`l#{-clfIObzLb-`l#{-clfIN=UO0Eii+1qX6{#^R zQe#J?#<r!#CZtYKj?cD*Qn^@o($#gw>%THc<S;<k)Yav}zz>>r3!(1n3Bt{;-YPuj z>OX}K9Av(eg=wxnDLmt9I)rfg7elBQolVcp<MPhdAD7A^*O^7PTCLUkX2MCXeovr3 za!8vBTT+pMauKOaq@UVY%l8Sta`jcg<ChusRu;6po3N*=9~3_1D#<v@)!6Env^hQ{ z(cLuDb-7Jft+-Ct9+Blqw>C!VZ>AFYb_&P4da`hbtB(r1Xk(MZQ9{$zD+R7)vW^TZ zU+NiB&yq;JL*SYv^(o<5S2xmDH_&#y+77~ju5vM2;3`?-^i{QkbVgJqQV$nqxVnut zwC!zEs~s&YboB&*GhM#z+TSV?sXr9h?xfx>Y+&10ZChanS8o)2tE>G=s_$>L;xbel zs`=j2=DhZFKK-=^H9Zg8Ox30-^V2>1fXPs6F9|G1sq1U)ZDi{&ztQY<`3bwsVR0>L z7dR}QPw2%7RgWjOR#;gHCDnMabZ_?ra|K^w`KyDUdMZJ<*l>QY@v_2|oT~<bA(sxd z7q1}JyF9OT63Jx*GnW#!Sb1|zAa_at>0=|2+7e#H9#UPN&r7vPd-e5>l?Uaxwgs;g zj+N-huT>sn_vm{6FD`IBgYzd?_p;RYEZKFP2cbCMYzgJXRqzG#tb=8yR>Ak&3a&S` z25xXGxW&{exZSPbH*N(_x)p47uw@5aXlfnMuOw$hw<<}m=fpuRlJ_TVpnA(GE_OYG zpPJY+0r;LLQ360H&J$1+S1I04wRL$PB^=@ERDnverp;eqAuC`XE3E<QX-@}-x)l&Y z)*@2AHe&0%^P%~D&9e@Op>>wQ!`%!Bg1HEmZ@&cllSIKv@HNxBTcKBLmSQ!9XpO^R z4BwV0Lq8H8b=7KHyX6gpHdhA=Tevz@*wxiNg}q&^2#2{E<1f`=Q(|v5#j{<{;I9tx z;iSIbwen^Q+)RsJeVq+=l<1>Y5UR~itKI0;O7IU7Ehq42Gk3SbSIpc1tAZJBq3gZ8 z!J(!$z?E(VKX5C!$*tfH33-HXx4zW?{lg50yBUlQW;oN$;FMs7OWX{uFtrYDaw~Ys z)GAo%R`8;!b?~Z$w&A+kSTriIu>>>R)6L*;Q|sV(w}LYzIKzwG3~n>E0iJRzctL_Q ze8tURwpO@K7_d-+2jsUMIgf-*Os#=!-3msy6^wN&xJp6@_(wN`<0rcreq5rR7@TTq z4V>;)@Fll`tK15fo7w>VbRH>P;BBVX2MU8-1zVX~1G~8uj5W0Z#+zCLAC}N#c!Zn5 z7fr2SEDY6dq7LsVe8AKi*x#+=g-LGxuyB{D4e+Fd!0=f&gAH^VDcY98P*=eROs#^l zsWot@TfrQ+f>TXxfb&ePgRi(1e9zPxxW%o26HyJP=izmBW;HVy&eIub`47Fk6^8Pu zvHY8|-6>JXKM8+#bsL>veqz?YCDqTy`f{n9dh&fh_^qo?3oBiHMOfR<je~?kT)j@X z(beUGpHlhBqhRrbk=mi9JjYgb{XF49S1%VHa`jn(r7vHWy|3B&`?Q>f*~+R<5oWr| zdb{6MR+cZPda;J;tPYljg0VVS8d6yjtOuzTVYaJ36MR|Ji=|L!(tS>C_P*?s^9|vK zp7X?J_!moV`KRjAoz|^#(Jf`pUvUT3nUQRu6_xvhG!9S>*}HUFvlp@PB%6-ZxJyWl z+kt$~)oyT!MCvobORkc?WBmjNobRgE$7wGsXB?-OBE%Cz*4S@4`=Sl7mUJuWOEK0O zXQn5+#<|qrQdKL?rCM=P)QUBqH^uLIKPKVw2A^;}gA)(6(>1>v!?)!_*qX*r-W9t| z`FdVnf~^uwJlNgT8raLNV1Ehw0i0>(8klct9V~V$ILocz8n=Q6-3nH?75v$);O}k) zJ8C@Y57^6x)(RPh%zca^V-)*ZfCdQtZG$^mtp*^7?vOx;+g8NYocN3EWU8p_wZf3S z{I-y%uT~_?1gyE9!G}L=iOOdJ-!3a}8bf(L6O@0<%S-SCiG~QiVQLM0&#mA_2{Qrj zHggR;Y-%0+&aGgjTftx53N}|C)dtww)EaodTfyOO1xL9RoFJiPxYW!w@L#6Z!E(0( z#+gi2GR%x&UT?i=fH0soIM-@50Ig`M0HTK5;KOFlr;518OPDH1v0U@1>XvPhME9KJ z@jI^mTJVIGpOflYD!(eVWZ}#26FeW~FH60|t=9=RxtcE(9X=+plTv)b^$Z?(xb-Dp z3jCn{KdiiI+*ak<RlvK0D;(iwuvaicqRBgLI0P%ft*y8QLa<i2r<*|t)>;HBww9u2 z8Ns%(T6GYDwZY+T1|e8m5iCC|c`iUjVrPd~b3KFm9?>%;_?}_qP2=ZG@6Mq6YX1r^ ze2;YB68xq_JMq=R^RB)qP%GJ=sq_(v)<*_I2a3~Awky576%tMBX8;Tx$lt&4K!Z^> z0R2x)akT3hylPs{f#JK@%A3XqOz+O%?}HuoRd1q~m*8B9P9t!vnY-t}+uRI(W@-)G z?N$)ln*&QzECv{8Y7Ok|R&bzO!B^c1u5l~4+pXYtZZ%A`xN8ZUnpy+n-3rQX1)p*& zSn5`AiCe*C5>8zB4L5@ym|6ojxfMKNY7IPXY8|v{4m9;(4^!)4j9Wp)t)T8!Fwd>v z^KJ!SaVubsk|o8|ULj#g!T&P7yA8e;?2sh0Yr%J$-pn9r#tvr%J0#KA;ZK7dl4|Vm zAHfbuHg@<v)0-LGKiJ{SV239JJ0zd<ACfQPz%5K~W{`|whvW%=7?x~XOL&ow-MwF} zFpO^iJTcf|7~cRG;<YC62E=&8zuMYcSc2biJ%c|z()yHdsrcS*<;@bLTo;WrR4C43 zF++;w_sIQT3#tEQE8gdN26@bgeDkL8U1jA><LRLsUSPWZs4VtX?@_N;g1?vOY6M2g zU0eG8!U9*piKdppx7`Y^bt|~Rt^Xy^SaMOIkD;v$?q|hyKqCwt{?N^UAef6_`94nU zd#zZ>5$|(7gInvJR*&S!_B$(Ymf$8T*C4?_cWs65ax(}K^39djLWB%%Y_2sBBDBGG zx*3EB#bg!{T8Z$IL?7dT;F>S7p{hPi!X*ms>Usu0WqL91`0g#yaKNFa)(;o(Om1-s z$108=veH`NSc|J}sY;p>T8C%5p23GrFIva<%M!H?t}(TKt$=6JI*u2csS2((wFYoj z9*R17M^>ohF^S#0h)=kl!E-x$&M>|ko2_ZwJe0%3f*no|cIYvRD>yM;ur`_{I9xv3 zSi#<2trb!&*>96t8MQuO#SIW@wH39B`=g?*R%(r~T6GX=4Jc~mYo6!&Tr43Y@KV<^ z__LWkGlK8+5={-b!_@jO1w50f!Ew2jR>3`{Hozlp1(U5#157cs3_9Ejj&dvT`1w$a zj#TK#Pc3K-&>3xq;4!y?Ke-kB!>tC3Us+3NHMIr?x)r>~tzdt*g5%r@7P%Fi?pE-5 zw}NGE1y{NiT<unHqg#QGF<+`YOzB<;69eyeJ%cl5^_&=d|02=E{8Lz0#Zu$hN9pEf zs)C`WR=^&nmaD>tOsyU+5Iwo16xAz*V}8M*^iL99D~&Ho*HQ*_g)I|$%zSXvcv+$~ zGeE5oS85|~JYSw&G94o!3vhw!8T`ygdS(INvm_ci2*rFZV6URMO7R8eSqGPzS_MCF zEBKkI4REKaRZyC3T?N~j+5o$`6^wH$m}F`d9ARo5%rdnBzTsA|ekXAoU~5zBV7Obs z7`K8$-3n&76@1RE;PY+;H@g-5#I0a2rB1UnRv=Bu-cw|$k|a?d7x|0CkOs|b*9{6p zT=bEOLNxT~yHv+bvuW2C&v!k8XXyPZYa{i2#>$&5@Fml`GuV0*zD;Ap^zICPGuYuR z!45rku?f?U%Pd~A1n-e3)u2W03|{DGY6J9_sB^85#^nsQHnj$}b?du@8Eyrqx)m&u z5CWdzW^kdYH9)Tw82res;AXcnj5}QgkC<8mPq`KR*{z_z(y3rzQ&VeTYqx^!+zNIz zwG8$#wE;%E6&&hTaF~Q)z(sBbWH?zfNrE#=v~{e$HXV~FKpWh~&49#VhNrk0gsio} zo7@b@2Hx;P)^r_&&b2}BQNC?lt+~C{rnx*trJYu(OxI6!HD7l+Y)aT);MuNc@VoP@ z*<y{#_HBvw7Z8f2`D<xjT&4IriE;#PHnj?V<5uunQ|sVKQ>)-vQ)}QAw}Rb{wqW4n zrq;o?+`2;eo2!Po_}14F-fL<NyyRA}j>e^)Z6=I!^$WsRU48v%D#>8AQTglF>eTDU zGEcn-{riMe?_V7}<NaGt&2MTwsTDn`(;<2jIyKnT`so54OBPz+tup@C$N!O<`MEWf z#wWH9x(;YV@r&`-Ndq&Rw0e^cZ<eq|;4Q9aaPo;g*9g9YwF9zW!QD;o&fvIUhs|Jz z*9ALlKgQ$1&zjyeekIu9r{{ZoxXkqK3|=4X@b?Qm4%~5}`@>GtyEAxFu*1H_@sN$P zS%T}SZ`xqMHm24AqtcxMnB-P)hN%tkB?<cnWOxbz9x$~I9x}B8{^(Y)(ya!KnB^?I z&D085*R5cXTfs=Tf{@5o*kR@dILXvHAie4jAggKvT<uoyJ-32K-3p$TFeLb_n+-}j z-4xb0wE^1P3brw|40bZL0Y*rO1`lvEsF+#@XS)@I$!>*LnYj-7YmV9cg}r>*Tj4Qo z1}6qH{GOY^kAoTh(#_xjQ!9Ywqfy0Gq*ho&-L`P_|E5J2k2XZ`{o{Nr@P3IZf<FZ_ z9D2NU70i_|a`<&OgS9{EW_XrFO@jXlW_Y`sL0Gn}aa-c_3(Gcxp}Z}YbGn^tYpeXU zhW1w*UOASscpFw)19MERgX7%_&UY(oY^+UxIj#zg_ef30`8G2(&cZz`evR2U$kjL- z@?|p4cI)}V4_z(hqPDSeO1iZbak`RiRU^~O-3o4VE4baQ;6YQ%;0d>ar`-ykbL)%3 z-%PE8wY#k~u&$|f(CSt&!L6X;)(&B|tH%i+bM@207hDAcj<v3XA*R;AHg4TX*xS{E zgbA)5F8sjN<Fs&CQ^|T#N?0JBwi4=}5PYrFu8_LIt($yIR~3n>#R*Qfr1oT!Xpb|f z_1K=AmF>w%*S<>g8BVYEIE(lvCsKQyChW->(Vm<J?es9L=604ay~UsIhUMDcM}NDL zK6WL2>`MCBwX@bx=wnyX$F8K0T}dCim`A2c?RWh~d@AV74ikX=T#*?-Px`2{z+XvD zCnbHHl=N{@(#J_jA15V!oRsu&QqspsNgpRAeVml^anhHIK2A#dI4Sm#(>|QHv5Q(2 zu~$-Kr=-TVrS{XXxAcX#lV<05UrbAcKe@W?$8`;q$Tw{&>@Y>pauKvlq@h;5yqB=A zt1|?TUp`anS#G^VxXjh-gxg$wM);?zvDKezuiMl%rrKG;d9D^$-P&EU{K~BdYS*gS z&Q&{HxZc$}gqL02MJt_+OefhF1+F$y*~?g4QjZnby`-{%v3p6qQDFCy%2ni#uD&X; zk;yt&@XJMw?T5Wb)?%}%tq4m{*4;FtBP3FPq#3x?W}$YM;8&K~E8$uphxK#@O^`^P zA^4_H;~cx$t;+?!Xw?2F^)GH6r4){_G}i7G?)8iU60Beyn%OxvyR{R9Pr4dY&YB{@ zy8kKGR3)x@S&QXWVI}Nh`KS~tp%PcKd>_(KeWg`)(il14WM!$GYJI7&D1PE9y&GzM zsj&7Aca@G_>FQ5}dt5#E1kJTX!A9y%wOt~0g1}ZIHI9a}xbHJ0T+a4Y_kGUmT$6UP z$*TiKq-+%fs}}>Szu`V_cLz2hbtaCjTxS!zIUA)^_D5z-O)zns-cn<~i&?1lSE(<9 zDs%4>UVXh|WwYF|QaI+B;347DB;4)8>8@w+u#;>b%-<2>dy<43prTlBjr>&<S1CT- zJZqq7Y871JR`4xT>)^YlR>2LX*1*r*3QC`_Jb(jDt%Kv;3Ql$_IM1zs5hS}+(ZfnI zfc#w^4@944V^%K2>8@w+s71YUA=_~h<pP9aEvt}=ytqp7ma45=yRC%%TpcA)N!FI| zqWKdfTBqP$R$2qplNIdcRzL_@i%9u0Arj5<whV4zo^?PBUE4CaubTluFc-n{EuLU^ zc(4-ut?AvZ(5p2|v6@2UH>Zr@vl3-!neZc5sr9(4&j~ACeN}kP)i(8HW9wLXpfK3g zU4(sHZ3(X~9UddG&q~Dwu4i!E89tnr@WS`=5)uMm`lOXlh3lM5AFCi#o7xgyRQs|- z)k^T!5-lh2sHs&jR6%3~BTTJ<SKSH-O=jRcYpo7WF|`Jkx)ogJR&a$|!A+)C!Mhe) zb6||AHE^U`!2$`*!7sWQTx)6#+~ij9Yqx?sPqDz@K2vMp*KP&BaVz+vTS5O*sa6B; zH?<C?x)n@!>q6mdw}NGE1-H0$?bCGgEm1JgFtrXoCt*Zz&=Tt<m}6=UoZ(h5{B(DQ zPf0X2;Ge+^OP?|`*v!=09>RgHf{LkiaJZ>eaEx2QVz+`XxV2SFZnz}bZdg9&OSF74 z7?#&zE#XD^mn150g`xbAP~7qv*{+pnkGNI%jjK-ye{^+iEiPYjjZaHG&z4-{65&c$ zuN8ji>aD_^uKrqh)Ya{^poZJpY8)xdarHvM*J0zEQtx)_!@}=f{j>0jtL<7jHCsfD zrNVixE)#rdHC9OVrPV0bNQ2dIlg)dhnD@qK!end2UzPeTiPT>Tzj5_BVU?>>G}kk2 z+8f6R$Gf^n@Ws%$T<X`|`d#4%uHGfw=jv0!v##!{RWU}Q)-D&m?rO1C8mtPR^u`lX zpRq}A{6%=#)d8COZEgM=?-ho*+7e!OYQlbDlU9D0M*VIZdAS&QIdx=H(Q=>ter1>$ zL66Bt=j=F0f)2@=I?mZanlO_iP7!p{K`!J%I>?1o(m^hyk`8hqm2{8`sqv(dns)Af z8$}JU5BAvj>UZSRUSo3o#IA#IVsEbaK52E%zU?e`_2TTSb2f1*X%paV;*?14f66+n zNZ9jX&Gif}|FjJ^i=D-{%gXg1GmG;45>5HXyu1WYkZ3gEGE-~d>uv?tNR-c3_>h@v z;P<B1!Qb2p`l&aH26iyD21dCRl-&wux)scIE4aw5;A#miLx$NaBViO7{FZg00YZP< z;H6fp0SKbo1`y)56>;;aCOgMV*qdO;Zho_OkE-7*VJ6^xu4nM@&scZ!nZS3Yl{bx{ zJf8{5|Ka5&_^L#?1MfT2Mho^ZwGQ@?kPkS~%r$VBsdX^Jt)R=TV4+*VnQjGNax3_j zTfrl41%GracvV8na6=7KGXeH9wGJ3uGC#@KGR8K-Vl_Y*MH_t1&4AFF9}rq=gB~}Z zAL9O9!u-IH(>ZbVzbM-(iSE8g-mVg<hX{wcI#=-2luwX)id(-SFnalJp@D2;gDH;? zM!6c}Pu1ZxiM?+Sr@NlPpMKVol+QoDAG7kN@hd9Vt^zI(uJ8wL1~&vVBwDfuCBaGr zy~K)ZAOvfL*SQ&lV68>4;zqgXSw^r+tyUd`U~TYvH-iwYtq7LiDBq*vdnI;Ci1)dk z!E4XznG$?AHCxlTMJR{v+l-lR!S`{C)hxje$VaEgKEjEvE(*0|jkT!sj91EF=s<qX z-J~ivOXw`T#q|shKf7mV@m*&rwx+RSdUpor1Uu}j-hCFgS%Tx`qf-MMWNIBObt|~k zt>C9_1;27D*h^Va1aN?<buitn;CQ!!&$|_T&8^@Ow}Rif6>R!Biwm|jwGMW7>j+__ zt6+kubuh`T;5fH}6Wt0fax1vqt>D*g1y8yaJmXgIid(_@nhQ-U*xu9{Ak)cYGePfD zdNe^9+~0KlUqJDUV231DyH^{$CfFgV#SUKzc1Uuu!^2E(W{~t^ho230NP@A$n}Qww zD%jyaf*rPLfcQi5N&g}F!Va$qc1XssL-K?_3=6L<E`D3wK91I##W21Bu+`gdg<*UH zV2Ib6#2XOfja0fvNjO>HXxB6N@pG(C`DTaj5mw$T!PydR=inozmVv8PaIIM@;1{Nr z!DFUY!9Pu{fPrdETQhjSsa3GMsTDB8)H0xBdS9E4A@nPQq2GDV7RmjS62=G@yPm;C zpYJ(Fe7|kwP2;do4i7TDY3!@sSzfOMFP3OHU>gt73WrN%21f)lobF~20=LG&(V-AH zgMYTbb?_GnYX*MABGkdr63mcj$=Sr=C#_hS5Er|i!C#nO{6`*q&oNuG1eZ(Hb#R-R zyIbL%ZU!Mj(RJBEgbdzdt~C%Mw87im3_^rr=41;ITH)p9S_Q#%K+Mw$*&dTH$?yr+ zGdSYho|BC4vl0yltfyi&A_31NUxi~8$91i=RyfvT>myY%N@AyxINJ3Lo@siKSbW<h zY8@PDYJG-)XVN;3WiwU5G*fE;XPp2=oxCGURnnBu5qP%i860<B&otnBi<LKxKR3NQ zgRSPP|EeW!9O^-jp-m;ch;gaMD8WBSbQuHBnz_3bQZ2c4OloD+dPbrfArNY{6}1|D zwAD(jr>#~UgjxfNTJ>0~tfngxG6HL^XYf4Ji>bl)LlR95ILp*}Q~12AX;62pf=^j# z4ad*98XYM;)=X7EgUQZC=^`^#fR|Qc-HT+pSVGU?rLJf2D$|Reb9}Xzm*96?&)^HD z_w;>KHjOeiMfDraR0W~N?6lZx<eh6dUmrF}=p0<v^$fn(^rAt0H<qZu0m5dk#^6JB zI7~t$xU1_KeC!L@i%9s6mM9W9%+&f6VY#b66{wV)M${Q+rB%={wFaoC=yTvt+zg1J zNdkX#E7;z<G8@ja7HZ(wV1}W$bJCG{%N20A1#8gSt*!!ZtpdE`jkG%5<mNQ#ZbpEU zgB@ODdUpm1gMSRyJ9&3{c?pIQwZffj7|jw4!^rn>5_r6qXE2oKyENsYpRGwh2hdOV zZRWA6vSC-hy6F3v5>4h;g>Se@&+l;+kb0cs6lfP2r9O~)%<yQ5%%=&bn_33fnOePB z_=&4O6Yh64rg)_epO>)q;0vy2@Z1ZmiTw5l-_jSYyC4)#O+#&N#Z?fB^G`&n{T?f> zfD6B5eZEBap{qX<sFZAz)EOpcCKL{r3lj?Wvs&c|!e4_KzT)Q16=+)M{~U2%(BZL? z<kY8;t-X;FTxJpK^y~&#i=O41DwR(6O0Do$rgsm3r>K^C+zLN!diMb687Y<mG0yWC zZ7{?bl*DLDVhl=R<V%kj+jx5e;ECSeU>MrV?-20a#eE0C;5#Jo9h6RHo8_!I7*<X1 z-WGm3*rB)4y=|<QDeevuZ6EIy#=FWS9qK9p4v{1mfs1r_xr8+czv+4gpEAAJ|M0y` zqWJ?9Cy`d_@I?uc;NM)&;N@TTwG(@a?>{8zO2|!BO4d;gm98hO@9JRTy{?WFDz4Uq zDXzxg{dKsDnQCCTmx6Y;P8Lpb6)ZNj49<5exWKJ|-X|vpUGt!ogQU^}y%CA6?_8AP z6iR8*!{m-v$@E<b`GVhfJ%ckZ?3pioe<D#vZWC^I^+DkeuKrWlP?hAcv9P79u}?+y zDs>*QI#nDuGspbR%#T&_XDh9N7fmgLR&%UvBJAfX7;S199O71Rm|Fn@Nm9ocJZR<Z zDxn8S>Ygo1aSEk0>0$EJb;)#$gw(+Wu4nLl%X+2`-{U38Qp5CdGgZM^rdGhEZvC!s ztE=EHSHZ7Mt!%GGc9bNYr@Ggv6m=^2Kks$GUrjB8jl4P_nj#U9-X}qcbeq+w5otXu ztrd0hJMW<?873hkaCg@;xWe?}G{$#?L>U45npy$l+zKYTb&4?Ctze;B!6)1b&UWji z!Z+Ot?s02egY@Dt2|a{Qx}L$^F6udF`2JI(9)gmJwb5)LY;S6LM`2f2Tf&PvPg|WT zAY_urkvbeDp>;UU^$dQ{^ddiH9ap@(1Z%Em@XMz6^zD=_SzT10YNq_Ox=4o?OK2Tl z>UswMWO@-1-|HnwL`+wiDUY~PhtErh2w!kLgYUn%XEyO&SGFV~rWP~h5jWQ1Aoto# z*v?hC*=wi{he>D;?&^95e`$I#0(?Jgwx;p3p&XtY?69wT2Y7i2o+HuwGT_y^TVu84 zb8A`)wK5o@<`?Otyp{5^CAvQcA?ko4YCRqAEV<}bq78;I41zZVI}EMmmu_09Nwnu3 zEqu<^I|MwFoe;-%GgXcd=z^B(cLaCL_qr7_JtiUZ@Cny5IO~$0GmY=dR^BwuP`Snm z*5F#AN{6{NKyc0Pnv<v*uAw~7a8lk%`E(0a1HpAbOe?M}vXfRg#q{n$(0yeOueD{{ zSE97+ABvL`x=W^GB%}p)yPm<jzS1)-_<q95o5o*XO4J5;NWx7myhGJw27N{Nu}3Ju zP@boV7G_(hW(GspHt4?1{7ydcZB2X!B))mv1&VvVM7tlj$yM-xB5P`?^mFTX9ne;C zOGa0JWsWr*Z@1F?nsJW~@0E~3c)#lzT<5Z$Da3b$M0*J6uj1rQ?r&v!+)8VpWTkmK zZ93f0;^}ck;>NCLaD%V*YzN=>Nz@Jq#dG4Cpm;Ycu7U$ht%JH-!Pndhu68SU@^b4k zc-qt|pn+r{Mf?i!L-YA35wV!JM3jHi!Z!d-u#lh!&EH8UwMt3Ue3IMLhYc+c%8xk6 z^$fn#^kQ!vqT{W+yacy*J%c-%Uic2x@h~qh!ChU?V8isncdCx3d3gy=cRhn=m|plU z)p66yOYm&hGx&(<J$<h+TeAh;C($kl*5F#g^+9v3gW#HHj2?uj84Tt5)^U|=_e+v1 z-U=N)Cb4Z)e8Tk%&bp%KBE)w)vo(!7OV=U+djwZVwPfuiwMx_uQS(kG<r(Ggv+6Yv zqP7)L^OFb99n7<QnBZ-e<N44f(=ig;1;qufXYg**i>bIr$M<@93I5vk3_fIf;k!b| zk9m0s{=xMOK4W^}yHdx`dwB`I;CcoJUfDCVLv*~A*%p@IHm+yzgQgd8%Q~)jc?s5B z&)}C$@98_=Y|R#UwnWPetiiQ}>le(m4uWewWAq?I&0r|cmsyu=pO+-d>>?drEMY?6 zrLJf2JzwjY41Axoay?;K{If*s3A|)xeQ#N$TC&WNS|w_QsClQ8@{IClB}xSdQQL~B z`7*=vY4a=(R(sxNzRZToG|YOhyFYPP*E4vQ>BUqm)p66yOYm&hGkA;XJ$-**wq^@l zLwPAF&&Ntzp?;Q>=M$8aw<hKJ?Z|bi|6@rqfk&*xB=Oo}tTvfF^~Uz-Ig=O896omL z^m#KnTK<$<hV2nd?;CDTwa$-qOq@A+?oo5+9XHpCI_J)6`NjvVaQxiPg}sXo+}nx{ z>{v+r@pBh;%%3}LPF{0rT0Crz*OhOxPaZk1^Ss;2)8;SeP`}4?OrO)j&#y~gO*0c} zE!U<FuWv{m$L;sJrexi3q*>F(WPRGLeGFKIyar1=!zDZBA0|G&-oBnTM9J8<>w{*= z!_v1F<7-__|47OC8!MJ>ytmj;|KUdZ%nfwgB7Mj8^|b^^d`16jg8x(z|KXC!l6OdU zlKf&L-MNUDiML6PmwZvOp5$oBlZw4c@?FV8659Qm<ji+?yEDX3O7@m~NV2VDn1p_< zC-&~ww`6}na-Ejr?GoY*lbogH%Q!AjoyGZ5)-6I9H@=L!MWil1)Ojtm6URLu`2S;| z``;x#FS$grT=G%L7bKG;U6S`o4w4MnRQVP+7q^hSwuyc{S^SOoqU2i1FC@E3zAkyY zWCzLP>Pw4A{~kb>tf_yozik=|<DoxiN_zJvla2n+ufI#)s9$HP5A^G_(EfU2SrYRU z^AnGWJK{~my)eW*GsKN?Vt-<sX#eVF`b<yqh~(6FYNHYFlf+l|=K9|)lKZ#TwN^5E zOMQAhME|2pwr@+~>k8SPkW7>hzGEcgCEH2%mE5wG?)xS2#iOqW?5uoA+9mNdd8q!} zC*eW6w@P>-?+xNZ;_oD<OCFHK7f(KIN?zGjmfiH9O2ii=Ps{eQgr~If<kI*$b%gvS z@i}VI&SSKA09Je~SA3RMEdQFepYKcdAFb^~5?|YD)452pSo`o%?dqG#I;8W|8lE2T zvr+nrfEb^6bJ$3=BZ;qApCA9HKEKnywsf8gutKtfWM9eoin)PEJEuuvJ3PC9c4&{s zLGa87+M`__C9%48c{~dJj*lyek1$!TI@F7===bVD+Aq|<nc^QLJhOu*hVTG~?@5l3 z@LY#2Bs^$?XOZwU4&uKcSzY|t-kXiPJj8umF;_}>FbYpZi7(1|C`f#;MDKp_7z+9o zU$H#;NBakrgM%f^3u9nDW=qof`0)Wc7nEzBzY!lT5$nfiG%%m9N#bjD_KPOyHcS$K zS%1_--B(KZd3=5s|LZE-L5wecp8jW&<&$;3N#g5(iuxqEtD$RwWNh7k-}sM{bbiZ^ z-$v$_kmD=<YH|EU;`k%Q?>t0pOE!>fD0x<~-Y&)$KYhXvkMMgWos#(Cr!e@93V!i| zpO%O}f)UI4O$vU9f?uJaJihn>`%{wNFVKH{mBbfcQ*TQ6CgkK3{X3Q4m(JHLyCr<{ zoNr+A9nOm+@fGW>_^8+8%Wro{&XRmX62E`PSMvBG9q}KO#BVb5y+7j9&Oiy@`=lM( z<Ew$a+v5w6v>(5b8^5K?_d2Ia_--Iy{*K@9jo$!{{f+fIPS8iA8t45V*ZfQ8TaSFl z@!pT=S}ooo@(oVDBgxlf<9BswmoI?7)pq~Y_V^O#PRdt&(GR}jOF#M2X77IT1ysKC z8(*<J`bRroz2uwH%o}53zW8!vI$wMnp84sN#8>=6Wc-rj8`&3~q`g!!YLR~vZ!2*Z zNt<M#<kKo!SB$SOOTSX`&Qtx1PSL*2$+{<z#P3VQ?;ypmVDQZczLpWc%@OPI1qr?Y zGW-mE%rA-Gd>HmA|0)vSjo4mNl58!BU!92cr=F+tNW%Z6IY+{OulcMbzW(t=|Lg72 zFX{eJ5?}nakG}^_m++^)_~K7l{IP2r$xKOn@dusPB=N5~(Z1is{&92sR65$%zC`z` zk`GG`muxOMM6!`&fF!<tjO|j*v*aiGH11vEfs**zf6|op@~CQfUz5L!>6$ZbZb!>O zjVW{IwRHQNm?@nLCLFzB;rxXyGw16!dFFI3TsWs=mnjRTPn$bx;lc$tPo8wZlwo_c zk8M%Za{J_3%k<gP=2tsrPUt@R$d37WmFY94Eu2>Cn7*)c-rPy^j%q1Stc{;Ee&U3d zx%1{9J#EgE&RJ4A5{Dx@XYDd&?zE#j4xYAf`s|JcqZUl>>})aXtd51&x>wbkt{Fu$ zvpc3ARqmWLZN8i|iUo?>F=I%lzB1l1cg8R}ykOz9xihBCnWwQXII6R&)-sLAQ#yEe z$NRO=q3$mAxT8F8K_^|dk=CY+s*N5$UVGQf;mXYTxyMeM(>Y_8ym8XPPdDhjR<E~2 zYBrBQr{ma;Ib>_x*h6Atd7;d;iR~>%PMc9)INwL>os1K)OH0&t&9&X!F%J?(KzGJ< z96#FUBk$$3g$w6*9@)LHqdsj;cL#GZr*m#cm@bya0StD0ZQ_*S!*?GsWta~)2A?u_ zLF}|<CCPQC-rv^LVtM|&IrC;QzV=DclWA=4m^*9XZ0r*zPB`S?_PjrFHq*s5cJ7Qx z(`IRad5&|HVF&AObo8Sg3tBY2_Re{V%}m-=mTh}yv2tIxprZ2xb+N_Q@|3X?Mi=jw z`+PebGTdcjC56Ed$1>MWn)0++>YOdv-phZ^w1u5>hfP^Hk2n67tXgINJS81-7j`cE zXg)u&j|X(louO080y4Sw=Du^T`NbaeZfJhTg6=sBV=1*pCud?yZS<%K6UJ6sbUMr$ zV*m6wXX2!eo~I1YU8wi(oeOGR)24T{ESz@~D^$}t_K?x-a8zwli`G^caIe#6`n<Wv zc4!;vS~!0g&NULuCj?{j({9?)I{WtTTzK@fu6Ty|-m^>3!(BZA$(nlIq^f~2;}0A^ z$tHBT%_lx|nB7ThJ<Ljvt;+K%KU)h6w69FDbD1f!Zg#{p_L`rC^ODV}*IAcORy#Y8 zZ!wdm9XY3?n8tF){OO9=(yj8`hdwOG7X(2SK&QSokNGXykvoo=-kBFGyG#!YQA4kf zt?sYgJwGYpi4~hKN_w0w#gc#BCsCUBUh^4a(lKrJ#bA2xHhH7I%Z3G?>`=CdElbgr zEhg#<)O2hs+9+2hlpxy-MfL=aceCkj(OEb)q<Xy0nB%>7eP3Z1K-g_2PdI48#Kr_$ zF0n0LLOS`>Z_1G$U8v>o(XI}=5|%w=*Zhtd9W%9i&KPTFtSy{{HoLv90deIdGu1iQ z+_i;iN*8dA;k+1o@OaohcGQ?%qOxmLc0;Lh>5e&}`^g?Ze!_U2kP}8v95a5xfxS;L zQkiT!!}f@s@+(ZfQhRI=YH;+#c3r1KCpm}aD%HNX#oL5DU910?G1+3c8t0vy9ImRC zcC|L);M%0>B+qZJ^UQkqx;?jZLAm?LIi1tT&uAGvX4IrnQ`*@|t=|V9JPPIDQSApz ztRAdIa$v{Yj``E(OzJpZD}+6k;z`v}<J)5{Rx_n`J29v8$eoWrdXBcf_fNMZXyNp{ zIu`4e<oEq~Fk_s2aJbg&Kh}3AzX@VC%k#SD&ajoCg{5^B?n+dvGI^}FSY4xrPnoVe zk8stePP=Y8;#A~U$2g(|nk|c`HN)U*s-P@{eVXc{*tONb=qmq?(ydu>K9@VSUFehR zo_9lW`6aox$+6R03rmZdYw7TOo%XyboG>vR^|aUBkQ7UC-qA;E5yWJ(`1+inWIxe1 znH+^vJNDNS9Jbqd<C=CQEw`)TjCopH9r-X=`Qb(;U+J&ELCD<+7dOPt1-gzXHF2I| zs>rTp+18ORvv!rVeL0`VUE}pHzwObLa)0ed3v}fme9QECbGnb78*bsWG`j6l7cbub zhqn8VtFx~E_<#5@L5CY`*l<Hdhl)m%DJm)!b4=0DP+3y3L}i7Eih8DGm=sKzV~UDK zg?+F{$;hb4m{Czfhe=9Fg@%TPg$@-JjV9^$`Fg(}=fK%keZPNv=MC@YdA+ae{kndi zAJ^d`u%@{9g0s(9U%YN^v)VcPKR!X&3AX&|`7dDu*Hv77Z7|Ia-1)20ox9h5;ygX$ z6zfF<>pgN?yVYnDYS+5Jj?BoH+g6LcW!?#iecJ5@^G=x*u&ogBt{}8d{j-3rF7@SJ zp0f5?HS=~1x6j*pw)r~u?DO=-MXybc51ljD?{N|5;){7b;AUy>JvO{n+&hYJ(sIll z&zF2o$Df|N!*4%qIV|gS(Y!ee?J(g^LdWmbRU5C0Sp9Zv+Fq68UU!{)Np<ATmE$)z zPq}WN3hi`zztYoMIDh>oIPXTjvah(Le63#7&(#j~;<^ky6VD4Lgq~-@PYd%F&-T2z zHy85`zJPmn4Zr-fy(kbq*{z;?c>LVM69N}syh;1k3CHV|nu^)^Vcsc8%XC(;Ub$3h zweRtM^^A4%SGiWC-jQ5v=j*`y(`ES0?%L3KNKYJkm1T9*`I>W!_FPiiowY@S8|_8N zn((V(cU}pf*yo)^+`(#3BYI%H+KBGttnSyHzkW@jUUBorN+$<<kr&<r_If>|N%Ypr zzeNr2Jaz_}|AL=4#BS|wx^CmO`FdN<(H&m(cC=m{tk7BuUTtrl=60Q&(8~bLvdwO& z%sx-bnx9V;7wEj;j+uGe<*f78r>#xPUUmGc)oI6PWu2UL^6FF4(mr$MwHr5{abf<3 zdA-_ONqbcrS_l5krC!LW@1k`VtUa&zKOC_3iq*~np)+b|MmZR4RjoO9U10uGtR^{b z({<M#S8?@~8;>i$_UhyEH(qx|@M_%)@v@7xqOL#TxJ$0C)YJcQ8>_1>i9BN2JE}q- z7F5~Q*P`n-ZYsZ8`+$G99bT$EUP<e3POm*REko<%nE$d$0;{h3;+1-3DfMZLvm*59 z+KrW~g4!_yt87CDR$Y4Cb$Yn*(oLVg_>xO6y>{dEfmJq&A9DFspSyZ~w)g%%UwgHm zd~V#&U27*OH}S@bi%Gtl%BwG%-%Hh|OKqoC-MOhRx%QH)?ENo=Ba`Mmu<A0_Tj+DC z|LI{GBT7H}F=n2ef8jWh;Vb0+JT|J<L<e%>^&zev+w^wXSut=VIY!#Q*zbEo{|{ZB z{;&qv`2TA>yLM*%hyGcAuZAYlz);&6^B&u{uRpAdJL~L`{}&qXql)vFqvP!8Ku4xu z4qFGI<+wnPL(^Cf3DdgRmTHguzfha5b42u4bbYj2E?Y0Qe4+j>)nl6`T0ibzQdFSo z%uomf(s=k;Ie-32)L&DnpT7gt7V1yeD<bBv>Y}K?#DR3ec$Rd{Bci{FKST%8;(UJz zjA!$y&yOSKuViCXU?4oRzOF_I=rjF@{^Fn0`qMC5-bMNe&7VF4j+no+im1T)`!$e% zq4n3I9C~a`oA!?mTsm(+=wY+k=C7A7)wTJyx=H#8)$P>d&@_4&`11i;UVFg5P@B#3 z{Qi2>pY7|`-%|aA`un*aho;fPz(3Vr*+P5d|ApF~P_)OkzuLcxJ`^3;W;4b=YqOtW zWN={o=;**vp)jw_CY`sN2M)-H4m`h)@vP5zn<<d?k!bybk3RU<a9g*w9JXAxtn>S; zI$2ZM4#hv~XJ7y3504GJ`N8~gVj|Xz^*_IYWvf2-FD9^HF6dEA_^jgx$7qX&W=XrK zmMbc-MB4n@@o3r3SGBA4Kh0Q_#y-Zfj$iBA@=1DFrJu|7W8<%tWBLhAZ`Rt$hw1Hj z%hTh~__`Jt=u)<RZTg$!nDVvcZL&<O&c?HLyCyNDe3-_uJpW&e=BG;ornFkVDy{u7 zS*z9Zn5MD(jB=3{_Av6R%2oU8VgvbK%1zqe8g;PR_zP8{@pyl}w&h)+oR*>seAHhh zo3s<#hO+Tbx2&DvMjb4c&r?oZsV~DY{^w;{y7qbUO)~FDef5`ok8INpx}E+WR4zMO zzptcavi=^i_G5K%mG(bayVkF+!MOI9lmps6XOnj;7b%}XPSA3;DSw1~u=0>{Bl$Sx zGBt*_&uP}KyubRf`UT2kt8{A@#{Z;p(Q*0~GkK$OoANsHwaQb<YsmG=d0D!EMt^rJ z4{86}MEiG?i?qIbX#b&dVzz#1hxT6OCgo#jw|$}SL|x>f{qM?U+9?xQU+*Yaouch0 zZT=6`@Y>V#nD#?tlb)pha-eU|vi5n~J5RZ)P;E?KZ0&jy3ayWFoBk78e(gin|MklD z7i6zy{+g7FKCSgje$d)Kqwm0y`>cI~o<EuYXO#1FkW@+Q?{Bi}5`CYV@dMhIhc4B~ z<Rr_N%^h#YD%;;8`xO11u55oDOpD<9`?#|GO|3`Bmnz$zkP5BO>y+*97=_m7Ez0(H zaBMx<{M@B%f8)gVE6WdB*3NJw?cK_KSL-XKtj~VsTjs6LVdXL%<g-lwvSmFP+Hq$6 zy`@}Lt1tGlKBE?B{oJPggZ30<yS>#ma;CD~^+`{6Zu&E<{dRpBh~>LL+3xsK&HP=g zY<FQfjq$&zY&QrAt<PI6-!r#9?^CvWScKN+4{Z8-=hkPBvfYcJhkAp`MY_;>7I|3N z?m}SaR9n7(DEDc7RH?q5Pu@}PQu|uk|E+9KBzDTQ@fYl;?Wz1D=6AWW{Tl8A?2pGN zcOBzj`&fV3%00?jeXjpJ<zFl7l;-kz%7e;U%`UH39#YooarraK_A9cX`M*jzpz}>= ze!r}2zxW#3f9_Pa-^>i<2bJwt6MHq8&3~_QQJcOjLw-`ZZC)N#o>JB!=*E9t*?!xp zo&0ZQ`-PiZ$p^-1e${v~`B3F%t<Mx?TmIF`_PYx2v%XGM9?O}V|MQj0G;wHou28n$ zF*ut3ZnUiSRQjt|E>pW!ft$Z(W&0BRt>pWapV9gguKxG+z|KdZ{vT7$%bv?GDNpIe z(9ul)w(_W^57qlXIqiFM^^){FV&8_omGRS*%TAr^?*!#BozFt`)>-@MbNQ3ju9X{V z|Gc&5&E+pC53QNoKej0UMR|Xg=N{#8Wo-txeBV-jbzb{J%5Trhk0{%dO{m^u%C*|L zL-`qNUpJSP!vA6d3E{`~AjZAIof{P6j-vV5UbW5ri*c_c=jVgwf*!>LKD0+(78uw3 z*zc0s>xLy-!nc&|w=j#zQCbmsZT_X3wJ%q;Uw-<mjz7z*l@lMFYcEtzo0lt;?KeGa z|F`k0ZTb%V(ipixc}V#H@^_WT=H(sA_7(on^nX;gZ?cD`|A(@DL;M7$4}?G6*QZ+U zO540owT_>6-9vA7_r6%EH^AYKYC~5p=U)g8_2sS&hsO+G;ij3qXM6Vi&#S^8NBPSJ zkssI1`>ai$YmqLS_Zg6VpfYbH`#>%<*4%Z(xl1Xljz2#8<j@%NKOmpiN1-l25cj%1 zb4lnEkWYrbZ@`#)T-{;lULR|PhR<E*VMyo`HsU@%gQ6|`p&r>jtcdsodERh7-w#dc zKF}rX@zIUjV*C7fb>3w*T?3hy^tp7zh0wh(FYfV4RYcU(?z1#%&OKH`Xhe6-fe%(f z!y<Q(&``H6=UqhJV;7k}n(ZT@Jn!@Pc{@q=>Jv{1k1~HR2~B3h3bmVr^4xwB8nX9} z5^C9FPYDg)YgY+3%<U_oL7|-`l=r!}gc`%UOK8Ae`^)?Wc9_s0e>F9f_Sj|ICY!&B z+<?gK6COv0uW#OC%Y;X;&Em({=Ye}-&hdO%V*UmRPhF_3;lkXeaB=VL;0Eup5!|r7 zwtycxxB6WUt$P>tx#C?*c&)p%*D4PWWqtc;+~MgS?y;sr-;uD7j@L(Cy>!QI_}WD1 z+Z&;8w(Rr6+dVFa&AVu?hvBaDc;4k5CHr!c&=>05CSDuyeG|?L;i=tH*a!34tX!}P z?M0D8IU7X|-18dPo?qabYv&ne&x=K&5kgmYwAI!{e2XG9qvzQty{k?>`Ggb0pUdmP zzP^DqH#oE)p+3S>`cL%dT{jPX)E~OsG5;g_c~=VeUC@0sBs42~*7S|@zon*+{6jNj zUo_dHw1&(tuDHh*vkv#Zni;Wo*(h$ihU(aWea)EmlDVs5ZaG8WHdKqhmd=CKC!Miw zZbj&emyxp&S#GadcD-c%+!vaB3V#Juao=BBP{Y}FAnkEkRD;j@55K$?ZraE7ae7-9 z`f`JE#MS2TwEOxdQn+#Nj<t#Q=-LmN-}&4)dn}9^^j0Gfm8{Q0@n`sZjE(Z`N8_z{ zKj!F-piRG1ZxGFb1>XDh2Eg(_oVQ1>lP!N=uRqOLy?`|r=q0>af|ZMWeg=0e_Ia&d zy4!eP$Fr9B{FFWnw&DBf$Lz+SUdmf8*GqWwW&DiZ_*w44frEXX&}VQq{LK~Kn-1}w zeV8|hM;-2S#Y*q>>E7Fq^tK)CeL!!>t-tFty$6288>i2*Z1_sO=QDSl<b4r$VS(OL zTKhlnO?+MNO>OwZDc-m7PkK*h!?)*pcVL0u+u87&aSNt>%nx6U=ipE9nKizB3U}jk zdT(a^&0uuC&)*EG_iEPOgTKL)GyU*dybWK)E6(!m4R{xxQ{ac^pY1&lzlZVX_~Ads z^FQwMb=Zi<75d?);Ny6W-YD7pehGhq@#p#BOK>N~6#3ybcnjWzt@sGmp6|#1(*<~; zcMLBs_W5$`#JKf-coN=mk<UNCpW(Vs`QbbCnV~Jmg{9ux^_igMb(eWBEB79{(R;$@ zyw7~z`zF4JmsR-TkKxm}^b3A?{1x7%I8o{I;a7S;j3->>b1mM6MOA+IcW}qGKK~Ub zu`bAX_yas=lOO(DjJn?Eg?J_2f`7uP8~k_&R(qG>7w|EB8jt;=A1`>LH|<N_K70w^ z!|&Jl_9yX=7<-c+z6g8pO?(f(@nt{Wt2m7h-t33}t=9XguXr!RtMQ9?H~y>6j~7$# zy<xL==`G&Xcp7fI)elc;@E(DccpEn3PjB<%t!?x^v(3At$@@;Tcj>*}r|^NV`CR@D z?{m20n?Apa8(V!I#p~|#`GjwIC-9~=pTCB`!++op?$_sWE&3%LeHLTK#W(R;yy`m| z9<9%P@vGQ~_hK79gx&Z{d<>t$54Zbz1-L=le0+)AfG^{c2mSa*U?JX&+fB`9AMV6c zJN$H);LlBs_XqMznD9M6-pBBZrpBwqTX8q-hd<=U|B|Wkek`N4ZT1T&FVJ-pQ`=Ne z%g%%FU{m8Cf`^-N`XwaVkHeGjbUYhBi5svSb-HnNbb4^=aCX+?R@CZu!ym@&_!vHe zFX1~F6XmDV<$pK5T{pDlI|cLc6Zjdt9B;tQcsIJ&OX}x`<X_;E_$>Yd-@zEIL$`j> zu0vYZWn^bAz7*s0n-~}C^HR*ki*O?bu@3EejrD&&cHyt^DSRFmXdkfg7h)1F!$WW- z9)ri>iFg{W!L#sOybwQyc3sBmZp16_8oU8-!aCf7ci=tvO}rl;M7w@tb$)`|@mKg5 zK8e4_KjZWG8orIYF-ixL^}jzZ!=vydJQF{O_hKu48$0k}?8Zm24|n1pOzlH|!spDp zbca5C-?aJDv1{Ym^%OJ7)OhJ=*HJ8=Y-;>7OpSLYo<sWv`~p^)8vjeC#=jZsXulV~ zgWoeXez&Rdd$5=Gr*RbR`iYJInyK;M#CK?qkJoU`_ra#dOE)!M24>R!F)YLjOpU+6 z)cBX+M%t@!Gj26C{=KHg{|4Ii5v%_r?8B#V*wl1?!`DqsZ`U2ncTG*d|Nh<-JQ_1i zO@9*kH1ay~`Q%bl{gq)k?Kj{pcn^NVRKGta|BP(cA8h#3ruusZ|7>bLcj0?zH$Ji9 ziKeDY!%yO6_;q{$e{8D%NAOWo{XB&);OqFdss8s{DDTnrGgIRqYpS1Bn9uO@O^tsm z-i<%Rm+?J}*At<=u2^Jhx_mqzZ^gUuSNIQn+thsg6W=p6e~S<F9)`zZwy8R2nOdF= z4F5d2iu^@W{eBg<(*9lAyU9<HN60UdUo|!T+c<->xNwoLpKNM=4<@g~OopFos-KTy zF~dJgz7(%u_$E`!_Z5b3#x1nphd;ny;BQP#_Xm8zRNa^G@22MS4cd2;?PfJLd^sMA z$C>KyRPx76t?wd+e-&@Xe*8T?Z>s)___C=w|HAzfeLffuHC68z@)}e1K12Qjxt82$ zYWx;cby~5F_HOLQVSLuqbmQb#$nRpbea@o(_QL~A&9~jK$6SRUMfdrP`a6$&p{aba zseUfQ>uA4`_FEW!8{SU)xADjL8{BEC-#_8s@hwwz-o@Rf=5x^!@1eK~PcYTbTKt5m z=`X~K%)9i<{P-oTH8tH<aufNR<nNJxh(E<%d=j6-SMgm_^>^d@=3TmRoPE9}SL4a1 z&9|xX&%%$>eleDt8t-aykbE<FGx<(a{oI3Jr~OB?_mY229wh&sJW76v{JN?B-okfj zKS1Y3TaM*;n5p^8#2i!8<zk+x@r$v-)c94j2eF!VyFrnS--?~si@z~7{claxc?$nP z`>V9SL*7kZaFFl!AY5*$pCie3Lny0z3d8fs=a4TjRqvDdY1*&C>rD0cWpW+)cCy`o z$@>2e!yhL90)NBs-;wPmRo36Lrs}?cFX5D_{{Crdybl;2^C3TeoT>K1Otl|NK8}1U z`5gQN!#_>F*t|#EiQ(0z=A#B{P4(YG`*+A4<e!jt-~hv)AwNrg(Nw=L<14gBEz|IO z^}f_pog{K9ITKeiJePb1`8-qoUVxvZ{c@}^)qg$h4cJI~JMBLtcawibej0}v{#Wui z`3>^4srC3ThR3G(<v9#j;fbc^=X6u^y$09OzJc}%@|EOjaszH-cnkSk<OfXk`w%`% z`{T6#p8O~Bi{v-)U4}>L0|DC}`<a^GB=Uz$E$0e`AI0!BScDhRezB?fxePx~`^~i9 zM!tjm4e~?yLxw*}?jt{Gs^6#4ZdzvZ`*(Z?W0(8k`<q&h6kKU)`lIo~rl$WWo{Ob; ziK*$YAXkxZB-fI+n(Frsyqoq1@Tb_1PnhcWMe^UtZ{ho<`ioxS-Oto~F2`f>RQ#B! z{?0SCok|&g8N<Jh58x=ig728B_b>dnsd`DN-otS<o@A=t*{14U%<wBs^>Yp0%J61W z<Np@_gl}PnK7g|JkK)Hoo!ieR--^xnTl^D7AL^$+7EdxYAE)9+O)bv_cqv|sH<+q_ zi>c*lVfeSnJ>=hzpCk{Ps`EVlop$?zz12IwRDVm!siww15|71Ic$%r{)|i^^9P%f~ zCFBj{&yn4AFO7dY`99izLjDE$aq^I<<sCIOKVvvf`wYgX`T0q~LrhKg5j@4z^rzz* zQ}ch0sqxm6H{vGTjJKH@?;i3uOf5$T`G>T>h_B(w!~Jwwm}_c2@-W}je3W1XR^v^k z>Nb#D@IF)Ze@Na=eun%Kd4?Q&gzqQORQ+U3F;zbkbFmQ5H&wrsd<pp~ywQx->ka&> zss8T82k;U6xvBmhCqGI4vl*@Le&Q}u{k&yr{P!6iz0!}jpQ-lccr2cZA2T)GdAPxh z*5@jCEyKS|{wm&Ls^4$mL-;8E%2dC<B@dBDP4z#9<FwCUe7f)VKvUDFkPjhekWV7# z;u&~0mf+{{2COqx|5n^;YB?UpUt+(h`a`D1AI1^dC-F^F<IR$zj`TUfRKH8ehnni= z2t11RkJ5fN`8@Kc$e$%&PQIG_B~$&~jCHhs4Iji#Q}eeSA2T)G6Zkt*^Z6paiT^Y; z-3O+|k2%U4XKMTv_+dN^KaS^{n!eQ3^krC1`we&t-h<yTHQo2H+tl<u*lVi()A$0u zhHsggewG|{w9gAoO_xMYHPvq#rqg~ho{8)6)28~pmV5)b4(~A4-`)5%Q}w=&KgTC= z$W(uSHFbV^jp5S_KQ_a+pNv=Hjd+Wxdbi>2rs{nge~iDuou=wNXR6*5!`~+-ALFM# z+|+m%;bnL;{uH0Y5mV3WFOZXu_0u1Y7vW`i2mTCqm|BjV_@t@j_$$7FA7Jc<eg8{M zEyt0j#y^g{j{FI73HcIJb-sYt(Y}rLuaVox-!nD-kMU=;_tX9a`48kjlgG#trlz07 zcNiX(so|RM6{hC<SaKfu9P)+a4W_oo<)-?(60f0sGv0&W#fMBy_b5JYYWm;eQ>N<w znf8~+Z(;ODeESkyW~#p<$VZ!6juXkbv|oicVi*1bpD;Bazr){~nva+99bB-=4?n<E z-Gj(S;<2Xc=aSDPmyxd~ZzkVqs-OEz)xRIVOZ#?w0-wbfOilL+`E~Mp7<ZiSZy_!= zwLB~F1YC;+ruw^(TtY54HD482P5aHXZ)Nx$csK12;?Hm=4w|a-7kt%J|F7c*3}2Y# zhcCvZrsn@>JQ>fzLR0;gVuh)GE3wMd^!3<`UpF;fJNbL$Zt`!)1NapF5y$auj9Kmb zTWqTSQe0-L{;7Bl7MV8Rrp7Nr-Kf!xUyV1J8n1!8jod>17WpAl{XC36rv10H|B?J0 z`DOB}<afyLk>if{{Vl}Brj}zRo`5-~=5HOIZ)!f)<EPBKbe_PQu+G$UTTP9B2i{Hl zgZMMtiGRlDO-*k%<hJQw!#8P<Jwe0o(ssZUQ^)7g<dg7p)8^k)KWF2)wBJqp|1tbK z_#o{+$0zYGcwn~g_h3`~9)gFPny(Y^6w~U{em0&<`z3e{eg$taHQk-$d&&2cA0YpT z{0RBi<fn0%;V<HArsnree8<%MzEAu9C;Gg|RQ-d=$KWY=HlAl{ybV~v@GHsH<eSJ1 z<Za{@@_pnEaxeKwe9pW_--k3czl%@ubyt{Lp2KjZsrF3TPbQyEKHJpz=i>RaZ^TV_ zqj|4xeoem3)O5FF8^a$kHDBH2pPTpU^@XYNpTwt4&DY=XZJaUh)$84peS5sA=@Rfz zhNqjVb3FMJQ`4<8HU8OnF721#HF&+L@xMa8#ng1S;kQin-${G7sqy=0@5ce!pTjpy zjrShyA7D(5hHH5fOtmi~AC0RReyXYY_$Z!1`&qPK$ncBsGqhigH{n-J)wv%Z!beQ? z|0w>_)O`H`?RP*ezievy_wj&J{B(<OiK+39!fZUn)O6>Oi^-*?>Xu<S?bUdbsp%TX z+sG~C4*UVbd&s{akC@tC&y(Hvgf)NfGTwWp>VJSMPxbXaY-;#%c!H_v&cZ@d^K}uq zl>B+}4OqkQTgi>&7E|-}0K*?<_@k!k{t|yf`=9VHrt1Ekyo>xU`91P}r)fORZ!)el zRc|#p-&8+Ers@@A3GJ8AUP-<YZ)SL-nXDURlfPxEpKs#>rt1HY_D9LT#itqm9Qjq; zjUUjyC|CVxJ`XX~|KWHx!;8r!SZb>7rL<qk@M~}r?KjfCnc-V-8|{6xKaJ1P{sO*a zs?I^D`}sQ(vrNrrHs+Wb?`%BJ)bf;&H;_M14q`3Cx0>qj4!oQ82k@uZkCXVesXFhQ znm+oY-u+C?&tg;UXW@Fh46nhPaU0%;9j5y2#4c0)K0^Di8U7ePLHkp*Kg;mv@kQE` zKj!CaC9X16=XgBHRGrId|034Y-hhp!#=8%{ZEATt$v-0hoIHR}G5lFmb)Ux<X`jZJ zJm3EkJQdfNs#9oc`XVf*eFN?H;CJvx_$&M!{snj8KTY-f9)4hIIhU^SrkJX~lAJ+4 zft*8LOTG|)$?)HrI<D<^)~%n=?>iiDhR+`|)t*NF2>E#OX;{GUbIG43UreqfUqk*f zxsKdKzK8s6@`L1V@^<p$<R{4^<mbt+lHVZDlB3r8<yvHFxt5aC$S0D|AeWLaC)bgi z$PbZ!M*cnd1+x1+5v|t+`M%y^rgA3vO!9@~E6F#Ko5}Z+e@-4CzeIkW9KX)@pKNOR z9t+55{SRX?9uqJTHHjNP1yeB%(@`H+x$*Qdg;Q?_o!O|D3oh%l>C8jTrppCbh(%b8 zC0L4OSdJA~iB%ZHYOKLptj7jy#3pRU7Hq{fY{w4l#4hZ{9_+<F?8gBd#33BU5gf%a z9LEWq#3`J{8JtDkO2Msn_xo(xAL7Xgn25<}_s_BYCKb~#9WyW!voITTFc<UCeScj2 z7LW_E2#c`<OR)^gu>vd6-7iD^2FcY}gSA+X4cLfH*o-aMif!1A9oUIo*o{5di+$LS z12~97IE*7WieosA6F7-eIE^znivg`0+n%u)k9L168=i>Cn1ZR8hUu7rnV5yyn1k;7 z`Ffm3&c^~Q#3C%l5-i0sEXNA0#3~G8HP&D))?))UViPuF3$|h#wqpl&Vi$H}5B6do z_TvB!;t&qw2#(?yj^hMQ;uKEf49;R8hV75>X!rec+aHrL1yeB%(=h`x(e49g{bZy2 zy;$X3avtVm0TyBr+Wo?;pAsy^GPL`LS$hRmqTT<?h6k}4Yp@pUu>l*g37fG6Td@t> zu>(7?3%jugd$AAuaR3K#2#0Y5M{x|taRMiC3a4=fXE6}#*H0|QV*(~(GNxcEreQi} zU?yf^Hs+xFy&G+pJaRr3U?CP^F_vH{mSH(oU?o<e`+XkOt0vcAE!JZLHewStV+*!o z8@6Kyc48NHV-NOXANJz_4&o3F;|Px87>?rvPT~|!;|$JXU;*17<1qmfF&XW?adteV zVj8An2HO4PY`iSY#vIJWJj}-eEW{!##u6;WGAzdmti&n|Vl~!aE!JZLHewStV+*!o z8@6Kyc48NHV-NOXANJz_4&o3F;|Px87>?rvPT~|!;|$KC{lcPcr&x@~1Wd$aOu<x4 z!*tBROw2;NpPtpp!CcJ4d@R61EW%<e!BQ;4a;(5gtim8xV-40~JvLw?HeoZiU@Nv^ zJ9c0vc40U6U@!JzKMvp^4&gA4;3$saI8NXsPT@4p;4B8>*!~!g37Ck<n1ZR8hVJ*> zw0$$knV5yyn1i{Phxu55g;<2eSc0WkhUHj+l~{#Ati~Fw#d>VOMr^`nY{6D+!*=Yz zPVB;N?7?2_!+spVK^($i9Klf>!*QIzNu0uIoWWVtt&9EfkM8&Wv>g-3iI|Kjn2L5E zMLVwd`TKzyo<(~$+P&9p{9Me#d@Mls`-B>=h+K>%Sc+v>julvmRTxC~`-kechFpvF z*no}Lgw5E3t=NX`*nyqch27YLz1WBSIDmsVgu^(3qd11+IDwNmh0{2LvuHP{bmxDJ z#{^8oWOTnrsr8piPQ!G}K==EV8ZV2SjX9W$d6<s{ScpYfj3v0w-^*0J3fe2t?n!OS z7sP6;!CI`x25iJ8Y{nLB#Wrlm4(!A(?8YAK#XjuE0UX339L5nG#W5Vm37o_!oW>cP zMZ009+x{4j3Fv<RRO>I9oPw$7elJz+>EsN|#4OCl9L&W$%*O&O#3C%l5-i0sEXNA0 z#3~G8HP&D))?))UViPuF3$|h#wqpl&Vi$H}5B6do_TvB!;t&qw2#(?yj^hMQ;uKEf z49=q6(AaH%jK>5_#AHlC_j|(H?rG$7%)m^{!fedJT+BoF`^D<7fLw@0Sd1lDie*@i z6<CQ?7{qF<!CI`x25iJ8Y{nLB#Wrlm4(!A(?8YAK#XjuE0UX339L5nG#W5Vm37o_! zoW>cPMY~an+y3Z&Ut8NDft-lRn1ZR8hUu7rnV5yyn1i{Phwk^nZTpi8u?UON-49LU zm6FS_94oLAt1yVwScA1#j}6#}P1uYr*otk~jvd&EUD%C1*o%GGj{`V}LpY2hIErI9 zjuSYEQ#g$?IE#S;+5Q-h37Ck<n1ZR8hUu7rnV5yyn1i{Phxu55g;<2eSc0WkhUHj+ zl~{#Ati~Fw#d>VOMr^`nY{6D+!*=YzPVB;N?7?2_!+spVK^($i9Klf>!*QIzNu0uI zoWWVNTZ6mfALB6r6VctrK*wDQITh0|9W&6~-$3JMk+U%eb1@I|u>cFP2;F@V)L#j? z6w9z2E3gu)Fo@MygSA+X4cLfH*o-aMif!1A9oUIo*o{5di+$LS12~97IE*7WieosA z6F7-eIE^zni-E;#e~iZjOvGeN!BkAcbj-j^%))HU!CcJ4d@R61boZ0cb}uHEU@4Yi zIaXjLR$&mUu?B0g9viR`o3I&Muoc^|9XqfSyRaL3uowHV9|v#{hj182a1_UI94BxR zr*Il)a2D-P0l4EI<1qmfF&R@Z71J;sGcXggFdK6)7xOS53$PH2uoz3Q6w9z2E3gu) zFo@MygSA+X4cLfH*o-aMif!1A9oUIo*o{5di+$LS12~97IE*7WieosA6F7-eIE^zn zi*|!LxBW356EG2zF$GgG4bw3LGcgOZF$Z%o5A(4A3$X}`u>?!849l?sE3pcLSdBGU zi}l!mjo5_E*n+LthV9sao!Eul*n_>;hy6H!gE)l4ID(@%hT}MalQ@ObID@mOKc?Zg zKgMGMCSo$CU@E3zI%Z%dW??qwU@qoiJ{Djh7GW`#U@4YiIaXjLR$&mUu?B0g9viR` zo3I&Muoc^|9XqfSyRaL3uowHV9|v#{hj182a1_UI94BxRr*Il)a2D-Py}08a<1qmf zF&R@Z71J;sGcXggFdK6)7xOS53$PH2uoz3Q6wA=v*GI1tD#(>sh3-B-YOf~OU@g{T z12$q4He(C6VjH$&2X<l?c4H6rVjuS701o014&w-p;uwzO1Ww`<PU8&DVj!9AkMWp* ziI|Kjn2Kqbjv1JVS(uGEn2ULsj|EtWMOcg_Sc+v>julvmRT#u-tif8W#|CV~CTzwQ zY{fQg#}4eoF6_o0?8QFp#{nF~AsogL9K|sl#|fOoDV)X`oW;OFY=4Z$1Wd$aOu<x4 z!*tBROw2-eKPVl4Ipkc-LwA2DwHJ^Ju?UN?1WU0D%drA0u?mA&jWt+{_1J)o*o4j4 zg00ww?bv~x*oEELgT2^?{WySwIE2GEf}=Qw<2ZqnIEB+VgR^LV%FCVqF&+~z5tA_m zQ!x$GF#|I(3$rl?b1@I|u>cFP2#c`<OR)^gu>vcx3WHdUHCT)F*no}Lgw5E3t=NX` z*nyqch27YLz1WBSIDmsVgu^(3qd11+IDwNmh0{2Lvlv*$_Q!a1_X*SSm`F~>6m<6u zQ+paY9W&6~PfYDu<ZR4AcYiUp=aKWV01L4Qi?IYtu?)+x0xPi!gIJC3er2j(ORmQT zY{VvP#ujYFHf+ZZ?8GkY#vbg&KJ3Q<9K<0U#t|IFF&xJUoWv=d#u=PN`-6|}_{Vrm zz(h>O6ih|?8@@JuI%Z%dW??qwU@qoiJ{Djh7GW`#U@4YiIaXjLR$&mUu?B0g9viR` zo3I&Muoc^|9XqfSyRaL3uowHV9|v#{hj182a1_UI94BxRr*Il)a2D+khr8{M@tA;# zn2afyifNdR8JLM#n2kA@i+Pxj1z3pgK6l!`ipeEdie*@i6<CQ?7{qF<!CI`x25iJ8 zY{nLB#Wrlm4(!A(?8YAK#XjuE0UX339L5nG#W5Vm37o_!oW>cPMf-#6Zu?_ACSW2a zqr0!4wnr*C4bw3LGcgOZF$Z%o5A(4A3$X}`u>{@y0yQ6H<Z`UQN_6)R)ObO1HP&D) z)?))UViPuF3$|h#wqpl&Vi$H}5B6do_TvB!;t&qw2#(?yj^hMQ;uKEf49;R;1=}Cv zF#!`X8B;J7(=Z(~FcY&d8*?xh^DrL^un>!|7)#LIZ_&0txg0C7600zX)mVeISdR_Z zh)vjxE!c`}*p408iCx%@J=lwV*pCA^h(kDxBRGm<IF1uIiBmX@GdPR(2b10LkMWp* ziI|Kjn2Kqbjv1JVS(uGEn2ULsj|EtWMOcg_Sc+v>julvmRT#u-tif8W#|CV~CTzwQ zY{fQg#}4eoF6_o0?8QFp#{nF~AsogL9K|sl#|fOoDV)X`oJIRXG;aH2JSJcwCSwYw zVj8BSyRWE@%S>_>W@8TKVjkvW0TyBr7GnvPVi}fW1y*7e2C*7zuommF0UNOio3RC3 zu?^d?13R$`yRip*u@C!k00(ghhj9c)aSX?C0w-|_r*Q^nF>ol`ALB6r6EPW6Fcs4< z9WyW!voITTFc<SM9}BP$i?A3=uoTO%94oLAt1yVwScA1#j}6#}P1uYr*otk~jvd&E zUD%C1*o%GGj{`V}LpY2hIErI9juSYEQ#g$?IE(JSxjJ5B5A*v$JSJcwCSwYQ?yH+d zPR9()#4OCl9L&W$%*O&O#3C%l5-i0sEXNA0#42?6>(z2rlWVXR>#+eFu?d^81zWKV z+pz;Xu?xGg2Yay(`*8pVaR`TT1V?cU$8iEDaSEq#24^vl#_^Bwn1G3xj47CkX_$@~ zn2A}KjX9W$d6<s{ScpYfj3ro#Wmt|CScz2_#A>X;TCB$gY{VvP#ujYFHf+ZZ?8GkY z#vbg&KJ3Q<9K<0U#t|IFF&xJUoWv=d#u=Q&z~O9vjK>5_#AHmtR7}Hk%)m^{!fedJ zecnG>$7ccUg;<2eSc0WkhUHj+l~{#Ati~Fw#d>VOMr^`nY{6D+!*=YzPVB;N?7?2_ z!+spVK^($i9Klf>!*QIzNu0uIoWWTP9KrU-cuc^3-e)^n@Be8}!*t9*cOUL(ef~?% z#vF9_=T>_jIUftq-M3rqMdV^EL3bZ-wU?30u>vcx3WHdUHCT)F*no}Lgw5E3t=NX` z*nyqch27YLz1WBSIDmsVgu^(3qd11+IDwNmh0{2Lvlv*(_Q!Zkz(h>O6imf5Oven& z#4OCl9L&W$%*O&O#3C%l5-i0sEXNA0#3~G8HP&D))?))UViPuF3$|h#wqpl&Vi$H} z5B6do_TvB!;t&qw2#(?yj^hMQ;uKEf49;R8o$ZhA{_fHG{y#YplhNJpUG1slG)zZ# z|97=#lCv-ybI{!vUgPDF^RWO6u?UN?1WU0D%drA0u?mA&jWt+{_1J)o*o4j4g00ww z?bv~x*oEELgT2^?{WySwIE2GEf}=Qw<2ZqnIEB+VgR>YolI@T2=<biN?UP7O#uQA& zG)%_~%)~6r#vIJWJj}-eEW{!##u6;WGAzdmti&n|Vl~!aE!JZLHewStV+*!o8@6Ky zc48NHV-NOXANJz_4&o3F;|Px87>?rvPT~|!;|$JX;3&2~#$y5|Vlt*+DyCsNW?&{} zVK(MqF6LoA7GNP3VKJ6qDMtL=0`0FA46np03}Q9bU@g{T12$q4He(C6VjH$&2X<l? zc4H6rVjuS701o014&w-p;uwzO1Ww`<PU8&DV&G`DKgMGMCSo$C;6DF8gVuir?U|T` z*_ea5n1}gTfQ49u#aM!+Scc_Tft6T=L9E6ati^h4z(#DsW^BP$Y{Pc!z)tMKZtTHc z?8AN>z(E|sVI09x9K&&(z)76KX`I1Xv_Cu^rR^4r@tA;#n2afyifNdR8JLM#n2kA@ zi+Pxj1z3nhSd1lDie*@i6<CQ?7{qF<!CI`x25iJ8Y{nLB#Wrlm4(!A(?8YAK#XjuE z0UX339L5nG#W5Vm37o_!oW>cP#lSIae~iZjOhothN3@@$kW(=Y(=h`xF$=RX2XiqG z^RWO6u?UN?1WU0D%drA0u?mA&jWt+{_1J)o*o4j4g00ww?bv~xIBM#<mSZ@M6F7-e zIE{g0*)AB537ClP@447^A*W&*reg+XVism&4(4JWHXrZjzXe;d4coB;`%KMGKMvp^ z4&gA4;3$saI8NXsPT@4p;4B7C@bwe2y@{BNDVU0Bn2s5kiFufh1z3nhSd1lDie*@i z6<CQ?7{qF<!CLG)k@boLIEX_yj3YRTV>piP?*eE$O_HZ@8fS1811GUwPiDPhGNxcE zrlGqJzv^U=Gcn6d)_nmn2XiqG^RWQSO!Zfe6<CQ?7{qF<!CI`x25iJ8Y{nLB#Wr;J z!Pk6@=lJ=Vz)76KX`I1X44mSpi^X_Mz(h>O6imf5%skcilZDxsgSnW8`B;GN{`Fdp zGIBXqU?o;z5UbJM*Iv`tlIyVn-F@!W-b8Ljci(#rZzZ?k*lB)w#&H5CaSEq#24^vl z%X-ClOu$4;#uQA&G%P#a_fw7)Scz5W?$fU2s3zB-yKlRO*OMEt5u30XTd)<|Fyg-I z>aY8we!hCJ7yGau2XGL_a2zLa5~pw)XK)q+A7i~@JSJcwy8E_kK2yl4n1*F}tXHhS zO02>lR$~p;Vm&rsBQ{|(wqPr^Vc-mw2jejT6EPW6FcsZ>&!hFdS8@hsVism&4(4JW z)~@yQQI8GSi0*#k(SblSxdmIX4coB;JFyG9u?Ksx4+HC1AL#BEuDS{2M0EEL*YFf_ zDyCsNW?&{}VK(MqF6LoMK=aY0&lgSA$s+4%(B&d>F}aEyBx_PPeKWa>+)W-J50b~p z6XaQPAj;QEGu3H2IggxAE+<!z8_1#iN4xt#Yx>ZApxynPl|%P)cK2mg4&9eIS<7to zQcV5ikaNi;<Wh1Cxt82YZX@@S`^cl@F|xZau+=9g$57wYuq<*mxsY5$t{_*E8_131 z4ss`XfILW^B!})(n;7fsC!4CDP0k?~l8eZd<SKF#xtZKW?j{eDL-$d2_e0h4hwg`( zvcT6*HB~={oJ%etmy)Z=HRKj@E4hc<OCBMQl4r?*{d~PNQ}dHf&L<a;%gGhwdU6A~ zo!mio_nB0GePnmvNaZoIyC0-2KRGqd*H1IG{JG>jav8atTu%<&H?f@@x({MMIdosc zadPNBg|YFzUc9M#>EsM@KDmHgPOcy~kVE(DbNAiT@`UcY=kA}U9J+s=yC0r%=ze&K z`}_LIrs`*rv&jYILUIMUlI-pqr~Vqq9kh3n2grluNpk4EYzYVW`iZ73KRJV(N6sgg zkW0xm<XUnoxsB}ZJEr*y-FM90Pt4W_?e0Ed%Axy&#oK+MloPl=R2n&*oI}nf7m<s} z734~CExDfDLT)AZkbB7^<Wcerd6t}F_bt-=rE>qGTyh?{m|Q}xBv+B${hc&@BiY@z zNjY@iCU+ku<<NbY-2If4L-$jPKallfYI~)T)5$sHTyinFgj_`qlAFlQ<Zf~gd6+yx z4m~gC@qAT|4cLi8IE~3XKjmO4)?f?v;wXmxZa{*T)$N~{kL4J;Z+_^$_d1;fqV&Iz ziOfg!m6g|CUAb}9)yJi|f2*_gU(WHToODuJ+Ul&V)${&;Qg(J)TJ}j<*;#JPvIA~j zS9oSrRFsY&|1T;KV^7oJf7!SAhuMydz>0vqnwa~yes$lLmpAO#^6obK^i_Y8ace>1 zmX|j_vFU)i-KpF41|kq#xYLck{R92muw`J!wnr?7#^3Vt*7XTn*TvWEUL0Iew>v2q zvtiex>f}+o3yk_%@TlExV@u-Jym%|Ke*XBH=-}Xi8+P5cVRawf?hM%IJ$mO8*sx>U z^?``-Q~mg_T%<YKW>*gafx5heC_jz$;rg$e%-Fgvam$A3ts4@yY?|4+DP_w|vs-V9 z-?DCM>$>E+_ZDwiHyJ#=?!6_!gSKv(+49_$nXMZ4rr9l%8(#VM`yYI;Ge14yCOrjj z$xn~px^8MqcDf$Le(=fE&3(axcE+`-swP<7r-}VkJ8X*0nqup^$$d@q^__85nrPP( zbIWsX{I)aRteaVO{bH@rS8i2Rmgj@?%^EeZGb&3v(WCkRC$M45(2fm{+Q!iXhOcJ$ z)-|z@engM!CZaa?ZCMk$=?^=j^4yp^*TmZ-8+O<z$ITlh`24OP*sxXehdr_D>(sZV ztocn3zw#xm?YaFUwEec7^Jd+@mS4Z$hF6~Ww?;_cR;H<T2CB64_2_dERo-Bq>j!o) zOrJq%SY2LhR8OXR$Z&m@qTvMFOSRek4)!aB`P=`X;PG|4(}RiH)3#gB!ITZJoU7V9 z19?i@ZGm>?`K7kK)bAhKH?$(%__psh&D)=}{p)rgGq1lSZU0&8&t52QcQZWK(cb&J z=I6_4b-Po7r)jn}t?;wK9Q4@S*#2&Zh5G%j`fb`4JW6ZG=7&|I{ULHH+m?GRzxHRh z11H!neQu)d(i`HpZc5&E)|*?`r_{|Xzka#x$Gf+TXm`|}Y5Vbsp?cb%25rT}gg1=s z?BPAvZK7S1J+`oZoLzsly*b17|6qE2%sKg6lGC>oYX85$_Wyf(KJ3P{m%zJz>bB(0 zwXs?vO>KMZuKRmzgVI%Vk8M!Gt#0|X{{PqUxx|joFV(%bEO@C7RyT*ig1wH^3*Xb0 z(wwIM=i~0lopE`p-*b%3#9407Xo^^Rt$)7=ac$~l=UK6K=G--E-5&a%yWP@rtaa%6 zrrTW|P3&*~WB<Bux9wl{!hCy%I&r5{zoYKGe=QC!soT9Gn7rYY&uc3B-(X*svxCZB zwAqEzeeN$hAG<T3+hsQR^Ix(%|0UMFuLqOC8|vO)q4oRzV%MM6uTFGt&0jgMy!9`? zg0In<*ixfY;oAJDb(40AOZ6wj3vGwksR?%m>@Nbij`mu=uG!7&k($?CW43O~LOrgV zj9Hr>(Ou%)_$zJvE*rn%KaRh+{?j`5%uSQ7X<qr_KF?QmyAKK;VMptMc1SMT@X8V` z-<EfG2JEj1uvXpiXs`0!vh4l*qwTT8w#T1m_TC=$=AkD|_4hh{=bj%^>UJ;F^W7_7 zo11=T!0OG_pSS<)F~65;qJ7P;-3@)8^SktBo8Ov4w0Ufl!`!^t8SnKCuN<V#-0`TD zv1uw)UgxLK@fkmN%F+I#(~CWMCf0pm2dADzx2&589#i+hvc>gV)otAe>_*pUQ*7BC zu^WB=pC5d%`rWOuKh3kPsI9qm-GqOVjM$MjeX{QHsJi##H~rDJc$~)F_jtkk+}5_Y zTyCM~*Rt0Ot~I<$c8&S0O}y>QWxM_m@%kevnEvHuwnZ0crEFTVGmvP9)Q4D2i-QMm zc;)qXwRi3PS|)ORg|_ef=My_f?Y#d3b>NTH?MGP0|LyrC$)4X<_~)Y}n_kavSGwu* zl(sL`|Mcu)E%UnB$J}jC4vpfsXK4QB&L_*%YxsO(9qN3NC+Obp$D`dibiUqu`ai$3 z_w;ttaJ!Mm-uwUmI^X}d*JD?zlI;+Qe&^Zi^;pWzIJ?`o_5!<!SYYmn%_dsr_M&~h zB)fNKT$<kP?RtFP@#fZ#JHG!pz4!8!X>_|$)!xe&v3`>5{P45+)9X!IV8=c-lil@D zo$WfXY5u=G=f|J__v%mEOa0m#qW>{JZu+D5F@2Lwzi406|F7-ko}X{1dv8VXB71(e z<qPKR_5A#kxBZs;FB?J6&vq+k*F(f{+@m+5b5F2VVAo$mujkkq{=-Y{ZLYJOakg~3 zzOVDap6k<X-({M&@cwVz&+Y$~?0$q=t)czDZZc)d2EFFen~7Py{@S`pd!gP&B<aOh zu*lv<q=r|+$$B?2wN)c;a_=U7_?BM>H?a5G>nOdP@-L-^ckX95DrV`KWXIOeCib{@ zPJh|7pvS#)+E4wteZ_YgdSUzDUN4-ix_d64y(#~HyTAPN&Aq3$oAUnuxxdt@=KnZo zwZ8<k$NvAZzu40K=l$g$Q+uzEMB8>cC;aE*Z%Ht{Zuf`$`P_CZdp@{NJ?V)?hyHdO zWG8YR%37%H_72|S-sb~%JjT2Cv-V7^SN`s~Ing~OC+PXOt}nK3ChhuVTi5HUS-aod z>-$$eqI!A@V4raG=qg?y^7Yy3zFlwh=;Cc)*F=x5!3K1^?0UgAg1twvm;ZXrr<Z5j zV$X8#fZYqeH1~{Jq$P0MVb{a{8CGZC9_{6UUEi|l|M{P%U+Tusvu6u?l6>U~&7e*4 z!T*}1$X;U}ZIk3MiM>kL_gpTnpVC`uS1F+N?4BE5iPB{D{;zH_!CrF)bu8M;T77z< zw^KLixK7@7M(oye^^WSO>oc~Tt97jvow#MaUPQ-lO-<jb3ASnidwcacd&BPDrE2Bc z$3t7!Cg{cRp?V*_Wo?2+)~5q=qwm;yUBc#fgA;m#W&_m~-Q4lImOW<3R@;*tuWtV0 znLj^ob-NRG#@MMKxP;lTSvWyUW3P8o)9uf?2drle-m&NT&OIL;tvccJfo&!2bOF6e zus^)=pZ8zAKC;hS-1}{t$oAjoU$gz!PEgzR3XJ{Ny4vo#+UNco@%-qXkG`f}_MD$Y zJ-6D0f&V-|bFW`6+Q;-|Hoabh?>+thdOl0iA+)&uZcX~-BkXjZTle0<n-19-XG_^* zOF93D+M#oOuxzhqyT>L&@9+QX^V6oh|8a_YKxJ(~+@W-<wy)bnI`3%}zY^3YcP%^P zY-wL9SDv@M=fD08ZLg1LzIF!ehM3#+o^$>S$Gx9F4h&}4>*2-0L+W-PVy}noUylw; zt<t*P3+;u?3%m3Ypgw2Y;7%9zdV7OAf9Qjbx&E}i=iYpt>rPhg0NZxvJMQy}CHlNV zpSHcF!@)kvaGzIfR>$u7R>zZF&f94V;EPABeSfx^bme!wyt=Q+zoWD(YkG2x-+G39 zToF27xlb&b{Thq0n@aBbi9i1Tzt7*xug=Y1yPLlvZ4uRvoI5*-?u@afU4OSN{a@y* zb^d&9cdOYi^sY{~kaY8ZJvzID`n=1(e_0o=w-l<eGcVCK+UNY1G-%%L&*!=Nyw1kA zd-iI4KcX9d!;Yw=s3R9GT^O@y#iFFBB~ghwdZN<<3m1M=g93pV9_ql3^$+!zxjz($ zS#;{c(-xkswYlHYsF+0y7g~%`j5{#gmZRsz_@z;EZTl})w>HfIM+J<92Spv7aQ0H0 zEMb8ga$r=H&x;OMK29g?#Ws$Okr+F#r=$#3N!7FUl2xj%+6$~BoBh1~Y~-a2{9G(J zdug=hB3Uus#`5u?d97O756x>;T(&T3z3U_;du}QXKUmR~@|`TF^1{f<E9hIx8Lf#@ z>6>`Syr}s)bXC;H5<>GoH}{88$tJSb78mJFyB&bq1W|8kLqr{=9eur>YW2@<S7`sD zqxSok_JioC_@{KXijH3Jo+IvZ9q}=-3ogGZ7>JIIyHHa`$1m7rW5&l78?kY}wt)$; zXKQ}d%Mv{)N5?LxSH;-axCJ+8Bg9m0P=)<AX}tL8sxCc_Tch&P*Vb6!m4P^W8i>Bm zr`W)PLTe1(s>b-l=<8=~{6(6L=o{>zjsLJZkFNG9Htt8(_C=rK<Ca>w@d`I)LSX;c zXwBpS78m@?rux#)?cqnYUZTHzh?@5Mww^8uqi;Gujd81Nj9Wf#|5ue~ZKPX2<5FUr z{oT;$+cvwD68AMrw?E`kYTUu*9gn$`7MG|Vqnqq|0MRSc<KD7fnitwSTA2}dkuB*x ze$33cS8Og@e4kly^_E(XcVlM9-EFDuAlFMyoPF9A{oQicmK$f+{-Phc-=(~`+iZ=0 ze~pd5GC%Ga8`|lYzaZ{$tM>z+&JHZN)F!O6PWO*pq5m(8vdK=>qXhRqTZswof9o_% zBjt$$mS{cgA8UgTwAEy5WYHIuVtl?Ll%wd+7HE(DG`)@H>)C4CqumwNNL#}r**cmV zNljg@$>zdVZA8<P;i(pA>F1gfZ0Qngn5K_&OYwJ&x;QE`ax}NZHq6Sn|0gLdjw%U{ zW~;-m7&pu&(72yfyB5qn&T&)RwvQ>?uzS^@ahu!}c42D&*j7D0z(4$g9wx@dCZ}uH zNwS%~Iq4W}xj@qU`d?JiZrg{FPS;2=Ng3LNu}N#R|1C(`r7gc-Qj%KZl8)7o_@tvW zWdEdh^!R|JujnvZm{g)35|VzUaSlvctJXzHr)fnjPFk<SH8Ck&kCT#~RoNv;ztI1e zCfVOVOiuc;Y8{mHElvBOq&qcaS<>e;ZA#L2H2mPCBh>Tqq;F`*iX{8qOKQ?L)!QLS z_iEk_O?q074@<K5B56risfWXpPS!X_Bz;Tsurld$`hR-TbL!{Fq_gz+sH8^KJvymD zk28{P(Bos0?p6QCCY__+KAd#2s%Iu;Y4}HyKCAz)N?ND?AD5)lZXhdZiN;x-G^NMK zC)rEs6O#U@X|t2;70-!D>s9xpq~q1|$w|*?Npq6kQ{7XNZ0nwy^hd3w(~_RnRJnou zzMzg$VlUdPp5lJ0|HYR6Q2)2nK&eKH-B6&>qF3sKrY>VYYnv!~WqjQImdbovLfirs zjlIOTCB`LNy40s+_WbXu&jj~B8}4@~xAWQ2r(MFf|NgNy6ASG7C$Z&zfX&d78?_>$ zk{7rmRwD-#-M`~B;?gf``l!VV?2q0?-x){_UVTL%Dsh1;erIfQRq$HvMGLG_^quj^ z8?P!4L@gmEC|(wbTDrhyA^Oh5z>;^=VbpS8$e!y@&`+j*uF&v<T%m(qA=|TjrGs6i zs0#v1Hrh<a_-XUhZrlF~{ro9B?fbDdlV8)Y54pMgAlBycS^fCg3`EXmROD<%&&}pg zluAv-y7f_|$?wz83JqJMS@5&D%auAy!+fbpSE^0fmwL^e)52@ybs}rzjo9!SdE839 z;7hfs%v1XLlZM&fBK4)7b)}-U3Vo^PT&a9zU+OQBrA8x5JwI2<eNEtTUusBYu2h*D z)y;D4O}^BxU8x7crGDc|y>HoV=N+!^PihzcklWDxE?@7nw)A7Jm^&XW*`a+qs+o1D zN=K`gziG_P;c9odYKt|VU$7=uZJn}Tusb6c?5@ZKyL)cI9<@@}`%-q1uUS7y+7s-u zj$g2AT&dGF%$K^>m3m9rm%1*pR4}sCrnypDZGosu*jy^}hJG@%1Aa!QBwwo3l`7US zUuuIZ^#f&J>a&rhE{-f!Hdo61Rq{{xQucYr5n6eFQ#X%?OP%9ap!O7B>f^4|`O3aj zVPvUuBTJn(SE^5EsHl@zfhyCipIg<<YMtKvQmuBSeiANqyeqX*E7+GhA+l6<WT_M9 zO5JYTY7r|?Wv)>El)Cx9aH;)WDceo_QXSw*J#X3VgbQ8YCu%MDoiM@W>wVTvc%Un` zLpiWyvsIgl@dvUV7if#8s?vd4V839yV(gqzpkcn+WXu{(Xy3&0)n1FSQ`?MXx68lo za*C!`R<$=`>`=~84lJp$YA^U|_G!>p^|M(m)!}N-x@teNsofdsIalp%WxpE#;(8CC zHb#k@HlBC2+==ujI-;U}=SwxIOuv4P(c7lKg-Z>%QtLI$mwLjLdRW<)`fX&XCnHM@ z&Xsz|N`2Rt8d8}*Yag_~Tz9^H{5ouNr4sd~$CtX_mCCa0w%E5_-wl@CI{c2y9X@Lv zw!32QC<m6@Z`GQ7HM?Yah<3R%^lq;=Ty3kXc9n+tYK^YiPG!Gf+aee2_Q(ahV{XCR z*QajwrP5TUSU>+(H%Dtm{DR%+N*$xmS$wH4xl&(M_N8hfOWhP%>dSMb?y#l0%9kor znQi*9&&=-%m%7}QvcCxBOMStWI!aHHzSI?wr79y!T{&0k7Ay5>U&^kl{!Txo>gM0! zQtMqQ`=d#|)F)l37sI74iY!$US?W`BrEaoPXZccgNi#vm=rX;Juh2^LEAR|gYORL( zQfpl)`#U^-sq!OBt&1#m=3J?ul{(ayvdf^a>*o*ZCZHAOOC9V=y&o>M+?6_1pDg*E zaE0spddqGnOm+EQpS2Sn;)*?@yiDB&Uehw9Tpoy8<+_Q{JNLlBTeXZ)=`p)j=rvS~ zT`mqRxx(gae?MRLbd#&oPNqh_B0OKQZoW!1%&&q4uEQTG`&F=C<SK}ZTm|uStDsT^ zqy8D~&Sm!T^tJkVTiyIAT<Wc8JC_}%k6C=Fx1-l+9xqY$rKY1JUZ%Z6<m~cpbofQd za$BmGe5qQMu|Hh=HFdK_`-orL&%07P!lhntrBd~d-<SGpWT~;pQZLSxdQ8W7)Q~SV zrZOvZrv0qCvA@OTOFijI-KJrFsRmuCzlBTvF0#~9k)@uVEA?|L^($Y>F0K~q=U`n< zw_VnkdeoI#r(wR-&t0i+Df^}BjV$$x$Wp(YD`lU1MLp<C*@apAkl+3qz~*qNZ@W^q zulZ8naivNuyK`o{>)Y-`?|0Ylx@>or_s=^IxMFsv_`s4oZNcvK)vQvseojx(>z{D7 zJ6*NQHOyDL%T@c0vR|;fBNwbWa>4GITd=Qa6Gd(IrSeqfEBdk9lYd6XjbDegu2lNL zp;BLQrEXI8rM?<jsxGor{amRcEm~C2m$J*H_SbfQrEVS%m%7@O+7&KU<x1r*50$zm zvedParLLPRHLR!bsLOmQyW$(GCz~79&1xN9eyKj|N<E-qeg$6aN_`M6RTf$5lE_k* z&XqdFmg+2D$}Z78ub&fjLixXNsWV)uOEk=vTI)(}x9s+eeAjnUs<Jzgt#f&`&pMHv z>584N99Xj2s-5Vo*~Q!ydJ_1SS`N^G>lZA`Rr{???Ou_rcGXrM5?Y7HM=sb2kqeeR zw_wLusY87!yO#T7{d`K@REJ9)>`HCcFkfo9EA@(Hw_qz=-{&40TCh}?zu~i;p<S`J zl><u-w`vFaYIbdOT0eREF!FEVYVodGrH1)x`@3q7Df|8KfXD?~7`b2xa|@>3D-bms z<=-6ZSs`0L@2Q*fbO!S4@Sjn3-aR@kRBFbJTdV9#{VQr#eS}}t?Iv>GeJ?6}-qrCM zh#K>y?4s*|I<-HdZhFI|{^Cl#q+x!kMqQ~>wL1JdeBSkamu0teyx{VWebzest1I>g z<$!&f8i;z@SF<a=`T9BR2rY<CRDQvJ>#BWR!+f<TUA1;)zhHxr3--In1$%04!M<(> z*w1|_yEJ>Jex6e|cZEwm;!5qeGF0kkuGGcKzEn?SsqK-a9-S+-%+65jeJQ&__J*EF z?ol^(s`X1%<VyWIT<UyR>P5?LKfJ*89hDwhhZnkhp3ho`#je;ll><vs?9}^BU(J0R zLYvTT=X6!L+P$t?@{yqh`<km(XW3P2alP9ugZvizy35%|xvXm6aMfCr154tq+U>rY zT`(Ea&&z6gHe79stCn<hsM>9=+J(w~HEwmihj+zBBD><Yxz*@?cP!tRvNEwc>uymu z`8wJA)%Y=2>ZjpSd9Ku=j8LgHk)_UvEVXv7l)d(j%JQY`D(m_B$yYZ&443+_D^;ao zem~4~rJe|v`bcD{RgtBRn=7@<N*(4)*(FN*3xOY~o8>yl{ZcJ=r9P~)nJ=}%m9jfc z_!XEMS?Z9;Qisl!T4bdb`BHYt)czRYqv~dJxYYix)ZfFU4sfMDc5JBB!pKqyk);j{ zms-BSN=><`?MkX$N!+AfUQ?wN?nAX*c7D2FgHqi&esYa=rhi#<d*Ew!b~^vVitd#0 zy2WdJ)c*H|ot^Gf3@mrQZ}x(#V>RB=&kJg}K+l4{&a+nMfXq;x=d4bl;vufiUpNaM z;>wKrl%S+4&xg)|%U`p7{0UdYE-Ig;pRcNmpM{I`TakyuMIN&vCw?SU<nf3iJ0pq= zgp2%be-(Mi6|sw<Z|LU=b#a)UWc`wS*NS{igZvtMz>2(K(Jje?*6mrVLTjwUVzZB0 zmhV}amlOlb|6+AEyE=A3^kJRHvyRheE8#k|R;N^he4VdYoo<V+&R74R*3JdKs^VPx zE38djhK-Gi8Y@B+ttblNqJW|$gb-6hve`+vcncxfLNp|h3xdTXRz>Mik5O8$ZBgt| zTTyKN6pxqV4XaiAVX>{Ptp)EM{XnZ$ZA<;0XXcr;CKz|m`F`L2G5qI!=bd-nwbraz z*IA+Cbg66SB8u~@h;}Y!J3oaO3@dmH*@D9d7VuA(ZABV1HVE!PEB5Z~VealNEP1!8 zVBEk0{t+@hp_>THmt)JZvE^Vk#!DUZJZ6uekVb>gfs*rl^^j)xf)u<R!jqAKA>VW_ z<linZR$q5kdj!K*v4f77Xsr0^P2v8?8mnq&H82={23OYMXBaEqfhwHhtU8?)d~Jwe zb;L!+ijS`g7dR_^=3l`MU%{n3@(yFgH+Ks8Hv&wHk2ou|_)a0LM*VMN#TV)e?{ZeJ zJF6%deg)U<F&`VNAJdB8^*6o>aqePT{7NwVC)kh$r3XPXFy!sJ!oNDJQfGx0?;ixK zab?DeFRmAsAZvWhc2)y|;a!Y=!a`$p1FdE_tCh|QzF1Ol+!e;^`?P9vR<}4S#I=jj zPx_g$;v<&AtDO};TkoR(Dy>fVow4Ffp+bK1-o&-TSz+CG(dwknjn#Zwz2dBf;H=E8 z`>$}VmK_ewz>xEl3RB1$U&lKuM1KX>#Pm~)72iKBJjz+kcUEYzgFR=)Qe*WqT4kKo zYG;KlbP|1?e66v1kXFl_6+h{2;)2yF^mWR^#)_|I74m!VCazyOE3B`>xQsQg87s~* zDSX^n@iXjheX)K)W>1_34h;DQX(7MiZhQ@c&b2s<dq;MRvEn3w!o83+R@0poTD+Ta zH8dD2zDHa*0oh<H>JA8MkSi$o+g^qEzo39ZTk8UxRBJ{aMgb#WSRcKJ`P}j)P2G*T z<=wf?_NF$gbH>I10b>F2wC|e2g5gIVvtjteV}A3KaKWz0E$fGljE<fXwp22Ebh!NB z@ryTvxrWIt;hr}Ry?4f<@XY3D>6Md?55Kx}(#e;H%Nn9hVPSK)Vte#zIQ<To9dW_X z@YJng$<mGCyoT_IhGRE`XH*_vfBaF$hx?BT)6HSesBqBI@SIUrw_Ig|@33;^PWadl zKH3_>y_aqX&zT(V*AR9c91gxC>=+g9eMPuzR9JXNxMI}Cuwg4~)6wLi;fjWqM}D*+ zY%*~|kwv4?!IN8}16m#lmsEyD4MVS6c;LLSyRs!5bbna6HL7gEG7N9vGAy_;JP0i{ zZ4UQY8g_1u9(=aGbM@0<Rdldj(*1VPs;41(wIwXv{BC_q*mXtp8n6)SE8NpImt%A5 zhi<|eJLA9&VeM91ci67k_l4aJ14ir{?z#Qluytqj#-9fqwr_Y^#C0`j`_S;brDtEe zFl@fjuYDF4Z2i!Ct=h9{g4N9%%o=DI8lHP&SlAFQJDC4hH$+QYCS4g0k1Ek%6V~0R z0VDRh1RG_~t?!1*c3v6IS<2P1A?(IRK;;z;(Rjw%XPq^1A-pvj^@L3qa2apJf}MMC zxMxFg%Y$JKo{}YP)ROMjAF%RX4RffRSlXqsYY3jt!rJS<a6@>SobGE@Jv!N|*yfL6 zmG|sKb`kqX-<TSgZfB<)ybD|EyoTt?yTfHzJJG0c*<`Ms`H|_*ZtM7w{IkYd(O42@ zGrQa%cDeH!HkNM)ue=}{6)oKq9&<s<ePLZgIC^uK-5d_9>_M-J-Uv%}hRxXI(P$=a z_mR=$U7HZ-J`JyL3ES^j))nrBooCm%NB=5pZwQxc-<+G&GWv#9;XN1RZMHcY<ww<b zdFI)b7abDreMflCX6!#^PenXfcguHvGAmrb&ZmxRwt3PqW{2Gehv`wao1o{SvxN0G z+TCS;<LI0lv7c-R&)&@S8@(BxqMd1|Db3y36@KlCuw(NtqBoxomu!AKykXDnlaJ4J zc6Plr`S_O3PCUXiLl}pj`1kJ^v@Yx?-R<cf@$&uI`nv6~{TQhTqujM1-zX_lTHxiK zuA?8FD?1Nmmm<~Vv2nKa{W%8jr<A^e;hTBBGvst9dU>aFoQ1M8k>2urxU$_z-@9;W z``rIyD!?T%>qa7d?W6oZ^Epj+|Ajg^To)Gqe@gZL13ztfY%fGvCDPqE-Cl-tAJW50 zk4s1We>d^AH~)_C%}6tmPDGlBbSl#R|HE`C>?>;OtLo<kW%c#dRdw}2MRmnYsDhf> z`m*|}+M1wlUR`~~%plV+t-7i_sF<0dam~CSQ$D?{zAWBt;tWrec_PRYK%U<5)RQNv zJXzwYP}R&#bydamAX_o3p(=~ajH<c#zs7j0swuB-m|hW7Ro2vID}w2@<@NJ26@hK4 zYI;yLJzFuu{$FP!ud1jEYG&5go>EccSQns61bEf=^MasYWt2{(_&pu0w)ltho1kp3 z=#l}`2M=_5)*0dS6^VW-bi8yj_R|vm66kRK^#%Pp=zRMU$oy?V`aY8LQ+3h68LLw> zF2yQ|W8;+L`#l>MTPfCIOF#N`(AV~(=Q<zPkDil|eLuJ$Fu!%sKkL~es_NCLiw2h1 zVl(~rC9k}{*!g_9zc%?Wc!F2g`Q($^J+Qp-`oPM-D(SO6_`LN*udZ7kyg}ppbb3C? z>~EX!v15OJ_>6Fh=ikM~2YRn~`l?Gq#<m*6T)eILaIM<2aWU{oSbyt*kF8Gc$DYra zPUuI^2SWZbmcWKTKD}87#_O%0eq^4xcs6ltxGdo=>*_lFRnYrwIsKO1^d+dvAD<IE z4>~{n^#|VF_m|7{HQtK9+N(R`qSTDl=zp$F-aPLw7EWaH^(FAZA8$+lvsidD*{|!` z;+<cAeUuoFSijKM`hC+|$8I@zbM<=IyLC`=X~<p1d~=L$csq2eSN_e_;YEJ`;XTa$ zV&V-)KPDF|?+*57&s%xEz65RZ#~W|kKo?(s+lV*K#(6fbEpCiTPw$qQx2AsR>9I#t zUm9LC(3SI+(j)zpJHNacG{P%)dfxh>4;L%PV*dQ`y96@szvdlB>0=5~zVYmIl=E`} zUpAhVpnMflzVV4Rw<6^mCus9DQoj9_Ht!+j+n=~he0uw3`we}RqCDSzKpVcmp08ii zW;tx~^&7@=6KwMJ1HRPvW&Hrvc~2l15OkX_N8k{^d_-a>M!pB5s{OGKU>7mABp%Ed zTXMX~_qAm|E(kLC-~6WH|1u;tMV8xqM7EoJQhh4q8l&qqoQ*tO5loDVY_n=2kB1aJ zSr1vyLz?+BjfX5D4;UovZwasziSd$MHXo5ZZSYqOZU4pSdJR`2k9Y|tnv!d*n)r^? z<c(HM<Z+y01J-fYbDU<L)e3?v{x`pM`2S`khEA@x`H1|b$tSCN9pt-=uGjDZ<Pkc- z#L!6&=ui`RJf!H!ddPYn(#*4(7vmO)FCZ~Sa;wcpBwsuAS1)ZpGv&R8gHT=&%pvwQ z*$lzNT4b3~&mk(LCg~Uz;mZ6xzbX2UOmQ7y{boJCY33(e3qpR=iQhW8H6!8<2m^xN zh}811mzW>h{R9c+X;S6v$L8n7Rm8XoOslgA27!evCQq_zLctU#!LWCmA5USIBAI>+ zcG-MH@{L=6Mbq{|Q{HR12Kj<u7QsYQlGUL0TTrbOX=`P@T50BQK|%*0cu5auY0`X3 zGsqIWqNket4<uL<ytt>De9Eec?NXEPST(^*ds>sbteV)<E^3-AHt}Z(t$}#2=ZXDT zB(5!Tyv;`>UmAwzctE5rFYd7!4J(nyK0+|jl$>YP1aCD^O*UCI!8-#~lZ&mI;Ee~W z$>ml}@SX$J<Rw;3Tq-qrwN(>&f=)4bMu_!HFu`$}WHoPZT?g@IQ;ZP>TyOIcxzps6 z)k0e{M+&Qjd;$rpg<xXn<V#jf{7!0ehgB1K9H$b;S<i8rc~<j6=cU&NNZg|2hc+LP zd|{gLxSmW~zRS)nO74qtgibKglsv?$i98-siHEG`A<aCic`@=ba4eGPb>MiL$6Z)# z36oD^r0q#Y*K2q>@`#Z*)2MqQ@*Jxsm>4>_(y9qQc%hoS+Ny~>?WNeRb)5Aar<rFp zZ;5!qcQX=~h~$k2<Rg+Vbo*<aw!DGGwN7qDDhTR`mrXW9FtHZ-u~F9%yrV`nNyn(@ zwx;JdMZa5+F!~eLZ`SjhX8v#1f{@>I;x|5Qczz@LWlao+1QVhuB9AuF%;GIQ8(2JG zdJfWb@C;HxFq@ErA>^l4O(>cnNi^~J?l~)R(IA9kdib;PkR{}yn6!~)2}VcjB+B?K zg6HH*O)*Y@z%HAQNWLY{weD6mZLc@wy@vk_d8}&UVUx`eOsqwIX4G?tT~d>D>>Z&! zzbX3vDH66YK_}>N1QYzG$q$XXj@TtNY5m4sgMK;B09`I3wLI|=n&oDeC63Uf%Ht!n z7grJE`Uw)YAfaH2$-h`Np<s%WVB#&v8#S}c3hhpjbv7T7oFL$@Xxefj8ut~l3kiEa z!9-K?LaQe7ct|B4vYv-D^Q`9W&sRb0MdJQUUSsnS$(aRyjI{lM(e)Z~${AuLm}pAg zXVt|0Qj?EcHIc`0iVaxDS<kVV-o|QP=vyGZfW*+rtu`N#oT=c4PTL)(yw_0Walc^s zXSO^=?u+`^?!+*Y%@R!TnkHu(^=#q{sYyCUMYsRZ?<dx8M5^7mzj^JZ+3x<P`W!-y z4I$@QHKE3aB#p)6m*=dA&NyoxI~5^k#bljT6LMCZIE(ir-Vxl6#I;Lu{t*Xyk~1^> zwM*L_rW|V*{09;`2EjyAGL33b6NBY}JjkkvJdRU|<E-a6%{;4l9is%|AxI3J9AWbj z$(bI0=(HVebiIa?kw=UK6HUn(R!vk&O=hi{$m2N02CU<(=Qzzgt9hZ%huDO~(8*?- zk4VlO@k6I=yV3O;u0S546HGKEFSlwUkB1aJSr1vyLz;P3^J3&ZUe4ZSjN~;oACb?S zd~*Dt?GKC&Lk4&k5@IBn7$f<RRTB?OO+IVYL>|Yf#BtVhoMxWYywG_Y`UND0PHwgN zh~yL&fA!M#6;s}8xC42FPP}i_JrT(-8bD1j(E~XM-k>J(I8Lzv>mloTNHfoBUg*37 zwl@+(C-=4ah~$(QKXlrTGP+(vmB*tU%ct1#6nO>`4$ef*WU~Ylyr#)#jCv07ywoHe zdq;KponVT4BU0_gqaDkSx8-S4<%`^C>BUvVxaJ^X03#GkG5Lg56AGp{2__!EYEgWu zv7EgSc*<tC0XFJ*jD8=g50JQK$q#KlA~~tYU$eCRhbhN}1h^l{v6%_JeN0pGP^%`G zs3uRaY9f#06dhX+S<ge7`J;@7EFll^6)qo#lp%33NKVT~J|a0`$X^WF))*b`!-366 zSPX)RrsPtqCh~YlB_6V#hcxr7=5=B|n&CVW#z<ad^AX9JMt+R6z0&A<4c8-&7zrkt zlAElW;Ku=|Ce7=YL59fVIK>96<E-a6&Aj<j06~_Jhj>+QgKj$#7lVAw<|C4`nEb_{ z?G96pV<Y$(5*CACqA6+KoC`9<9`ZmQhy-gQkK<J0IO{o1GtX+?7U09KLy#CcIl|^6 zlCz@x&}lo`=x}TVCnF&kf{CW&467#i=>@9EtW^_v9H$b;S<i8rc~<j6=l%UAB!*5l z+k8awIh-FlZP%FcUc(!a$3R7_H`xrq#9HKwMm>jkNotagy%Emyo1*{gkT60K)^FDH zn`ZtQYeC3wI`JD1R`mNXNW5+#wLI~N&GJiad74ytJhFOm6)~<}B%Fp43<3*TOuk^% zgn}tff{6!2v&?3N;^6@p+I&QEf|<XfX}g!v^%@?CJUcAFL{swXR!tlsH95|zi9C)| zY`{9sdXCe~vzpgOra~-3Vjm&PZ9XD7Va*SnwlzkFK@gmWgwP2lnv!Q(HL*}?@&c<S z@;FW<j<cTQH1i$CLza+-c!1$!;$9>!26>ImM<gf1`HMl@9~d1@vA{c!uowgrP09PL zn&6wrRFjWeHIc`0Dsi0k9H*IQHE#>>N%jj!44vF+^AX9(b$;lyeZ`dH6bpO@3852A zG$sFH)x;-K8^Rl`2LO2-rxM3m&vBZ0R`WvV!@<3g7&^JH%||3B>-nM6cCyj+8gjNh z#tGsKlg$uJtVQ-3^&H~6Qj>qQYV6YH=lM<1f7TS&5p;rR2`2bWlmBYeb%gw;6Tk5Q zL%*YuIKYs9H2I!*fMNMWTb?FW-qufCMU3kdBn&Wwf+;4iv}!`Z6eq#N0}S6-*p9>% zO}=LH5y^Rq{)(pU4pWZfC-@l>wmQK?Q}QdQ1~q}Ny%{xmpj8uj9H$b;S<i8rc~<lK z2p<j~g2d3t5jG!@ocHL5PTQ$Q*K0Trd8{*{$z(GG6Kj!|8})30e`$tl@-C|;^0bj+ zTeFR69bwzZdTpecUt=u@wUH*Tv1&qXVBzi0TaJir)Ed)S1RWyEBJy0TCgiw?q&M%O zlIJW<XERN4hLE!%iL;F7YzUoQXRQfE>E3KGkL~FYJ-jH1GV4WIoH)*Uj*F8h<9no! z!qH>KS$B$j!sa8A6HfijOxs@?U9aKqkVjV}m}pAAY1PDAQj>qSY9f#06dSOPv!3HL z^Q`9eP`<uXfW#h3hBhCOoWSabPTReV4o7eBKqQ1tFwvC!x>XZLNKKBjY9f#0RN^@6 zIZiXrYF_Akv!V=%p_An{ACa68>xWL;R#V<<cnR_tfQc(iHbXG67WtS_&mlHTP13P< zhUfWB(f_xRaE3=%zgf?3n)wH<1tGub#BV$R)9;x`9DqqJPdos#e4#B*lPYg>JE0d> z5##z65(X23L0}<^$w#c3P%y<wF!2D)*R=LFD-=gMa9^8`NX`ZJS2S&h8C|a-zlnlA zLNL*kJkF|#iBgl(teVK<IK>96<E-a6%{;4leS~k4%|c=yA?s{DB703fx%))hGmQ>6 z)xj<#gibIqbn-&0CisCDs>!RYn#kigl{n6Nj?>Junio1>3c4AIp_A)vJ|a0+*<b6l zeZ-Xa8mc_*E-Zi2mZwOS$K8eHe4(4&jeHpiy_|T>sC$aY&#ao@tKf*Bh@>}fpYWWe z>FgyW^gTk(hLC@;YC_J2B+lZ#=Q%5)vtOH9b%dN1lOI|&A!o&jvv{xKyMZ5=Rfl^w z;D<IJk!$wuyGm)xch<2=439z{dp2>rOvyP`P4F#uZWOY|stLYmj&4LS(Sl@q@aJ|| zuelVPrEhcwLd~T~>n!UzODE3a<B{hqqO)<v*&IU7ipVCbCKP)Sxx%Um`sP+n+K3+? zcx|NF#%NP(Hla3#kbGSq8=p`cL&!x|O{k3_NgMIT_u42*R>~~;RU5@5YvP=Nkh9{% z*(|q)`Qm3U689(a8k>(uzVyir<J;b4ba;6Iyax#zi+I?m@$?dW!m5cp9#Zr`b8JsS z9?~SMdHX!Y7myeuxz*+)k`wFw7-{>8DaYjy_zn{K8NozT@-J3Rd?K|Wyuo?^kjHT< zah&xWr<rFpFLb^iyEhU;C-=4ah~z|lKXlsigG=1E$ni)BhG3#8S!UJ5G^xpqRTFs} zrxM3m&vBZ0R`WvVE4)oe44rJY`H1Aie?N5Ewi_KDqkt=r5IVs`Q*yOc6PHR&UTxJx z9>=M~an^I3W}el&(APn{8Hu5j>uo+F`5^&6blTo!bm-LJ14sy+V4^9>&*nf){9J1C zS5{5rahysVXFbPh=2^`PeH+B>NDQ5P&E_MLFF^aD({`}Y^%@?7JdQX7KfOa!vfQeP zQ%p8PFwugfWA9Mq`AyOP5vI6~kl!>p)v5{WH|zOLCw}YP_(8w_Fw4^$ky@T5e)%5o zh8-YHsysd(dvO&puA`7JiV}*en4E0Y1cSgr7AL{PqbQv}W{Poj0zP5$5y?+8_$!*W zzce~roq(?)p)(LnG$lW<Y9fz^RN^7)c}O$QYF=mHo9zWi><naR^AX7}JNPlub}ysD zWe9jU5@IBdFzTL&9B0)86Frc}S~YQ;)Z`SaCQg)^oMF{Oo-k4j!?u_8+DkLfYTknK z742C_Tu`#k<|C3{m+%*qww!*(VUoNE2}dE~UrjbcFtHZ-BcrY(IIoRrl8(J|4bN|i zepi{|*@X3*_57xpzuj68@|#Zl#vRS`8`19yQ)>=ECy1tq{E1Z)a#oZ$i_b4SXK6Z< zhau!G#=|T^9)^&wST(T|3GLy3`}4dNdESZ>Z&}Y<apEoOdE+z(^LrnDKQJxeJQDoS z<|C4y?%;a&Z8`ss8<8A=gl$2LGT98l#9CyzQP&ZiNJuqF$KFO{4Dy>IOHA=>!urj6 ze$&j)uoi^;rW3#MM)dqf^n0MGHHV-RL{mgoSv4VNMTxU`BYMu#bS4i&$Zr@Avj}+@ zLN2pvg3}<;-Vo9*{j7f0YLVx-IB}fy92X~!v!3JP#BtU+=2Vz_OuOAF@@F<5k^Ei? zw}!Lj^qB3oJVm}{^AX7}rueqsL?ygRir;DYXam3NGIw!X27fKNV_{u)Q+KYay|vqX zh~<mw3Vo!ZqP@Gddxi1A2_M!Q-YL_MExI2cVPB2po?knCt}VAX*WP_>fdAlYtT;{_ zFHR7h-Eop926JatH)d<AD;g`Z+1jkslRdSWwc0qlth%8h(P|QFV@+*MMbNXP1<RZ1 z=xXh5?Pw2LyD~is+FF~dTKd>$tEM&7S2Wg?&Gh_~*Vfcy5^STJ3>!z2Da)44Y_wBm z8#xtqNoTGlcUEhAuEnmknx@6M#6RmzuPCn$+B>lB5yjXzHzBcdQ*CY7aa(GoycQE? zE9xtPwvP6NCFZ}L_O8~2XtIQVsiLX7yREgWd#uZhbD8ljGr?t!b(!N_W}?eXa+%3N zb4PniU9P#iG|r8UbK{bz5to@LoP@<_6j<}3rp|zWqPwxZqdga#GN(~9dfTyns&nlN zyBATZImBJfP3`Tu&aT9{+mPA-`8Q8vrn;fdw4tfRUF_&~eK969WY#683fulz8nm`I zxAn9jlx4ZLU|CaJPcDP+#-mx=ANt#AY}HA9f>iI}B;}+HE-mLNo0v3jI^L>wJv7!; zl-CFNa>^L@EtKY<rK7of#gg2yNdubxtnTb@^q%gsCY5)zFUxht9iTK=;<|d=SlqL0 z6bQ?#CNqgTHi{Rz(JY3YV*SN_*4ov8M!n!FW|TEl*Ec5BciS23E9Ta#_j9Lc@913I z)Yf`lu7xqgv%ljo+`^Vu*VcKvqEp*x=v;y}v(4axv(UR1b#!)@^w}Xa_LK(7VDPb{ z(YS!UZ)Q_>^P*f=Syyvwt1FpcyFdm0R)B0V64^=<gDzC+yIWV))Kp{}zc3cWi_)jW zj4WN}v@WSj)?H<`wjtAKmeh9MxT;suzj<w@zW;)3MJ6e50~l9P>^t6>I6CIqn>$)s z+ZV=r$Gl)sQ+rEWt~03+cb{bC$Ijxiz9XlNzYcTzD{9KoiVi7tJqx;W7*YDlWBb|7 zb~^}}e%R81k=q+qH8S=M!R&QrY4iny42~bQm5p`yjzL8{?3N}=mvmgy@7+fP+)$0) zqCtCne|0Kq8fNP7v&0--$6=6Mych=>?Z>4qGuCCsxy*Q%>2nakMv2$1U5&MwiW)AF zThM^RYBqOPP0!*5*iJ3E=C<;-jxIC4y72LJla5YS!s3|^I&e(sJF@zNmi@8<%=MXv z=8m?W#qDaq?DAue3*z0&4C`@_E-b{S>fAl;9?5YRE24*I0rtp<A=hSRbF@tsb+^r+ zk+ThlR7H`gt*bI$q8QWD)j4KS$Ku?Wmd=hb({o+tbayNn)79MAmFrwKeoRwG8wS%c z=7Up-`?#<8tJm!w_G=bcdW|wkwb;UTrp7+I-R_0l^(t!`O3F(nj2<_7Y{|IN(ut)L z$4)LOIc-K~E;p@i`Wa@^VHMcVVA<UvX|1vX14>!7JF)1yOKA!E4B>XO#arSF>rltJ zv8BP{*7j*Dx^rEbTxU5C%3oH;w$fj5yqWFzZhJe9Hm28O7j|cAZlvxLsQaMD7p$sq zhLx?sGS@XstE=$Fv`iH~>``7jy{e`%@ol~l^5usbcQpBOi+JqobDpPfk>sgnPcxJ8 zudNkZu&J%iow1<r*iN)C*Im}#?d@n)H5hp?266z(ddsH~{^Z&!jE`SfEoRfhsdi`Y znBh8|&Y9}U%Xk#hW@xmhJakuwLu`QagR#fC69l?5Uss7++pWLEjlt4>jYS8)@wlx} zUVePZNc8R_^K|ZDbk~Z--AxO??oP`^F4viB8{Lg@KNyYE@upz(g03!Pa|?PFHa0C- z(3x8njHZdzw6>qs;maHbtlZgQt0%T+b@H^rRL(7Glw{qsbu{~4mh>#(kss|QwVOJd z+80t~YxI>6doY^AIYuvcN%P+!Ka+>ap8;O}H@~U)-@jbKqaO3aRat<SAmiVXYl2`Z zuCNY-hV^-|#jC%=C1Vnm`Aykh8NpqYje<=3e`Z$-8~S%Y`r`yy_jB24P`EtHUOB*C zPVR1Z5)}S&Y`iuIN^l#J%fWTvmV;NlzQ4&6G3Ueu@0Hac@B7<whg~lE<MKIw3slEm znxf4qc<ksF9%Us+{Bfea@9!n}D?woNhnEdwf9=To@xA^H+$zOX758(Yo(+ZX@6)@3 zU_RQVKfagZ;=2HO`g8H!T7jpNUIWhGw_xM@oBK07v4W2N@TffYw+4Byda$w*4-dvd zsh=ym4zkO$=ugY>E}?7)SGE>;zuiaCF4r&H#S@pf-8+$Yb&w5?SrG&!%;@LJZinpq zdm8@O*XeIxB)483MBddwHkb*2@y#x;>>1_RU-`?y?isup=YI6T^rGnWqc6c*Ax`kh zxJ+L62<l<?$A0YS(`_>rw|xh*D$oz`so&rXBrXS+i_7Z!JN+uGH&5X&BTVC;uTKRZ zd>$7d6ZTm%ls$*0-1Qn;D+~~r_Y31u$CXEX3)cKFZv)F!V74veA0e6Rek#&v$%le` z5YBJk(4Jk4&ql9Tc^S9_=@`kUfa{Q4{RZT>AldIq6a<aPbG|S8Rsr@n?mzsPE90Te z!Id8YxF2MD{x3xN`A~4$dyC3fgX<vIO8z&Hlc>i@X8-4eWoLgg<aLmrRr!xWenQo? ze=lUtt$a!44}<(@FxNEWdlDQ5nPVB{=fMnCyKC<^kgtL~0c8At0y!6>TJqcA7L@Zl zS1kVkGC#8G{QVX3e8_J741^s&%gX-6_V$Ln4aO%zW_|t{loAB*+8Y6RK4iB&j)r^{ zWM_XYWKI~u@M!Au+YOw}@`_~sxwxrluLLsN%R=UdWL^7bvK)e2-i44?K|Wpe`Jsnx zkWY~OEyyK>Nqm<;o)3AQ%Kr^=5&R=0)86%v`LS9juZPS|>y~c=Wb^K{>fZ;MFBZFU zexiYI>pGd=Y2YiP+)i9yzl7|*Lq(Z?$F5{BZdt1Q70CS5uiGAPLFRjN&fiYR9EhF# z31q(U<ox3UbLLOeyYfBI7x{Kinf!khGW(}nz5|ix<8)_#C}e(q+HL=1kmtvtojeKo zt6)D>{!WI>r&5)YGm!a=+qK7!KFo*g{PPPB>pYo%mXweDwyAzMWIl--C;5EH8TkL9 zWPa#@pR{)ITm_l8+8<H*b&xp|->pA>tAXGC!#}fqZ-dP50J`#xkU1sat&jhJ%x?p_ z{`M5)pFwu*y#V<^uN-dUUucfFv4}RYVZ2{xM(RWnn$gdfd1Oj{Vc^}@hB`D~9P-N# z2>yt8+&8TD!4h)Y^5#5mlT-FSgKV$E-7SImN`1F0z}@eMxO=a>nPBh2Cih-Tc~$SO zr<k?hNR01O?SAJ9H`VPeEZk+c8QgYvcfwF#7ZOs9HTMi~y9g!ribe&c$(`ZdZ#7S% zvAtkmJi7aeth*j_RpZ;t@r~#BR&;!GI=)>!E-<$&MvogmX(AhN*PqT=X?$a5LYx~P z=aSntW{GrL18#I9*4@;>y(s%=!eu5)F-e>#x@Qu{npn(rl&$F=Ubu%D?%{@e*kQJp zE~|A<$oRm;m$@;6nB4P)zTLoGTgUf{Cb;`W@r|RnD89MmDw(Brw=>+eI+}`a^!WFH zp-=8qn^1X=99nlbDaqnW^o!4tzNp&m_8s<%uOk&;KRH!w7Oxhc5)Z)cQ^2u^gngA{ z9&;#PBbmnx%J+!B62A!@>vK$Gd5gGGTqAB4UlsSm_(J<?u~YoE_!<en??@hulLOix zKtexJ@+sn6F(*Do!tPI!_rUo8>lc&IpCGwMd_X)DgC@&okg(5*-O_(o@~x7ekvsr{ zEA96YtHf`MKNTMr-w@Bnpv(67_lU{+N%;A-_=cFqU`;*$`Z762%!xk|pA?@L_r!Ss z?W@GwNVM~~<UdH}-+!jvkvOiC=ZM|n1L9|56OQ-va{&qao5Xvi|E=Ubaa?D4j)eXB zlGlpg7vB+&#NmYYy(H}Kmi(Ofy7YVCcu%{@Vvl&S_$G<^`{O*CoJhjHQk*UQxsumN z{;}kTB=gT9vL63-A^luLLcU%6Ogt9Hcj~8$Ys6>7gHV^{^(0cac(wGmiT8_dh(mGQ zXT57k=&qOil;n3LkH_(l<&#OaBl2(PQGcQ2E5#ed+r>@d+akJkP=I{`n=vRj&0e39 zC^j;$G1<<+;vppZ^hlMD5swpjZp`|ph*@!-IA2^Swu?RD`Ql~bTJaX~9`Q->SK>Bt zhiJb3hB)|XHO4bcJW8A-&Jg+iM%pb9dEG?$U&PDB8^qg1o-@<#Nzsg#khe+RA^u$) zgmp>#jU4a5`^1OD$Hk|`Uy3h^zZbWOZ;J1U<|9GyYd$vw{zLi{$4AJ8Vv)GNI8;1T z94U?#Cy2+3Q^gr#wU`ynIF0uBjdQl!BAzYsx{&&1qWN38kiRYYGSU3~VCdIMzCm0k z{=0amXuc@~`%RJ`5uX%)A#M?WBmO~rReW3AA$}zORSb9>K|5a&)8am&IsTx0nB>F7 zvEnzxnc`_;t9Y)+59+X;pNss?4fn_2iZ7FM@E3YjUdrPX?5F5>HC3EW!fvL@=Spsq zyqtvJmEtOuuTlA0$>w+nKjxD+Xop{hVZFD+cV+hxiSo}Sf0f5U)SE^^Uqhmv`Irhg zTjh-^KU=c-Q}w8~LHY+s*z-#v<YTh?h01>|*&KIK?_<dWd3=SupLh_7IF2CUhhNSh z$EbXg%F89!iL0gOYdN$x$8+!om9JO%U6LOW`Hcy-w~K^*fsWe)NyN1miSh#_A1R(L z{UQ?e+QcO)U!n4gC9f5KF8x*#^?oawPb8qd*Hylgg#5WUj^_u6<0PFYOcTv~f7sQk z{8SS1+2VQPcf=dSbtL@VNg|Go;=L+=SmjSk=FD{ZeOvrgjCei*J!gf}-`8}0GE6*F z<)c)7oa7ne3hDXxxf#bA(fnB=`2C*BZzdt%Bfc*E`y}dpBz~&$0-paMo-~PiL&c-T zDPpx~ruM@AOv>=LKs-z39VE)nll&d=Vd<YCQSW*21(p9^<!?y-SRBdoE%=+D^R7wa z6cX`Ps5~QizG!BKqTUZFqrLUwZ7SbLqWnS0&x-$$zEJ0JoCnDI`;chwAQJV=>_W)L zNzd7B)c26EUm>2a^3^Ig=ZmO!v-J0foZv_QFNnV(aZ&WP<Q*jZ|Bd817tb3Zn~8vE zZ*QGX?nlDUFqND6X^_qNC)g(aa@nsGSCJ@Rqw=+qZxw$lJ!d&_`Q8%WRryCM|6KA{ zc|Hn%{QDb>vqtBqS<#%=qP$V%XOoc66E{fz0EzY<79UgjFI4_($#009pTqVJ)A{a5 z@n{nMk5&0p$r*9JxI|nft|sB{Y7%jLPrO0p>s8LlHT3_8_<{7hNYpFP`Sm~&c6*WV zd!Xba#nYu<M511sxJ2bERDQ8!GZ6#+I5&d+wvwp#Tk&Pty{__|l0O&6u`i+CNhIn` z6K9a{TdVR@C7&&xCw@n~L0m_|-<>4<Z4~cS`NJxITJlTcAYLD!-T}H!I7sAQ2WK23 zRX$#FxmYJQi(R65=^Oqop^P}zh*zlmdnC$lmVA%+y7at{$$B4&pQ^lo*Bz*rCK1<A zu~z!iNYrZ-n^oSX@^dBgonO|!R=iETUwoKEJI|2t_q_Om%73r&Hza>7j>I!t)|)`0 z-XxLFa@ijLSUAfwlIM%pNdH3;_125GseGf#AC&y8__Fw}_&2fO0Nc)B68`oU_ao<E zd?FFYk&-8iRpLCcRqP;P|1A>!E)XwL`Q<9VR`PA)@1=i}M7{qKcc}aml@GwfF2=Qw zSV5w_StRN;i1SpwK;?@ipD%8d{vi_e9u=Qd`SU7&N%Gs`LAX$5dq<F{H%c5sBCbg) zFPB^=u9m)+M7{5d*Q@*%mES4(LGc&j@5Hyo9VFuTjD){kVgVj<GLAwL<wGQo5bLBr zlSI7*;#n&1Q27eUmx-ICe}Y84pNr3`{6&?&BKiM_e-{TGWaIjpSVAJcQ6&705yz8= ze+qdT?wd(&5L?79@!R4W@-*D%A>r@4;`Jo_-9ny*=Mv(BB<%iEe1e4Cb1E;u!vNY3 zCNcIMA$h#ynUd#8?vi|g<m)B>Nb-M5epd1ul0T3<2sb|1-T@@q8!P!l$#Wz(OFm!n z8p-P=-!1tW$-kDoQ}W*=?>Ef0cL<60PLNzFxk>V3$(KsLM)C&94@llB`A?ERlRR*^ z^*@}%@{N*QA$gW$6q)S-7~=BR5SKBAIL$P~>4PDLc|+`$hFFb;CE{V?NbzW~RGc7A z5~qk$#p&Y7VzrnN>&3a^>Ee8`MO-AdiA%(8ak;osTqRyCUM5~HUL~#-uM=+)*NL}^ zw~Kd*8^wFYP2xl1qvDg|)8cdD7V$;#CGij9Ht}`wZSg(veeomlQ}OR2AHQ+G<R2Cx z&HXhnExAY>A{L87#S-x_aiqv+>hxDCP7uxgIq0WIo+?fkPZq1ijA-uTq264{r;GE& z7IBf-CYt+wsMjrdxwukXC0;CECSERHC9V~(6K@jNiMNWki+73}#e2m~;zQ!2;*;Xj z;&b8_@kQ|^@ekrQ@pbWS@jdZ<@gwn5@$VuY_}lF-Mq*kl5{HPz;!v?fG=FXv`H_;3 z7E8qmBA?B(UrZ6Fiql0tt7mz&=$=c}OP(v9F3uO-bE`#?+r%XzpV`yza?w5CS|#~n z@iOsp@hWkxc%68YxK6xPyj{Fg+$i2FZW1379~GYzpBA4Jw}>x_FNuE;w~4QdZ;S7V zQ+b~l$D8Tm$)b5~2Yp6zy*O9oUn*d|VvZ9H_F28zpCwPw_;Ir2YRU5@w@6+td8K4C zp2FW+$@i*!lVmgQq1=soW?X~p#x*l;K@QY^hmeqqB_A!hRC2ZCjN~PfyCs|b9rZ7l zZ1!i!ZhtoWC1kf>n*9#4+waVN1=;OaX|8w3MOy!dNggSAisY%1=SyypZ2Bkauas>1 zA7t16O#g!H`j_cHkX`>V{R6V=AAgsByqID7{}2-8#gdPf%=f>zeN8_>x#=g6O+SD< zU*)T0f3f82B;O=?lVtPU1NFB^HqSXAzb)B3*MOW(X?>B950h-3Q$U^~**uqkJYTYT z?f`j}<cmqj>m=VQ**q^m{0~Vs&j%pCDA_y@fc&0hbN?T5O84OpBO#BJJVo+U$@P-w zO751tT=H7U*Gaxp@<z!+)$gZ@^TmtB+eLRi;Ev~}-(z_vsNc>NSNi=J<&R3n?fReq K|2Y=P@Bal;8knB| diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Darwin/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Darwin/libexpat.a deleted file mode 100644 index 5b0037760bdee327f45bc5ff65d760cacae89cfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513008 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: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 XP!w;3tw=3(F<eWNvb7F}&iMQPg<CJN diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Linux_i686/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Linux_i686/libexpat.a deleted file mode 100644 index 58672792f27777c43744eb852d1afea88641975c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512592 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ⅅz(wpfJQVa`Pu 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Ν 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%0D(5NC;V#ra~DxL8~wE)|!HE5w!J zDsi>=lvpjU5!Z_A#SP*{ag+FtxLMpPZWnimJH<WXUU8qeUpy!}{j~nYh!_=PVw#vP zW{3$fQ|v5ei#cMh*hkD0^Th&jkXR@diN#`xI7TcL$B7fgN#bO&Oe`0ti8I7m;#_gQ zSS2nNmxxQn<>Cr)rMOC5Ej}eyi)+NS;(Bp|xKZ3Bz9ViHw~E`v9pX-LkGNOdC+-&y zicWv6e=#CP#h92Tri&S3Ld+C9i`in1m@D=X^Td3yKpZ3%ibZ0vSR#%QOT}^GL~)Wh zSu7LF#cARUah5n&oG(_1i^V14QgOMsLR=}X5?6~)iPhp7ajm#s+#qfgH;M0vo5ii- zc5#QeQ`{r&759nz#e<?#p!F|C#Hbh()5LT!LrjR7VrMa1%n@_NK4PAjFBXV{#6q!1 zEEY?|F=DAWPMj!C5+{pgV!1d?oFUE<=Zf>iDsi#6L|iH^7gvZY#Z}^J@hP!dTqCX( z*NYp(jp8Qp9dWa`RopJ_5O<1u#J%D^ald#_bOvbsixDv@#>6x+UCa;@Vy4(x%ocOR zT(OUsC+3R<;vlh5EE0>w5^;=JDvlE;ij&02VwqSjP7`N{v&6aLe6dPgEG`k3ip#|n z;!1IqxLSNltQOaZYsK~A263afNqk4#EN&IIi#x=f;vR9YxKG?K9u%E{TK{51jEXTa zO-vUv#DthBb{4b695GkyBj$<uVu3hFEEJ2xVzERVBbJKe#EIf0ak5w@mW$KG8R9H) zt~g(;5*Le0#HHeLafP^2TqUj+pAxIZHR4)vy|_W#C~gwp5jTrl#qHt_ai_RP+$-)A z_lpNb=TxnKF(O9An3yJ}iy2}<%oIC|*<y~EEA|od#C)+p93&QsMPjj7B90MD#c|?9 zagsP$EECJcY2plVmN-|OFII_*#U<iWak;ocTq&*+SBp=H)#4g)t+-y?AZ`>liSLM; z#jWCYafi55+#~K4_lf((gQ7D?>tBqBQ86Z_iRog7m=H6?&SJKhBj$>I#5^%yED#5Y zg<_FdES894#8PpbI8mG=P8Q3=a&ekCL!2ef73Ygp;$m@$xKvy&t`Jv>tHjmfQ)0Ea zMqDed7dMC-#ZBTn;%0HHxLw>K?iBZkd&Pa?e(|8_4A%M=BVtsHiD_cGm?0*_OtG_= zE#`>1VjnS2%ohv9L1Lj;Bo>P$;ux`194Af`CyA5AGO=8oCe9FNiF3vIVwJd9Tp}(N zmy0XJmEtOKwfK}+Ev^yQitEJ<;zn_k_>Q<)+$wGtcZfU1J>p(*pSWK<C_1NU{fiMX zD#pY#F<s0M6Jn;=S<Du5#9XnDm?!3o1>zvFP%ILQ#S(FhSSpSaCyJBA$zqvUE>06? zh_l4G;(W16Tr4gTmx{~972-;9mAG1bN~{*wh-=05;s$Y}xJi6R+$?Stw~IT(o#GyG zueeX#FCG+~AzJ@pM2w0tF-=StGsJ|LDRvgK#T+qL>?7uh`C@@MNGueK#A2~T93z&B z<HU*LByqA>CYFoS#2Ml&ajrODtP&TCOT?w(a&d*YQd}jj7M~KU#WmtualN=f+$e4m z-w`*9TgC0-4soZrN8Bs!6ZeY;MW;~fUyO)RF(#&o>0*YM5c9<XagbOj7Kz1Ti8w|q z6~~Da#Yy61u}mx%r-?Jf?Zvh~JH(yh9&xX@Puwpa6rB+o4>2M}#h92Tri&S3Ld+g% z<K&3BVjnS2%ohv9L1Lj;DvlE;ij&02VwqSjP7`N{v&6aLe6dPgEG`k3ip$0AqcpDK zPH~U8SKKG=7Y~X~iN;loh*2>nritldhL{ku&(gSxxndtNPs|q!#6e=ASVT6$_X>z5 z;ux`194Af`%fxbVnm9w8CC(Msl0nB=FK!SwikrlD#LePXal5!f+$ru6_lo<({o+B< zIoq}$9c>vC)5LT!LrjR7VrMa1%ohv9L1Lj;Bo>P$;ux`194Af`CyA5AGO=8oCe9F7 zkFo3TDY05yBd!(KiyOr4B-Y0cai_RP+$-)A_lpNb=Nwx<EJnnr7!%XPbTLCrh^6P+ zIOD{L;v{jhSSFT>)5IC#EOD+lU#t=ri%Z0%;&O5Oc^VIKr?^MlEAA8biw8xgRO2B= z#Hbh()5LT!LrjP>&bM)9iF3vIVwJd9Tp}(Nmy0XJmEtOKwfK}+Ev^yQiq2T|M~sM3 zF(#&o>0*YM5HrQjVz!tg=8Ap9JTYIKF;3$l&K2j2RpMfCiMUi;F0K$)imSxc;!|R^ zxJFznZoJUuu}OSK+$?Stw~IT(o#GzR8Lx2_BVtsHiD_cGm?0*_OtG_=E#`>1VjnS2 z%ok@&(71|o#ra~DxL8~wE)|!HE5w!JDsi>=lvpjU5!Z^T4)UnPJbSXraT<%qh%HDQ zr&@_^$(tPqU)y5*PZ0Zx_&9I$Lq#0+O&PnX;U(fV;#~1A@nP{#;>+US#V^Gl#6ZBt zZ6vl5lj8B>sp1H6taycZgSbGvOMF=TllZduH}MnkIE)d;@9L1{?cxLC^J0y-SF9hl z{w>7LVsCMvI6@pJUM0>H7l}`bYsFW@jpEzlW^tRiL;O<QEB+`R6oV-?--y^yOcPs* z39+M?EgmcO5l<Ei#M8tgailm#yg-~NUM7}_*NQX58^!tJE#eY!rTCcmw75oGFTO2) zEPg8numhR>Mm$p-C7vUW6)zGm7pI8Vi8IBO;v1q<$F>s{PZkG@qs2wy-Qp(kXE7PE zae9jviDlvp@fq<i;%8#>y0(6MafDbZP7?1E9~0jayVbMxhlsxu7l?O?4~Wl;8^jO9 z@5E;HZM=5kF!2WQMsb07hj<@}efB}|&*Xf^c|-Os(tjj=Ec*{)5C=^9M@a1VO-aOS zF2>3Ej?-Pt6Z?_yA4<aiOmT$l7l~8FX(asTknpb*Z<hUjakcmi3ICT!_`fW^D*GPU z_e+0JbQ-{azT;$yeMrPPl|-C##H+-4;xh4RaRZ5Zzl!x6+Hzm<bn$EwanBVmAkqHS z;vDe~aVd$okCUkPB)QOW){&^UQG8e2CVoM}e>b_%aek8C!DlYkt1C7UTafVYE)Eb! zi&uzq#NU(1>p_(t5g#KFf1UU@@l$apiF!YgXs<!cvb}h`c!qePSWZ?s&McMZit|ad zcRN|-IQOdjNAV@`U9t+FJ4lSjchdhvG7nq;knP3ZB>elUe5yEvM0=Nu6(sy_5$_=p z=Sh`cRC%3PL!$m}@eqmn4VzfDBvHS$cq|G3-YTCVjw4ZTvdU#*ISK!z;%X9pFN%Ma z{!J3?d?x-wY}nNLw<MW|*p6f#;;G^&aSVxeCW+-F>Q57Akf^^xe3*oPwYW)qPuwbg zDt=9({`V^Xs&XjJ#%V~xo~CkwMEjZI5ZOy*pCtWcu}t=P;zAPn-Kp|DDnG39<0?N- zqMaATb+T`j{R@@%sQi=42UV_v3r^<UfJA#ONW^O;ww1k?I8Yoy!vAb>Jc)W2i<gmz zTOr;m-btd~y(Ih}5FeKP1@R4WoA|Z3k3{{0B<efOEW;$)YemAIE%ugvh|1$szDVUV zm9JHKCW*K=iZ{u=Ok6=C{*&Sh(!Z_pM=F1#@&T0(shrx}#;-3n5?hhTKa*ts(&vb| zvJaKLMCEf-o~UxUc)j#<RbD{ixO11v_sRYUiT*w&J|X*SvcISDhbn)r@{i&_q)$z^ z`A13QpGG2Xx|kvRakA&DJV50ll}p77rJt<wRF$Wbh&xlfQTAoBKPH;rPe&dfs{Fb9 zc9R$f^SkJ<|3mt8eBk2vcM`jiu=gU--U;H#vX7E|ym*E5vsJ!LyqiS*d&LJxwDW@O zuZz3I17b=`>sOCNzKuxa(^C50;y`hz>?26Dcb0gL>{Df*Et=o8MjqyOs}a}yJ~epM z-=l`#M~d^6_=^~f+q@c+X!jVg6N!2~R6dSGKL$u&EPaXe<D|b-EF+Q6BjTULufzjl zYKCpMp4gB?yY0oEVt;WEiMXRl<a-{8ye^l$T%0NUjk4b^{W9@k*&mhtS?T{Gz9yRA z?dABfjP^bj&F}9*pMnqg%(nrFyjqa(YbCaoy_Yyp94U?_QSUMm^{yn*pP8~(inqyr zr|b_%|CsnRi8wEji1V`es_cK0eVfW(i@%BuTcaNO(Ue4-b|mu1k^XoRaZi$du=FEI z_+KFVc=2M{7mD|h@cX0q63INpcS*FrO>}<`^=Fn*FQtw3uPZhn;on0XK*FzB97iJl zM6sNN|L?>((pQShq<4P@)ct+Wx2Q+lkL35U_?i3<i1iXSeoL_piF)0{<E1~DL|*;G zV(HIS`2rH-ewp-Fi_=NOyNN{oh2kx;KP3K1tPwYosJB(zNuvH9aW9E+No#A_f`or( zF<%@g7K+2gb4k=6tMX+kU#0SNmFJLXw~|Ev?vnly=^vB+IqA*sC?by|e>d@v>}l<6 zo(U3hGsVs%@;OQDM<UKpm4~T(j>_Z7Ag+5z<aMp|72*Oi=s1f=*zcD9LGe)%@t-Aw zj`L^nB@%gjK*Ii+%3rGdgUSa~PHAub>yz+rP6iz(F1C?9S1b?*lkgu+!v8!Hd0ry> z)v{N}K1ZyS{R!Ehll}$qFS5Tcej)xO*2zRW=wFOPyJ=#k^j*c?(w`_6N<W-L-sed_ zR-7RFG;zMTRJ@l&z11YzeM)>q_Dw3kLt-4v@2Vls@1_4q`cMbhp^u79NyHs2juhvM zcZv^?X!l|9Q4(?fBEBttB7Q+4?g0|@ekGAt!;ZFIbFnQ6dj}Hs<D@@X93*?8>?P8l zFJ3HOB~Bv|Z-#i6^yYW2kgxfDE97<5-?M`KUHN||{vaM8QLjNK8^1A$eA|+!*G0^g zy^rh#(hn7jNyI57k>@yZqU=}7e!a>I#Jj~u#V1I_d5J_GZ%TjI?<_%Yepd<k{UHB9 zXWMRySeJyotJs%B+#<1*WS(Lf3IFTG3hB-73!&Z$l@I$pA^4l$0|L$O{lM>g`hlS= z8^4a&oP=LO>?nN~@nq@yt2|nqOd{Sim1l_N_i+&KPL{!k#b?DANYr~>G`~{=zmHf( zzdshgC!zmE<v<sdF}@8*=$nbHNW{w`QNOF$L-v8<NO8P)35j~wiE~KQuM}@4(aw{i z`8^i+*RTx!UHnYkEq*8dLZW^!Y5g0JC^u2LmC7ASwA+P5|4xv8u=GQvKTG-vB-+19 z_N&EvWPeij7o}e(*2r#t4+MF9EI;%6A1HsTviZFalvA>8UUf<2)q;e+otRA`?;H~L zJn09Bg(UJUA>lVhES3El*=MOdPvylb->LEnl^;?084~fH6JL=1Z{nw-`F#tte?We} zlE|}OS8zVI9}@O<B;s`xyU2c~>}N@Tj(EQ8Q^gy_+r<aP$4SI}Qd}p!`Mn0T|DN<8 zh`VL~jznI+N+0ZI<D`<P*HX+9yO9fV9inofIGjYB(IoOXPjr8G;7=^$-sXGq`$YE7 z#qXv6l|;MY?lxYGM7%UHorJxsc#_zUMEgTk9!4&7obh70^wUYin@7U`HkI!b?<Nud z3Gpvt4GI6ZReqmD{N3U&(uZ=ONBo8){9CHrT5Lxm{;6b@;|wPeXM%XG^f!`-bCbA` zM7{gPKZ?(gRX9(m{HExBFZ<WBA0QF$S25Vb#%nHi5WA37I8UqGUmQfD{wUeUsysow zghYPkd&|LvD&I;X-aRUt?;nT#k1QkJI`MV+y{qyT@goxcKgynRtc}-RJXSo3gkL`r z<5{HgDA~u7Xm5geiR@EkH{Z97`m<HOg>2+F=6kfEe}HAwH{Xv9{Ri^<O!{5oS0wxg z^|by|#RVkl-Kw(r-eru-iz=@ZYe>{@muu@6i4#cFzf|R!;*H`RB<h*({RJPE{!tR+ zVZPrN`j_N)<oEb~Ed7___ayrJ6N&o4<81uqB=m8yjr3i`Ug9ZYAqoEr#B%Xw@mBE; z68SwKJ|`aaduHMHx$NJF=KEuzuiMME*MLOc=_K@R#cbJg#9Zn7iKE0zWxqn4B7KE8 zU%X9xkVHQpA<^#B(!U_SD*Nl=ThjksG~a`YJnQwgaT<zENazz{mUygqA&GV`60ebd zrdTN+`F)`eO8*BE^*<1|k;wmR*$?|(PUzeAvH2uPlyg-+NgPNb-f805(vKA<iC4%z zMVur3e3hRUUliYzeT&K;iC;<oqj*RRA8+%Bh%HHsV;hxE7l(-#$UaHs$>I#@=ZUw7 zcgTL1_^9+xsQj_`8HsWFLH0w^hfc8irX=#p5IcxnWY1H%FNtxzOuSpXmqh$Ol8E!1 zxK1?R+XwpxDt|^I&Mp%ApQR6-X!UhS=$n$vOY9(akv&i4z9iyZPU3iWoys?e6(r&; zkllPw9m;pBY`&KcW%K=Wp!uFT(0q>^;_a5-0kLkLZ6{sqBn}XZNYo#p@;DOxnJWDa zB=W5gZ<T(j_<;C`?2m~rO7DIjn*04_sVCWZCyV{WVI=YxEshf}lKoO~y7Uz)KP^5h zzAF2hDyN=o+l!MpAGB4um&$o6UnS0!exb_utNgIa&#C;G%Dcp`NaTM&Jn<A;&L=T` z1>#WYi%G1n^Q0du{$6_b`-h%k8F~LGeIVb)OA+%(#5qmn5)%GPq`zPKhs15t?@{>x z3I7xN+BgG9<U3fLA^k#?my+-|-&=xqzmR^n_zj712=%jUBDNJflBjpG%KcRys`5xO zi06^w<<ggnzY}ki{U-5N>F-hbKJgjpUlh&vav;CgWq(WjK=zMS{z+`m-{#X^JYGCQ zyimMOTqHguzABpUb3nga7uf!H5eJIX#ChV2;%nkhVw(ZBev%A2PIs{<iGGa|FCo$1 zblGQ;*spJq{Vs8Z_^9{<3BTu6UQeQ(*Twh54@mfZNuu5FMe{y7$|(b_z8;DC39*-0 zC|)3zi#Ln6l8ApliFm8Tr^Oe<btL>Ys{AgA_O^+i%5L7DMw}m14xVb`)*<0vUrd+2 zmC7fIL&VYIM6q0)E8a#TpZiF(w^I6Qaf7&7+$ruC>kYE`G$awHHHkQ##2oQ>u|J9Y zPbJ|$O8N`M%fzc>pQiF068rH&67}8pS>I6EeGm13%CW)LucMeJ4ihJe)5XQ&BjO99 z`~KsvDyN-h<8~4A#gXD9aWRSQ`4#bPF*3yJj}hCF=uZbRi^TX170)LT=Q@>Vk?@~O zV*Jc|Ver3K_D94gMfbh0H&{l!FGQ!%mRpG3#ew2!B;ub<&c|~S(YzOh@)VV)lZZQ0 zTp<1J;xcii_&5pwcg5XeV5rqM7u$-bilf8{;??2;@qY1Hag+Fk_^a6VbhLx<%qEdX zj+jf%$LBh6lsI0zghagxmFKE_i^_MAh_{Sf=s1r_|0nS!684wLg?K(B{YT;#B<#Dz zL()gifF5}@7MqdqYbmyuzMIO&k_)kaNna$MC7vt$1eLEO5pSyWv!!1sE|&cn@m&(* zP`}8sx!6;@NSrFJ605}>V)RT~Kb=JT8DfG&e+$H7@hq|m&qYb}?^@|+k*Ggc`X$mo zB>f+xe_s0a;v2HRE&C_Z?-uuozlgzMw%z(9@=GJpZY!~)*o8!XCy?;#FAkOcOxe$u z{$lYeahf=rMErRq;@v6zec~$FSIfRe`j^E`vcDty4(Y!Vf0F$lvezGO^Gy?5i5<lp z68Yqk$frR1Vd7}9RQ8KhE+ZQ`&J85$SIB;=>`TQ5Wq(BW=cHdJzApP)vVSc7m*V&0 zK`~Hl^Q=c=Jv1fJeumgq_HMHGmi|QPPnEt%93}lYl`ka`?+WREC;d%gmGpP3d>;w_ z2gN6)uU7d3aT|&8{ZjVt#b0F)j<EKIB>L4{Y)2w~N7;Kxe~LI*_Mx($CH)2B#j@Wb zt`R>avEO~I@^|8oB-*bx(z1ovS?o%p-T;+PQ@L2>b4cWSK8gOC_el}&8rdskpCkM2 z(k~Mqmi<xjCF%bv{!QF0`&RKY>G!I<k3{=*M}cU+i5M3XB<xu#=aR^~kMyTXUnGu{ zy<EJ5#5lYzZV`VFlO@*PN4!kDR(w!=L;Qe5``g4%NaUS*mSr<BPNLl|B=XObejthZ zr%8Xd^cP8gsr1)Nf1_9>`(oKwNdKt#jQFBx-aAFRudDnXiFW@k9`-&d{0_=5<!tz& zKaEKEHzi?jFMYOnoOrT$DhdA~B>YE9KTf<%_A6zdF8v(w7TIr?{Xyv;7oU~=&$7QR z{d?ly#hv1JB=Y%@L_VpbLG;VK{|dHJxg806QsrJGj+cE&)E^-G2-(jS4|{(V_04;# zh&x;Mn@QBam4y9%=~szQi!X@lNce43`CStAw~3$1zE}32rT<0xx?|vv_M3<;NW|-? za(5E(dP?74`a*G-^yjHOj)eb2af<ZUs=QQOPNJPvvOg`Zm3_VJo21_&?vUNQhl~2= zeOu%oI0p+@pG5nONZ8}jXNuXf7mL%y2T1I9?~9*`EzY(2j^eQ-;`b6yAkpr*;$`Ah zB;qYl`4$rOZWmWd|AflVkjVEH>E9H$$o`S+UrGO?=$vQchDp><Bau%lv7^{s>_Z}t zJQDte(vJ|&lYOjsx%A~?h4gbs)W1Xe<>Di<KPLMN($|Qa#4X|{B=Y%O{8st{VyF~$ z^d~AdC*dC_(SB0;T=4|i3&gSFOz|EP>t&O;Rcvy;)wdCoB--gN_9T(VC~<-~iA1~` zRjwpa?`H8{>Hnbe<0SHaQTh$y+p@nW`{&YsBmOM=FS0kdz~<9TY$J9SdyqjqFC@|4 z0O?N`OUNLe$BPrCze1cQ{R|TItE9hEykGW*WdD=&YsFW^x5W?1AkHJ=m(qVP9u!l? z!Vlwo*n87x-@G3UeOK9gl0iK07RQL!iFb+1#MLC~uT^=y_`dX8Nwo7RiS@Z#_HV@R zNz{*yv-Y@nyf{c4PQq^jiTo}RC(C}F?DNEhvfm<__pnj_0hM1Rk<Ys-ZxKJ2{#z3M zsTW$mCM4QzCMKlMRyjw^B~fpv>|?}B#0uFLiMNv&pA{-UOro7Xi@QnW`J>7Q#PE2l zZ$!essn|;TqrR7oyavi%EM81Pe>sUbbEUsk<vYZ?NccS<`$yt#@n^Bl1o$D}W5o7i z4-)ZD5pR?J$oIG(lm1!x{aLJ${%w`t6F(r4*IwCw71JhKeG3xpW|PRPx5_7qr;w;W zSoYtEH;Z?Re-NJ)Ys7a+#Q#)0{vzAX022Da;!qOpjF)|iI7_^jg#Sk>?;>&C^S#Q4 zRIYn5^c-Ij_BJYKtK3WF{wfbrd4$Smt2{yFNh)8X@^qCeRjyL`Zk6v-`Eiw>Qu!s7 zUs3sQDsNW#GnKzo`6rbRs$BOH+n<Ic`WII@N9B`L9;Na)m8Yv*sq$?q->32#m0wl) zZz^wB`Ae05QaLcmw%?G%_;yzLIF(OPxlrYiDvwq9dX?v?e5=aKR8Dme_a+>NNv!Wr z!~_^bIae$aQO)S*iYvs;VmM&!IpP>`srZf<Mr_6(BUX$1#c0UdOT=m7QgOYwPs|Nl z|H<M?al4qFqIe?TH)s2s#dHh=%k#x*afg^$$J$H9Dsj7*9kKRFBH!C)yuD&tU0co* z`Cc~dOT}0{*~N+CN^ysnR^R%K6IY9S#c<TxOT}5@DsihAZD9QdiDSgc;u3MKxJL{( zwDmH?Jh5Eld%^72dU21)_j{>N6N|-Z;u>*>n28ON{)OTiF|D!mVyRdr&J~x68^nEL zVG~=Q@1rt)wYWpfY-;s<FO+t^?@8_zv(s!jUn~|^ifhD8;(jsh7+bHim?w@CXNcvO zPP+2)Nf&mzynDj@^~lZ1?bG|XUO7Dzi5#P`|M$qr>6M$CNF3J_cB3z?cf)|ffq?*a zF#QFbkW*X2J;6JyA=jX@lkT8V-{0_xJ?WLjnVFSiG7}5>{ZO&L$<&O>{;}C>%Uach zs<0tfAHrY7`t;H3suq-WbPi?CX6>qq0~wq?;7r-F`xEM|GyJ$yJEPatgo;|?&f@y? z9&1OhTQJqBEXd5RDaefOg?U~<W(4J&%Ax|G^MY^@GRT28JTEQt(69_NUQrX;o{q+` zr#riUhx%T;>fVRPuV!z3?eRxdQC7=U6?-z+y@~^k8_ik*%k<V22bz?fS#hAnl-6iG zQRD1IfNJc~NH${~`qjuZTJ|lim4jllU!77HoozJh3AorAzG2B&x8SLcFqr<Kq0a0h zk7sTl=M|$@;mkut?A5WV-$FfOi*Ehm%tSSY+o=gU*zHX&99P85MlBQf5aSkO?2Z_% zMzh9Y9YLEgsn-Pa(ZH^*(2cJ$D`{6-$P1ofo*It@{lXRd6H~L8P-Q+=ccWR)*<N5o zj@Cb{_d+;SRp&8CZQf>e_{$uAU%AIx7RFbhp={>O@kzy6HRIE-04l8ieq8tP$eHJk z)F38S<CJ0#t;SK#Hy%d68b?smR|YrRrMo>gn%xI|-PI5O89f>>+g$^;sj;j4*X^d+ zc8hRCs&0#Rcm4dU8CetKnExsUzs;e#6JtE>i_z*oiqUA+m9|cz8pkkf6O*w`?79@X ziapttg_*hY#$;w-m(8D7hV@sL*=OD~?84JB^D2IBGH+65=d#j@pPQHUulTu<=|x$4 z4z5|x*qDFD#{4v*Qs-OQ2$z9S353b4M2w2{*>=6bDF;Vl6KVGrZLdAPvfEQ-_|Z~! zX<B9kxrFCsWMW-L4-LoWKIO!Umje~QM5cVmm2Ns->t#F|%__%wvU%`ZkL-|N#dT+u zYjGxDFrfLaQmAZuc6%=J%HIB+R#sSXAYRs;J22N=SsR3~+xC<cY#n8nvh3@xw_QTH zn(Mm*YI)leoW1RJ20LhvS)D`u3g)G;k70YDGOZ{;dj;TrYx3NER~5HE#4`KuT;IAs zGLAMplSn4w>^g@d<Ey;rUsrB4i~Bd66Q<`i!5DU%T^Z1guks(?dE`5_;z0AVE*vCo znq|$+vEB~Qq$3ab_PD+YS3}j=aIWdk3q1@G&jlJE)34)d$0z5o<6XO&5U)x2UIl7L z*rKV8<GCH5C5Od1@n6JgH0uKNMX|DKW9=FV_3j2${y%?z7xeqKVt>njdp_HQh(|e} zt*v9St?mUg&o6HIxFgCuvzqgb8Bv_<%yG8Xzo)VLx2IET`+4N{)Mys_R1@0EgGUlI zcb$nc&wu@S^{f>UDur3=q0pQU!VCJMug#|>D*NGJKBXRZax=nZ*)>7$aL)5Ej^lY) zi&Zs2#;86PG1r;xl`H4_b*{dLtFJsQT-_Cgid})(ug*IyjGZ~ibz0NUtj=|`clX<$ z-@VP8x1jIl*WbVU6<43**H`X-%#PTC7om1~tknQ6Si_8PzKUYQPQ!5phrJjNF*r`8 z^KgS>RR&IDI9w$v_II4x4LTmXco^bwEQ~{BdL<4=tc|J_>!Z64?Z;T!^EJkSA5W?( z&y3D~yR2<Zz#AphVReQ=9ryg)W9`xPHG#>^ne`FYs>;4mobXpx><rB78||@n_rq$p zVh>N>F>DS|9xKsM#eryzvmB@XDNXr<;Ep0ytdE%MCYudPyS~NYpU0DkJ@XxCRF;Ly z8bk`0W!VdrdhS`UtP$0|gWdOTKWgxJ5bK>+8fLwlc;=japh4Nt=?R>#5xAh@K&vTn zUkq-0#=qh~{nfqE9#7c3ZosCdE5W0+ITf3fI<EC;+T%Hm%^?3K%KzWTvg@tJS<C!! zfV24wf8GSM7qN`lnMb)Eh^k}1y?9#yf9jsc-gL;03-+IRo3XpvxG?f~|J&DZOqOR0 zZ2zi#*zx^eU7wZBM&tx`L|n=2o@=-E=XvqGi>JTe9v`z3Fy8<9_-scj)x5~})-U!P zY-NqhhVTU0jmLhDSy^#q-@{j6ecxVy^=6M_0doY$Cn2Y%Z-n*i^;YGXv1)F#v)`VQ zHZM?(Pdv6gw_Y_bt9O4^g|@lDhjA%V)~n*@#$~OKJVMp?9ihI*@kDW7ElV*m<^?PJ zMb^#x@yPARcB)ZXTXw4Lzv&8&pQazHo7Q$h>mB<Ox0v1)2eQhJ<=F7BQ`QG-`ajsf z&2=sIv+cN}P~Dkh@K4*j|M=YUKRQ15!On)`FwZyU<a5OF+30yvvHN4caKN0M-SuVb z@g!yJio=uC5!=HtWn-sf@Y1=nXHLNp(5z@4voS^-1RLKSk%7NG#H!9yg<IWRf7b+N z;BJ5!R1@!?#^?WL{Mm*XlcUAAo60fV{xj|NZ`N_)Z};f1?cYBv|EgbRf8p`%@a?HB zhD6(w`84@k2TXT+GM9nvxDNhxe;SwdpWcE^;p#SPN{gDnYFt)SH!~}4Di5#rGWg`* z?xk-(j$%J%vSvNm{r9V?qqSdgpy>_G(eku@+)HpY<)?!-tT`UnQCVfX%+B*~JFCxa zHqR-qp`|kOc^Bh%46jqu?fz)SkDmwsi~W(G8*E=}hTi9wqmHNX<hcXqqvmB@kKPoH zVb$j3VXmjVVd1f@CRl_6qmGL_KQm>;`|r<h%Mq(O;jRa}J^f#g2lKV#<8{P;eD&r3 z-=BZXw#$1WzV&H7cQmu>lON~H{>$~5kMo(i53tUz&rQ59fO`P{ynpzw|G9HuJBr)S zJEq;{l|y(($9y0hcl6IY<}ipeJU_9pj;^!+lk0<)H6aIQLewzHj>i6AKj$nz>~oH} zPS8Ct|L3Jfvo7Y<NoY0BwkE)?3y*$%VA8VN>wmv~m|-=Jm$mE1-eLKl#w%hxe3r2B z4j=!<WfQm(%;!ywKkqI6#^+6}UvsbJ4&P^_f4V#LN=<0*5#wAr+`Ar$&I@r3;3GXg zm$}C=@AD@2Pp0C#erWQaUq8ffa${}m?6ubq{_*?o_xCDp+qkAZ+V~x1`>h?n|1aC` zTAV=sx7+Vz#Q6WW{W8P<%k4LY&u_KcFORoJZXb>RgYBdCJnCMz2Fw<??uh#nx?eSK zOlDe-5ApFYowwY0uE^kyl2v)ScX&FdCY7H_%_o+5o8gv@PrhlqL1oU9zT;8H+I{87 z`!A_g>9}`wc<pDftvTlN$L@y?J1%wm7jYWRx`M~0)O^I+MUe^k&KLGGBTk+zcyuny z{P!PL##h;oywxX|?cQW$KmT+5@oCz8Vlfx@EfDWN`kcZ~BNct4fy3_~*z>3V`W~Hh zugCuFhbs4aY&+^y<C@~1&o^d!VMv|t|NG-{6`uy+9-HrY{J)B~o$>H_q&6Nu`{6v; z!k&Lk|NqPLulI~Z=il0U2uEH&c+VHiqolUjAnZdFeC{)!oxR&EW<xgjqgL?qj(Znj z%I4jlar63j&lP;pcyGeHZ|i^F@Si_#YBcLyY}Qzp?h_O~d@?b)Mc1GKTn^;N0tUP` zKnW)xjIp&(#<d9S)?n=GDC2J>mTD{;ux!Rsf@LBW*8XpnLGUj{PY)r7|H+cCx<w*m zP5ckzt(IR7I0&Cg`Fxy9iR6hs-AbSA`nl{3TOTaxzv1KhGIk__xqRS}OU$QF_~aw~ zjx6WHw*<>%Ec+4H!CLz(<o}DM^M4Vm&TshU!&ZW2C9bIWT%OBnpX}=RjNX-x<R;j* zW8w4sBW*{PSJMwqYR|*663Zqno28@vKV7QfTX07I;<JhdIK$5xUOZr^Q#7Jq;o$zx zfYXZy7oX+yEiNt`JiOQ$P&i;HRL<#V6!$G2e8%a{;M4mTjwl%53_kVrGlmUt1`I8t z_vvRjMg0r<7Wc)f`d5E<<8XFAmItw{!op{ZPhwevh4V!Q4=pMjJfOfCHsH(=gNH#F zIJgA=pKik1;DZaC!3Dzx47C3bx5*A3Fx)wPXz>|C2AuA4xKpPO9_X7)!hv@o1kOVX zmtx`HS#ir?IOU?t%A8QR4%-ifQ^vtF6i97{wHm$x7mp#nuSff_IHRO|4yQ<P@-(PY z=U`(DUdiqT+dHYvS-Q%W!cO=W7WwLqQzsUjx`F;TAVBbHiu7NIc7o-$6i#i2Q$X+< zTZ*L4qUW_I7|*B^3BLiUE{owiSnIku6i>%hXmI*2h$&66dlv?0zlWnuYD0S5*qr~P zm0fh2)6JA(sVA|Oxh1BQo*H4P@_JLsNc|a=gEucRr9|rQXsdeClrmF;7>D4ZZKl*Y z^=a&k!P~57cIqccAb7itnUi`wOLwMVl!EPZQ|GgE_s5LfzEA2~)ZW|M*z!`ZWy}Y! zGo}30-($Fgf9OE}_64a0?Efm;|3Rsl5tJUarNK^k3@grH&`9_T{9iA?YN<%BzWI-X zSl|5D7&<sbfx6p_NOhFM)Csx<{4c~+I}hV$)F->@fWoq0M}$R0y4hwqdPmqz+i*J9 zbK+3dI>A(7OiYF&e3<DTuh!<nO!e8x`qZKR-^~BdqR=qFkEgW}Y{#jC8@JL(c!zOI zVxX-XN5#4s9kYN}57;AN4ss-1A9BOMIY+5sbdzC#*H}~IBK#i;*7*QyEE1lILS1Si z;gj%xqi{IwR~TYLG2%DG=I|gM`w9OAV)eKZWB0If?5+s5=GYT(Oo{yi+d*oqEw<V^ zvAY;E)(e`tvGLd*>&5;E&-$@55g{6T6Fv=M!(nY0%SHS~u_v(>V=?}mP2<>UkekH1 z;s2&FPW(!XeS@}+iQR#^&0^mmljgChsGA;3Ln|#}6XDY`_6Rib*i#swjM&ep+bYI~ z0Ig$P;om0qDy)gv1Vm^X<Nnny_84+#ADfE*Gh;&#r$cNM<c_glkZq^f63CrnJ0WMq zUP1gWu>wR(#%@Ej?AX1~ca6P?|GUMW!T;T3bMSvoj6ciKBX&MoKQ{I_+UglgLA$xJ zorrK;>^QXBE7lK@d&gcwPy56sq21$Sr=fQz#0Db5iLni+mFJ{z{#kl>)OpaQc0{;v z$vlWWD7=m;;d8R#7Hl6*{S0Bk=XNlqNb2v<K$u?%2U|3C2pSEaZ*8&Evst>pmeRBX zR3K)3^B?tgyJ7-nTf=t1^&bf{iSQ>(Vw_dn3`OJN7>GcN6tn*ZUW29y_Zet@54maC z<(E+IfM8DJr_jH^?E&lB5`nDi?SWd?JB+dE<gzQBz>)xSXnNsg<D9^qt~}NW{64@# zgwuE{`W!e#;rIhHHry$`aQVJ)ecccU*Uyy^uD=bJHiR8nZ<Bih(T*|wSkK&=nQpwy zUNkeQy~50znapY=BGLw%*EgsfSQNC80*Gq!S`@79<}E?SvfaEjSli9Tu8e561#P&x z?B;z6SLB7e&lm1~U$_-+2z2uSS4Ox86|M!l`JBQn^TIvn3-`P)+!{9o!u{Em5$*+r zYs&0CQn;_Za3A@?ZS#fuyBh-Gw!1RIeXMZnnBA{oJ9Z~U+_C#LTswA$!nI@Pq|}aG zz?Bg$m}1ASJ;S}G?B;vnUh`$Q(U;xpZbr!N4Od3EH<jI2*bf3*LN>b(y>MGXwb^~Z zZ>H6n{V-IU-BwpdxQ{|MyJQN&U7^l)!2!Z<C|CG8d!?_lSA}cCmANv)O$pm@f5fpO z&_m&_@xt}+g*(<4uBRIUoy~P+ggZ{*S}?oQ6mEkT?lfPxA--^hZU}@M>dFXry24>p zoWK}`YmQ@|?d%v|xO05r&UHf|+<C5yaHR_O5sxL`Y0ZxJ!hPpkv)}vH>^^sGBHRzI zjBr0{&5q$_9M+nB+6x!<t=SacnoV`rCc@QmWrT}p&0fZE{S+>Y^<q2Q&lj%0FI<5e z0^tU@GQtg1xT_g%gu)H?!j15S8|e!-$_;^VC9aHcXDQqahPz1N_=`|ByNi6`F7}1H z#0`OPlUy0$E>*aB40o-<ed~q0))($NU$|**2!y-dl@V^b!rj7fl?s<1b+fDVg`4jS zx4;d7a0^`-;ciyA6%4mQ;rR1WwzC_2;a>HH`>PuQ;a+oPgxjca*YM=_j7~b+yl~I> zPC9=w#|L|GuXax~2=}ZjBiwU3hvA`+6ZlZ!y5fVO&F({AxUIf$AGskAZksD3+}{-r z_o1A?PYO593-^;R+<srUpWP4$cfgeq?jH)*mf<4W$zJoqMSMG1UEfYt&)u;QuD&ZH zTvR(*7Q?krxR!VxVmsTy7p|o*T-*(Ta2c+QaIF-s2gBtk+(llv9ACH|zHrC7ArP*o zD<fR4!r=(#1pcbA<K1qX-CuoU_nL3)HoD`5aId>E!o8ufJD%bCDZ4s&GGfE^^JUlH zmtBFI5yA~{WrQ23?D{g?xe7PZ3wN$B+<CrmrEUm>JKvQN?gE7y%y5@0+yh>?%YES{ z`@&t}hCsM0T^Zr7Qn*DJyub{F+vkOw;S2XWU$~iW2!yL}WrUlhaF24IeM#qv{<z0y z$L=NHx#BOrbHzIM{D5%lT^ZqC*16&(hTE-hw|L=p`@-$<h5O14fpA~DGQxeMaOO8L zw<z4lUbrp3a3A=>edvZjxUH^?a39%lX=n2qWsBLe0$p%Cu-BbiYOgy#;1z|v?);Ef z0QS0bt3*b!=l@9zR974DHHc(Kt*&nawx4(Hp{c&R(IT&?D<fJ1ZNO6)uBF29{SF(h zr7v9Ew?AaKArP*WD<fQMg`3WBNrh{Uhsicv(ibk<7p|)t0^z#3GQxGY;nKe67WaT1 zHBMQ#qxL}Us6ALaY7f<p+REBdd)SOx^WA3CHGwd;&fobT{sQ&zL^$1i1en2~!9`9B z^C{qWj2m1OZeczM%w)XaqDTw#S)js}q9`HNS!^J<DAsa0>YH2FjC=1cWE+10stjzF z@h2dh0Kv&vjQ?5%aTjY*EESA|7DdTuN{BCT;Ir;nj^J*S>2{RAM6D8T*}J?<cORDN zp2ITz>aa||J}lF3lxb^b+7dC-5kHU;Sd7Rf)y>eERDXnkmk;s(TG)K)hC_=YN2I-< zX=nTezQ65fZge<_PFxX1b_3zV56-P=%d>4Np4PTCYof?(ELauo%&Iukj0M(3JF_l^ znau<%qn%k9!&Qu;h_z8{HXN)D(@EaX&tWGk0@q;Gm`?6OW2TdJ(6ZBJF^YG?=1bnU zPI%MPX~Wm&Uiz0ld;!8~Q-uFN`<Fg^!2#<Y{~x`bR<t{b3z2W2g}sX5z&wXfBAviM zV?3I*gVVxX(RhQ?(p=PdgA+H`GTz{1sHnkdWv*`A!TAD#2cgx#$)VdZ_GWN++tm!t z^$?u)rTA|*Y?-^bQD%nPB8`*~UrXq45q4P9_T4CDoP|W$v*1-kI5?Gv1g|Ed^`|(; zW|~^<@R>Q|y5I6m3E82Da?53N=FVRor!GezVScxGxg8(QMB0W8nd1~_gGbGFe3l<R zKKC9zKKC6yKKCC!J}V9zpAXSMIkE_>4?Tm%&G@84XU3-&1g8ye(tZFNyZ+BRG~aG; z+RTQ}um94AZ!Tc(fzQ!n@Z|(_{6{nw*ljz$9nLRdAV*Rc#y)I2zWeZw?>W5VUmf1@ zuMh9|H-~lHLGUWH8b}F0j&U^||Jv<%6s<dL&V~zrtj?G8Q4S4!eZk4N55B+c$JZ0k z$wTZ=U3<pmyAdy9qw9j^0#AFLtZUA`-qv5woPfQpzrH!|dRu=~MQ!~J%$eBT`uR9) zC0Y%14KGG`)5(F*nYB9(f|IcT?fVk<9TxbW0d5}VGP#>=!kj!hD}pmYSvb%i7wDbL zq3mXp?@Wa2Y>s7BCgFQgwg<CChi81t;ThlRW}L+%HXpj}#S(ZvY_jD;Ka*`91Z1<B zwnp|A9UlhYs%%yv8@q`#GI#5|(TkZIcHZbUHg{IM(QBfjMz5*4*MiY=y72ZN=LB4Y zLpkqM1x{{>d!-*ii_pnkhT-H7hLL0doeeIECL0*WvRRwY>6-9FaC@L9>UO1XS2}j3 zS67DU%6O*Vp7ZKJSDsM2@??rzvEL#Eb5?W`*PvElo;|7XiSgrDI9!1z5Z(5D-r*;e zn+`vzR33g(nSc06Wr2HA>Bhk3_NUXGcQ*O9+(9f{>BI1pDxM8x8uCi^fq;=s78pj7 zMTXJj7{gc=YuBLW7YukxAWpwiP%%!&;S}gOfdWHaM}fg_hG0g;t6Uf`TZ8f7$j}3S z-Fd5&vk5N1!u<9kzvQ)0VkO0AgZINRS!EQF<Xwi*<b#H>9M<lQnxnA<*2n4g7v?~} z_bAZuO9~A2D+R`GjPB%cWA*C3YqB#A%#IGsj<;U<>fIV;SCxSX>!IubhvX&*9KEfE zk>pOpXmX!nEQ_`0pyor&Zc#8!zamtO({UUHdX`gQsQDBad^rR&dS2ywf+j!X!Tjif zzb?F?%l9E>;zq|)&;{nULS9Xw<u=~NFq}*pMv}b^qsjh;vDU2pK5DN;DBRTTiMnz6 zc7`ra=Rp+c%{SBI3^$ho<39+Y2ZzuL@QlsTcrZtL;27Kmshx+&zC+Yej=}cw>;m}y zwx7K`>(2d|4^p;b;a1bRHPX5O%2&{6@-hfqFV`AIk~bPgleZYgvRL~e)U3gRyU%g@ zeanu~F$KyvJzG#<sIC+kye|Z^UcAaRw$H|ceWnNgy7N{x-@`Z$_hgvgtIY3@P>x`% zKSL;kkbD&aj%3Mq4Wr4A4P#lXeh?1nsE+&Dar!M|O*%eFfu2m?#QKl|qkjXzB<NNC z+9qf`m>@lvAa9OyqU%FS@FGm#jyu>t8bXnbLf`<V8%C0uhS6k>VJwTauY}`5EVw}) zr(ajdaXR*;Ku`XhdYqy7d+H|m^$<*cUgi2JX2Uif%#R+-k9XVon$3PJ9KgB>gg67r zrBEbCLtuV9@NoRDGK?l~FpOofb`2aq#ezHTar!+EIZnqnDbSPFI79tJfx+wJu9C^m ztGvaIpYdRR^k9CxeeXaXhK2d9Odzd$pyYn{h+#PSjA10nLlVy|Zy3h1SUDXP^RVC! zew==7Ajj$0lL9?YrNB_5DKPfs5KMYr<u5{J_>2eBqX+)Fe+X~B-)FwT0qG5Hix6Ky zS;1I8L%0t@lFtD-emvYU!B&Q`ELP`4kt!^BCJ?9JORP!9cPY?w7X`-pg#x2D#*HeI zpjWxlUIZ8qCP)t^$OjC2QSC~UIeuR<L4Hq02Poo$AQV7I7DHfyrH0X@`38+eu`E{a z0*8TE@RT7=zp<=INB(?$oSu~w7;6~?Mt=f=Nzki2&?aa+m>@lvARk%q&6T&YFu{54 zkWM9(T)}r3hLiUjMv^?=a{Qh*jAgO%5>#A+1y3#F^m_|(oQ|JSpy$sN7^(s8QN<a% zEd-OESGmNdXFQl5J(wOJfow<p(@<u5S?v+x11OJ!BKbK4?jPS7Mv}i8Mw9h$ki)f6 z7Hc0w?Q}TfF-V+#{Bn*s9Vb$tC%>j6&QMhp7<>f;lb=`lQk$RgV1D#qe$7$82=aYc znBNBEm&`KFJIUh=!^ysek>pUrX!0z>SQaZYi}_gaSS3!sb&%t9e4he6cT-@fLlhXh zDQ<t6^t{TB-9L;6)1wE|<1-q*r_c^%rgu>$LX<<<35xhE2m>J`s~~XmTWT0ht~88g zvHB;d{wo$dsEN~W8f(&#Z^Ojtxx$TAO@Yy0gJ2T$Dj#DLG#*Tl9!!u=efZMKd@M|` zZU>}O10^qu{swM?A^CTsh$MF#Mw34o#<Ey@1RSoxf+s(5`uzeqPRGW$dlsi>2MUaJ zJOu_XgkbXXDxYcdGak&39?XxAk=W7iurR-s%&!@g+&wtqfSX@8!$|T3!)S7#VJwT4 zSEAxZEO?R>rysx5B~C|vsY{%m{8pDZL-A`};*7l-f=SP-e4$OxcrZPBFg-q&;ui`G z!NT+gbwqj>LdoId9IW*)B(FD$NOGQGG<ln0EQ__9!l5@7JerEr?;FT*I)-@1jGnx0 zXksNPF!(7DOnzSFsWw03!TjjK{O*G{-@!58ScCj_BER@kP!5MfaxDao-$uhoa<gGH zxx+A)#o7~4dk*uvHWa7dbS6Q^TPV=;K?)4@90dk{1A@uVt31c%XFQl6J(wRKobf%R zAj%xSIh~MJ2&YM|-bRMuWZW>4>|_{C_B4!Tu`=H<-OBVTLvi|j!W`)MBL#Z$mS&ux zT2o-`V<DLIyvldk^o$47qX*ODgE)T2!5F32sWU<hgK{7olIKF;@Lg;eNlrD4CTAMP zvRJzlYMzP(598wWyMjs3aW(~d-bsO>9;LwGFF`Q*d6nO_`56!9M-S%5CwsgP{1@f- z3i3<d3nho|QNwWZS;I*3Wy5IlEyGwAEAyL*mNLC(0&)7i%N*#)+pBSU{z8GF8uN}J zV|RdH((@|6Vn1^k52i;C{B_}zLcT$DA7UI2U4TE>ncNF4^E+r5PDXHg=D{z`Fq%vl z##*!XUew-<P<UE+5$eY2`xX<S^S2b}-I(|57_J8e#y<ms`PASA_}=DdJeVUra5Z!q zQo9Y2fBVyb{nT(1e1F?dpBnf`lkZj?#KNum+%8D#6eur6qsbu<xY>*{j3mbzMw7gz z;z^UWYf$qGEO@LLr{5BGjE<`)&~q&XhI)qrgYSf3){9p;Y%eN}2m4G9{B`FuQr?>{ z#KQc3Wqu2xJP3#6?;$Y12Mr_1Ck&&>7Yt)rtlb<ndt<?K(m4G(@s1!JPc*j%A)G;h zp~g~R@T(!1{JhG?*!+wK^P>m;y1WK&zU}o5mP+UXZzPe|N6>P+;pHIn`@s-*RB(Y| z?x+~rJKd8}b1y;#vV&t$*Ic}|=gm7d(-(r%nvHCLTg2RC4n9CPhCYvOjC~aa2A@Nr z0ff6KFb&=ZbTXbm?cd%W_;MM>n@@fD9$6m@FUR|`Y{bciatq=l`#@lScp=LDpvVyS zMhtOp1gwLa?Xlp=Z=8PnnF$@Eyje%j1O<l5rNH2WAeiy?DxYk}+jwvw=)wH>7@2QA z&R2d7yCTGOP>z8^at;LMcdKC}$xB#{_a6*nS*$$@HLqrVe+|UxH-|~k@h%GVe4GM9 zt)sx;??W*8d6nO{`>63?e)Pa!muh(P?X?TAE$oIaklGD-{S{hn5APX<lb;wyl3yD} zlLriAtyz0DYIo*}?ic(cJ4fFN+z5=*`F;xYUPpo9KBd6;0o*V%#}O~U*>((#2Xmwc zjwAJu+DC}|+uMUZj+_SH-}cjSgb&d9j@ue6+-@H1hO}Bh*#?a!J3!!i>0ua2o@5wJ z4mONsvGyF)d<aY6++du3r=en;j^|RK=am!~>P89-{(A^!y?B)`v3)ik>@z*^*PTz~ z`IcN1TO;!u*c~BwP5c-fl4TH>-weY@l2_T>Zk8CvvRM0l)c%S2T^@|nZwr&4<5v{u z8Q^_HhB}4<gJ(f7`FWM6+5C(L^P>mz<0F2)b$7n<`@B0s{0YjF;E?2%KJ$CiFp~Vx zFq-_rFqXyIolvts7Ch#U({BuupyOl;^qfV3p_Wi!@Kq2@eqQATHb3LR{OEzdE}S#K zZ*@5i+w@xK0^4$sS1PVnxm`Cg3@2L~Mv`3&qsd-|vDU18Giv8^yM8G=F9+?@H^zI1 zbk3nb?;;8eH<<$CFN9#WYcIgN_5+sjV2<>_hV}s(csl3bZLb}9oXcp3Zv6Ik%@_Z$ zUO2fSAI`I|aJ!k_18MQ2z$!GFJRbtr%cX{qBtKkmyP0hm%VO<f)GWh-2@Y}kz0Z!( zaW@5e9-_cdO?kJG!8<`P>&2_Q-}c#fu+Q{hew;1A_Zk1D{8}H25d4&NA{>&dAuvDl zt&uohZ!qO(@*Tri7Hh9S&9%&LOE^xyvzY`PFQY)unG_i6b_xvs2n3U#SNRK@pYdRR z^k9CRez6_VkHuk%<M%xBOMV9>HyeKbVtV`z6`oG`8G*ys+Ax;G%KK3{1C;|?;&gj~ zDbVk23UvIO0wW!uz|akGXVKis_Ue9N&Z@?N$<cwyaW)6P7jV9k8{HET@}O)7hvXm# z%&yoFH(U&H!^IFcT)<JNc{Q`E8;H|yC~s=g@q7yOoI-)2=22kqyCImt^C~y9Cllkr z{OG~_I7fu9LT*)l|6qQVQ2r4P$vYr0zxxew$HfqLTnur?1$+oKYnWflK%9PCnFJm8 zQlMv;cR3j<odSbrLooSyl{?w|j0f|h2lLwiZ@yaD4@W?*+~4OStq-8&%Kh9BH(U&H z!^IFcTyULiZn&VlAC)su8S_r!^vh=sbS$Po&xsTmY8nN`u7Y6F^D3Wc(=#4Sj~@8z z!cU|8#?3Z3Uaf#GFy=Vq*V(l1Bzqc$lP4QSl7kJS$zsD;OV;LFUS<l%11F+toUVfs z5a>IR0-fhlV6>GK82%Lq$MQjdSAVV90F47Pqyu^$Mq<9Bknb_2ol(*=a4+XqWTpfX z@XW`;QN9tW*e7F|?o&ahXW$k*Bnk9L3DAqLUD0#3=h?&ajGlm&*TSF|b8`R2XSZ$N zf+i)z$GLS`%Xsm(jr9;ecN=bR2ipH+yf|&5?t89Rw3ob6oZL(6!mC3oXi`F)T~PNR zymCLnZO}lco<_@#nYy{}GvTbkM$1VSR{Jw<xdf8u87&_|n+PVGGU!Y;5wyc$={nnZ z@y)in;~*NZ-@9I^PHqNU$oYfu;&hO@H$lw34N~CPmyDLr=xbYe&#fDDa^GUz+%JsR z{q%Z;b?bAidi`Rw54v@8dog04roGu~zHevS`G)7Z6Zt#IDIuOrtadmvKlv1+ok1<f zF}E3e-FJl1@&skIb8yojP;iOS^77n{=IdM&1Ak|<e523$_Mz{fJB*g^*qIT@eVD#O z9yMCd&ahg3YhK{=bw<nQ;Wo2;NP(g)M$3yjtG$^$9`=pVa>j#=(12@nL`om_jTef> z*9kNZbZFSLeyCx*VdFrPKnz0|%yjD4Ke>Jg{vnCDR1G(CLJd!-e`5W?_}rM%G!SZ7 zzdnlr6jK{`wmuk@I!yz$wn!sHW1YGk9irYbflkrEO<ApeiqS*^0b6d+7Uk|3l!o-7 zN29PWQmivt$-u{>#@*05+D>7hgvp>uip?N}O*BOzLOTm-a;{(Ne2kn;TFvBa3eEk_ z9FP3eJNlVS@EzQ4_k-vn=JA^*P>aQutpYuo4hxJ(EvbK&$tRxT^k^EyU}nsl8Ne9h zm~qq0fD^2@h;Jyh_PM99pKYuc#e~0eho#U~DWF?yvz<~<v3-3s&j6XZ-cZo31Bx09 z=F{<?!q-y|JNd%Hv9m8cidjsV>7a)=7<TEVqBlTz?*ctWgV}yhCe)P{%pgD?oyLLN z`bAml?gen$&+*m6HqgUAMmRM4im>+V7C0s9ZUknO+%UQ7zSazn*$#%^2|75qg4j1G zN60KIC&(_+lQ~unlV@6)za8j|vT}qhv2vI^-^vMcoRuTwL@S5MKUz6K{>jP_vf9dF z@+B)L$Qmn0$PHFD(^cNGa)Nx{$`Nw2mBZwRR!)%HtQ;Z#Ze@1e{NbK~gVPSiXIO8b zz>4_a{MA~A*II|W*6k2J#lmqV8wQM=Ao&FY)RX-9069SplAfF)Jvmo;^7qn{%cUnd zGm~-9l=<U~%5GSY`!<;&9%&6aiyWHyDqp}UB5a^VuBZ9l?C+sx!ej!+Mm9utwsM&4 zBR!cfJvm5vvPgQeM0&DRdh$Z)$%)dFk4R6hmY)2J^yCKVNzTOc4+v*p@)c){!aCqX zE4tlutsD^7OxgWoG@g|?3S=v6B#?8+gq6c2=SWiT*5kCse_#nXXFeh`#3QY2$u;|1 zEk%_(umqeDZk4qtuEWAa$X~3SARQces3&p6r<@>ha5j2!xb$R+^du)Q(%)@|^9^@n z!EhDB#P=|L+mCByvaZ>m_;$E|Y$Jxr9afHzoNUCF$hegwWWvf}@;ECe$X-^CkY*wi zdPrVn^$D`f$`P{M%3+c-6aBq%P>y0jSEc|rSkdist#x><)!U;vcZZiyh!-Z`v2uju zJHKp)JRm*k;9`aTWLqmI$WB&{keoS3AF_v)6Qr5OgCjB7$LhmmUn?ibQ>`2!2U$5x z^1V{#L!N2n2w7s~FnPX}6XXOdN63j*4wIb1!Z_p$R*sM_TAACN`P+fM?#6;~tpigU z7T?xVYaL!|^~QBAoWC;h78!EhqOY>g9HyJOPIJyA8ezd!7be@AT4xgc{tv3j{#H#C zOHFb*2=+r_lGG&UjX+J9*^>z3_K*|!l;zQMuA7;Pc)tl*7AE&tIY#c6o=o6l1x7YT zcD8bu>?1vyFFiR@dXirp!Yzj6v`5Bq6X1lyt7Iq5kB~TJQF6KTB;Qy^y(nqsHE=7{ zA14y-GWJD=e77EF2jZaAuB$uo595ta**~8S&w~C*=cVfN^P2YQ+^S~YU~gPGah;ME zVDW7rRB>XUKLwx8OTnk}QgC%g59ejTxq%PcCJdj4i~%9cltJH#!kx?K&&H?ovhnG> zY<xOzKzuqc9Zm&&$)r;jCSSF3g#5+I3DUupAl7k&<k#78n;}oMa)LbB$`LZ(%3*S* zl@o5G?<1a>e}ENzrDv~Q={|eZXZQN+v&VdPukWrMYr-}AR*GxIs5-8hvirwLg0Gs4 z7a4LQ999rv<_`K?-AR4^739--3Hx+jl0Kccf_yqR8#5=6llqt<$@zi4)Bbj(RcOs& zl24t{S;EXD^c{9M!>^@v_4Y5H4i@|8(|OtYbY8a9`7>i|UuK*u$k~2OoP5Zbz01Zc zQLM6NFB_i@7W?PZdD-}MUN+SEn`3O>T3?MKXYVl^lCuPT$-1-m{A<#ugR}kf>AY-w zIxica&aG<Z@12a#)c!U&El)bH4WG_y!>9Aw@aeoZID>D2ZNreW`Fx|`Gl%JB&E7R6 z=isTfw@!RIFGHWs%h0FuGW6-Z4ELf9&cWk~AUU1Sw<2ifOgosvq&0h64ON4z*~`$U z^D^}5ybN8PZ#<~-C&SRbWR{@#!V#_cbY5#do!6RA=Z%L?=Zy!a<Z)6R$AjebJYNc& zHrLXcy$<_yUJ5>)mx52{r9hp(ImY%i$ER`&k7&-P^P2PNyykp5uQ{L2>oI51y=&Vr z<cvCB3N&-F8@B*5WX!{eHdv@8Z7pxZpeKKw4rXthd^#_2pAO#k&(--hj9Qhqb8v1Q zA3iYwlJo3*HK@AIn!N;kIxhjA4&L_9)g3*Y>t!auy>UbnoYy9u*Mv{!HR02FE61nv z+Tav8PTgZK$pS1$i!d|epmu%TDQo^A_vyTJd^#^3pYCY!+$PM7w|O=lhrG+AQ$(1F zaM)?wKX-<jKOLXWOUI}4((&oMbbLCu2{T7+8`}1_!Kr7`d2RS~UK>80*M?8$wZU0x z=3xu^MvlgU>kq<AUh{R?omJ*f$EWks@#(yDd^#^3pUz8%Q^W4T;%~#J^V;y~yf%C~ zuMMBhYlAb(-ZE|A<1qM+l_Ml4{o!IWLDsi&gp64^Om?txg6wGJ2-(@nVRDp}6XZEo zj*z8R4wIbS#<twVIOXi1$z@UGT-YWUd+h<nXOH^q-kA98F`wNVAJ>i@%r*NC0kziQ zwbtQoZk(02%jRSF56IX|2s2sDx0$%J$o#9&r}NVF>AVzuI&T&FbZ$0g5*jB4q75@a za0q0iLzuZ~zI5D4WBzn}Ixiic&P&Iq^V0F@ymUC{>`aqRS(r4xzle`7<V{weAS<mL zA*-w$CSSC2f_&M^5t7r)_|b>lV&w$+cPmH8?N$zxocHG6q9&s}4GUKD7c%?Sc&&AK zt#!EDDYi*<(CNGEpLMlcWv$;LZ!CQ}Z!D=}z5!==ZQ6@W`fLVjx0Sspwm-(MT#~cj zd}nNTR+@i>`gC3rKAo3@Pv@;rpU%y|OlrGEDUg*Wg(AYtb@Ods?j$sSIzFA3j!);M z<I{QR_;g-6oWr&V3%3Pwv6Um_U#*-VUz48PWaTjVnUxdd=T?r8oY%>iWb<Z5PLQpv z93c}{4wIZm=ik0oquv@5V^O3vY@Lj~cH8jTqdvPgCO&)2XZOa(wPT}o&A#oo);he_ z>TN}w|MsxW$MAW`I7AR;TAXhcy7SfitI((O()H=Q6n#2x75a4ED&%yxpOp?-zqv_= zFtgx%>A2I={OR~~UOGOVmyS>8rQ_3i>2P)%=cl0!L(X*b?PKl?G=B;{otJ`7=cVA& zc`5jGUJ9JR#;LO00Ldq<oFJ>EC%=`R<n&eglbrnK-xxU~jT3E|^LOAO$!>!_d(>z5 z`r@<4e0Hy2t{q#TYxZr7wbqff){$=8oU}I8<h#hQ0x~v6!pvp!t$lZrnSbbgIxk(H z&P&m!^M>B1bF(pX)HutGYoFwNHQ(BI=aKnS@aeo1d^#@$pUz9cr}I+aY_QgtaO7{p zr}NtI>AW_4I<F0%&TE6S$*!?&7*;~Ys1s(AnQzqH*<b#2d^#^3pUz9ir}NVB>AZ9} zdF)lCLw<+_=@4d4nJ*o8vX?&{pUz9ir}NVB>AZA&Ixij0*lLX_RsJ@7I<F0%&TGS` z^V;y~yf!%DYq)8nEKE+ba)O*8J-J+Zl3()8eVkk^J;^Wcrk?z(^yDV#$#<nE`32$h zCtGt47B00(PC%pHO_I~XE;hc4B6GmSl8<7K`t08L`0B@ec5kd)I}R4E*>~J<tyl{V z%~e>iQ4mVR&BMXOR3y$nFL&=dy{W}zlhYAPA1s5gxPN@0eiD}LSon<G{o|A4RtU&v z&f9HZW8#zFdT3%b7Cser|MDSUh-C>D+T1@rQayl$4`WNQcz<}T)*K5TXU@Rl{_&yO zk60pjFqMwQ{o}3j16ay&r<XVJ-9LUZse=z1{LC~Fi~Gmx*Ev{rV&Rpq`^PKI_ptCv zc^ej98Pmu8<8?y~7GBYG#^V0*5dI(*o?ILpp4>mKqHD0s#j*s8`)40jo{3^0@Q;QK z@W1()bBt<W(nS}bANtjFe4Uah;G0XjO{9Eb`Q-D<&bzR@?7}NAJAabZxz5G`&%@37 z2+axvPOAvrUU%lz6GAhuE(wjhhlP_yp)m8}<41?acMG)~ADWOCYSArJRuar<J|T4F zJ)yMmp-b~ZO-n)-bqh5gAG$a%)T|_QdACsG@uA6ip;$@i%92pSZlO1vyu2Zi)0a_m zNy*70Lw|^Li=477^f?-uvMSiI>9SB=_^ui<D%5a%=$fivm!?BTO$aTGl!dCxzsnmE zdZo_HFP4RNl$V5ttqOIVSsE%^6^fRGrmhOrD+v{^3T1Z-jT|4$X|^oXp(J!|)v|L! zOX^f1`IpPTqjtIdFSi+^J`yU4yno`5<s(DCgiIF8rj<mBmxac@7iv5+^6cEmtII;y zu38q_9eOV`_j<Jc*O8$ggWY~u7JA_Nk_(oN4qaFk%tA}(>E__f(BkW7vba3h)kN=E zc3K50{2|!w&l5tQUtdx=aa4Ke^6}{7#8II}WuZGz<s($-g7TD5<47JxeL;|;zHoX; z==^(FK;jFhn^B+IEmUuO=;}NU&o$jH4PBdeZfI;ts8vbms+pk%<3nY69EJ<Kq45bD zr;g&df9{MARD|XPW-c4mV?yYM=~bb`%n1zKp`_1*Q0YB=ho98-q)@YN6GBsGTDe?o zAb#e2mlm3R&3BQiAtw$AH7OZ-D*hcm`}ojh&xIP!4E>N=7P{q{RiP=7l2H9_p-Uqr z6GBb8g(iPDbwcRkRgrclPUsPNHuS^|;{!uS-Z(Jyew}W}WLfCZ@{;)zLWic`6F4(; zZOPQ^2bYDez9+v+=<P_i_i29y+rrvV<TP7rc8aZa=vvmQe^2`n*b4TA?}?m(ZDh%H z<3m&4!;psR-4nWIrrCaWhi8WFyDm~@t8We4>MO5f^;Y);xK5rm$_b%2uPX_a&&2Rg zbpBsuX98bUb+7G{oS-RDN|6?))>zRZLI@BBy`Vw}1QL>%5W(RZLUKrgAxV=HCQ-Sd zNG(<rYw0aASnJT@6^Bx)R&hq9)+#DLwTi`BsyJ7xy?pk2-@TuGa)Nm8_w65tXZ_zb z?zPumd!4;b*2>I^A98Q-|B&qC;%l;&s_Kqh7t~zyjDdkicAwBc{=`MwGp1IT#GlRz z1KfMjjH<@Lo$)I&S7o@3{4O&*k?j}Hn7BTEO-A+%CH4!h!%Mmj-_UhvTj#r_V@$(O zOSUy^XozpVRAtLP+HGN;Z;ZcWxZn-(Ththmd6JuT_Ss<uJ2JuyetU^C$Z`70_FiH< zqZr{?HN;n5oShq#>87kO${QD@qGTW45TCzFSzSwYeCq1RORtI>;-{)2OKw`P%8l=g z&j_y1U5j<UB^9sF(je)F;$hN{OJ6u;ePdXnsb|M;kFQe%U8Y@&XRnk>J6IbJFUj7; z;S~)M`5}qyPbE^I(+b+nGnrxdEf+id-iy`+5q2LE=6cJ*DA!}NX9RcLeTVpt+qp2j z<G$}Z&YelenE2r{;<p_#CB8!~W#ADFy60#l>kkQY_{%~{6y*CO)K5`^#Q#qZCw|o; zWx7fUH;?-F_`E6co-fAdjd2g8+w`A3md4jCS{k&Fw|ayvWc{MBg{;1GRd`N2NPBCL z_D8XGLE<}u#P3^l(2_sgV@mw)MF*68D|g2Z?v60^TTuU$Qq@|or!4O+nlY_=d%iC# zd&(WBOeu-K5L>5{+j6P;;_Teuu9_WxB9=Wy_i&i+aUW$&9i&_Nl(4?enK7{;-l!Hf z^^}tM*zi<~XI$J+690Vui@{a;9ryJ1`EGV6N0;=f>@b0U%ulcI{d5p3f({}lyw2|& z8eZqM>hi<Z_2DJiGt>usn7#Cl_3@4BEaoI_sIOc-f2n$@c-tmDUT#(Y+`KB@R}ZP# znFakyrq7MPsq9M{J3Ft;C~4@-%+|v*(VUo@Xi1KU>A$Ar!l7^&91aU$6mBH;C^#CP z8k;e-w5GDWw5TTB+@<F1ai!HoT`GIM)RdK%6~#K+>T8pUiq?*%WK(NPtf`}-b5?Ux z-Q@ai;VUPPubx&^Q#NjDS~`X0Wz&>HO|)lBD%*;2mE)#HnS1+|w)RAQVs=wYqP{3N z#j@JDiLUe=Z$eRFX{@C+S?f{^O}PrXLPa~$gvCzf#VHn+Yd4vqX=$Y^s;n%pjMXNS z%}pK2p^;-)<QN_~3L?jd$T2c<jEWqiBgd(+y4IHZszhBfKjj*lat-S$t;!SZqf_5n zmt5GE7!hl4ZBEp*w6-K-CDUuzOs7TFP?~6INH$tzL!FMg+Lo3?dq-DV(e<L9|L3bv zQ&C!7739J8IvuLhM69{Br6Jdw-zcM?%DjtC*xvGEO)YiJo%JfpyhL+sUTt${q9WNI zQ?}t{kIk6dT%q!}HdHyS$t_LEZiS<9cypnyv?rBS=N9G`<c-Q3mOCte=&+&rLr3He zs7%!77S|?2eej5ra|h2&cD5wOHY9Y)O?5JB+v^&~HjNlPGIwx8?%?uaxq~~B^<x`a zI!`?{ckt}Qg1SVTn@C4+iryP2I9WC`O0|lxf@`XZ3a7<1BpnhBGV5YP8e8WkhSayW z4w;bXxG>q;Hl(AjrX$flZ`hF9)@Fqp5)4wEe7GM`DoyrJ3fo^ahOO$H)say1>TKy~ zYEb(Q>bNsGdvsxI%e+K;GHN*av9{<IOC^|U(P8OpCQnG6)K}JTxE)e(HM?cm)KRTW zyP{1fnmDeybXra7A|BWYOe>l(jl0e_V@qrM+}h@*MTvTsA+;q_s;tq;7nYV+rQKwa z9PTOQGiVMPk<#!UQ5}t~?aAD31*NmgkKs^n7j}QcV!j=w)+Xy36CL9^>YAD&pMtPW z7HNYI!m8^FBaMo6C{p+CWO7+qQDx1S`k>UQbn^*%w2lj#+N!$hZc=4=bwy2Zrs3U` zikjwg@ZjYY(+=)YSya*G5p|rdqEy<cyW72TqNT32zNw|b7bEQ9VvV&e_05U)t_Z2- z(^dJY#8Q6Ud+f0MRoZZ?sH{-A@I@?a#QCufU4Qph2f5*k2paa^U4@|g?Vg_s9k%7@ z$xxxEQTe2rD(xv&l<M2_yHe?Dr9meW?d}yl57abxG7LXhoT9SosWk7lpqm<|9(nFu zJ<aHS^CQR5$T2K(438Y$o;11wsj3X?th}PA%oig%(O6w$ZF^;6c3J1#S-L3oiMr;( z=GKm&caMsnXm4+AcO*LSnCrHCzn<Q8hFhK~I2*LpwKjLoZ6Sl;{vJBAt5{J%R3aj{ z&UM0_9!qeUnp#4~+3wT3;vP`lL7!5kezGM&ZWZNKlY`ygQne7>=-t~>>guOgSk$`1 zt>Sb(#O=yI6(ZbhuBO{vbD*d199OoUQsHZZu(fujHmOMW`?%6*ym8PHcI#ooicX!{ zmuiFO;?Vrq+@_ZC3zLbCibQ*%i||!(xJ3`*ow`in7%Xg`dKd)lbZA$CQT=u+XteiU zD%~j5WDUG3%XH3F)#Iy*(z=|A$=V~YuzbSgvPoTO2hXvueiB5T{a1%bbxqxdf9&7) zKST?*7EEiM%}u(3war!02uE!rY$Oed<hW!q?beuFroKX5l)H?|wDY3_E-s&}?n}|R z)zUiesQECOswy1k#{m^y6Ap%4pH=GXVtP;y9T`2Tom{Z@V5+(gXc?)@c=!z0kNFD= zPs<&kvChf=>rf|nOX)Xg8H*}o8H=+sjyWtV%YPnpzBIq#^x;2eijC`)y)3h^S8k$b zuk3M;^var;Q!Cd*xyI#8ma9;%2|1Z|c8LeN3d3+pZh$_E_1UdYPvsX=(iisZl{G%6 zP5&3?EC~Lu)c+H6#>o3teY~*xHp0#g{40Y0i_`uulDjY`bG$GyCyXBCwO8@|w>RXK zU%aeG@$#(VE8-=WXJ$_7`PdVWtNevIvHl9z*ZJrT>UYR%QIKYs*hO*|>1}9%!i|xC z@CPb#r|M@O^;48njca_4A_a9eAt$KUq~iIHK;BP}_f_@!r7EO?Ck3@0`es&#=_@_I z=ice^>rL*XPG5($z0$mVvZ^3BT&Me`dBx)=trYg^UA`=9dA#_F%=Vr^ZItFThK}N# zik^=={)8{f*`Z^6j_YZR-irFq1kMQKA6C9BzC82Xp03FWIa7=<Z*OSnKLsdtI2|s} z0>4q!+vQmnbXZ&I^rS`M21(l>%|BCr*nxsJSllZ&sXB0bE6(Y_HQq0%oyM~Y?;mkT zX;}0AgZ`=XrE>eQ_L(&QNO@AAgqjz`_fLh3)3jVyn0}U8nWhy;^N(p)rfJ2}{PWeN zY1;YHye4FN+%{?c)#seFaF<E*;)m(s)=2Y@A=}f!`R}LwL&Wpbv~AK>Nt>0X?Ud%9 z@|C1%d!=~=x%7J3FKvUg^tio!&H8i?*I$~KCyT<l?T?oBthDExN7OeQtnIhbUUhG| z-rE$<zg|i&hc_E_M-*vJ-?JJO(t;nmd^!EDRL>%PEv4)9pH;jM6fgZ6zA4S?BBiJQ znY2~X{(sA#uNf8pmLW>Zc}|e#9~7i(o_+DGzUL!+4A7_9aiu+GLH%9vviQX1y4!rG z6y+?`t<@`QlG>@$T%)j_rk>!iI;?Gy=JiYp10~e9N!u;0GELj*xSCE(FON5Y^o(b^ zw%>83rC(S7VS0sTRsP`gRK_OtcN21E>i^=Lu%8Y4LHgN=(LG+QcwUGhH?16A>)T5% zD2wpO>sUB9SvxD1*O6=w*%-On6U})^4gF(zdh=5o%bV5F5zDjK-Wm#a*C%FmHq<n= z%x+b%z+F3QR(oPzWHq<eg^}=VuWf12*p{%7)s>P5myxdu63g=lT?5rvo`&{`JUv16 zJ-@c@!Z6W9W6kV#e=YrgJ&sdAb+Iv3LvWm_|D#=hE%=)HP!+}0J*JM`KUaIwwee(_ z<EyE9spZ&-*t%_lW33~m9S-N?6nz~2e+%dP%;{(9<70!;`+XEicCJMo`TC@nZ^Lc! z(@D8}DrTyDXUgsLqGPTqAZK)Bb@}<(lb+tTJ2aiF1!|n09$TsO+*Z@mTQFUJ3>p<S z&F|bax16zaBz%}_S9nBeG|7zI_L*{#&chCl$j?_ey?hIPA6_e$Pq$~Pd<*1`;>a1B zqx9O+gvfd20pVU=tabH#q8w4U<+9WBU7>t^9i6Wp8L51)m)miCU3{E;nP!GvFb@0q zvk^w&_FSz+0tjP7;eLrb^6I@Ra)op_9}nnbcXSCHt~qMl(xdiwuiWY9u}bH0t0MY5 zJYgKQXFYmSZB)+KVx8D_J2;|z)AO`f*3Z<>tKoTK_&nSC^w!6DrZwN#&J7x3qzO@a z3fApN*Rx_D{wv)x9-MKPqTQOi47uXUJ*xWGWoIh9&oLTn*-k&=x?|iQMt!XPkC**{ zD%ICIL;i!rs86^52;2I2>}vaTxudbL?WwXoo^g|MeBCCgzTW;bWk+Kz+l?~4ib)i{ zU3T=mu)msd%xl6#{+G*+p8xj0N_I4!v+efib#J2bZ<HO4XYB9x<yCAV|6j|F##Huq zy9!od5ncYL#AqC7|DCd<vAgX*$&SWBw%?LHQ|af5j{l(;jeqR_Pnp})NIagm9T%gq zmF>f1FG(w3KiR>0E~IyYY_EpnrXE}$+0huu@khwst@ika{B55uI~w2Ho+R7r^+fS2 zWJhC9`=2Y@s|&duJN;VO+f@0FlHMHIUW+EW9{&CijWr$rV%gDn)b?`O8&ug(690PH z(YV9@8*J-lIRpRAvZFD!{qL0>je~7JDmxle+kQrNG@iEY4Ys0juI)GM&luPC+m5dr zbQbw}^@nIIYX9JSh&qGF-@mqq#%uOJTy`|pwEa!l(Rk6ee>D@0DQ%x9I~qIM9xU5y z1V!~fQg$>(wEyX{qp_gviL$q;v-0!DcA4yG%xC*-+0od}c8zSWOcb^6IkKa1n*Ecq zy~<H^{VtImjqU8eLUuF`vwe+huMicL_djKOohAK~Z;#+RkyluX{BM)LzZ*p9drS9V z<tM^FDBG(cMdf=+cCZc-{zB@A2dSh?<(b}-y9_<MJmrd~dcRPP`^HW?;=z-vONggN zJ)stl_384ID<1ToT~b^(@{1~O?lJmE?xPy;UT0^@c0X!6?WaA_tE})XXY@iV?RDRm zU%npj22Wvm)k)CdyrvoES36AU;1x)`X49}y)1;}Fx+BtGu`=J6Z!LQJ%<Gy!i{8hj z-YDlsGc;*4gTZ^+yrHL#O3nMF<_1&BQ0KraFgv5SXm*DaM-=7MXs#k{ro)AsS~2aM z?(dB~9gv#WP!L{WrQSB-(BwzA_x4@$kD65J=98Z~%dQ#K;VG@_t-5BG!|9ZiBXz#1 z+0nE~(XjpxoTiSZr=#iW;If1-)WQe{&R45qf(seVTMrE`Q1s3-nr98`c~V(<Wl`EZ zE3KlywVirzo<4sjo!8o~Yrlx}gs0rm%lR&+ULGD~e)CJx0W%<aj_RJs(EXv;fUyj9 z2ve|wF|zbF^#4Tnv)SQ2W;6ZlH8XWvnFVl~sr3BpvA!B^LVp3ful($Pis|rh9r_ly z7yVo6mmGeOsqp7w`#p*6Td*_qaCEqnV4*4hCinyNb?`%Yh@Q)i*WXn5N!b1_Zu@HN z+pu52?xoJv@xBWum<m4=dnNWJ>~~>YVI1ygQ}GAF)8M%<Y3lP6>@9E){MgjzpV)oW zc{{xV_}`}dzNYTk`gnK+d<}Z5j^I4hZJU*F9lQ&E3j1m>>vRiDg)hZ!#(n@k2fZSH zkUks(&w-c2>);LWW%xGqHa1RYBJ{>HwpW`fkCz~~?ZwH>=ir}Vj>a3-$HFOa7Q7oi z4!^E<YYzWicp6*=uZK^=PhghDF^+c>oB-S4Bk)D|796hejpI#(m%wY`^U%wAI^3tw z%WB%Lgsb7ra0~nb_R*IQhc7TyZxz@{Z10L{|JUG0Fi-EytdED6z%{1Q*^0dbz5$Qc zJ2b}|2wUJ%_yBwk{@ql1y*0iH%4y1;hP@8n1>b|2`m*Qnr@>NK4R3&tno4gswii~n zJ;+r23*jR88~7AFLW2s2I|;VHrSJjx96aJ^!o!iU4K6d4{{z^&vHNNK666CXLUq4^ zuI?*fFlJMEbejaWno~eke?S#G;IS|l_J;%DAeave;ArS~GA_@VZ~`obrLY1{gEQdy za3-vWjj$QE!6aM&^-3hje+j${u7E4yDtH}S1J}Y0@FsXG+ypnnd*D`hKimc%h1=l{ z_$=HBcfnWTZulnL3-`ef;NRhAa6j~L*4M#nD4N;O-%)M%hJE3Y(EBmlKNt3g1K=Q- z52NS$Xl&1AIsTb&0xX85(BEAhE*KAp!3x0Q`RFrYJ#2){unk7zhy~b-;SzWmTme_Y zRq#5v2Cju0;7#yWxCw5C_rR_2ez*-j3b(@@@L9MM?t-tv-SADg7w&@}z`w)K;C>iW zUAlgQb!f$G?89Jh7>%=z#6A}0!v1go90c=W0UQlImls@rH~|*JQdj|}!5Q#;I1|>x zM%WD7U@$I}dja-hxCCAXSHP8U6}%3vfotIgcoV!8Zi1WPJ#Z_$A8vz>!tHPed=~D6 zyWp#EH+&QBh5O)4#<lgZ5jMkU+?&K+02f0IGqvV0&x7f~Ypz&^sK;tRJ(hy&7<~^o z-uBsA2NwU4a4Z}T%i%OQ6SlyMVbK37zjfF_zbgA)?4Vzi?RTLr*W2(@nB{gZy${TV z!4jj=$6!x^GvI8Pgj(Y^NGIqI6mK1NaG%TeJ1plD+`r;W*aLkXWC!&vUg>%jSHbJy zT6iP875*2z2i^;}!N=ha_#E5?UxRPLx8VoyQ|P%_mn$<Xq}S24?fEvdFFYFN!r=Rn z{0CtVgPyN-ywl+XI0aU~VEb)_J0E)%Y=kY)f3WBD7QrQOIa~>^g`UrK_~84QcoX(7 z;byo6-VYy!+u<{CCwv+1hHt@r@FVE?Ugsa|#w}`1?7-Fn(*d<AbHEX>5S|5B!Hw{4 zxC46GQ>X6*NX@};4!j874IhJ<8XG!%u+pXI#Wii$!42>(_&&_Y4#S-eE8tadJ$x0u z2T$?$L8U(yE`r`F*!q+36?mk-7fK%p8{k5?1#XAl4%gxP!D(<d{5kwJ{0L?p7RDO~ zt6;E_o6@@x`*rvs%=7m@`JV|dhF8NK@HKdhzyB%xU^oXZhQEbR!)$-=Q}|%1EO9z^ z6TBI2g~9hkg*&u&7%%vKDEn;e)$kYa&+ub-iof?M{8+dMu7pp*SKyKU-ly;<!&=yE zs;_H<NwX^4_s`+Cqwg@Q_1Dk%zX{*QKg-__)#kkFj^llc?~6yn@0eBLYCHCCN1taZ z-R1aS4S$UPeWucV2zw9q+osa_6#bv@3$se&p}wL2bW`Vdo~e8;H07U!i|~)Wzplf+ z-&DR2WBadBZNG)>2dQl@L*jBAVJe?~@EBA1oQQuCeSul6c_UN)UKhmt3Hk<8>D_KB z{rm9WW-9$X==-p9{JmG<zGo`la8uz%L2uCJ^o#Jn4t<STt@&2`?}Wd>{{>U&zJl$= zFKqt{`>1}Qoog!JL8kJ}hXtncJ>8tH6$8<)F_rH|Q~tk%oAH0qR6eg_e}UcO$S|F6 zn9Apy@F-L1oPd8jx|eNmKFjgH8vYo6?@#7@wwTj(ozWkM!P*MaU$d?B--G@6K0g2! znDQSBCzy&?f&VmEi+(5eui<Y^#eX0BV;Jn{qVvq<eLw*`!&Leu*yYfFrtftA9e@8B zzU%2X@IJW1RJc#DKZia1UO{><7`%6o?fDez-eb!gW-8s0a6EbmoQ{4TOrrl7`={_G z^xNSU_#oU4|7a?|7vOI6zrjz?KZiY!4a+&)RJ>8J5WN&u!wX;o^oCfDmxN2ue*k}s z{!@4Z`t#V{nab_%ujn7Z&tawp+^)wQ*w<8kN1BS)AAK+^z~4JcxxLQB_I^^fufo0t z-e@ZQr?LM4UqOEpz6(Ev|AN`yQGAu>FnFY?^p1yv(TBqE=q0cjy$vo#za0Ju{seA- zx0%ZKcKBQLhv75m&%r(DhaDHj>kW@JRo)X}9vlU|JCgk;o62u0JO_OiY(Z~_%g{Gr zZ-)1yKL($HFTvgLZ>I8l7k-YOnH!d;mnr`~umqOF^Guby9?pgH;H7YdsdQGtHRv1R z?dW&HhtZ#g`_Mmt`_X$GPdQ;fm<vxfmG5A9D*AX>hF%Hl(3{~^=-0p-&~Ju!z^(8h z_>`%9pMfu<?}6{5e+&nGHw>Q-$C#?uB3K5e!<n$j%+!{ya3T6q_#^ad;m^@`U_T3A zMgI$Y5B>wjP6*5MH8WE`e}PA#e;4MV4}%xNR(O%A^STUP1+Rze;jO0f*#x(uKLme| z{zv#{^mpK4{loaZ;jyOjJrU-?QSeMS*;Kw$;W_BDU<-OX{2}@#?9K3g^vB>c@Fln# z{>@Z=@50Z~Gfxc5+sl-HA6Np*;d!R-KR6f8gO|b;rqWpn*Pw5Nx1-+)pF)2J`+fM| z=vgO)`5q3x1&@OROyxHSjz%8`r=p()XQBTP`)c?z^qb)Aa0`48Za0<R4!8^b4frnl zhj8Hc!ti<UG*k6h2uoo#yZ|<s%I88jAAJd2iM|SMM1KnV8Tc~#9=H#F0>6NV4hZwh zf&EOCGZzj*&xcKLE?j6T{8IQscpba}-fZf;ehIgrKM0>j{{ws;{c9(O@eVgNPWZN| z{7!;H;Al7wPBE2VnW=c^qSwJW_^&b#)%KLwTd^O(egf_?m2bvCeUxqw_zhF~(eMN~ z2#$cKn~FCcmZ49Fb?6On0s2PlU%)%j?}d-R9q<MCnyLK$4Btcl2aKN*`X35&Or6I# z>>^Y3R*ilEY{b7A|HbH+!ymz)zzy(bQ{~xis=lAcehKb1mH#&eh2g#lk2j?cgu~$& zSOm*VrC$jzKyQE@==0$U^gFSC4Ie^(3O)~Cg@1wXnab}Y_yzi*gTwM3VamTBJO=$N z>}pf>n?P@Y^WhTs19+{e^sYA*??&`r!MpI^WvYH(!;a;Jc8;m|Ux&G->UA>qRCo^h zEO;SI!i(W@Q|Vm^uSZ`Ge}#Sr+=l))?04bk=$S*p^5nq2@Z0btQ~3>qBhk-*CFtdF zCi)MsuYx~CzY+cl-UELJA2*fXQ}9Lf*Wo+p@57JLPtFhH4K{V1#+s_<iLe~bfVFUr zsr*_@#ao2F3|@)<W>eR93-&JTJ=lMRpP9<{_@QCCC&Hno^wVG=EQQtZ0#oIg1+~0K z5N|$QhJFQHgZ>cqWAKmYFT*`>AN&M<VJg4OVIg~&DrY}<0{ZvhOjr+FO@&_o{{vnL zSHrcY^4S1?g?<m*hW;pg0sRZ?%;A*JbopQ|JQ)sy|7I$`Ghhk&G&mEz9(JOy!@d#z z7y57DHuxlb4!&Y4zt`bA=zoX)!%X{U!Le{0oN89-eJrejjqv+$k*RbpfmfohhU?LP z4sSvK6ZRXX+W80QpTo=%Vg5O=FZ{Nt{Ej!PHSR+n0mqo~Kiky(ae=A#MYGZ8!1?Ga z;41X%;70U^;O|YP_gCzXu@4^^rhk+v{}Zr>V4sRzgk6q(9(E`8e_;O%`xfjwv44mC z680YKcd<Xmj*kk<^L10@ISTtk>>=3yhFyex7WR4A4cOnuz8L!o?A6#eVBdy)H}-?r zPh!7-{W|tL*q>l$j1J3tNK8CSzuz!*9WQ|T8Xn7(y##K8`{0ooq5qk10o(=sy8_3L z>0_P=8=>dbt$W_wya{^#+P3GX&Hb=<Jhc16(XbSH{@UR^KW+N&Buvkjnwz12UvAs; zp5{In%L;AJUs@jk$3V|3T3-RzLeKYE-wXG{f*zq>49|yca4p;nABDT%KIk9QJN>?} K6#Dm`*8eZBm<I#^ diff --git a/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Linux_x86_64/libexpat.a b/Src/Plugins/DSP/sc_serv3/libs/Aol_XML/Linux_x86_64/libexpat.a deleted file mode 100644 index d24c5d8d31f923e7e806388eb1529a0fc647f13f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861176 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�k{O*wS9Q41iVxG6p6dcE@95Ezf~Lrr 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 diff --git a/Src/Plugins/DSP/sc_serv3/main.cpp b/Src/Plugins/DSP/sc_serv3/main.cpp deleted file mode 100644 index 3b167b49..00000000 --- a/Src/Plugins/DSP/sc_serv3/main.cpp +++ /dev/null @@ -1,1213 +0,0 @@ -#ifdef _WIN32 -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0601 -#include <winsock2.h> -#include <conio.h> -#else -#include <sys/resource.h> -#include <termios.h> -#endif -#include <limits.h> -#include <stdio.h> -#include <stdlib.h> -#include <string> -#include "services/stdServiceImpl.h" -#include "file/fileUtils.h" -#include "global.h" -#include "threadedRunner.h" -#include "protocol_relay.h" -#include "w3cLog.h" -#include "yp2.h" -#include "updater.h" -#include "auth.h" -#include "streamData.h" -#include "adminList.h" -#include "banList.h" -#include "ripList.h" -#include "agentList.h" -#include "cpucount.h" -#include "stats.h" -#include "bandwidth.h" -#include "cache.h" - -#ifdef _WIN32 -#define _WSPIAPI_H_ -#endif -//#include <GeoIP.h> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[MAIN] " - -#ifdef _WIN32 -#include <Mswsock.h> -static void win32SocketSetup() throw(runtime_error) -{ - WSADATA wsaData = {0}; - WORD wVersionRequested = MAKEWORD( 2, 2 ); - int err = WSAStartup(wVersionRequested, &wsaData); - if (err != 0) - { - throw runtime_error("Could not find usable Winsock DLL"); - } - - /* Confirm that the WinSock DLL supports 2.2.*/ - /* Note that if the DLL supports versions greater */ - /* than 2.2 in addition to 2.2, it will still return */ - /* 2.2 in wVersion since that is the version we */ - /* requested. */ - - if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) - { - /* Tell the user that we could not find a usable */ - /* WinSock DLL. */ - WSACleanup(); - throw runtime_error("Could not find appropriate winsock dll version"); - } - /* The WinSock DLL is acceptable. Proceed. */ - - // if we can detect WSAPoll(..) then we'll use that over - // select which means Vista+ should be similar to Linux. - HINSTANCE ws2_32 = GetModuleHandle(TEXT("WS2_32.DLL")); - if (ws2_32 != NULL) - { - typedef INT (WSAAPI *LPFN_WSAPOLL)(LPWSAPOLLFD fdarray, ULONG nfds, INT timeout); - extern LPFN_WSAPOLL fnWSAPoll; - fnWSAPoll = (LPFN_WSAPOLL)GetProcAddress(ws2_32, "WSAPoll"); - } -} - -static void win32SocketCleanup() throw() -{ - WSACleanup(); -} -#else -int _kbhit(void) -{ - struct termios oldt, newt; - tcgetattr(STDIN_FILENO, &oldt); - newt = oldt; - newt.c_lflag &= ~(ICANON | ECHO); - tcsetattr(STDIN_FILENO, TCSANOW, &newt); - int oldf = fcntl(STDIN_FILENO, F_GETFL, 0); - fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); - - int ch = getchar(); - tcsetattr(STDIN_FILENO, TCSANOW, &oldt); - fcntl(STDIN_FILENO, F_SETFL, oldf); - - return (ch != EOF); -} -#endif - -void scheduleRelay(const config::streamConfig &info) throw() -{ - // only attempt to run if not indicated as having moved - if(gOptions.stream_movedUrl(info.m_streamID).empty()) - { - threadedRunner::scheduleRunnable(new protocol_relay(info)); - } -} - -utf8 getLogFile(utf8 fileName) -{ -#ifdef _WIN32 - // this will fill in the default log path as required - wchar_t s_defaultFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(DEFAULT_LOGW, s_defaultFileName, MAX_PATH); - utf8 m_defaultFilename(utf32(s_defaultFileName).toUtf8()), m_fileName = fileName; - - HANDLE m_file = ::CreateFileW(m_fileName.toWString().c_str(),GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - m_file = ::CreateFileW(m_defaultFilename.toWString().c_str(),GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - uniFile::filenameType fallbackFilename("%temp%\\sc_serv_" + tos(getpid()) + ".log"); - wchar_t s_fallbackFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(fallbackFilename.toWString().c_str(), s_fallbackFileName, MAX_PATH); - utf8 m_fallbackFilename(utf32(s_fallbackFileName).toUtf8()); - - m_file = ::CreateFileW(m_fallbackFilename.toWString().c_str(),GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); - if (m_file != INVALID_HANDLE_VALUE) - { - forgetHandleInvalid(m_file); - } - else - { - m_fileName = m_fallbackFilename; - } - } - else - { - m_fileName = m_defaultFilename; - } - } -#else - utf8 m_defaultFilename = gOptions.logFile_Default(), m_fileName = fileName; - - int m_file = ::open(m_fileName.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - m_file = ::open(m_defaultFilename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - uniFile::filenameType fallbackFilename("/tmp/sc_serv_" + tos(getpid()) + ".log"); - m_file = ::open(fallbackFilename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - throw runtime_error("Logger could not open the log file \"" + m_fileName.hideAsString() + "\" for writing [" + errMessage().hideAsString() + "]. Check the directory exists and another instance is not already running."); - } - else - { - m_fileName = fallbackFilename; - } - } - else - { - m_fileName = m_defaultFilename; - } - } -#endif - return m_fileName; -} - -// event triggers for main loop -static vector<HANDLE> s_ControlEvents; - -class sc_serv2_service -{ - // log messages that have been stuffed in config objects deferred list. - // this only need be called at startup, to display messages that were created during - // system initialization, but could not be displayed because the loggers didn't yet exist. - static void logDeferredMessages() - { - const vector<utf8> &deferred_error_log_messages(gOptions.deferredErrorLogMessages()); - for (vector<utf8>::const_iterator i = deferred_error_log_messages.begin(); i != deferred_error_log_messages.end(); ++i) - { - ELOG((*i).hideAsString()); - } - - const vector<utf8> &deferred_warn_log_messages(gOptions.deferredWarnLogMessages()); - for (vector<utf8>::const_iterator i = deferred_warn_log_messages.begin(); i != deferred_warn_log_messages.end(); ++i) - { - WLOG((*i).hideAsString()); - } - - gOptions.clearDeferredErrorLogMessages(); - gOptions.clearDeferredWarnLogMessages(); - } - -public: - static void addCustomLogElements() {} - sc_serv2_service() {} - - // main application loop - static int go(stdServiceBase &base) throw() - { - g_upTime = ::time(NULL); - g_userAgent = g_userAgentBase + gOptions.getVersionBuildStrings(); - #ifdef _WIN32 - bool win32_socket_cleanup_required(false); - #endif - int mainResult = 0; // result of main loop - utf8 pidFn; - vector<threadedRunner*> runners; - - try - { -runserver: -#ifdef CONFIG_BUILDER - bool builderMode = (gOptions.confFile() == "builder" || gOptions.confFile() == "-b"); - bool setupMode = (gOptions.confFile() == "setup" || gOptions.confFile() == "-s" || builderMode); -#else - bool setupMode = (gOptions.confFile() == "setup" || gOptions.confFile() == "-s"); -#endif - bool gotConfig = (!gOptions.confFile().empty() && uniFile::fileExists(gOptions.confFile())); - // look for sc_serv.conf or sc_serv.ini to emulate v1 DNAS behaviour as - // too many people cannot get on with having to specify a config file :( - if (gotConfig == false && setupMode == false) - { - utf8 currentLogFile = gOptions.logFile(); - - #ifdef _WIN32 - vector<wstring> fileList = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"sc_serv.ini", L"", true, true); - vector<wstring> fileListConf = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"sc_serv.conf", L"", true, true); - #else - vector<string> fileList = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_serv.ini", ""); - vector<string> fileListConf = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_serv.conf", ""); - #endif - - if (!fileList.empty()) - { - fileList.insert(fileList.end(), fileListConf.begin(),fileListConf.end()); - } - else - { - fileList = fileListConf; - } - - if (!fileList.empty()) - { - #ifdef _WIN32 - utf32 u32file(fileList[0]); - utf8 u8f(u32file.toUtf8()); - gotConfig = gOptions.load(u8f); - #else - gotConfig = gOptions.load(fileList[0]); - #endif - } - - // if these do not match then we need to update the log file being used - // as otherwise it reports the wrong thing on the admin pages, etc - if (gOptions.logFile() != currentLogFile) - { - base.startNormalLog(false); - } - } - - if (isPostSetup() == false) - { - if (gOptions.screenLog()) - { - base.startScreenLog(); - } - // during initial startup some messages are produced but cannot be logged because - // the loggers do not yet exist. These are in the deferred list. At this point they - // can be safely logged - logDeferredMessages(); - - gOptions.m_certPath = fileUtil::getFullFilePath(gStartupDirectory + "cacert.pem"); - if (!uniFile::fileExists(gOptions.m_certPath)) - { - WLOG(LOGNAME "Cannot find `" + gOptions.m_certPath + "'"); - WLOG(LOGNAME "Without `cacert.pem' the DNAS may not be able to contact the Directory"); - WLOG(LOGNAME "The latest can be downloaded from `http://curl.haxx.se/ca/cacert.pem'" + eol()); - } - - #ifdef _WIN32 - ILOG("*********************" + - string(!sDaemon ? "***************************" : "<<RUNNING_IN_SERVICE_MODE>>") + - "*********************"); - #else - ILOG("*********************" + - string(!sDaemon ? "***************************" : "<<RUNNING_IN__DAEMON_MODE>>") + - "*********************"); - #endif - ILOG("** Shoutcast Distributed Network Audio Server (DNAS) **"); - ILOG("** Copyright (C) 2014-2023 Radionomy SA, All Rights Reserved **"); - if (gotConfig == false && setupMode == false) - { - ILOG("** Use \"sc_serv [filename]\" to specify a config file **"); - } - ILOG("*********************************************************************"); - utf8 version = gOptions.getVersionBuildStrings(); -#if defined(_DEBUG) || defined(DEBUG) - version += "[DBUG]"; -#endif - ILOG(LOGNAME "Shoutcast DNAS/" SERV_OSNAME " v" + version + " (" __DATE__ ")"); - ILOG(LOGNAME "PID: " + tos(getpid())); - } - if (gotConfig) - { - ILOG(LOGNAME "Saving log output to `" + fileUtil::getFullFilePath(gOptions.realLogFile()) + "'"); - ILOG(LOGNAME "Automatic log rotation " + (!gOptions.rotateInterval() ? utf8("disabled") : utf8("interval: ") + timeString(gOptions.rotateInterval()))); - ILOG(LOGNAME "Loaded config from `" + fileUtil::getFullFilePath(gOptions.confFile()) + "'"); - } - else - { - uniFile::filenameType oldLogFile = gOptions.logFile(); - // if we get to this state then to make things easier, we attempt to offer - // some possible configuration files to attempt to load as the config file - int mode = (setupMode ? 2 : gOptions.promptConfigFile()); - if (mode <= 0) - { - if (mode == -1) - { - ELOG(LOGNAME "Aborting as no valid config files could be found."); - throwEx<runtime_error>(LOGNAME "Try running setup mode to create a valid config file."); - } - else if (mode == -2) - { - throwEx<runtime_error>(LOGNAME "Aborting at user request."); - } - else - { - if (!gOptions.confFile().empty() && !uniFile::fileExists(gOptions.confFile())) - { - throwEx<runtime_error>(LOGNAME "Passed config file does not exist (check the file path exists)"); - } - else - { - throwEx<runtime_error>(LOGNAME "No config file passed"); - } - } - } - else if (mode == 1) - { - // if these do not match then we need to update the log file being used - utf8 newLogFile = getLogFile(gOptions.logFile()); - if (newLogFile != oldLogFile) - { - uniString::utf8 file = newLogFile.substr(0,gOptions.logFile().rfind(fileUtil::getFilePathDelimiter())).c_str(); - if ((file == newLogFile) || fileUtil::directoryExists(fileUtil::onlyPath(newLogFile))) - { - #ifdef _WIN32 - // see if we can create the file, if not then just keep using the temp folder for the log file as we know it's ok - HANDLE m_file = ::CreateFileW(newLogFile.toWString().c_str(),GENERIC_WRITE, - FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); - if (m_file != INVALID_HANDLE_VALUE) - { - gOptions.setOption(utf8("reallogfile"), newLogFile); - forgetHandleInvalid(m_file); - base.startNormalLog(true); - } - // make sure it's showing the correct log file - else - { - // this will fill in the default log path as required - wchar_t m_fileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(DEFAULT_LOGW, m_fileName, MAX_PATH); - utf8 log(utf32(m_fileName).toUtf8()); - gOptions.setOption(utf8("logfile"), log); - gOptions.setOption(utf8("reallogfile"), log); - ILOG(LOGNAME "Logger keeping log file as `" + fileUtil::getFullFilePath(log) + "'"); - ILOG(LOGNAME "Check you have write permissions for the folder(s) set in the config file."); - } - #else - // see if we can create the file, if not then just keep using the temp folder for the log file as we know it's ok - int m_file = ::open(newLogFile.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file != -1) - { - ::close(m_file); - gOptions.setOption(utf8("reallogfile"), newLogFile); - base.startNormalLog(true); - } - // make sure it's showing the correct log file - else - { - // this will fill in the default log path as required - utf8 log(DEFAULT_LOG); - gOptions.setOption(utf8("logfile"), log); - gOptions.setOption(utf8("reallogfile"), log); - ILOG(LOGNAME "Logger keeping log file as `" + fileUtil::getFullFilePath(log) + "'"); - ILOG(LOGNAME "Check you have write permissions for the folder(s) set in the config file."); - } - #endif - } - else - { - throwEx<runtime_error>(LOGNAME "Log file path does not exist (check the folder path exists)"); - } - } - - ILOG(LOGNAME "Saving log output to `" + fileUtil::getFullFilePath(gOptions.realLogFile()) + "'"); - ILOG(LOGNAME "Automatic log rotation " + (!gOptions.rotateInterval() ? utf8("disabled") : - utf8("interval: ") + timeString(gOptions.rotateInterval()))); - ILOG(LOGNAME "Loaded config from `" + fileUtil::getFullFilePath(gOptions.confFile()) + "'"); - } - else if (mode == 2) - { - if (setupMode) - { -#ifdef CONFIG_BUILDER - if (!builderMode) - { -#endif - ILOG(LOGNAME "Entering setup mode - Open 127.0.0.1:8000/setup in a"); - ILOG(LOGNAME "browser on the same machine the DNAS was started on"); -#ifdef CONFIG_BUILDER - } - else - { - ILOG(LOGNAME "Entering builder mode - Open 127.0.0.1:8000/builder in"); - ILOG(LOGNAME "a browser on the same machine the DNAS was started on"); - } -#endif - ILOG(LOGNAME "if the browser does not automatically open the page."); - ILOG(LOGNAME "If working remotely then replace 127.0.0.1 with the"); - ILOG(LOGNAME "IP / address of the remote system to use this mode."); - } - - // attempt to open the setup / builder page on the system's browser i.e. kiss option - #ifdef _WIN32 -#ifdef CONFIG_BUILDER - if (!builderMode) - { -#endif - ::system("start http://127.0.0.1:8000/setup"); -#ifdef CONFIG_BUILDER - } - else - { - ::system("start http://127.0.0.1:8000/builder"); - } -#endif - #else -#ifdef CONFIG_BUILDER - if (!builderMode) - { -#endif - ::system("(if(which xdg-open > /dev/null)then(xdg-open http://127.0.0.1:8000/setup)elif(which gnome-open > /dev/null)then(gnome-open http://127.0.0.1:8000/setup)fi)&>/dev/null"); -#ifdef CONFIG_BUILDER - } - else - { - ::system("(if(which xdg-open > /dev/null)then(xdg-open http://127.0.0.1:8000/builder)elif(which gnome-open > /dev/null)then(gnome-open http://127.0.0.1:8000/builder)fi)&>/dev/null"); - } -#endif - #endif - - #ifdef _WIN32 - win32SocketSetup(); - win32_socket_cleanup_required = true; - #endif - - threadedRunner *tr = new threadedRunner; - runners.push_back(tr); - tr->start(); - - threadedRunner::scheduleRunnable(new microServer("", gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_WEB_SETUP), - microServer::L_MISC)); - - s_ControlEvents.push_back(serviceMain::sStop); - while (!iskilled()) - { - #if defined(_WIN32) && defined(_WIN64) - if (WaitForMultipleObjects((DWORD)s_ControlEvents.size(), &(s_ControlEvents[0]), 0, 1000) == WAIT_OBJECT_0) - #else - if (WaitForMultipleObjects(s_ControlEvents.size(), &(s_ControlEvents[0]), 0, 1000) == WAIT_OBJECT_0) - #endif - { - // stop signal - setkill(1); - break; - } - } - - if (iskilled() == 2) - { - ILOG(LOGNAME "Stopping setup mode. Preparing for broadcasting..."); - } - else - { - ILOG(LOGNAME "Stopping setup mode. Shutting down..."); - } - - for (vector<threadedRunner*>::const_iterator i = runners.begin(); i != runners.end(); ++i) - { - (*i)->stop(); - (*i)->join(); - delete (*i); - } - runners.clear(); - - #ifdef _WIN32 - if (win32_socket_cleanup_required) - { - win32SocketCleanup(); - } - #endif - - s_ControlEvents.clear(); - - // if we get here, we effectively restart the server post-setup - if (iskilled() == 2) - { - #ifdef _WIN32 - gOptions.load(gStartupDirectory + "sc_serv.conf"); - #else - gOptions.load(gStartupDirectory.hideAsString() + "sc_serv.conf"); - #endif - setPostSetup(true); - setkill(0); - goto runserver; - } - setkill(0); - return mainResult; - } - } - - // just make sure that we can do this else we need to abort - if (curl_global_init(CURL_GLOBAL_DEFAULT) != CURLE_OK) - { - throwEx<runtime_error>(LOGNAME "Unable to load libcurl & / or its dependencies - cannot continue."); - } - - config::streams_t streams; - gOptions.getStreamConfigs(streams); - // the old sc_serv had two sets of passwords, mimic this - if (gOptions.adminPassword().empty()) - { - WLOG(gOptions.logSectionName() + "A dedicated `adminpassword' should be specified in the configuration."); - WLOG(gOptions.logSectionName() + "Legacy handling has been enabled to map `adminpassword' to `password'."); - WLOG(gOptions.logSectionName() + "This is not deemed safe and `adminpassword' should be directly set."); - gOptions.setOption(utf8("adminpassword"), gOptions.password()); - } - else - { - // otherwise if explicitly set as the same then we abort - if (gOptions.adminPassword() == gOptions.password()) - { - throwEx<runtime_error>(gOptions.logSectionName() + "You must specify different passwords for `adminpassword' and `password'."); - } - } - - - // abort no matter what as without passwords we can be at risk - if (gOptions.adminPassword().empty() && gOptions.password().empty()) - { - throwEx<runtime_error>(gOptions.logSectionName() + "You must specify a password for `adminpassword' and `password'."); - } - - if (!streams.empty()) - { - if (gOptions.setupPasswords(streams)) - { - // if there was any error on the passwords then we need to abort - // so it can be fixed. important if using multi-stream hosting! - throwEx<runtime_error>(gOptions.logSectionName() + "Check the stream configurations above or ensure `adminpassword' and `password' have been set."); - } - } - else - { - // if there are no stream configs and no main password - // then we'll also need to abort as that's not allowed - if (gOptions.password().empty()) - { - throwEx<runtime_error>(gOptions.logSectionName() + "You must specify a password for `password'."); - } - } - - - if (!gOptions.cdn().empty()) - { - ILOG(LOGNAME "CDN " + utf8(gOptions.cdn() == "on" ? "opt-in" : "opt-out") + " mode enabled -> ensure all stream(s) are properly configured"); - } - - const int cpu_count = gOptions.getCPUCount(); // check options - ILOG(LOGNAME "Calculated CPU count is " + tos(cpucount()) + " -> " + (cpu_count == cpucount() ? "using " + - utf8(cpu_count > 1 ? "all" : "the") + " available CPU" + (cpu_count > 1 ? "s" : "") : - tos(cpu_count) + " CPU" + (cpu_count > 1 ? "s" : "") + " specified to be used")); -#ifndef _WIN32 - rlimit rlim = {0}; - if(!getrlimit(RLIMIT_NOFILE, &rlim)) - { - ILOG(LOGNAME "Limited to " + tos(rlim.rlim_cur) + " file descriptors [relates to ulimit -n]"); - } -#endif - // calculate defaults for yp - // if 'publicport' is not the same as 'portbase' - // then we use it instead of the normal portbase - g_portForClients = ((gOptions.publicPort() != -1 && (gOptions.publicPort() != gOptions.portBase())) ? gOptions.publicPort() : gOptions.portBase()); - - // before anything else starts up we'll start this as needed - metrics::metrics_apply(gOptions); - auth::init(); - - // load any SSL certificates - threadedRunner::SSL_init(); - - #ifdef _WIN32 - win32SocketSetup(); - win32_socket_cleanup_required = true; - #endif - - ILOG(LOGNAME "Starting " + tos(cpu_count) + " network thread" + (cpu_count > 1 ? "s" : "")); - - for (int x = 0; x < cpu_count; ++x) - { - threadedRunner *tr = new threadedRunner; - runners.push_back(tr); - tr->start(); - } - - constructMessageResponses(); - - // w3c logging - if (gOptions.w3cEnable()) - { - w3cLog::open(gOptions.w3cLog()); - } - - // load geoIP database if able to be found - /*{ - static utf8 dir = gStartupDirectory; - char path[1024] = {0}; - GeoIP_setup_custom_directory(strncpy(path, (char*)dir.hideAsString().c_str(), sizeof(path))); - GeoIP * gi = GeoIP_new(GEOIP_MEMORY_CACHE); - if(gi != NULL) - { - ILOG(LOGNAME "Loaded GeoIP database - Ban and Reserve by country is enabled"); - const char* returnedCountry, - * ips[] = {"58.218.199.227","77.76.181.71","87.104.93.85","195.238.117.56", - "114.244.60.232","108.52.34.116","91.121.164.186","78.46.75.50", - "62.75.139.39","172.17.200.143","205.188.215.228","82.30.80.183" - }; - for (int ip = 0; ip < sizeof(ips)/sizeof(ips[0]); ip++) - { - utf8 details; - returnedCountry = GeoIP_country_code_by_addr(gi, ips[ip]); - details = (returnedCountry ? returnedCountry : utf8("UNKNOWN")); - returnedCountry = GeoIP_country_name_by_addr(gi, ips[ip]); - details += " (" + (returnedCountry ? returnedCountry : utf8("UNKNOWN")) + ")"; - WLOG(details); - } - - GeoIP_delete(gi); - } - }*/ - - // load up stream branding artwork - gOptions.m_artworkBody[0] = loadLocalFile(fileUtil::getFullFilePath(gOptions.artworkFile()), LOGNAME, 523872/*32 x (16384 - 6 - 6 - 1)*/); - - // load up ban file - g_banList.load(gOptions.banFile(),0); - - // load up rip file - g_ripList.load(gOptions.ripFile(),0); - - // load up admin access file - g_adminList.load(gOptions.adminFile()); - - // load up agent file - g_agentList.load(gOptions.agentFile(),0); - - // per-stream options - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // w3c logging - if (gOptions.read_stream_w3cLog((*i).first)) - { - w3cLog::open(gOptions.stream_w3cLog((*i).first),(*i).first); - } - - // load up ban file - if (gOptions.read_stream_banFile((*i).first)) - { - g_banList.load(gOptions.stream_banFile((*i).first),(*i).first); - } - - // load up rip file - if (gOptions.read_stream_ripFile((*i).first)) - { - g_ripList.load(gOptions.stream_ripFile((*i).first),(*i).first); - } - - // load up agent file - if (gOptions.read_stream_agentFile((*i).first)) - { - g_agentList.load(gOptions.stream_agentFile((*i).first),(*i).first); - } - - // load up stream branding artwork - if (gOptions.read_stream_artworkFile((*i).first)) - { - gOptions.m_artworkBody[(*i).first] = loadLocalFile(fileUtil::getFullFilePath(gOptions.stream_artworkFile((*i).first)), LOGNAME, 523872/*32 x (16384 - 6 - 6 - 1)*/); - } - } - - utf8 srcBindAddr = stripHTTPprefix(stripWhitespace(gOptions.srcIP())); - utf8 destBindAddr = metrics::metrics_verifyDestIP(gOptions, false); - - if (g_IPAddressForClients.empty()) - { - char s[MAXHOSTNAMELEN] = {0}; // paranoia - if (!::gethostname(s, MAXHOSTNAMELEN - 1)) - { - // changed to not throw (build 43) as this will still run correctly - // and has caused a number of users to go back to v1 unnecessarily. - g_IPAddressForClients = socketOps::hostNameToAddress(s, g_portForClients); - } - } - else - { - utf8 addr = socketOps::hostNameToAddress(destBindAddr.hideAsString().c_str()); - if (!addr.empty()) - { - destBindAddr = addr; - } - /*hostent *host; - if ((host = ::gethostbyname((const char *)destBindAddr.c_str())) != NULL){ - destBindAddr = (inet_ntoa(*( (struct in_addr *)host->h_addr))); - }*/ - } - - if (!srcBindAddr.empty()) - { - utf8 addr = socketOps::hostNameToAddress(srcBindAddr.hideAsString().c_str()); - if (!addr.empty()) - { - srcBindAddr = addr; - } - /*hostent *host; - if ((host = ::gethostbyname((const char *)srcBindAddr.c_str())) != NULL){ - srcBindAddr = (inet_ntoa(*( (struct in_addr *)host->h_addr))); - }*/ - } - - // for legacy sources (with optional portbase override / disable) - g_legacyPort = ((gOptions.portLegacy() != gOptions.portBase() + 1) && (gOptions.portLegacy() != -1) ? - gOptions.portLegacy() : gOptions.portBase() + 1); - - // if src and dst are same we configure ourselves a bit differently - if ((srcBindAddr == destBindAddr) || - (inet_addr((const char *)srcBindAddr.c_str()) == inet_addr((const char *)destBindAddr.c_str()))) - { - // for clients and sources - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT | - P_SHOUTCAST1SOURCE | P_SHOUTCAST2SOURCE | P_WEB), - (microServer::ListenTypes_t)(microServer::L_SOURCE | microServer::L_CLIENT))); - } - else - { - // changed in b71 as it's possible to specify a destip which does not correctly bind but the - // value of destip could be correct and able to work in all other areas e.g. via listen.pls - // so if there is an issue with the destip specific bind, then attempt a destip==srcip bind - microServer *r = 0; - try - { - // for clients - // changed in b79 - r = new microServer(destBindAddr.hideAsString(), gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT | P_SHOUTCAST1SOURCE | P_WEB), - (microServer::ListenTypes_t)(microServer::L_SOURCE | microServer::L_CLIENT)); - threadedRunner::scheduleRunnable(r); - - // for sources - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_SHOUTCAST1SOURCE | P_SHOUTCAST2SOURCE | P_WEB), - microServer::L_SOURCE)); - } - catch(const exception &ex) - { - if (r == 0) - { - WLOG(ex.what()); - } - - try - { - // for clients and sources - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), gOptions.portBase(), - (microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT | - P_SHOUTCAST1SOURCE | P_SHOUTCAST2SOURCE | P_WEB), - (microServer::ListenTypes_t)(microServer::L_SOURCE | microServer::L_CLIENT))); - } - catch(const exception &exx) - { - // changed in b79 - // if we get to here, if we've been able to bind at least on the destip - // but the srcip bind fails then attempt to allow v2 sources on destip. - if (r != 0) - { - r->updateProtocols((microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT | - P_SHOUTCAST1SOURCE | P_SHOUTCAST2SOURCE | P_WEB), - (microServer::ListenTypes_t)(microServer::L_SOURCE | microServer::L_SOURCE2), gOptions.portBase()); - } - else - { - throwEx<runtime_error>(exx.what()); - } - } - } - } - - if (g_legacyPort > 0) - { - // for v1 sources - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), g_legacyPort, - (microServer::AllowableProtocols_t)(P_SHOUTCAST1SOURCE), - microServer::L_SOURCE)); - } - else - { - ILOG("[MICROSERVER] Legacy v1 source support not enabled"); - } - - // for flash policy file server - if (gOptions.flashPolicyServerPort() != -1) - { - threadedRunner::scheduleRunnable(new microServer(srcBindAddr.hideAsString(), gOptions.flashPolicyServerPort(), - (microServer::AllowableProtocols_t)(P_FLASHPOLICYFILE), microServer::L_FLASH)); - } - else - { - ILOG("[MICROSERVER] Flash policy file server not enabled"); - } - - // and finally look at adding any extra client ports e.g. so you can run on 80 - // and 8000 and anything else for clients that cannot connect to the main port - if (!gOptions.alternatePorts().empty()) - { - vector<utf8> tokens = tokenizer(gOptions.alternatePorts(), ','); - for (size_t tok = 0; tok < tokens.size(); tok++) - { - u_short port = (u_short)atoi(tokens[tok].hideAsString().c_str()); - // make sure we're only allowing a valid port number and it isn't already been registered - if (port && (port != gOptions.portBase()) && (port != g_portForClients)) - { - microServer *r = 0; - try - { - r = new microServer(srcBindAddr.hideAsString(), port, - (microServer::AllowableProtocols_t)(P_SHOUTCAST1CLIENT | P_SHOUTCAST2CLIENT), - (microServer::ListenTypes_t)(microServer::L_CLIENT_ALT)); - threadedRunner::scheduleRunnable(r); - gOptions.m_usedAlternatePorts += "," + tokens[tok]; - } - catch(const exception &ex) - { - if (r == 0) - { - WLOG(ex.what()); - WLOG("[MICROSERVER] Alternate client connections on port " + tokens[tok] + " will not work"); - } - } - } - else - { - if (port != gOptions.portBase() && port != g_portForClients) - { - WLOG("[MICROSERVER] Skipping `" + tokens[tok] + "' as it is an invalid alternate client port"); - } - else - { - WLOG("[MICROSERVER] Skipping alternate port " + tokens[tok] + " as it is already a used port"); - } - } - } - } - - if (gOptions.pidFile().empty() || (gOptions.pidFile() == "sc_serv_$.pid")) - { - pidFn = gStartupDirectory + "sc_serv_" + tos(gOptions.portBase()) + ".pid"; - } - else if (!gOptions.pidFile().empty()) - { - pidFn = gOptions.pidFile(); - } - - if (!pidFn.empty()) - { - FILE *f = uniFile::fopen(pidFn, "wb"); - if (f) - { - try - { - utf8 s(tos(getpid()) + eol()); - if (fwrite(s.c_str(),1,s.size(),f) != s.size()) - { - ELOG(LOGNAME "I/O error writing PID file `" + fileUtil::getFullFilePath(pidFn) + "'"); - } - } - catch(...) - { - if (f) - { - ::fclose(f); - } - ELOG(LOGNAME "Error writing to PID file `" + fileUtil::getFullFilePath(pidFn) + "'"); - } - if (f) - { - ::fclose(f); - } - } - else - { - ELOG(LOGNAME "Could not open PID file `" + fileUtil::getFullFilePath(pidFn) + - "' for writing (" + errMessage().hideAsString() + ")"); - } - } - - // schedule relays - if (!gOptions.startInactive()) - { - vector<config::streamConfig> relayList(gOptions.getRelayList()); - if (!relayList.empty()) - { - for_each(relayList.begin(), relayList.end(), scheduleRelay); - } - } - - //threadedRunner::scheduleRunnable(new yp2); - threadedRunner::scheduleRunnable(new updater); - - s_ControlEvents.push_back(serviceMain::sStop); -#ifndef _WIN32 - s_ControlEvents.push_back(serviceMain::sWINCH); - s_ControlEvents.push_back(serviceMain::sHUP); - s_ControlEvents.push_back(serviceMain::sUSR1); - s_ControlEvents.push_back(serviceMain::sUSR2); -#endif - -#ifdef OPEN_PORT_CHECKER - //BOOL CheckPortTCP(short int dwPort , char*ipAddressStr) - { - struct sockaddr_in client; - int sock; - - client.sin_family = AF_INET; - client.sin_port = htons(gOptions.portBase()-1000); - //client.sin_addr.s_addr = inet_addr(g_IPAddressForClients/*destBindAddr*/.hideAsString().c_str()/*"127.0.0.1"); - client.sin_addr.s_addr = inet_addr("192.168.2.3"/*"127.0.0.1"*/); - - sock = (int) socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - ELOG(g_IPAddressForClients + ":" + tos(gOptions.portBase()) + /*destBindAddr*/ + " " + tos(connect(sock, (struct sockaddr *) &client,sizeof(client)) == 0)); - } -#endif - - while (!iskilled()) - { - metrics::metrics_wakeup(); - - #if defined(_WIN32) && defined(_WIN64) - int waitResult = WaitForMultipleObjects((DWORD)s_ControlEvents.size(),&(s_ControlEvents[0]),0,1000); - #else - int waitResult = WaitForMultipleObjects(s_ControlEvents.size(),&(s_ControlEvents[0]),0,1000); - #endif - switch (waitResult) - { - // stop signal - case WAIT_OBJECT_0: - { - setkill(true); - // remove the pid file on successful exit - if (!pidFn.empty() && uniFile::fileExists(pidFn)) - { - uniFile::unlink(pidFn); - } - break; - } -#ifdef _WIN32 - case WAIT_OBJECT_0+1: // admin server - break; - - case WAIT_OBJECT_0+2: // main msg loop - break; -#else - case WAIT_OBJECT_0+1: // winch - { - // reserved, banned and blocked user agent list(s) reload - reloadBanLists(); - reloadRipLists(); - reloadAdminAccessList(); - reloadAgentLists(); - break; - } - case WAIT_OBJECT_0+2: // hup - { - ILOG(LOGNAME "Rotating log and W3C files [PID: " + tos(getpid()) + "]"); - ROTATE; - printUpdateMessage(); - rotatew3cFiles("w3c"); - ILOG(LOGNAME "Rotated log and W3C files [PID: " + tos(getpid()) + "]"); - break; - } - case WAIT_OBJECT_0+3: // usr1 - { - // config reload - reloadConfig(false); - break; - } - case WAIT_OBJECT_0+4: // usr2 - { - // forced config reload - reloadConfig(true); - break; - } - case WAIT_OBJECT_0+5: // admin server - break; - - case WAIT_OBJECT_0+6: // main msg loop - break; -#endif - default: - { - } - } - } - - ILOG(LOGNAME "Exiting threads..."); - if (gOptions.configRewrite()) - { - gOptions.rewriteConfigurationFile((gOptions.configRewrite() == 1), true); - } - } - catch(const exception &ex) - { - ELOG(ex.what()); - mainResult = -2; - } - catch(...) - { - ELOG(LOGNAME "Unknown exception caught"); - mainResult = -1; - } - - if (stats::getTotalUniqueListeners() > 0) - { - ILOG(LOGNAME "Terminating listeners..."); - stats::kickAllClients(0, true); - } - - // Stop all sources and wait up to ten seconds for everything to clear out - const streamData::streamIDs_t streamIds = streamData::getStreamIds(true); - if (!streamIds.empty()) - { - ILOG(LOGNAME "Terminating sources..."); - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - // kick source off system - streamData::killStreamSource((*i)); - } - } - - if (yp2::requestsInQueue()) - { - ILOG(LOGNAME "Running Directory cleanup..."); - // now wait for YP to clear out - for (int x = 0; (x < 100); ++x) - { - if (yp2::requestsInQueue()) - { - safe_sleep(0, 10000); - } - else - { - break; - } - } - } - - for (vector<threadedRunner*>::const_iterator i = runners.begin(); i != runners.end(); ++i) - { - (*i)->stop(); - (*i)->join(); - delete (*i); - } - - runners.clear(); - metrics::metrics_wakeup(true); - metrics::metrics_stop(); - auth::cleanup(); - - // general files to save - if (gOptions.saveBanListOnExit()) - { - g_banList.save(gOptions.banFile(),0); - } - - if (gOptions.saveRipListOnExit()) - { - g_ripList.save(gOptions.ripFile(),0); - } - - if (gOptions.saveAgentListOnExit()) - { - g_agentList.save(gOptions.agentFile(),0); - } - - if (gOptions.w3cEnable()) - { - w3cLog::close(0); - } - - // per-stream files to save - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if (gOptions.saveBanListOnExit()) - { - if (gOptions.read_stream_banFile((*i).first) && !gOptions.stream_banFile((*i).first).empty()) - { - g_banList.save(gOptions.stream_banFile((*i).first),(*i).first); - } - } - - if (gOptions.saveRipListOnExit()) - { - if (gOptions.read_stream_ripFile((*i).first) && !gOptions.stream_ripFile((*i).first).empty()) - { - g_ripList.save(gOptions.stream_ripFile((*i).first),(*i).first); - } - } - - if (gOptions.saveAgentListOnExit()) - { - if (gOptions.read_stream_agentFile((*i).first) && !gOptions.stream_agentFile((*i).first).empty()) - { - g_agentList.save(gOptions.stream_agentFile((*i).first),(*i).first); - } - } - - if (gOptions.read_stream_w3cLog((*i).first)) - { - w3cLog::close((*i).first); - } - } - - #ifdef _WIN32 - if (win32_socket_cleanup_required) - { - win32SocketCleanup(); - } - #endif - - s_ControlEvents.clear(); - DeleteAllCaches(); - - stats::getFinalStats(); - bandWidth::getFinalAmounts(); - utf8 t = timeString(::time(NULL) - g_upTime); - ILOG(LOGNAME + (t.empty() ? "Shutdown" : "Shutdown after " + t + " running") + eol()); - - curl_global_cleanup(); - -/*#ifdef _WIN32 - { - wchar_t buf[MAX_PATH] = L"\""; - STARTUPINFO si = {sizeof(si), }; - PROCESS_INFORMATION pi; - GetModuleFileName(NULL, buf + 1, sizeof(buf) - 1); - wcsncat(buf, L"\"", MAX_PATH); - CreateProcess(NULL, buf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); - } -#else -#endif*/ - - // if we're in 'user' mode then if there was an exception - // we'll not immediately abort and instead keep things on - // display so it's easier for noobs, etc to see the error - if (!sDaemon && gOptions.screenLog() && (mainResult < 0)) - { - ILOG(LOGNAME "Press any key to continue . . ."); - while(!_kbhit()) {} - #ifdef _WIN32 - // do this so we consume the input which - // as we already have a custom _kbhit() - // on non-Windows already does it for us - _getch(); - #endif - } - return mainResult; - } -}; - -// create the appropriate handler for the app/daemon/service framework -int sm_main(const vector<utf8> &args) throw() -{ -#ifdef _WIN32 - stdServiceWin32<sc_serv2_service> s("Shoutcast DNAS"); -#else - stdServiceUnix<sc_serv2_service> s; -#endif - return s.sm_main(args); -} diff --git a/Src/Plugins/DSP/sc_serv3/manifest.xml b/Src/Plugins/DSP/sc_serv3/manifest.xml deleted file mode 100644 index 436c2df7..00000000 --- a/Src/Plugins/DSP/sc_serv3/manifest.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > - <assemblyIdentity - version="2.4.3.187" - processorArchitecture="X86" - name="Radionomy.SHOUTcast.DNAS" - type="win32" - /> - <description>SHOUTcast DNAS 2.4.3 Build 187</description> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> - <security> - <requestedPrivileges> - <requestedExecutionLevel - level="asInvoker" - /> - </requestedPrivileges> - </security> - </trustInfo> -</assembly> \ No newline at end of file diff --git a/Src/Plugins/DSP/sc_serv3/manifest64.xml b/Src/Plugins/DSP/sc_serv3/manifest64.xml deleted file mode 100644 index 7dcc9720..00000000 --- a/Src/Plugins/DSP/sc_serv3/manifest64.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > - <assemblyIdentity - version="2.4.3.187" - processorArchitecture="amd64" - name="Radionomy.SHOUTcast.DNAS" - type="win32" - /> - <description>SHOUTcast DNAS 2.4.3 Build 187</description> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> - <security> - <requestedPrivileges> - <requestedExecutionLevel - level="asInvoker" - /> - </requestedPrivileges> - </security> - </trustInfo> -</assembly> \ No newline at end of file diff --git a/Src/Plugins/DSP/sc_serv3/messagefile.h b/Src/Plugins/DSP/sc_serv3/messagefile.h deleted file mode 100644 index 4a0518fb..00000000 --- a/Src/Plugins/DSP/sc_serv3/messagefile.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// Values are 32 bit values laid out as follows: -// -// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 -// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -// +---+-+-+-----------------------+-------------------------------+ -// |Sev|C|R| Facility | Code | -// +---+-+-+-----------------------+-------------------------------+ -// -// where -// -// Sev - is the severity code -// -// 00 - Success -// 01 - Informational -// 10 - Warning -// 11 - Error -// -// C - is the Customer code flag -// -// R - is a reserved bit -// -// Facility - is the facility code -// -// Code - is the facility's status code -// -// -// Define the facility codes -// - - -// -// Define the severity codes -// - - -// -// MessageId: MSG_CMD_ERR -// -// MessageText: -// -// %1 -// -#define MSG_CMD_ERR 0xC0000001L - diff --git a/Src/Plugins/DSP/sc_serv3/messagefile.mc b/Src/Plugins/DSP/sc_serv3/messagefile.mc deleted file mode 100644 index f7caddb6..00000000 --- a/Src/Plugins/DSP/sc_serv3/messagefile.mc +++ /dev/null @@ -1,6 +0,0 @@ -MessageId=0x1 -Severity=Error -SymbolicName=MSG_CMD_ERR -Language=English -%1 -. diff --git a/Src/Plugins/DSP/sc_serv3/metadata.cpp b/Src/Plugins/DSP/sc_serv3/metadata.cpp deleted file mode 100644 index df55d841..00000000 --- a/Src/Plugins/DSP/sc_serv3/metadata.cpp +++ /dev/null @@ -1,459 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include "metadata.h" -#include "aolxml/aolxml.h" -#include "filenameMetadata.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include "streamData.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -metadata::metadata(const metadata &m) -{ - copy(m); -} - -metadata& metadata::operator=(const metadata &m) -{ - copy(m); - return *this; -} - -void metadata::clear() throw() -{ - for (keyValueMap_t::const_iterator i = m_keyValueMap.begin(); i != m_keyValueMap.end(); ++i) - { - delete (*i).second; - } - m_keyValueMap.clear(); -} - -void metadata::copy(const metadata &m) throw() -{ - clear(); - for (keyValueMap_t::const_iterator i = m.m_keyValueMap.begin(); i != m.m_keyValueMap.end(); ++i) - { - if ((*i).second) - { - m_keyValueMap.insert(make_pair((*i).first,(*i).second->clone())); - } - } -} - -metadata::~metadata() throw() -{ - clear(); -} - -// remove all values for key -void metadata::removeValue(const string &key) throw() -{ - keyValueMap_t::iterator i = m_keyValueMap.find(key); - while (i != m_keyValueMap.end()) - { - delete (*i).second; - m_keyValueMap.erase(i); - i = m_keyValueMap.find(key); - } -} - -bool metadata::valueExists(const string &key) const throw() -{ - return (m_keyValueMap.find(key) != m_keyValueMap.end()); -} - -//// only returns first one found -const metadata::metaValue_base* metadata::getValue(const string &key) const throw() -{ - keyValueMap_t::const_iterator i = m_keyValueMap.find(key); - return (i == m_keyValueMap.end() ? 0 : (*i).second); -} - -//// only returns first one found -utf8 metadata::getValueAsString(const std::string &key) const throw() -{ - static utf8 empty; - - const metaValue_base *mv = getValue(key); - return (mv ? mv->toString() : empty); -} - -void metadata::setValue(const string &key,metadata::metaValue_base *value) throw() -{ - m_keyValueMap.insert(make_pair(key,value)); -} - -utf8 metadata::safeXML(const string &tag,const metaValue_base *m) throw() -{ - static utf8 empty; - if (!m) return empty; - return m->toXML(tag); -} - -utf8 metadata::safeString(const metaValue_base *m) throw() -{ - static utf8 empty; - if (!m) return empty; - return m->toString(); -} - -bool metadata::noMeaningfulMetadata() const throw() -{ - return (m_keyValueMap.find(NAME()) == m_keyValueMap.end()); -} - -bool metadata::get_replayGain(double &gain) const throw() -{ - pair<keyValueMap_t::const_iterator,keyValueMap_t::const_iterator> mdrange = m_keyValueMap.equal_range("TXXX"); - for (keyValueMap_t::const_iterator i = mdrange.first; i != mdrange.second; ++i) - { - metadata::metaValue<ID3V2::userText_t> *md = dynamic_cast<metadata::metaValue<ID3V2::userText_t> *>((*i).second); - if (md) - { - ID3V2::userText_t ut = md->value(); - if (ut.m_id == "replaygain_track_gain" || ut.m_id == "REPLAYGAIN_TRACK_GAIN") - { - gain = atof((const char *)ut.m_text.c_str()); - return true; - } - } - } - return false; -} - -bool metadata::get_replayGain() const throw() -{ - double g; - return get_replayGain(g); -} - -const utf8 METADATA("<metadata>"); -const utf8 E_METADATA("</metadata>"); -#ifdef XML_DEBUG -static const utf8 EOL(eol()); -#else -static const utf8 EOL(""); -#endif - -// new xml for shoutcast -utf8 metadata::toXML() const throw() -{ - utf8 o; - o += "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + EOL; - o += METADATA + EOL; - for (keyValueMap_t::const_iterator i = m_keyValueMap.begin(); i != m_keyValueMap.end(); ++i) - { - o += safeXML((*i).first,(*i).second) + EOL; - } - o += E_METADATA + EOL; - return o; -} - -utf8 metadata::toXML_fromFilename(const uniFile::filenameType &filename,const uniFile::filenameType &url,const utf8 &pattern) throw() -{ - utf8 o; - - o += "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + EOL; - o += METADATA + EOL; - - bool patternWorked(false); - try - { - filenameMetadata fm; - fm.setPattern(pattern); - fm.parse(filename); - const std::map<uniString::utf8,uniString::utf8>&m = fm.getTokens(); - for (map<utf8,utf8>::const_iterator i = m.begin(); i != m.end(); ++i) - { - o += "<" + (*i).first + ">" + (*i).second.escapeXML() + "</" + (*i).first + ">" + EOL; - } - patternWorked = true; - } - catch(.../*const exception &ex*/) - { - } - - if (!patternWorked) - { - try - { - string str = string(filename.toANSI(true)); - utf8 song = asciiToUtf8(str); - - filenameMetadata fm; - fm.setPattern(pattern); - fm.parse(song); - const std::map<uniString::utf8,uniString::utf8>&m = fm.getTokens(); - for (map<utf8,utf8>::const_iterator i = m.begin(); i != m.end(); ++i) - { - o += "<" + (*i).first + ">" + (*i).second.escapeXML() + "</" + (*i).first + ">" + EOL; - } - patternWorked = true; - } - catch(.../*const exception &ex*/) - { - //ELOG(string("[METADATA] Failure converting filename to metadata ") + ex.what()); - } - } - - if (!patternWorked) - { - o += "<TIT2>"; - - utf8 us = fileUtil::stripSuffix(filename); - // remove path based on delimiter for Unix (/) Win32 (\) or MacOS (:) - us = fileUtil::stripPath(us,utf8("/")); - us = fileUtil::stripPath(us,utf8("\\")); - us = fileUtil::stripPath(us,utf8(":")); - o += us.escapeXML(); - o += "</TIT2>" + EOL; - } - - if (!url.empty()) - { - utf8 u = url; - if ((u.find(utf8("://")) == utf8::npos) && - (u.find(utf8("&")) != 0) && - u.find(utf8("DNAS/streamart?sid=")) == utf8::npos && - u.find(utf8("DNAS/playingart?sid=")) == utf8::npos) - { - u = "http://" + u; - } - o += "<URL>" + u.escapeXML() + "</URL>" + EOL; - } - - o += E_METADATA + EOL; - return o; -} - -utf8 metadata::toFixedString(const uniFile::filenameType &filename) throw() -{ - utf8 o; - - bool patternWorked(false); - try - { - filenameMetadata fm; - fm.setPattern("%N"); - fm.parse(filename); - const std::map<uniString::utf8,uniString::utf8>&m = fm.getTokens(); - for (map<utf8,utf8>::const_iterator i = m.begin(); i != m.end(); ++i) - { - o = (*i).second; - } - patternWorked = true; - } - catch(.../*const exception &ex*/) - { - } - - if (!patternWorked) - { - try - { - string str = string(filename.toANSI(true)); - utf8 song = asciiToUtf8(str); - - filenameMetadata fm; - fm.setPattern("%N"); - fm.parse(song); - const std::map<uniString::utf8,uniString::utf8>&m = fm.getTokens(); - for (map<utf8,utf8>::const_iterator i = m.begin(); i != m.end(); ++i) - { - o = (*i).second; - } - patternWorked = true; - } - catch(.../*const exception &ex*/) - { - //ELOG(string("[METADATA] Failure converting filename to metadata ") + ex.what()); - } - } - - if (!patternWorked) - { - o = filename; - } - - return o; -} - -uniString::utf8 metadata::convert_3902_to_shoutcast1(const uniString::utf8 &d, const streamID_t id) throw (std::runtime_error) -{ - utf8 o; - aolxml::node *n = 0; - try - { - n = aolxml::node::parse(d.hideAsString()); - utf8 artist = aolxml::subNodeText(n, "/metadata/" + ARTIST(), (utf8)""); - utf8 name = aolxml::subNodeText(n, "/metadata/" + NAME(), (utf8)""); - - if (!artist.empty()) - { - if (!o.empty()) - { - o += " - "; - } - o += artist; - } - if (!name.empty()) - { - if (!o.empty()) - { - o += " - "; - } - o += name; - } - - if (!streamData::validateTitle(o)) - { - WLOG("[ADMINCGI sid=" + tos(id) + "] Title update rejected - value not allowed: " + o); - o.clear(); - } - - o = "StreamTitle='" + o + "';"; - - aolxml::node::nodeList_t nodes = aolxml::node::findNodes(n,"/metadata/extension/title"); - if (!nodes.empty()) - { - for (aolxml::node::nodeList_t::const_iterator i = nodes.begin(); i != nodes.end(); ++i) - { - if (*i) - { - // skip the first element as that is the current song and not what we want to get - int seq = atoi((*i)->findAttributeString("seq").c_str()); - if (seq == 2) - { - utf8 next = ((*i)->pcdata()); - if (streamData::validateTitle(next)) - { - o += "StreamNext='" + next + "';"; - } - break; - } - } - } - } - - utf8 url = aolxml::subNodeText(n, "/metadata/" + URL(), (utf8)""); - if (!url.empty()) - { - utf8::size_type pos = url.find(utf8("://")); - if (pos == utf8::npos) - { - url = "http://" + url; - } - - o += "StreamUrl='" + url + "';"; - } - } - catch(const exception &ex) - { - forget(n); - throw std::runtime_error(ex.what()); - } - forget(n); - return o; -} - -uniString::utf8 metadata::get_song_title_from_3902(const uniString::utf8 &d) -{ - utf8 o; - utf8 result; - aolxml::node *n = 0; - try - { - n = aolxml::node::parse(d.hideAsString()); - utf8 artist = aolxml::subNodeText(n, "/metadata/" + ARTIST(), (utf8)""); - utf8 name = aolxml::subNodeText(n, "/metadata/" + NAME(), (utf8)""); - - if (!artist.empty()) - { - if (!result.empty()) result += " - "; - result += artist; - } - if (!name.empty()) - { - if (!result.empty()) result += " - "; - result += name; - } - } - catch(const exception &ex) - { - forget(n); - throw std::runtime_error(ex.what()); - } - forget(n); - return result; -} - -uniString::utf8 metadata::get_XX_from_3902(const uniString::utf8& node, const uniString::utf8 &d, - const uniString::utf8 &old) throw (std::runtime_error) -{ - utf8 result; - aolxml::node *n = 0; - try - { - n = aolxml::node::parse(d.hideAsString()); - result = aolxml::subNodeText(n, utf8("/metadata/" + node).hideAsString(), old); - } - catch(const exception &ex) - { - forget(n); - throw std::runtime_error(ex.what()); - } - forget(n); - return result; -} - -std::vector<uniString::utf8> metadata::get_nextsongs_from_3902(const uniString::utf8 &d, - std::vector<uniString::utf8>& oldSongList, - const bool first) throw (std::runtime_error) -{ - aolxml::node *n = 0; - std::vector<uniString::utf8> nextSongList; - - try - { - n = aolxml::node::parse(d.hideAsString()); - aolxml::node::nodeList_t nodes = aolxml::node::findNodes(n,"/metadata/extension/title"); - if(!nodes.empty()) - { - for (aolxml::node::nodeList_t::const_iterator i = nodes.begin(); i != nodes.end(); ++i) - { - if (*i) - { - // skip the first element as that is the current song and not what we want to hold - int seq = atoi((*i)->findAttributeString("seq").c_str()); - if ((seq > 1 && !first) || (first && seq == 2)) - { - nextSongList.push_back((*i)->pcdata()); - } - if (first) - { - break; - } - } - } - } - else - { - // if there are no nodes then as this could be from a stream-specific metadata - // update then we need to preserve the existing list so it's not cleared out. - forget(n); - return oldSongList; - } - } - catch(const exception &ex) - { - forget(n); - throw std::runtime_error(ex.what()); - } - forget(n); - return nextSongList; -} diff --git a/Src/Plugins/DSP/sc_serv3/metadata.h b/Src/Plugins/DSP/sc_serv3/metadata.h deleted file mode 100644 index b3bb289c..00000000 --- a/Src/Plugins/DSP/sc_serv3/metadata.h +++ /dev/null @@ -1,151 +0,0 @@ -#pragma once -#ifndef metadata_H_ -#define metadata_H_ - -#include <map> -#include "ID3miniParsers.h" -#include "unicode/uniFile.h" - -// metadata class. Mostly just a container for key/value pairs -// stored ala ID3V2. Some helper functions also to aid in -// ID3V1 mapping -/* - metadata strings are stored in utf8 format -*/ -class metadata -{ -public: - // The metadata values are polymorphic since they may contain all sorts of differnt - // types of information depending on the specific tag. All you can do with them - // is clone them or convert them to xml - class metaValue_base - { - public: - virtual ~metaValue_base(){} - virtual metaValue_base* clone() const throw() = 0; - virtual metaValue_base* clone(const std::vector<uniString::utf8> &s) const = 0; - virtual uniString::utf8 toXML(const std::string &tag) const throw() = 0; - virtual uniString::utf8 toString() const throw() = 0; - }; - - // templatized subclass of metaValue_base. You instantiate this with a class or - // struct of your creation that represents the specific data for a tag. - // The most interesting part is the constructor. You must provide - // an overload in the ID3V2 space (see ID3miniParsers.h) of the function - // fromStringList() which loads your struct from a list of unicode strings. A string - // list is adequate to represent all data coming out of ID3V2. Even binary hunks which - // get base64 encoded before being passed in a list to your constructor. - template<typename T> - class metaValue: public metaValue_base - { - T m_value; - std::vector<uniString::utf8> m_originalStringList; - - public: - metaValue() {} - metaValue(const T &v, const std::vector<uniString::utf8> &slist) : m_value(v), m_originalStringList(slist) {} - metaValue(const std::vector<uniString::utf8> &slist) : m_originalStringList(slist) - { - ID3V2::fromStringList(slist,m_value); - } - virtual metaValue_base* clone() const throw() - { return new metaValue<T>(m_originalStringList); } - virtual metaValue_base* clone(const std::vector<uniString::utf8> &slist) const // clone with new data - { return new metaValue<T>(slist); } - virtual uniString::utf8 toString() const throw() - { return ID3V2::toString(m_value); } - virtual uniString::utf8 toXML(const std::string &tag) const throw() - { return ID3V2::toXML(uniString::utf8(tag),m_value); } - const T& value() const throw() { return m_value; } - }; - -private: - typedef std::multimap<std::string,metaValue_base*> keyValueMap_t; - keyValueMap_t m_keyValueMap; - - // make a copy of this object. Necessary because data is allocated on heap - void copy(const metadata &m) throw(); - -public: - metadata() { m_keyValueMap.clear(); } - // force our private copy() to be called in all copy scenarios - metadata(const metadata &m); - metadata& operator=(const metadata &m); - ///////// - - ~metadata() throw(); - void clear() throw(); - bool empty() const throw() { return m_keyValueMap.empty(); } - - // return true if a particular value exists at least once - bool valueExists(const std::string &key) const throw(); - // note: setValue() takes ownership of the 'value' parameter. This will - // add another key/value pair. Since we have a multimap, existing values of "key" are - // not replaced. - void setValue(const std::string &key,metaValue_base* value) throw(); - void removeValue(const std::string &key) throw(); // remove all values for key - - // only returns first one found - const metaValue_base* getValue(const std::string &key) const throw(); - - // returns a string representation of first instance found - uniString::utf8 getValueAsString(const std::string &key) const throw(); - - // V1 mappings - static const std::string& NAME() throw() { static const std::string k("TIT2"); return k; } - static const std::string& ARTIST() throw() { static const std::string k("TPE1"); return k; } - static const std::string& ALBUM() throw() { static const std::string k("TALB"); return k; } - static const std::string& YEAR() throw() { static const std::string k("TYER"); return k; } - static const std::string& COMMENT() throw() { static const std::string k("COMM"); return k; } - static const std::string& GENRE() throw() { static const std::string k("TCON"); return k; } - - // other mappings (flac/ogg/internal etc) - static const std::string& COMPOSER() throw() { static const std::string k("TCOM"); return k; } - static const std::string& PUBLISHER() throw() { static const std::string k("TPUB"); return k; } - static const std::string& TRACKNUMBER() throw() { static const std::string k("TRCK"); return k; } - static const std::string& DISKNUMBER() throw() { static const std::string k("TPOS"); return k; } - static const std::string& ALBUMARTIST() throw() { static const std::string k("TPE2"); return k; } - static const std::string& BAND() throw() { static const std::string k("TPE2"); return k; } - static const std::string& PERFORMER() throw() { static const std::string k("TPE2"); return k; } - static const std::string& CONDUCTOR() throw() { static const std::string k("TPE3"); return k; } - static const std::string& BEATSPERMINUTE() throw() { static const std::string k("TBPM"); return k; } - static const std::string& LYRICS() throw() { static const std::string k("USLT"); return k; } - static const std::string& ENCODERSETTINGS() throw() { static const std::string k("TSSE"); return k; } - static const std::string& RATING() throw() { static const std::string k("POPM"); return k; } - static const std::string& PICTURE() throw() { static const std::string k("APIC"); return k; } - static const std::string& CUSTOMTEXT() throw() { static const std::string k("TXXX"); return k; } - static const std::string& VERSION() throw() { static const std::string k("TPE4"); return k; } - static const std::string& COPYRIGHT() throw() { static const std::string k("TCOP"); return k; } - static const std::string& LICENSE() throw() { static const std::string k("TOWN"); return k; } - static const std::string& ISRC() throw() { static const std::string k("TSRC"); return k; } - - static const std::string& DJ() throw() { static const std::string k("DJ"); return k; } - static const std::string& URL() throw() { static const std::string k("URL"); return k; } - - // output xml. "safe" functions deal with null value scenario without barfing - static uniString::utf8 safeXML(const std::string &tag,const metaValue_base *m) throw(); - static uniString::utf8 safeString(const metaValue_base *m) throw(); - - uniString::utf8 toXML() const throw(); - - static uniString::utf8 toXML_fromFilename(const uniFile::filenameType &filename, - const uniFile::filenameType &url, - const uniString::utf8 &pattern) throw(); - static uniString::utf8 toFixedString(const uniFile::filenameType &filename) throw(); - - bool get_replayGain(double &gain) const throw(); // return true if value found - bool get_replayGain() const throw(); // same, but just the return value - bool noMeaningfulMetadata() const throw(); // return true if metadata is empty, or stuff in there is not - // useful for user (like replaygain). - - typedef size_t streamID_t; - static uniString::utf8 convert_3902_to_shoutcast1(const uniString::utf8 &d, const streamID_t id) throw(std::runtime_error); - static uniString::utf8 get_song_title_from_3902(const uniString::utf8 &d); - static uniString::utf8 get_XX_from_3902(const uniString::utf8& node, const uniString::utf8 &d, const uniString::utf8 &old) throw(std::runtime_error); - static std::vector<uniString::utf8> get_nextsongs_from_3902(const uniString::utf8 &d, std::vector<uniString::utf8>& oldSongList, bool first = false) throw(std::runtime_error); -}; - -extern const uniString::utf8 METADATA; -extern const uniString::utf8 E_METADATA; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/metrics.cpp b/Src/Plugins/DSP/sc_serv3/metrics.cpp deleted file mode 100644 index 8cb2e1a3..00000000 --- a/Src/Plugins/DSP/sc_serv3/metrics.cpp +++ /dev/null @@ -1,1249 +0,0 @@ -/* metrics,c routines for sending client details to external server */ - -#include <curl/curl.h> -#include <string> -#include <deque> -#include <list> -#include <fstream> -#include <cstdlib> - -#include "bandwidth.h" -#include "metrics.h" -#include "protocol_shoutcastClient.h" -#include "stats.h" -#include "config.h" -#include "services/stdServiceImpl.h" -#include "file/fileUtils.h" -#include "webNet/urlUtils.h" -#include "aolxml/aolxml.h" - - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "METRICS" -#define DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while (0) - -namespace metrics -{ -#if 0 -#define METRICS_LICENCE_URL "http://www.google.com" -#define LICENCE_RESP "\ -<SHOUTCAST>\ - <FUNCTION level='10' />\ - <METRICS url=\"https://metrics.shoutcast.com/metrics\" />\ - <METRICSAD url=\"https://ads.shoutcast.com/dnas\" />\ - <YP url=\"https://dnas-licensing.shoutcast.com/yp\" />\ - <AUTH url=\"//auth.shoutcast.com/AddShout\" />\ - <AD url=\"//ads.shoutcast.com/dnas\" />\ -</SHOUTCAST>\ -" -#else -#define METRICS_LICENCE_URL "https://dnas-licensing.shoutcast.com/registration/" -#endif - class service; - - struct metrics_info - { - httpHeaderMap_t vars; - utf8 url; - size_t id; - unsigned int match; - streamData::streamID_t sid; - int group; - int mode; - metrics_info() : id(0), sid(0), group(0), mode(0) { match = 0; } - }; - - struct metrics_data - { - utf8 post; - utf8 url; - virtual int post_callback() { return 0; } - virtual int failed_callback() { return 0; } - size_t id; - int group; - time_t m_schedule; - int flags; - streamData::streamID_t sid; - - metrics_data () : id(0), group(0), m_schedule((time_t)0), flags(0), sid(0) {} - metrics_data (metrics_info &info) : id(0), group(0), m_schedule((time_t)0), flags(0) { sid = info.sid; } - virtual ~metrics_data() {} - - virtual const char *name() { return "metrics"; } - }; - - struct parse_response_data : public metrics_data - { - stringstream m_ss; - size_t m_length; - - parse_response_data() : metrics_data(), m_length(0) {} - parse_response_data(metrics_info &info) : metrics_data(info), m_length(0) {} - - virtual int post_callback() = 0; - virtual int failed_callback() { WLOG ("failed " + utf8(name()) + " attempt with " + m_ss.str(), LOGNAME, sid); m_ss.str(""); return 0; } - }; - - - struct licence_data : public parse_response_data - { - licence_data() {;} - licence_data (metrics_info &info) : parse_response_data (info) {;} - const char *name() { return "licence"; } - - int post_callback(); - void handleURLs (aolxml::node *root); - void checkURLNode (aolxml::node *root, const char *ref, service_t s); - }; - - - struct YP_data : public parse_response_data - { - YP_data (metrics_info &info) : parse_response_data (info) {;} - - const char *name() { return "YP"; } - int post_callback(); - }; - - -// libcurl related stuff - -#ifdef CURLOPT_PASSWDFUNCTION -/* make sure that prompting at the console does not occur */ -static int my_getpass(void *client, char *prompt, char *buffer, int buflen) -{ - buffer[0] = '\0'; - return 0; -} -#endif - -static int handle_returned_header(void * ptr, size_t size, size_t nmemb, void *stream) -{ - int amount = (int)(size * nmemb); -#if defined(_DEBUG) || defined(DEBUG) - metrics_data *entry = (metrics_data *)stream; - DEBUG_LOG (utf8(entry->name()) + " header [" + utf8 ((const char*)ptr, amount>2 ? amount-2 : 0) + "]", LOGNAME); -#endif - bandWidth::updateAmount(bandWidth::AUTH_AND_METRICS, amount); - return amount; -} - - -static int handle_returned_data(void * ptr, size_t size, size_t nmemb, void * /*stream*/) -{ - int amount = (int)(size * nmemb); -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG ("Body " + tos (amount) + ":" + utf8 ((const char*)ptr, amount), LOGNAME); -#endif - bandWidth::updateAmount(bandWidth::AUTH_AND_METRICS, amount); - return amount; -} - - -static size_t handle_licence_body (void *ptr, size_t size, size_t nmemb, void *stream) -{ - licence_data *entry = (licence_data *)stream; - size_t length = size * nmemb; - if (entry->m_ss) - { - if (entry->m_length > 20000) - { - WLOG ("response for was too large, ignoring for now"); - return 0; - } - //DLOG ("Adding " + tos (length) + ":" + utf8 ((const char*)ptr, length)); - entry->m_ss.write ((const char*)ptr, length); - entry->m_length += length; - } - - bandWidth::updateAmount (bandWidth::ADVERTS, length); - return length; -} - - - - time_t g_metrics_updated = 0, g_recheck_services = 0; - AOL_namespace::mutex g_serversLock; - utf8 g_licence_DID = ""; - static short int g_uniqueMetricsId = 0; - -const short int getMetricsClientId() -{ - return ++g_uniqueMetricsId; -} - - -class service -{ -protected: - int m_queueCount; - const short int m_id; - unsigned short m_flags; - CURL *m_curl; - string desc; - bool in_use; - bool running; - utf8 url; - const time_t updated; - time_t stop_time; - utf8 main_post; - list<metrics_data*> queue; - - virtual void resetURL (utf8 &new_url) - { - if (new_url == "") - return; - url = new_url; - m_curl = webClient::setupCurlDefaults (m_curl, LOGNAME, url, 5L); - curl_easy_setopt (m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt (m_curl, CURLOPT_WRITEFUNCTION, handle_returned_data); -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (m_curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - } - -public: - - friend void addToServices(metrics_info &info); - friend void metrics_stop(); - - service(short int in_type, const char *in_url, const string in_desc) : m_id(getMetricsClientId()), in_use(false), running(true), - updated(g_metrics_updated), stop_time(0) - { - httpHeaderMap_t vars; - m_flags = in_type; - m_queueCount = 0; - url = in_url; - desc = in_desc; - m_curl = NULL; - - resetURL (url); - - vars["server"] = "Shoutcast v" + gOptions.getVersionBuildStrings(); - vars["port"] = tos(g_portForClients); - main_post = encodeVariables(vars); - DEBUG_LOG ("using " + url + " : " + main_post, in_desc.c_str()); - } - - virtual ~service(void) - { - metrics_cleanup(); - curl_easy_cleanup (m_curl); - } - - virtual metrics_data *metrics_node(metrics_info &info) { return new metrics_data (info); } - virtual int failedEntry (metrics_data *) { return 0; } - - int addEntry (metrics_info &info); - void metrics_cleanup(void); - - static THREAD_FUNC process(void* arg); -}; - - -class licenceService : public service -{ - int m_initial; - time_t m_nextCheck; // for licence - - void addCheckup(time_t when); - metrics_data *metrics_node (metrics_info &info) { return new licence_data (info); } - - void resetURL (utf8 &new_url) - { - //DLOG ("in reset url with " + new_url); - if (new_url == "") - return; - url = new_url; - m_curl = webClient::setupCurlDefaults (m_curl, LOGNAME, url, 5L); - curl_easy_setopt (m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt (m_curl, CURLOPT_WRITEFUNCTION, handle_licence_body); -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (m_curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - } - -public: - - licenceService() : service (METRIC_LICENCE, "", "licence") - { - m_initial = 0; - m_nextCheck = (time_t)0; - utf8 s = METRICS_LICENCE_URL; - resetURL (s); - addCheckup (::time(NULL)); - } - - int failedEntry (metrics_data *entry) - { - if (entry->sid == 0) // assume licence checker - { - if (entry->flags & 1) - return -1; // no licence, so no retry - int retry = -1; - m_initial++; - if (m_initial == 1) - retry = 1; - else if (m_initial == 2) - { - retry = 10; - } - else if (m_initial == 3) - //retry = 60; - addCheckup (::time(NULL) + 60); - else - { - m_initial = 0; - addCheckup (::time(NULL) + 3600); - } - return retry; - } - return 0; - } -}; - - -class ypService : public service -{ - void resetURL (utf8 &new_url) - { - //DLOG ("in reset url with " + new_url); - if (new_url == "") - return; - url = new_url; - m_curl = webClient::setupCurlDefaults (m_curl, LOGNAME, url, 15L, 4L); - curl_easy_setopt (m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt (m_curl, CURLOPT_WRITEFUNCTION, handle_licence_body); -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (m_curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - } - -public: - - ypService() : service (METRIC_YP, METRICS_YP_URL, "YP") { resetURL (url); } - - metrics_data *metrics_node(metrics_info &info) { return new YP_data (info); } - - int failedEntry (metrics_data *entry) - { - if (entry->flags) - return -1; - entry->flags |= 1; - return 15; - } -}; - - -list <service*> servers; - - -int service::addEntry(metrics_info &info) -{ - httpHeaderMap_t &vars = info.vars; - bool start_thread = false, queue_it = false; - - if (vars.empty()) - { - if (running && (g_metrics_updated > updated)) - { - DEBUG_LOG("Service " + tos(m_id) + " expired, start clean up", LOGNAME, (size_t)info.sid); - running = false; - } - - if ((running == false) && queue.empty()) - { - DEBUG_LOG ("[METRICS] service to be removed, " + desc); - return -1; // trigger a service removal - } - start_thread = true; - } - - if (stop_time == 0 && start_thread == false) - { - if (running && queue.size() < gOptions.metricsMaxQueue()) - queue_it = true; - } - if (info.mode || queue_it) - { - metrics_data *copy = metrics_node(info); - copy->id = info.id; - copy->sid = info.sid; - copy->post = encodeVariables(vars); - copy->url = info.url; - start_thread = true; - if (info.mode == 2) - queue.push_front(copy); - else - queue.push_back(copy); - m_queueCount++; - DEBUG_LOG("[METRICS sid=" + tos(copy->sid) + "] Added " + utf8(desc) + " details to queue [count: " + tos(queue.size()) + "]", LOGNAME, copy->sid); - } - - if ((in_use == false) && start_thread && !queue.empty()) - { - in_use = true; - SimpleThread(service::process, this); - } - return 0; -} - -void service::metrics_cleanup() -{ - if (!queue.empty()) - { - DEBUG_LOG("Purging " + tos(queue.size()) + " entries from " + tos(m_id), LOGNAME); - - while (!queue.empty()) - { - list<metrics_data*>::iterator to_go = queue.begin(); - metrics_data *m = *to_go; - //DLOG ("erasing metric for " + m->post); - queue.erase(to_go); - delete m; - m = NULL; - } - } -} - -THREAD_FUNC service::process(void* arg) -{ - try - { - service* m_service = reinterpret_cast<service*>(arg); - if (m_service) - { - g_serversLock.lock(); - - if (m_service->stop_time) - { - time_t diff = ::time(NULL) - m_service->stop_time; - - if (diff > (12 * 3600)) // drop after 12 hours of no response - { - m_service->metrics_cleanup(); - m_service->in_use = false; - g_serversLock.unlock(); - return 0; - } - DEBUG_LOG ("[METRICS] time since stopping " + tos ((long)diff)); - } - if (m_service->queue.size() < 5) - { - // allow for a build up of metrics over a small time, saves excessive thread creation - g_serversLock.unlock(); - safe_sleep (0, 80); - g_serversLock.lock(); - } - - int count = 0; - int try_later = 0; - time_t stop_time = (time_t)0; - - while (1) - { - utf8 post; - char errormsg[CURL_ERROR_SIZE] = {0}; - - if (m_service->m_queueCount <= try_later) - { - if (count) - DEBUG_LOG ("[METRICS] run queue " + m_service->desc + " complete"); - break; - } - - metrics_data *entry = m_service->queue.front(); - m_service->queue.pop_front(); - m_service->m_queueCount--; - if (entry->m_schedule > 0 && entry->m_schedule > time(NULL)) - { - m_service->queue.push_back (entry); - m_service->m_queueCount++; - try_later++; - continue; - } - g_serversLock.unlock(); - - if (entry->url.empty() == false) - m_service->resetURL (entry->url); // update the URL - - bool failed = false; - - if (entry->post.empty()) - { - if (entry->url.empty()) - DLOG ("empty Post/URL update on " + m_service->desc, LOGNAME); - } - else - { - CURLcode ret = CURLE_FAILED_INIT; - - if (m_service->m_curl) - { - post = entry->post + "&" + m_service->main_post; - -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_service->desc + utf8(" POST body: " + post), LOGNAME, entry->sid); -#endif - - curl_easy_setopt (m_service->m_curl, CURLOPT_ERRORBUFFER, errormsg); - curl_easy_setopt (m_service->m_curl, CURLOPT_HEADERDATA, entry); - curl_easy_setopt (m_service->m_curl, CURLOPT_WRITEDATA, entry); - curl_easy_setopt (m_service->m_curl, CURLOPT_POSTFIELDSIZE, post.size()); - curl_easy_setopt (m_service->m_curl, CURLOPT_POSTFIELDS, post.c_str()); - ret = curl_easy_perform (m_service->m_curl); - ++count; - } - - if (ret != CURLE_OK) - { - ELOG("Request failed on " + m_service->desc + " with " - + (errormsg[0] ? errormsg : curl_easy_strerror(ret)), LOGNAME, entry->sid); - failed = true; - } - else - { - long response_code = 0; - curl_easy_getinfo (m_service->m_curl, CURLINFO_RESPONSE_CODE, &response_code); - if (response_code >= 200 && response_code < 300) - { - entry->post_callback(); - stop_time = 0; - } - else - { - ELOG("Request failed on " + m_service->desc + " with code " + tos (response_code)); - entry->failed_callback(); - failed = true; - } - } - } - if (failed && !iskilled()) // a failed metric, and server still running - { - int delay = m_service->failedEntry (entry); - - if (stop_time == 0) - stop_time = ::time(NULL); - if (delay >= 0) // do we drop this one? < 0 something else is done, else put back on queue - { - g_serversLock.lock(); - m_service->queue.push_front (entry); - m_service->m_queueCount++; - - if (delay == 0) - { - m_service->stop_time = stop_time; - break; - } - - g_serversLock.unlock(); - DLOG ("sleeping for " + tos (delay) + "s on " + m_service->desc); - safe_sleep (delay, 0); - g_serversLock.lock(); - continue; - } - } - - delete entry; - entry = NULL; - g_serversLock.lock(); - m_service->stop_time = stop_time; - } // while - - m_service->in_use = false; - g_serversLock.unlock(); - } - } - catch(exception &e) - { - service* m_service = reinterpret_cast<service*>(arg); - DLOG ("abort in metric " + m_service->desc + ", " + e.what()); - safe_sleep (0,500); - if (m_service) - { - g_serversLock.lock(); - m_service->in_use = false; - g_serversLock.unlock(); - } - } - return 0; -} - - -void addToServices(metrics_info &info) -{ - g_serversLock.lock(); - list <service*>::iterator it = servers.begin(); - - while (it != servers.end()) - { - service &s = **it; - // DLOG ("Applying metric to " + s.desc + "(" + tos((long)s.flags) + ", " + tos((long)info.match) + ")"); - if ((s.m_flags & info.match) && s.addEntry(info) < 0) - { - list <service*>::iterator to_go = it; - service *s = *it; - ++it; - servers.erase(to_go); - delete s; - s = NULL; - } - else - { - ++it; - } - } - g_serversLock.unlock(); -} - - -// assume only called from one thread. -void metrics_wakeup(bool force) -{ - time_t now = ::time(NULL); - metrics_info info; - info.match = METRIC_AUDIENCE | METRIC_ADVERT | METRIC_LICENCE | METRIC_YP; - if ((now > g_recheck_services) || force) - { - if (force) - { - g_recheck_services = now + 60; - } - info.match |= METRIC_AUDIENCE | METRIC_ADVERT; - - g_recheck_services = now + 60; // next recheck in case stalled metrics - } - addToServices(info); -} - - -void metrics_listener_new(const protocol_shoutcastClient &client) -{ - const streamData *sd = client.m_streamData; - if (sd && !sd->radionomyID().empty()) - { - metrics_info info; - const streamData::streamInfo &stream = sd->getInfo(); - - info.vars["action"] = "listener_add"; - info.vars["tstamp"] = tos(::time(NULL)); - info.vars["host"] = sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = sd->radionomyID(); - info.vars["client"] = tos(client.m_unique); - info.vars["group"] = tos(client.getGroup()); - info.vars["ip"] = client.m_clientAddr; - info.vars["srvid"] = stream.m_serverID; - info.vars["mount"] = getStreamPath(client.m_streamID); - info.vars["agent"] = client.m_userAgent; - info.vars["referer"] = client.m_referer; - info.vars["bitrate"] = tos(sd->streamBitrate()); - info.vars["codec"] = sd->streamContentType(); - info.vars["contr"] = client.getContainer(); - - info.id = client.m_unique; - info.sid = client.m_streamID; - info.match = METRIC_AUDIENCE; - - addToServices(info); - } -} - -void metrics_listener_drop(const protocol_shoutcastClient &client) -{ - const streamData *sd = client.m_streamData; - if (sd && !sd->radionomyID().empty()) - { - metrics_info info; - const streamData::streamInfo &stream = sd->getInfo(); - time_t now = ::time(NULL); - - info.vars["action"] = "listener_remove"; - info.vars["tstamp"] = tos(now); - info.vars["host"] = sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = sd->radionomyID(); - info.vars["client"] = tos(client.m_unique); - info.vars["ip"] = client.m_clientAddr; - info.vars["srvid"] = stream.m_serverID; - info.vars["mount"] = getStreamPath(client.m_streamID); - info.vars["duration"] = tos(now - client.m_startTime); - info.vars["agent"] = client.m_userAgent; - info.vars["referer"] = client.m_referer; - info.vars["bitrate"] = tos(sd->streamBitrate()); - info.vars["codec"] = sd->streamContentType(); - info.vars["contr"] = client.getContainer(); - - info.id = client.m_unique; - info.sid = client.m_streamID; - info.match = METRIC_AUDIENCE; - - addToServices(info); - } -} - - -void metrics_adListener (const protocol_shoutcastClient &client, const adSummary &summary) -{ - metrics_info info; - const streamData::streamInfo &stream = summary.sd->getInfo(); - - info.vars["action"] = "listener_admetric"; - info.vars["tstamp"] = tos(summary.tstamp); - info.vars["host"] = summary.sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = summary.sd->radionomyID(); - info.vars["srvid"] = stream.m_serverID; - info.vars["id"] = summary.id; - info.vars["mount"] = summary.path.hideAsString(); - info.vars["client"] = tos(client.getUnique()); - info.vars["group"] = tos(client.getGroup()); - info.vars["sent"] = tos (client.getAdAccess().total_processed); - info.vars["started"] = tos (client.getAdAccess().start_time); - - info.mode = 1; - info.sid = summary.sid; - info.match = METRIC_ADVERT; - - addToServices(info); -} - - -void metrics_advert_started (const adSummary &summary) -{ - metrics_info info; - const streamData::streamInfo &stream = summary.sd->getInfo(); - - info.vars["action"] = "ad_trigger"; - info.vars["tstamp"] = tos(summary.tstamp); - info.vars["host"] = summary.sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = summary.sd->radionomyID(); - info.vars["srvid"] = stream.m_serverID; - info.vars["mount"] = summary.path.hideAsString(); - info.vars["id"] = summary.id; - info.vars["listeners"] = tos(summary.count); - info.vars["bitrate"] = tos(summary.sd->streamBitrate()); - info.vars["codec"] = summary.sd->streamContentType(); - - info.mode = 1; - info.sid = summary.sid; - info.match = METRIC_ADVERT; - - addToServices(info); -} - - -void metrics_advert_stats(const adSummary &summary) -{ - metrics_info info; - const streamData::streamInfo &stream = summary.sd->getInfo(); - - info.vars["action"] = "ad_metric"; - info.vars["tstamp"] = tos(summary.tstamp); - info.vars["host"] = summary.sd->streamPublicIP(); - info.vars["radionomyid"] = info.vars["ref"] = summary.sd->radionomyID(); - info.vars["srvid"] = stream.m_serverID; - info.vars["id"] = summary.id; - info.vars["mount"] = summary.path.hideAsString(); - info.vars["group"] = tos(summary.group); - info.vars["file"] = summary.name; - if (summary.missing) - info.vars["missing"] = (summary.failed ? "failed" : "timeout"); - else - info.vars["listeners"] = tos(summary.count); - info.vars["bitrate"] = tos(summary.sd->streamBitrate()); - info.vars["codec"] = summary.sd->streamContentType(); - - info.mode = 1; - info.sid = summary.sid; - info.match = METRIC_ADVERT; - - addToServices(info); -} - - -static bool _filled_info_notify (metrics_info &info, const streamID_t sid, const utf8& radionomyID, - const utf8& serverID, const utf8& publicip, time_t tm = ::time(NULL)) -{ - if (radionomyID.empty() || serverID.empty() || publicip.empty()) - return false; - - info.vars["action"] = iskilled() ? "shutdown" : "reset"; - info.vars["tstamp"] = tos ((long)tm); - info.vars["host"] = publicip; - info.vars["radionomyid"] = info.vars["ref"] = radionomyID; - info.vars["srvid"] = serverID; - info.vars["mount"] = getStreamPath(sid); - - info.sid = sid; - info.match = METRIC_NOTIFICATION; - info.mode = 2; - return true; -} - -void metrics_stream_down (const streamID_t sid, const utf8& radionomyID, - const utf8& serverID, const utf8& publicip, time_t tm) -{ - metrics_info info; - if (_filled_info_notify (info, sid, radionomyID, serverID, publicip)) - { - info.vars["action"] = iskilled() ? "shutdown" : "stopped"; - info.vars["started"] = tos(tm); - addToServices(info); - } -} - -void metrics_stream_up (const streamID_t sid, const utf8& radionomyID, - const utf8& serverID, const utf8& publicip, time_t tm) -{ - metrics_info info; - if (_filled_info_notify (info, sid, radionomyID, serverID, publicip)) - { - info.vars["action"] = iskilled() ? "shutdown" : "reset"; - addToServices(info); - } -} - - -utf8 metrics_verifyDestIP(config &conf, bool full, uniString::utf8 url) -{ - // we'll try to set this where possible but it depends on 'destip' or 'publicip' - // being set in order for us to have something to be able to be used by the YP - utf8 destBindAddr = stripWhitespace((url.empty() ? (full && !conf.publicIP().empty() ? conf.publicIP() : conf.destIP()) : url)); - destBindAddr = stripHTTPprefix(destBindAddr); - - // with full then we're wanting to filter out some of the values - // since this is then used for the public reponses / YP details - if (full) - { - // cleanup things and only provide what should be valid i.e. nothing from a private network - // and not send this even if provided just means the YP server will use the connection's IP - if (isRemoteAddress(destBindAddr)) - { - return destBindAddr; - } - return ""; - } - // otherwise we just return the cleaned version as-is - // since it'll allow for use in normal bindings, etc - return destBindAddr; -} - -utf8 createGuid() -{ -#ifdef _WIN32 -#define rand_r(x) rand() -#else - static unsigned int seed = time(NULL); -#endif - std::stringstream ss; - for (int i = 0; i < 30; i++) - ss << std::hex << (unsigned int)(rand_r(&seed) % 16); - return ss.str(); -} - - -#ifdef _MSC_VER -utf8 getWindowsRegKey (bool newone = false) -{ - wchar_t *subKey = L"Software\\Microsoft\\Cryptography"; - HKEY hKey; - - LONG nError = RegOpenKeyEx (HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ, &hKey); - if (nError == ERROR_FILE_NOT_FOUND) - { -#if 0 - // maybe try to create a local guid to read from. - subkey = L"Software\\SHOUTcast"; - nError = RegOpenKeyEx (HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ, &hKey); - if (nError == ERROR_FILE_NOT_FOUND) - { - // create one and put id in there - nError = RegCreateKeyEx (HKEY_LOCAL_MACHINE, subKey, NULL, NULL, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL, &hKey, NULL); - if (nError == ERROR_FILE_NOT_FOUND) - return ""; - - string guid = createGuid (); - DWORD dwSize = lstrlen(&guid[0]) * sizeof(TCHAR); - nError = RegSetValueEx (hKey, lpValue, NULL, REG_SZ, (unsigned char *)&guid[0], dwSize); - return guid; - } -#else - return ""; -#endif - } - char buff[100]; - DWORD rdwSize = sizeof (buff); - DWORD dwType = REG_SZ; - nError = RegQueryValueExA (hKey, "MachineGuid", NULL, &dwType, (unsigned char*)buff, &rdwSize); - RegCloseKey (hKey); - return (nError) ? "" : buff; -} -#endif - - -void hashDID (utf8 &ident) -{ - // uses openssl for hashing a machine/installation Id - unsigned char digest[SHA256_DIGEST_LENGTH]; - - SHA256((unsigned char*)&ident[0], ident.size(), (unsigned char*)&digest); - - std::stringstream ss; - for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) - ss << std::hex << (unsigned int)digest[i]; - g_licence_DID = ss.str(); - DLOG ("ident is " + ident + ", DID is " + g_licence_DID); -} - - -void metricsCheckDID () -{ - if (g_licence_DID.empty() == false) - return; - - utf8 s = "DIDC"; // Dnas ID Code - do - { -#ifdef _WIN32 - utf8 key = getWindowsRegKey(); - if (key.empty() == false) - { - s += key; - break; - } -#endif -#ifdef PLATFORM_LINUX - ifstream myfile ("/etc/machine-id"); - if (myfile.is_open()) - { - string line; - getline (myfile, line); - s += line; - break; - } -#endif - // get random sequence if all else fails - ILOG ("failed to get a static unique number, falling back to random sequence"); - s += createGuid(); - } while (0); - - // append conf bits to string. XXXX[-publicip]-baseport - s += "-"; - s += tos(gOptions.portBase()); - utf8 p = gOptions.publicIP(); - if (p.empty() == false) - { - s += "-"; - s += p; - } - hashDID (s); -} - - -void metrics_apply(config &conf) -{ - bool same = (metrics_verifyDestIP(conf) == metrics_verifyDestIP(gOptions)); - if (!same || servers.empty()) - { - if (!same) - { - metrics_stop(); - } - - DEBUG_LOG(utf8(same ? "Adding" : "Updating") + " metrics details", LOGNAME); - metricsCheckDID (); - - service *s = new service (METRIC_AUDIENCE, METRICS_AUDIENCE_URL, "audience"); - servers.push_front(s); - - s = new service (METRIC_ADVERT, METRICS_ADVERTS_URL, "adservice"); - servers.push_front(s); - - s = new service (METRIC_NOTIFICATION, METRICS_RESET_URL, "notification"); - servers.push_front(s); - -#ifndef LICENCE_FREE - s = new licenceService (); - servers.push_front(s); -#endif - - s = new ypService (); - servers.push_front(s); - } -} - - -void metrics_stop() -{ - g_serversLock.lock(); - if (!servers.empty()) - { - int loop = 50; - while (loop > 0) - { - list <service*>::iterator it = servers.begin(); - if (it == servers.end()) - { - break; - } - - service *s = *it; - if (s) - { - if (s->in_use) - { - loop--; - g_serversLock.unlock(); - safe_sleep(0, 100); // thread active so wait and try again - g_serversLock.lock(); - continue; - } - } - - servers.erase(it); - - if (s) - { - delete s; - s = NULL; - } - } - } - g_serversLock.unlock(); -} - - -// called near the start of the stream and each metadata update. -// -void updateMeta (const metaInfo &meta) -{ - metrics_info info; - utf8 uid = gOptions.userId (); - - utf8 ah = gOptions.stream_authHash (meta.m_sid); - if (ah.empty()) - return; - info.vars ["uid"] = uid; - info.vars ["ah"] = ah; - info.vars ["did"] = g_licence_DID; - info.vars ["tstamp"] = tos (time(NULL)); - - info.vars ["private"] = tos(meta.m_private ? 1 : 0); - info.vars ["sid"] = tos(meta.m_sid); - info.vars ["format"] = meta.m_format; - info.vars ["audience"] = tos (stats::getUserCount (meta.m_sid)); - info.vars ["maxlisteners"] = tos(meta.m_maxListeners); - info.vars ["currentsong"] = meta.m_song; - info.vars ["bitrate"] = tos(meta.m_bitrate); - info.vars ["mount"] = getStreamPath (meta.m_sid); - info.vars ["samplerate"] = tos (meta.m_samplerate); - info.vars ["verinfo"] = meta.m_version; - info.vars ["agent"] = meta.m_agent; - info.vars ["sourceip"] = meta.m_sourceIP; - info.vars ["publicip"] = gOptions.publicIP(); - info.vars ["publicport"] = tos (gOptions.publicPort()); - info.vars ["secure"] = tos (threadedRunner::isSSLCapable() ? 1 : 0); - - stats::statsData_t data; - stats::getStats (meta.m_sid, data); - info.vars ["peaklisteners"] = tos(data.peakListeners); - - info.match = METRIC_YP; - info.sid = meta.m_sid; - info.mode = 1; - DLOG ("push to YP requested \"" + meta.m_song + "\"", LOGNAME, meta.m_sid); - addToServices(info); -} - - -void licence_data::checkURLNode (aolxml::node *root, const char *ref, service_t s) -{ - aolxml::node *n = aolxml::node::findNode (root, ref); - if (n) - { - utf8 url = n->findAttributeString ("url"); - if (url.empty() == false) - { - metrics_info info; - info.url = url; - info.match = s; - info.mode = 2; - addToServices (info); - } - } -} - - -void licence_data::handleURLs (aolxml::node *root) -{ - if (root == NULL) - return; - checkURLNode (root, "/SHOUTCAST/METRICS", METRIC_AUDIENCE); - checkURLNode (root, "/SHOUTCAST/METRICSAD", METRIC_ADVERT); - checkURLNode (root, "/SHOUTCAST/YP", METRIC_YP); - - aolxml::node *n = aolxml::node::findNode (root, "/SHOUTCAST/AUTH"); - if (n) - { - utf8 s = n->findAttributeString ("url"); - if (s.empty() == false) - { - auth::g_authURL = s; - auth::updateServices (); - } - } -} - - -int licence_data::post_callback () -{ - vector<__uint8> v; -#ifdef LICENCE_RESP - utf8 s = LICENCE_RESP; - v.assign (&s[0], &s[s.size()]); -#else - v.reserve (m_ss.tellp()); - std::copy (std::istreambuf_iterator<char>( m_ss ), std::istreambuf_iterator<char>(), std::back_inserter(v)); -#endif - - aolxml::node *n = NULL, *root = NULL; - do - { - if (v.empty()) - break; -#if defined(_DEBUG) || defined(DEBUG) - //DLOG ("response size is " + tos (v.size())); - DEBUG_LOG ("Licence body " + tos (v.size()) + ":" + utf8 ((const char*)&v[0], v.size()), LOGNAME); -#endif - root = aolxml::node::parse (&v[0], v.size()); - if (root) - n = aolxml::node::findNode (root, "/SHOUTCAST/FUNCTION"); - if (n == NULL) - { - ILOG ("license parse failed, skipping", LOGNAME); - break; - } - - utf8 s = n->findAttributeString ("level"); - if (s == "10") - { - ILOG ("detected paying offer", LOGNAME); - streamData::streamInfo::m_allowSSL_global = 1; - streamData::streamInfo::m_allowAllFormats_global = 1; - streamData::streamInfo::m_allowBackupURL_global = 1; - streamData::streamInfo::m_allowMaxBitrate_global = 0; - break; - } - ILOG ("free offer only", LOGNAME); - streamData::streamInfo::m_allowSSL_global = 0; - streamData::streamInfo::m_allowAllFormats_global = 0; - streamData::streamInfo::m_allowBackupURL_global = 0; - streamData::streamInfo::m_allowMaxBitrate_global = 128; - } while (0); - - handleURLs (root); - - forget (root); - return 0; -} - - -// Called at server start and every hour. -void licenceService::addCheckup (time_t when) -{ - // eg http://dnas-services.shoutcast.com:8500/registration/?lid=2&debug=yes - // eg https://dnas-services.shoutcast.com/registration/?lid=2&debug=yes - httpHeaderMap_t vars; - bool licenceMissing = true; - utf8 s = gOptions.userId(); - - if (s.empty()) - return; - vars ["uid"] = s; - s = gOptions.licenceId(); - if (s.empty() == false) - { - vars ["lid"] = s; - licenceMissing = false; - } - - vars ["did"] = g_licence_DID; - vars ["tstamp"] = tos (time(NULL)); - - licence_data *copy = new licence_data(); - - copy->post = encodeVariables(vars); - copy->m_schedule = when; - if (licenceMissing) - copy->flags |= 1; - - g_serversLock.lock(); - queue.push_front (copy); - m_queueCount++; - g_serversLock.unlock(); -} - - -int YP_data::post_callback () -{ - vector<__uint8> v; - v.reserve (m_ss.tellp()); - std::copy (std::istreambuf_iterator<char>( m_ss ), std::istreambuf_iterator<char>(), std::back_inserter(v)); - - aolxml::node *n = NULL, *root = NULL; - do - { - //DLOG ("response size is " + tos (v.size())); - if (v.empty()) - break; -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG ("YP Body " + tos (v.size()) + ":" + utf8 ((const char*)&v[0], v.size()), name(), sid); -#endif - root = aolxml::node::parse (&v[0], v.size()); - if (root) - n = aolxml::node::findNode (root, "/response"); - if (n == NULL) - { - ILOG ("response invalid, skipping", name(), sid); - break; - } - int code = aolxml::subNodeText(n, "/response/statusCode", 400); - if (code != 200) - { - utf8 msg = aolxml::subNodeText(n, "/response/statusText", (utf8)""); - if (msg != (utf8)"") - WLOG ("response returned " + tos(code) + ", " + msg, name(), sid); - break; - } - n = aolxml::node::findNode (root, "/response/data"); - if (n == NULL) - { - ILOG ("No special settings from YP for stream " + tos(sid), name(), sid); - break; - } - yp2::stationInfo info; - info.m_advertMode = aolxml::subNodeText(n, "/response/data/admode", 0); - info.m_streamTitle = aolxml::subNodeText(n, "/response/data/stationname", (utf8)""); - info.m_stationID = aolxml::subNodeText(n, "/response/data/stationid", (utf8)""); - info.m_serverID = aolxml::subNodeText(n, "/response/data/serverid", (utf8)""); - info.m_radionomyID = aolxml::subNodeText(n, "/response/data/callsign", (utf8)""); - info.m_responseCode = code; - info.m_advertType = aolxml::subNodeText(n, "/response/data/advert/type", (utf8)"fixed"); - info.m_advertTrigger = aolxml::subNodeText(n, "/response/data/advert/trigger", (utf8)"meta"); - - streamData *sd = streamData::accessStream (sid); - if (sd) - { - sd->YP2_updateInfo (info); - sd->releaseStream(); - } - ILOG ("Stream #" + tos(sid) + " has been updated on the Shoutcast Directory.", name(), sid); - - } while (0); - - forget (root); - return 0; -} - -} // namespace diff --git a/Src/Plugins/DSP/sc_serv3/metrics.h b/Src/Plugins/DSP/sc_serv3/metrics.h deleted file mode 100644 index f324beaa..00000000 --- a/Src/Plugins/DSP/sc_serv3/metrics.h +++ /dev/null @@ -1,101 +0,0 @@ -/* metrics.h external interface to metric processing */ - -#ifndef _METRICS_H -#define _METRICS_H - -#include "unicode/uniString.h" - -class protocol_shoutcastClient; -class streamData; -class config; - -#if 1 -#define METRICS_AUDIENCE_URL "https://metrics.shoutcast.com/metrics" -#define METRICS_ADVERTS_URL "https://ads.shoutcast.com/dnas" -#define TARGETSPOT_URL "https://ads.shoutcast.com/dnas" -#define METRICS_YP_URL "https://dnas-services.shoutcast.com/yp/" -#else -#define METRICS_AUDIENCE_URL "http://localhost:9001" -#define METRICS_ADVERTS_URL "http://localhost:9001/dnas" -#define TARGETSPOT_URL "http://localhost/~karl/mapping1.php" -#endif -#define METRICS_RESET_URL "https://metrics.radionomy.com/connections/closednas" - - -namespace metrics -{ - typedef size_t streamID_t; - typedef enum { - METRIC_AUDIENCE = 1, - METRIC_ADVERT = 2, - METRIC_NOTIFICATION = 4, - METRIC_LICENCE = 8, - METRIC_YP = 16 - } service_t; - - struct adSummary - { - streamID_t sid; - bool sendRest; - bool failed; - bool missing; - uniString::utf8 path; - time_t tstamp; - const char *name; - int count; - std::string id; - size_t group; - streamData *sd; - - adSummary() : sid(1), tstamp(0), name(0), count(0), group(0) { sd = NULL; sendRest = failed = missing = false; } - }; - - struct metaInfo - { - streamID_t m_sid; - bool m_private; - unsigned int m_audience; - unsigned int m_maxListeners; - unsigned int m_bitrate; - unsigned int m_samplerate; - uniString::utf8 m_version; - uniString::utf8 m_song; - uniString::utf8 m_format; - uniString::utf8 m_agent; - uniString::utf8 m_publicIP; - uniString::utf8 m_sourceIP; - }; - - void metrics_init(); - void metrics_stop(); - void metrics_apply(config &conf); - - // new listener triggers - void metrics_listener_new(const protocol_shoutcastClient &client); - - // exiting listener triggers - void metrics_listener_drop(const protocol_shoutcastClient &client); - - void metrics_adListener (const protocol_shoutcastClient &client, const adSummary &summary); - - void metrics_advert_started (const adSummary &summary); - - void metrics_advert_stats(const adSummary &summary); - - typedef unsigned yp2SessionKey; - - void metrics_stream_down (const streamID_t sid, const uniString::utf8& radionomyID, - const uniString::utf8& serverID, const uniString::utf8& publicip, time_t tm); - - void metrics_stream_up (const streamID_t sid, const uniString::utf8& radionomyID, - const uniString::utf8& serverID, const uniString::utf8& publicip, time_t tm); - - // periodic wakeup for any stalled metrics - void metrics_wakeup(bool force = false); - - void updateMeta (const metaInfo &meta); - - uniString::utf8 metrics_verifyDestIP(config &conf, bool full = true, uniString::utf8 url = ""); -} - -#endif /* _METRICS_H */ diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.cpp deleted file mode 100644 index 941746d2..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.cpp +++ /dev/null @@ -1,232 +0,0 @@ -#ifdef _WIN32 -#include <windows.h> -#else -#include <sys/param.h> -#endif -#include "fileUtils.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include <fstream> -#include "../../global.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -bool fileUtil::convertOSFilePathDelimiter(uniString::utf8 &value) throw() -{ - bool converted = false; - if (!value.empty()) - { - #ifdef _WIN32 - const uniString::utf8& replaceFilePathDelimiter("/"); - #else - const uniString::utf8& replaceFilePathDelimiter("\\"); - #endif - - uniString::utf8::size_type pos = value.find(replaceFilePathDelimiter); - if (pos != uniString::utf8::npos) converted = true; - while (pos != uniString::utf8::npos) - { - value.replace(pos,1,getFilePathDelimiter()); - pos = value.find(replaceFilePathDelimiter); - } - } - return converted; -} - -#ifdef _WIN32 - -uniFile::filenameType fileUtil::getFullFilePath(const uniFile::filenameType &partial_path) throw() -{ - wchar_t resolved_path[MAX_PATH] = {0}; - - uniString::utf32 u32(partial_path); - std::wstring u16; - u32.toUtf16(u16); - - if (_wfullpath(resolved_path, u16.c_str(), MAX_PATH)) - { - return utf32(resolved_path).toUtf8(); - } - return partial_path; -} - -bool fileUtil::fileExists(const uniFile::filenameType &fullPath) throw() -{ - uniString::utf32 u32(fullPath); - std::wstring u16; - u32.toUtf16(u16); - - HANDLE hPF = ::CreateFileW(u16.c_str(), 0, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - if (hPF == INVALID_HANDLE_VALUE) - { - return false; - } - ::CloseHandle(hPF); - return true; -} - -bool fileUtil::directoryExists(const uniFile::filenameType &fullPath) throw() -{ - WIN32_FIND_DATAW fd = {0}; - - uniString::utf32 u32(fullPath); - std::wstring u16; - u32.toUtf16(u16); - - wstring path = u16.substr(0, u16.rfind(L"\\")); - HANDLE h = ::FindFirstFileW(path.c_str(), &fd); - if (h != INVALID_HANDLE_VALUE) - { - ::FindClose(h); - } - - return (h != INVALID_HANDLE_VALUE); -} - -vector<wstring> fileUtil::directoryFileList(const wstring &pattern, const wstring ¤tPath, bool fullPaths, bool preserveCase) throw() -{ - vector<wstring> result; - WIN32_FIND_DATAW fd = {0}; - wstring search = pattern; - - if (search.empty()) - { - return result; - } - - // look at the path and see if it's been setup correctly i.e has a .\ on the front for relative searches - if (!((search[1] == ':' && search[2] == '\\') || - (search[0] == '\\' && search[1] == '\\') || - (search[0] == '.' && search[1] == '\\') || - (search[0] == '.' && search[1] == '.' && search[2] == '\\'))) - { - if (!currentPath.empty()) - { - search = currentPath + search; - } - else - { - search = gStartupDirectory.toWString() + search; - } - } - - wstring path = search.substr(0,search.rfind(L"\\")); - HANDLE h = ::FindFirstFileW(search.c_str(),&fd); - if (h != INVALID_HANDLE_VALUE) - { - do - { - if (fullPaths) - { - if (preserveCase) - { - result.push_back((path + L"\\" + fd.cFileName)); - } - else - { - result.push_back(toLower(path + L"\\" + fd.cFileName)); - } - } - else - { - if (preserveCase) - { - result.push_back((fd.cFileName)); - } - else - { - result.push_back(toLower(wstring(fd.cFileName))); - } - } - } - while(::FindNextFileW(h,&fd)); - } - - if (h != INVALID_HANDLE_VALUE) - { - ::FindClose(h); - } - - return result; -} - -#else - -#include <sys/types.h> -#include <sys/stat.h> -#include <glob.h> - -utf8 fileUtil::getFullFilePath(const uniFile::filenameType &partial_path) throw() -{ - char resolved_path[MAXPATHLEN + 1] = {0}; - if (realpath(partial_path.hideAsString().c_str(), resolved_path)) - { - return utf8(resolved_path); - } - return partial_path; -} - -bool fileUtil::fileExists(const uniFile::filenameType &fullPath) throw() -{ - struct stat sbuf; - return (::stat(fullPath.hideAsString().c_str(),&sbuf) ? false : true); -} - -bool fileUtil::directoryExists(const uniFile::filenameType &fullPath) throw() -{ - glob_t gt; - bool found = false; - - if (glob(fullPath.hideAsString().c_str(),GLOB_NOSORT,0,>) == 0) - { - found = true; - } - - globfree(>); - return found; -} - -std::vector<std::string> fileUtil::directoryFileList(const std::string &pattern, const std::string ¤tPath) throw() -{ - vector<string> result; - - glob_t gt; - - string search = pattern; - - if (search.empty()) - { - return result; - } - - // look at the path and see if it's been setup correctly i.e has a ./ on the front for relative searches - if (!((search[0] == '\\' && search[1] == '\\') || - (search[0] == '/') || - (search[0] == '.' && search[1] == '/') || - (search[0] == '.' && search[1] == '.' && search[2] == '/'))) - { - if (!currentPath.empty()) - { - search = currentPath + search; - } - else - { - search = string("./") + search; - } - } - - if (glob(search.c_str(),GLOB_NOSORT,0,>) == 0) - { - for (size_t x = 0; x < gt.gl_pathc; ++x) - { - result.push_back(gt.gl_pathv[x]); - } - } - - globfree(>); - return result; -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.h deleted file mode 100644 index 12a1d419..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/file/fileUtils.h +++ /dev/null @@ -1,117 +0,0 @@ -#pragma once -#ifndef _fileUtils_H_ -#define _fileUtils_H_ - -#include <string> -#include <vector> -#include <stdexcept> -#include "unicode/uniString.h" -#include "unicode/uniFile.h" - -namespace fileUtil -{ - #ifdef _WIN32 - const char filePathDelimiter='\\'; - #else - const char filePathDelimiter='/'; - #endif - - static uniString::utf8 getFilePathDelimiter() - { - #ifdef _WIN32 - return (uniString::utf8)"\\"; - #else - return (uniString::utf8)"/"; - #endif - } - - //******************************************** - //* stripPath - //* - //* remove the path from a filename - //******************************************** - template<typename S> - S stripPath(const S &s,const S &delim) throw() - { - typename S::size_type pos = s.find_last_of(delim); - if (pos == S::npos) return s; - if (pos == s.size() -1) return S(); - return s.substr(pos+1); - } - - template<typename S> - S stripPath(const S &s) throw() - { - return fileUtil::stripPath(s,S(1,(typename S::value_type)fileUtil::filePathDelimiter)); - } - - template<typename S> - S onlyPath(const S &s,const S &delim) throw() - { - typename S::size_type pos = s.find_last_of(delim); - if (pos == S::npos) return S(); - return s.substr(0,pos+1); - } - - template<typename S> - S onlyPath(const S &s) throw() - { - return fileUtil::onlyPath(s,S(1,(typename S::value_type)fileUtil::filePathDelimiter)); - } - - template<typename S> - S mustEndIn(const S &s,typename S::value_type c) throw() - { - return ((s.empty() || ((*(s.rbegin())) != c)) ? (s+c) : s); - } - - template<class S> - S stripSuffix(const S &s,const S &delim) throw() - { - return s.substr(0,s.rfind(delim)); - } - - template<typename S> - S stripSuffix(const S &s) throw() - { - return fileUtil::stripSuffix(s,S(1,(typename S::value_type)'.')); - } - - template<class S> - S getSuffix(const S &s,const S &delim) throw() - { - S empty; - typename S::size_type pos = s.rfind(delim); - if (pos == S::npos) - return empty; - return s.substr(pos+1); - } - - template<typename S> - S getSuffix(const S &s) throw() - { - return fileUtil::getSuffix(s,S(1,(typename S::value_type)'.')); - } - - //////////// - - // return true if a file exists - bool fileExists(const uniFile::filenameType &fullPath) throw(); - - // return true if a directory exists - bool directoryExists(const uniFile::filenameType &fullPath) throw(); - - // get list of all files that match a pattern - #ifdef _WIN32 - std::vector<std::wstring> directoryFileList(const std::wstring &pattern, const std::wstring ¤tPath, - bool fullPaths, bool preserveCase = false) throw(); - #else - std::vector<std::string> directoryFileList(const std::string &pattern, const std::string ¤tPath) throw(); - #endif - - bool convertOSFilePathDelimiter(uniString::utf8 &value) throw(); - - uniFile::filenameType getFullFilePath(const uniFile::filenameType &partial) throw(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h deleted file mode 100644 index ffaaeb36..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/intTypes.h +++ /dev/null @@ -1,117 +0,0 @@ -#ifndef intTypes_H_ -#define intTypes_H_ - -#if defined(__APPLE_CC__) | defined(PLATFORM_BSD) -#include <machine/endian.h> -#else -#ifndef WIN32 -#include <endian.h> -#endif -#endif - -#ifndef WIN32 -// these are defined under windows -typedef char __int8; -typedef short __int16; -typedef int __int32; -typedef long long __int64; -#endif - -typedef unsigned char __uint8; -typedef unsigned short __uint16; -typedef unsigned int __uint32; -typedef unsigned long long __uint64; - -#ifdef __cplusplus - - -#undef ByteSwap32 -#undef ByteSwap16 -#undef ByteSwap -#undef bs16 -#undef bs32 -#undef bs -#undef bs16s -#undef bs16u -#undef bs32s -#undef bs32u - -inline __uint32 ByteSwap32u (__uint32 nLongNumber) -{ - return (((nLongNumber&0x000000FF)<<24)+((nLongNumber&0x0000FF00)<<8)+ - ((nLongNumber&0x00FF0000)>>8)+((nLongNumber&0xFF000000)>>24)); -} - -inline __uint16 ByteSwap16u (__uint16 nValue) -{ - return (((nValue>> 8)) | (nValue << 8)); - -} - -inline __int16 ByteSwap16s(__int16 nValue) { return ByteSwap16u(nValue); } -inline __int32 ByteSwap32s(__int32 nValue) { return ByteSwap32u(nValue); } - -inline __uint16 ByteSwap(__uint16 nValue) { return ByteSwap16u(nValue); } -inline __uint32 ByteSwap(__uint32 nValue) { return ByteSwap32u(nValue); } -inline __int16 ByteSwap(__int16 nValue) { return ByteSwap16u(nValue); } -inline __int32 ByteSwap(__int32 nValue) { return ByteSwap32u(nValue); } - -#ifdef __BYTE_ORDER - -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define bs16(x) (x) -#define bs16s(x) (x) -#define bs16u(x) (x) -#define bs32(x) (x) -#define bs32s(x) (x) -#define bs32u(x) (x) -#define bs(x) (x) -#else -#if __BYTE_ORDER == __BIG_ENDIAN -#define bs16(x) ByteSwap16u(x) -#define bs16s(x) ByteSwap16s(x) -#define bs16u(x) ByteSwap16u(x) -#define bs32(x) ByteSwap32u(x) -#define bs32s(x) ByteSwap32s(x) -#define bs32u(x) ByteSwap32u(x) -#define bs(x) ByteSwap(x) -#else -//#error "No endian defined (__BYTE_ORDER)" -#endif -#endif - -#else - -#ifdef BYTE_ORDER - -#if BYTE_ORDER == LITTLE_ENDIAN -#define bs16(x) (x) -#define bs16s(x) (x) -#define bs16u(x) (x) -#define bs32(x) (x) -#define bs32s(x) (x) -#define bs32u(x) (x) -#define bs(x) (x) -#else -#if BYTE_ORDER == BIG_ENDIAN -#define bs16(x) ByteSwap16u(x) -#define bs16s(x) ByteSwap16s(x) -#define bs16u(x) ByteSwap16u(x) -#define bs32(x) ByteSwap32u(x) -#define bs32s(x) ByteSwap32s(x) -#define bs32u(x) ByteSwap32u(x) -#define bs(x) ByteSwap(x) -#else -//#error "No endian defined (BYTE_ORDER)" -#endif -#endif - -#else - -//#error "Neither __BYTE_ORDER or BYTE_ORDER is defined" -#endif -#endif - -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h deleted file mode 100644 index 60ac48ef..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/macros.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef _commonmacros_H_ -#define _commonmacros_H_ - -#ifndef NDEBUG -#define DIAG(x) OutputDebugString(x); -#else -#define DIAG(x) -#endif - -/** - * The __TODO__ macro provides a way to notate source code in a way that the - * compiler will recognize and print out the file and line number in the Build - * window. This should be used like so: - * - * #pragma message(__TODO__"Message here") - */ -#define __TODO_STR2__(str) #str -#define __TODO_STR__(str) __TODO_STR2__(str) -#define __TODO__ __FILE__ "(" __TODO_STR__(__LINE__)") : TODO: " - -/* nocopy macros makes an uncopyable object use as follows - class foobar - { - nocopy(foobar) - - public: - // other methods here - }; -*/ -#define nocopy(c) private: c(const c &/*v*/) { ASSERT(0); } c& operator=(const c &/*v*/) { ASSERT(0); return *this;} - -// various forget macros that delete objects and zero them out safely. -#define forget(x) { if (x) { delete x; x = 0; } } -#define forgetArray(x) { if (x) { delete [] x; x = 0; } } -#define safeRelease(x) { if (x) { x->Release(); x = 0; } } -#define forgetHandleNULL(x) { if (x) { ::CloseHandle(x); x = NULL; } } - -#ifdef WIN32 -#define forgetHandleInvalid(x) { if (x != INVALID_HANDLE_VALUE) ::CloseHandle(x); x = INVALID_HANDLE_VALUE; } -#define forgetGDIObject(x) { if (x) ::DeleteObject(x); x = NULL; } -#define forgetGDIIcon(x) { if (x) ::DestroyIcon(x); x = NULL; } - -#ifdef HRESULT -// I do this so often, I turned it into a macro -struct bad_hresult -{ - HRESULT err; - bad_hresult(HRESULT herr): err(herr){} -}; -#endif - -#define checkCOMReturn(x) { HRESULT err = x; if (FAILED(err)) return err; } -#define checkCOMThrow(x) { HRESULT err = x; if (FAILED(err)) throw bad_hresult(err); } -#endif - -// so I don't have to include nsvlib.h all the time -#ifndef NSV_MAKETYPE -#define NSV_MAKETYPE(A,B,C,D) ((A) | ((B)<<8) | ((C)<<16) | ((D)<<24)) -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/memory/refPtr.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/memory/refPtr.h deleted file mode 100644 index 2650e7f6..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/memory/refPtr.h +++ /dev/null @@ -1,181 +0,0 @@ -#ifndef refPtr_H_ -#define refPtr_H_ - -#include "threading/thread.h" -#ifdef WIN32 -#include <crtdbg.h> -#else -#include <assert.h> -#endif - -#ifndef WIN32 -#ifndef _ASSERTE -#define _ASSERTE(x) assert(x) -#endif -#endif - -/* - Intrusive reference counted pointer template. - - The class to be reference counted must implement - - void refIncrement() const // increment the reference count - int refDecrement() const // decrement the reference count and return the new value. - - Yes, the methods are const. This provides maximum flexibility. - Obviously the reference counted values must be mutable for this to work. - - Two predefined bases are provided. - - refCountBase - non locking base for single threaded scenarios - refCountBaseMT - locking base for multi threaded scenarios - -*/ - -// base class for single threaded reference count objects -class refCountBase -{ -template <class T> friend class refPtr; -public: - /// return the number of references to this object (useful for debugging) - int refCount() const { return m_refCount; } - -protected: - refCountBase() : m_refCount(0) {} - virtual ~refCountBase() - { - // make sure nobody has deleted this directly with delete - _ASSERTE(m_refCount == 0); - } - -private: - mutable int m_refCount; - - void refIncrement() const { _ASSERTE(m_refCount >= 0); ++m_refCount; } - - int refDecrement() const { _ASSERTE(m_refCount > 0); return --m_refCount; } -}; - -// base class for multi threaded reference count objects -class refCountBaseMT -{ -template <class T> friend class refPtr; -public: - /// return the number of references to this object (useful for debugging) - int refCount() const - { - stackLock sl(m_lock); - return m_refCount; - } - -protected: - refCountBaseMT() : m_refCount(0) {} - virtual ~refCountBaseMT() - { - // make sure nobody has deleted this directly with delete - _ASSERTE(m_refCount == 0); - } - -private: - mutable int m_refCount; - mutable AOL_namespace::mutex m_lock; - - void refIncrement() const - { - stackLock sl(m_lock); - _ASSERTE(m_refCount >= 0); - ++m_refCount; - } - - int refDecrement() const - { - stackLock sl(m_lock); - _ASSERTE(m_refCount > 0); - return --m_refCount; - } -}; - -template <class T> class refPtr -{ -public: - typedef T *pointer_t; - - // construction - refPtr() : m_object(NULL) {} - - refPtr(const refPtr<T> &rhs) : m_object(rhs.m_object) - { - if (m_object) - m_object->refIncrement(); - } - - refPtr(T *object) : m_object(object) - { - if (m_object) - m_object->refIncrement(); - } - - ~refPtr() - { - if (m_object && (m_object->refDecrement() == 0)) - delete m_object; - } - - // asignment - refPtr<T> &operator=(const refPtr<T> &rhs) - { - if (m_object != rhs.m_object) - { - if (m_object && (m_object->refDecrement() == 0)) - delete m_object; - m_object = rhs.m_object; - if (m_object) - m_object->refIncrement(); - } - return *this; - } - - /// test if pointers are the same - inline bool operator==(const refPtr<T> &rhs) const - { - return m_object == rhs.m_object; - } - - inline bool operator==(void *nl) const - { - return m_object == nl; - } - - /// test if pointers are not the same - inline bool operator!=(const refPtr<T> &rhs) const - { - return m_object != rhs.m_object; - } - - inline bool operator!=(void *nl) const - { - return m_object != nl; - } - - // dereferencing - T *operator->() const { _ASSERTE(m_object); return (T *)m_object; } - T &operator*() const { _ASSERTE(m_object); return *((T *)m_object); } - operator T *() const { return (T *)m_object; } - - /// explicit get - do NOT delete this pointer! - T *get() const { return (T *)m_object; } - - /* these member templates allows conversion of this smart pointer to - other smart pointers in the parent hierarchy. This simulates up-casting - the pointer to a base */ - template <class newType> - operator refPtr<newType>() { return refPtr<newType>((T *)m_object); } - - template <class newType> - operator const refPtr<newType>() const { return refPtr<newType>((T *)m_object); } - -private: - T *m_object; -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.cpp deleted file mode 100644 index b1445cba..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "baseOptions.h" -#include "stl/stringUtils.h" -#ifdef _WIN32 -#include "win32/rezFuncs.h" -#else -#include "unixversion.h" -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -bool baseOptions::toBool(const utf8 &s) throw() -{ - if (s.empty()) return true; - utf8 ss = toLower(s); - return (s[0] == 't' || s[0] == '1' || s[0] == 'y'); -} - -const vector<utf8> baseOptions::fromArgs(const vector<utf8> &cl) throw() -{ - vector<utf8> unused; - - for (vector<utf8>::const_iterator i = cl.begin(); i != cl.end(); ++i) - { - utf8::size_type colon_pos = (*i).find(utf8(":")); - if (colon_pos != utf8::npos) - { - utf8 key = (*i).substr(0,colon_pos); - utf8 value = (*i).substr(colon_pos+1); - if (key == "flog") - { - m_fileLog = value; - } - else if (key == "clog") - { - m_consoleLogging = toBool(value); - } - else - { - unused.push_back(*i); - } - } - else - { - unused.push_back(*i); - } - } - - return unused; -} - -utf8 baseOptions::getVersionBuildStrings() throw() -{ -#ifdef _WIN32 - static utf8 version; - if (version.empty()) - { - getVersionInfo(version); - } -#else - static utf8 version; - if (version.empty()) - { - for (int x = 0; x < VENT; ++x) - { - if (x) - { - version += "."; - } - version += tos(PRODUCTVERSION[x]); - } - } -#endif - return version; -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.h deleted file mode 100644 index 96d96dbe..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/baseOptions.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#ifndef baseOptions_H_ -#define baseOptions_H_ - -#include <string> -#include <vector> -#include "unicode/uniFile.h" -#include "services/logger.h" - -struct baseOptions -{ - uniFile::filenameType m_fileLog; - bool m_consoleLogging; - - // convert a string to a boolean - static bool toBool(const uniString::utf8 &s) throw(); - - // process command line options. Options are key:value pairs. All unprocessed - // options are returned - const std::vector<uniString::utf8> fromArgs(const std::vector<uniString::utf8> &cl) throw(); - - const uniFile::filenameType &getFileLog() const throw() { return m_fileLog; } - bool getConsoleLogging() const throw() { return m_consoleLogging; } - #ifdef _WIN32 - static uniString::utf8 getSystemLogConfigString() throw() { return AOL_logger::systemLogger_element::panicConfiguration(); } - #else - static uniString::utf8 getSystemLogConfigString() throw() { return "";} - #endif - static uniString::utf8 getVersionBuildStrings() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.cpp deleted file mode 100644 index 3e8bf438..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.cpp +++ /dev/null @@ -1,966 +0,0 @@ -#include "logger.h" -#include <stdio.h> -#include <algorithm> -#include "stl/functors.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include "../../global.h" - -#ifndef _WIN32 -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <fcntl.h> -#endif - -#ifdef _WIN32 -#define __F__ __FUNCTION__ -#else -#define __F__ string(__PRETTY_FUNCTION__) + -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -//////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////// LOGGER ELEMENTS /////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////// - -#ifdef _WIN32 -//////////// Win32 File Logger - -inline uniFile::filenameType AOL_logger::fileLogger_element::make_backup_log(const uniFile::filenameType &filename,int which) throw() -{ - return fileUtil::stripSuffix(filename) + "_" + - tobs<uniFile::filenameType>(which) + "." - + fileUtil::getSuffix(filename); -} - -uniFile::filenameType AOL_logger::fileLogger_element::make_archive_log() throw() -{ - SYSTEMTIME sysTime = {0}; - ::GetLocalTime(&sysTime); - wchar_t d[100] = {0}, t[100] = {0}; - ::GetDateFormatW(LOCALE_SYSTEM_DEFAULT,0,&sysTime,_T("yyyy'_'MM'_'dd"),d,99); - ::GetTimeFormatW(LOCALE_SYSTEM_DEFAULT,0,&sysTime,_T("HH'_'mm'_'ss"),t,99); - return tos((const wchar_t *)d) + "_" + tos((const wchar_t *)t); -} - -void AOL_logger::fileLogger_element::rotate() throw() -{ - m_lastRolloverTime = ::time(NULL); - - if (m_file == INVALID_HANDLE_VALUE || m_first == false) - { - return; - } - - // close the log - forgetHandleInvalid(m_file); - - // rotate - for (int x = m_numFileBackups; x > 0; --x) - { - uniFile::filenameType dest = make_backup_log(m_fileName,x); - - // archive the log file about to be removed into a gz file - if (m_numFileBackups > 0 && x == m_numFileBackups && m_archiveFileBackups) - { - uniFile::filenameType archive = dest; - utf8::size_type pos = archive.rfind(utf8("_"+tos(m_numFileBackups))); - if ((pos != utf8::npos) && (uniFile::fileSize(dest) > 0)) - { - archive = (dest.substr(0,pos) + utf8("_log_" + make_archive_log() + ".gz")); - - HANDLE m_archive = ::CreateFileW(archive.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_archive != INVALID_HANDLE_VALUE) - { - DWORD written(0); - utf8 out; - z_stream m_stream = {0}; - - if (uniFile::fileSize(dest) > 0) - { - FILE* m_logFile = uniFile::fopen(dest,"rb"); - if (m_logFile != NULL) - { - bool started = false; - while (!feof(m_logFile)) - { - std::vector<uniString::utf8::value_type> m_logFileBuffer; - const size_t BUFSIZE(1024*16); - m_logFileBuffer.clear(); - m_logFileBuffer.resize(BUFSIZE + 1); - size_t amt = fread(&(m_logFileBuffer[0]), 1, BUFSIZE, m_logFile); - if (amt > 0) - { - out = utf8(&(m_logFileBuffer[0]), amt); - if (started == false) - { - compressDataStart(out, &m_stream); - started = true; - } - else - { - compressDataCont(out, &m_stream); - } - ::WriteFile(m_archive, out.c_str(), (DWORD)out.size(), &written, NULL); - } - } - - compressDataFinish(out, &m_stream); - ::WriteFile(m_archive, out.c_str(), (DWORD)out.size(), &written, NULL); - - compressDataEnd(&m_stream); - - ::fclose(m_logFile); - forgetHandleInvalid(m_archive); - - // no need to keep any 0-byte files - // this is just incase of weirdness - if (!uniFile::fileSize(archive)) - { - uniFile::unlink(archive); - } - } - else - { - forgetHandleInvalid(m_archive); - uniFile::unlink(archive); - } - } - } - } - } - ::DeleteFileW(dest.toWString().c_str()); - ::MoveFileW( - ((x-1) ? make_backup_log(m_fileName,(x-1)).toWString().c_str() - : m_fileName.toWString().c_str()), - dest.toWString().c_str()); - } - - // open new log - m_file = ::CreateFileW(m_fileName.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); -} - -AOL_logger::fileLogger_element::fileLogger_element(const uniFile::filenameType &filename, const uniFile::filenameType &defaultFilename, - bool &useDefaultPath, int backups, bool archive, int rolloverInterval, size_t SID) throw(exception) - - : m_fileName(filename), m_file(INVALID_HANDLE_VALUE), m_lastRolloverTime(0), m_rolloverInterval(rolloverInterval), m_numFileBackups(backups), - m_archiveFileBackups(archive), m_first(false), m_SID(SID) -{ - // this will fill in the default log path as required - wchar_t s_defaultFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(defaultFilename.toWString().c_str(), s_defaultFileName, MAX_PATH); - utf8 m_defaultFilename(utf32(s_defaultFileName).toUtf8()); - - useDefaultPath = false; - m_file = ::CreateFileW(m_fileName.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - m_file = ::CreateFileW(m_defaultFilename.toWString().c_str(),GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - uniFile::filenameType fallbackFilename("%temp%\\sc_serv_" + tos(getpid()) + ".log"); - wchar_t s_fallbackFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(fallbackFilename.toWString().c_str(), s_fallbackFileName, MAX_PATH); - utf8 m_fallbackFilename(utf32(s_fallbackFileName).toUtf8()); - m_file = ::CreateFileW(m_fallbackFilename.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_file == INVALID_HANDLE_VALUE) - { - throw runtime_error("Logger could not open the log file \"" + m_fileName.hideAsString() + "\" for writing [" + errMessage().hideAsString() + "]. Check the directory exists and another instance is not already running."); - } - else - { - m_fileName = m_fallbackFilename; - } - } - else - { - m_fileName = m_defaultFilename; - } - } - - ::SetFilePointer(m_file,0,0,FILE_END); // seek to end - if (m_fileName == m_defaultFilename) - { - useDefaultPath = true; - } - - gOptions.setOption(utf8("reallogfile"), m_fileName); - - // using this to prevent rotating empty log files on startup - m_first = fileUtil::fileExists(m_fileName.hideAsString()); - if (m_first && !uniFile::fileSize(m_fileName)) - { - m_first = false; - } - - rotate(); -} - -AOL_logger::fileLogger_element::~fileLogger_element() throw() -{ - forgetHandleInvalid(m_file); -} - -void AOL_logger::fileLogger_element::log(message &m) throw(exception) -{ - time_t t = ::time(NULL); - if (t < m_lastRolloverTime || (((t - m_lastRolloverTime) > m_rolloverInterval) && m_rolloverInterval)) - { - rotate(); - rotatew3cFiles("w3c"); - } - if (m.m_alreadyLogged) - return; - if (m_SID != m.m_streamID && m_SID) - { - return; - } - m.m_alreadyLogged = true; - m_first = true; - - utf8 ss = m.getTimestamp() + "\t" + m.typeAsStr(); - const utf8 &msg = m.getMsg(); - - if (msg[0] != '[') - { - const char *section = m.fromSection(); - if (section) - { - bool wrap = (section[0] == '[') ? false : true; - size_t ID = m.getID(); - if (wrap) - { - ss += "\t["; - ss += section; - if (ID > 0) - { - ss += " sid="; - ss += tos(ID); - } - ss += "] "; - } - else - { - ss += "\t"; - ss += section; - // if (ID > 0) - // ss += " ID present "; - } - } - else - ss += "\t"; - } - else - ss += "\t"; - - const map<utf8,utf8> *fields = m.getFields(); - if (fields) - { - for (map<utf8,utf8>::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += "\t" + (*i).second; - } - else - { - return; - } - } - } - } - ss += msg; - ss += eol(); - - if (m_file == INVALID_HANDLE_VALUE) - { - throw runtime_error(__F__ " Error writing to log file " + m_fileName.hideAsString()); - } - - DWORD written(0); - if ((!::WriteFile(m_file, ss.c_str(), (DWORD)ss.size(), &written, NULL)) || (written != ss.size())) - { - throw runtime_error(__F__ " Error writing to log file " + m_fileName.hideAsString()); - } -} - -#else - -/////////// Unix File Logger - -uniFile::filenameType AOL_logger::fileLogger_element::make_backup_log(const uniFile::filenameType &filename,int which) throw() -{ - return fileUtil::stripSuffix(filename) + "_" + tos(which) + "." + fileUtil::getSuffix(filename); -} - -uniFile::filenameType AOL_logger::fileLogger_element::make_archive_log() throw() -{ - char buf[256] = {0}; - struct tm ttm; - time_t ttt; - ::time(&ttt); - ::strftime(buf, 255, "%Y_%m_%d_%H_%M_%S", ::localtime_r(&ttt, &ttm)); - return buf; -} - -void AOL_logger::fileLogger_element::rotate() throw() -{ - m_lastRolloverTime = ::time(NULL); - - if ((m_file == -1) || (m_first == false)) - { - return; - } - - // close the log - ::close(m_file); - m_file = -1; - - // rotate - for (int x = m_numFileBackups; x > 0; --x) - { - uniFile::filenameType dest = make_backup_log(m_fileName,x); - - // archive the log file about to be removed into a gz file - if (m_numFileBackups > 0 && x == m_numFileBackups && m_archiveFileBackups) - { - uniFile::filenameType archive = dest; - utf8::size_type pos = archive.rfind(utf8("_"+tos(m_numFileBackups))); - if ((pos != utf8::npos) && (uniFile::fileSize(dest) > 0)) - { - archive = (dest.substr(0,pos) + utf8("_log_" + make_archive_log() + ".gz")); - - int m_archive = ::open(archive.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_archive != -1) - { - utf8 out; - z_stream m_stream = {0}; - - if (uniFile::fileSize(dest) > 0) - { - FILE* m_logFile = uniFile::fopen(dest,"rb"); - if (m_logFile != NULL) - { - bool started = false; - while (!feof(m_logFile)) - { - std::vector<uniString::utf8::value_type> m_logFileBuffer; - const size_t BUFSIZE(1024*16); - m_logFileBuffer.clear(); - m_logFileBuffer.resize(BUFSIZE + 1); - size_t amt = fread(&(m_logFileBuffer[0]), 1, BUFSIZE, m_logFile); - if (amt > 0) - { - out = utf8(&(m_logFileBuffer[0]), amt); - if (started == false) - { - compressDataStart(out, &m_stream); - started = true; - } - else - { - compressDataCont(out, &m_stream); - } - ::write(m_archive,out.c_str(),out.size()); - } - } - - compressDataFinish(out, &m_stream); - ::write(m_archive,out.c_str(),out.size()); - - compressDataEnd(&m_stream); - - ::fclose(m_logFile); - ::close(m_archive); - - // no need to keep any 0-byte files - // this is just incase of weirdness - if (!uniFile::fileSize(archive)) - { - uniFile::unlink(archive); - } - } - else - { - ::close(m_archive); - uniFile::unlink(archive); - } - } - } - } - } - - ::remove(dest.hideAsString().c_str()); - ::rename( - ((x-1) ? make_backup_log(m_fileName,(x-1)).hideAsString().c_str() - : m_fileName.hideAsString().c_str()), - dest.hideAsString().c_str()); - } - - // open new log - m_file = ::open(m_fileName.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); -} - -AOL_logger::fileLogger_element::fileLogger_element(const uniFile::filenameType &filename, - const uniFile::filenameType &defaultFilename, - bool &useDefaultPath, int backups, - bool archive, int rolloverInterval, size_t SID) throw(exception): - m_fileName(filename), m_file(-1), m_lastRolloverTime(0), - m_rolloverInterval(rolloverInterval), m_numFileBackups(backups), - m_archiveFileBackups(archive), m_first(false), m_SID(SID) -{ - umask(0); - useDefaultPath = false; - m_file = ::open(filename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - if (SID == 0) - m_file = ::open (defaultFilename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - uniFile::filenameType fallbackFilename("/tmp/sc_serv_" + tos(getpid()) + ".log"); - m_file = ::open(fallbackFilename.hideAsString().c_str(),O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_file == -1) - { - throw runtime_error("Logger could not open the log file \"" + m_fileName.hideAsString() + "\" for writing [" + errMessage().hideAsString() + "]. Check the directory exists and another instance is not already running."); - } - else - { - m_fileName = fallbackFilename; - } - } - else - { - m_fileName = defaultFilename; - } - } - - if (m_fileName == defaultFilename) - { - useDefaultPath = true; - } - - gOptions.setOption(utf8("reallogfile"), m_fileName); - - // using this to prevent rotating empty log files on startup - m_first = fileUtil::fileExists(m_fileName.hideAsString()); - if (m_first && !uniFile::fileSize(m_fileName)) - { - m_first = false; - } - - rotate(); -} - -AOL_logger::fileLogger_element::~fileLogger_element() throw() -{ - if (m_file != -1) - ::close(m_file); - m_file = -1; -} - -void AOL_logger::fileLogger_element::log(message &m) throw(exception) -{ - time_t t = ::time(NULL); - if (t < m_lastRolloverTime || (((t - m_lastRolloverTime) > m_rolloverInterval) && m_rolloverInterval)) - { - rotate(); - rotatew3cFiles("w3c"); - } - if (m.m_alreadyLogged) - return; - if (m_SID != m.m_streamID && m_SID) - { - return; - } - m.m_alreadyLogged = true; - m_first = true; - - utf8 ss = m.getTimestamp() + "\t" + m.typeAsStr(); - const utf8 &msg = m.getMsg(); - - if (msg[0] != '[') - { - const char *section = m.fromSection(); - if (section) - { - bool wrap = (section[0] == '[') ? false : true; - size_t ID = m.getID(); - if (wrap) - { - ss += "\t["; - ss += section; - if (ID > 0) - { - ss += " sid="; - ss += tos(ID); - } - ss += "] "; - } - else - { - ss += "\t"; - ss += section; - // if (ID > 0) - // ss += " ID present "; - } - } - else - ss += "\t"; - } - else - ss += "\t"; - - const map<utf8,utf8> *fields = m.getFields(); - if (fields) - { - for (map<utf8,utf8>::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += "\t" + (*i).second; - } - else - { - return; - } - } - } - ss += " "; - } - ss += msg; - ss += eol(); - - if (m_file == -1) - { - throw runtime_error(__F__ " Error writing to log file " + m_fileName.hideAsString()); - } - - if (::write(m_file,ss.c_str(),ss.size()) == -1) - { - throw runtime_error(__F__ " Error writing to log file " + m_fileName.hideAsString()); - } -} - -#endif - -#ifdef _WIN32 -//////// Win32 console logger - -AOL_logger::consoleLogger_element::consoleLogger_element() throw(exception) : m_stdoutConsole(NULL), m_stderrConsole(NULL) -{ - ::AllocConsole(); - ::SetConsoleOutputCP(65001); // utf-8 - ::SetConsoleCP(CP_UTF8);//65001); - - m_stdoutConsole = ::GetStdHandle(STD_OUTPUT_HANDLE); - m_stderrConsole = ::GetStdHandle(STD_ERROR_HANDLE); - - if ((!m_stdoutConsole) || (!m_stderrConsole)) - { - throw runtime_error("Logger could not open console"); - } -} - -AOL_logger::consoleLogger_element::~consoleLogger_element() throw() -{ - if (m_stdoutConsole != NULL) - { - ::FreeConsole(); - m_stdoutConsole = NULL; - m_stderrConsole = NULL; - } -} - -void AOL_logger::consoleLogger_element::log(message &m) throw(exception) -{ - static const DWORD maxLogLine=2048; - - utf8 ss = m.getTimestamp() + "\t" + m.typeAsStr(); - - const utf8 &msg = m.getMsg(); - if (msg[0] != '[') - { - const char *section = m.fromSection(); - if (section) - { - bool wrap = (section[0] == '[') ? false : true; - size_t ID = m.getID(); - if (wrap) - { - ss += "\t["; - ss += section; - if (ID > 0) - { - ss += " sid="; - ss += tos(ID); - } - ss += "] "; - } - else - { - ss += "\t"; - ss += section; - // if (ID > 0) - // ss += " ID present "; - } - } - else - ss += "\t"; - } - else - ss += "\t"; - - const map<utf8,utf8> *fields = m.getFields(); - if (fields) - { - for (map<utf8,utf8>::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += "\t" + (*i).second; - } - else - { - return; - } - } - } - } - - ss += m.getMsg(); - ss += eol(); - - HANDLE h = (m.getType() == AOL_logger::message::BM_ERROR ? m_stderrConsole : m_stdoutConsole); - if (h != INVALID_HANDLE_VALUE) - { - // see if we need to colour the output - only used for errors and warnings - AOL_logger::message::message_t type = m.getType(); - bool painted = false; - CONSOLE_SCREEN_BUFFER_INFO csbiInfo = {0}; - WORD wOldColorAttrs = 0; - if (type != AOL_logger::message::BM_INFO && GetConsoleScreenBufferInfo(h, &csbiInfo)) - { - wOldColorAttrs = csbiInfo.wAttributes; - - // red for error, yellow for warnings, green for debug, blue for update - if (type == AOL_logger::message::BM_ERROR) - { - painted = true; - SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY); - } - else if (type == AOL_logger::message::BM_WARNING) - { - painted = true; - SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); - } - else if (type == AOL_logger::message::BM_DEBUG) - { - painted = true; - SetConsoleTextAttribute(h, FOREGROUND_GREEN); - } - else if (type == AOL_logger::message::BM_UPDATE) - { - painted = true; - SetConsoleTextAttribute(h, FOREGROUND_BLUE); - } - } - - // utf8 sometimes returns a size that does not match input - DWORD written(0); - DWORD amtToWrite = (DWORD)ss.size(); - bool truncated = false; - if (amtToWrite > maxLogLine) - { - amtToWrite = maxLogLine; - truncated = true; - } - - if (truncated) - { - utf8 truncateMsg = m.getTimestamp() + "\t" + ((char)message::BM_WARNING) + "\t[MAIN] Next line is truncated" + eol(); - ::WriteFile(h,truncateMsg.c_str(),(DWORD)truncateMsg.size(),&written,NULL); - written = 0; - } - - if (::WriteFile(h,ss.c_str(),amtToWrite,&written,NULL)) - { - if (truncated) - { - // eol - written = 0; - ::WriteFile(h,eol().c_str(),(DWORD)eol().size(),&written,NULL); - } - } - - // revert the colouring if we needed to change it - if (painted) - { - SetConsoleTextAttribute(h, wOldColorAttrs); - } - } -} - -#else -/////// Unix console logger - -AOL_logger::consoleLogger_element::consoleLogger_element() throw(exception) : - m_stdoutConsole(STDOUT_FILENO), m_stderrConsole(STDERR_FILENO) -{ - if ((m_stdoutConsole == -1) || (m_stderrConsole == -1)) - { - throw runtime_error("Logger could not open console"); - } -} - -AOL_logger::consoleLogger_element::~consoleLogger_element() throw() -{ - m_stdoutConsole = m_stderrConsole = -1; -} - -void AOL_logger::consoleLogger_element::log(message &m) throw(exception) -{ - utf8 sc = ""; - // see if we need to colour the output - only used for errors, warnings and debugs - AOL_logger::message::message_t type = m.getType(); - if (type != AOL_logger::message::BM_INFO) - { - // red for error, yellow for warnings, green for debug, blue for update - if (type == AOL_logger::message::BM_ERROR) - { - sc = "\033[01;31m"; - } - else if (type == AOL_logger::message::BM_WARNING) - { - sc = "\033[01;33m"; - } - else if (type == AOL_logger::message::BM_DEBUG) - { - sc = "\033[0;32m"; - } - else if (type == AOL_logger::message::BM_UPDATE) - { - sc = "\033[0;34m"; - } - } - - utf8 ss = sc + m.getTimestamp() + "\t" + m.typeAsStr(); - const utf8 &msg = m.getMsg(); - if (msg[0] != '[') - { - const char *section = m.fromSection(); - if (section) - { - bool wrap = (section[0] == '[') ? false : true; - size_t ID = m.getID(); - if (wrap) - { - ss += "\t["; - ss += section; - if (ID > 0) - { - ss += " sid="; - ss += tos(ID); - } - ss += "] "; - } - else - { - ss += "\t"; - ss += section; - // if (ID > 0) - // ss += " ID present "; - } - } - else - ss += "\t"; - } - else - ss += "\t"; - const map<utf8,utf8> *fields = m.getFields(); - if (fields) - { - for (map<utf8,utf8>::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += "\t" + (*i).second; - } - else - { - return; - } - } - } - } - - ss += m.getMsg(); - ss += eol() + (!sc.empty() ? "\033[0m" : ""); - - int console = (m.getType() == AOL_logger::message::BM_ERROR ? m_stderrConsole : m_stdoutConsole); - - if (console != -1) - { - ::write(console,ss.c_str(),ss.size()); - } -} -#endif - -#ifdef _WIN32 - -// Win32 system logger -void AOL_logger::systemLogger_element::registerEventLog(const utf8 &log_object_name, - const uniFile::filenameType &fullExePath) throw() -{ - HKEY key = NULL; - DWORD disposition = 0; - - wstring regEntry = L"System\\CurrentControlSet\\Services\\EventLog\\Application\\"; - regEntry += log_object_name.toWString(); - - LONG err = ::RegCreateKeyExW(HKEY_LOCAL_MACHINE, regEntry.c_str(), 0, NULL, - REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &key, &disposition); - - if (err == ERROR_SUCCESS) - { - DWORD ts = 1; - wstring widePath = fullExePath.toWString(); - ::RegSetValueExW(key,L"EventMessageFile",0,REG_SZ,(const BYTE *)widePath.c_str(),(DWORD)((fullExePath.size() + 1) * 2)); - ::RegSetValueExW(key,L"TypesSupported",0,REG_DWORD,(const BYTE *)&ts,sizeof(ts)); - ::RegCloseKey(key); - } -} - -AOL_logger::systemLogger_element::systemLogger_element(const utf8 &log_object_name, - const uniFile::filenameType &fullExePath, - const utf8 &loggerConfigString) throw(exception) - : m_systemLog(NULL), m_loggerConfigString(loggerConfigString) -{ - registerEventLog(log_object_name,fullExePath); - m_systemLog = ::RegisterEventSourceW(NULL, // uses local computer - log_object_name.toWString().c_str()); // source name - if (m_systemLog == NULL) - { - throw runtime_error("Could not register the event source for the system logs."); - } -} - -AOL_logger::systemLogger_element::~systemLogger_element() throw() -{ - if (m_systemLog != NULL) - { - ::DeregisterEventSource(m_systemLog); - m_systemLog = NULL; - } -} - -static WORD charToLogType(char c) throw() -{ - if (c == 'E') - { - return EVENTLOG_ERROR_TYPE; - } - if (c == 'W') - { - return EVENTLOG_WARNING_TYPE; - } - if (c == 'I') - { - return EVENTLOG_INFORMATION_TYPE; - } - return 0; -} - -static WORD messageTypeToLogType(AOL_logger::message::message_t t, const utf8 &configString) throw() -{ - if (configString.size() < 5) - { - return EVENTLOG_ERROR_TYPE; - } - - switch (t) - { - case AOL_logger::message::BM_INFO: - { - return charToLogType(configString[3]); - } - case AOL_logger::message::BM_WARNING: - { - return charToLogType(configString[2]); - } - case AOL_logger::message::BM_ERROR: - { - return charToLogType(configString[0]); - } - case AOL_logger::message::BM_DEBUG: - { - return charToLogType(configString[4]); - } - } - return 0; -} - -void AOL_logger::systemLogger_element::log(message &m) throw(exception) -{ - if (m_systemLog == NULL) - { - throw runtime_error(__F__ " Error writing to system log"); - } - - const map<utf8,utf8> *fields = m.getFields(); - - utf8 ss; - if (fields) - { - for (map<utf8,utf8>::const_iterator i = fields->begin(); i != fields->end(); ++i) - { - if (!(*i).first.empty()) - { - if (!(*i).second.empty()) - { - ss += (!ss.empty() ? "\t" : "") + (*i).second; - } - else - { - return; - } - } - } - } - ss += m.getMsg(); - if (!ss.empty()) - { - utf32 u32(stripWhitespace(ss)); - utf16 u16(u32.toUtf16(true)); - - const wchar_t *s = (const wchar_t *)u16.c_str(); - WORD et = messageTypeToLogType(m.getType(), m_loggerConfigString); - if (et) - { - ::ReportEventW(m_systemLog, // event log handle - et, // event type - 0, // category 0 - ((DWORD)0xC0000001L), // event identifier - NULL, // no user security identifier - 1, // one substitution string - 0, // no data - &s, // pointer to string array - NULL); - } - } -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.h deleted file mode 100644 index 1cd634de..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/logger.h +++ /dev/null @@ -1,461 +0,0 @@ -#pragma once -#ifndef logger_H_ -#define logger_H_ - -#ifdef _WIN32 -#include <windows.h> -#include <tchar.h> -#endif -#include <string> -#include <vector> -#include <algorithm> -#include <map> -#include <stdexcept> -#include "unicode/uniFile.h" -#include "stl/stringUtils.h" -#include "stl/functors.h" -#include "threading/messageThread.h" -#include "unicode/uniFile.h" - -namespace AOL_logger -{ - /* - A function object, used in conjunction with the messageThread template to create a - thread safe logging entity which runs on it's own thread. - - The logger is meant to be run in the context of a messageThread object like so: - - extern messageThread<logger> *gLog; - - You post messages using the postMessage method from the messageThread class - - gLog->postMessage(whatever); - - The E (logger element) type has the following requirements - - 1) Must be a heap element that can be deleted. - 2) An install() method which is called when the element becomes part of - the logging system. Install may throw an exception - 3) An uninstall() mehod which is called when before the log element is - destroyed by the logger system. It MUST NOT throw an exception. - - The M (message) type has the following requirements - - 1) Must support a static makeError(const uniString::utf8 &s) throw() for - constructing an error message - 2) Must have - bool done() const throw() - which returns true to indicate it's a message to shutdown the logger - 3) Any other signatures required by the logger element - */ - - class message; - template<class M = AOL_logger::message> class logger_element; - - template<typename M = AOL_logger::message,typename E = AOL_logger::logger_element<M> > - class logger - { - // NOTE: logger takes ownership of the elements and deletes them - // when done. - private: - std::vector<E*> m_elements; - - void uninstallElements() throw() - { - std::for_each(m_elements.begin(), m_elements.end(), std::mem_fun(&E::uninstall)); - } - - public: - typedef M message_t; - - // constructors. If the constructor succeeds (does not throw), then this - // logger object has posession of the elements, and will delete them - // itself. - logger() throw() {} - - // create the logger with a single element. An exception - // means that the element was not added. The logger has not taken - // posession of the element and it's up to the caller to delete it. - explicit logger(E *e) throw(std::exception) - { - addElement(e); - } - - // create the logger from a container of elements. If the install() method - // of any element throws, then this constructor will throw. All methods that - // were installed() will be uninstalled() but NO elements will be deleted. Thatt - // is up to the caller. - template <typename ITER> - logger(ITER first,ITER last) throw (std::exception) - { - try - { - addElement(first, last); - } - catch(...) - { - uninstallElements(); - m_elements.clear(); - throw; - } - } - - ///////////////////////// - - // destructor - ~logger() throw() - { - uninstallElements(); - std::for_each(m_elements.begin(), m_elements.end(), stlx::delete_fntr<E>); - } - - // warning... there is no lock protection. Do not add a logger element - // while the thread is running - void addElement(E *e) throw(std::exception) - { - // note: element is not added to internal list if install() throws - e->install(); - m_elements.push_back(e); - } - - // if any element throws, then all the ones passed in will be uninstalled if - // they were installed, and no objects in the list will be taken posession of - template <typename ITER> - void addElement(ITER first, ITER last) throw(std::exception) - { - std::vector<E*> tmp; - try - { - for (ITER i = first; i != last; ++i) - { - (*i)->install(); - tmp.push_back(*i); - } - } - catch(...) - { - for (typename std::vector<E*>::const_iterator i = tmp.begin(); i != tmp.end(); ++i) - { - (*i)->uninstall(); - } - throw; - } - m_elements.insert(m_elements.end(), tmp.begin(), tmp.end()); - } - - ////////////////////////////////////////////////////// - - // main dispatch loop - bool operator()(M &m) throw() - { - if (m.done()) // if this is the done message, exit the loop - { - return false; - } - - if (m.rotate()) - { - for (typename std::vector<E*>::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) - { - (*i)->rotate(); - } - return true; - } - - for (typename std::vector<E*>::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) - { - try - { - (*i)->log(m); - } - catch (const std::exception &ex) - { - // on an exception, create an error message and dispatch it to everyone - // via their 'NOTHROW' handler - M mex = M::makeError(ex.what()); - for (typename std::vector<E*>::const_iterator ix = m_elements.begin(); ix != m_elements.end(); ++ix) - { - (*ix)->logNOTHROW(mex); - } - } - } - return true; - } - }; - -/////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////// Here is a basic set of elements you can use /////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////// - - class fileLogger_element; - - // the message class - class message - { - public: - typedef enum - { - BM_DONE, - BM_ROTATE, - BM_ERROR = 'E', - BM_WARNING = 'W', - BM_INFO = 'I', - BM_DEBUG = 'D', - BM_UPDATE = 'U' - } message_t; - - size_t m_streamID; - private: - //uniString::utf8 m_typeStr; - friend class AOL_logger::fileLogger_element; - - uniString::utf8 m_timestamp; - std::map<uniString::utf8,uniString::utf8> *m_fields; - uniString::utf8 m_msg; - const char *m_section; - message_t m_type; - bool m_alreadyLogged; - - static uniString::utf8 timeStamp() throw() - { -#ifdef _WIN32 - SYSTEMTIME lastTime = {0}; - wchar_t d[100] = {0}, t[100] = {0}; - uniString::utf8 lastMsg; - - SYSTEMTIME sysTime = {0}; - ::GetLocalTime(&sysTime); - - ::GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, _T("yyyy'-'MM'-'dd"), d, 99); - ::GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, _T("HH':'mm':'ss"), t, 99); - lastMsg = stringUtil::tos((const wchar_t *)d) + " " + stringUtil::tos((const wchar_t *)t); - return lastMsg; -#else - char buf[32] = {0}; - - struct tm ttm; - time_t ttt = ::time(NULL); - ::strftime(buf, sizeof (buf), "%Y-%m-%d %H:%M:%S", ::localtime_r(&ttt, &ttm)); - return buf; -#endif - } - - message (const message_t m, const uniString::utf8 &msg, const char *section = NULL, size_t id = 0) - : m_streamID(id), m_timestamp(timeStamp()), m_fields(NULL), m_msg(msg), m_section(section), m_type(m), m_alreadyLogged(false) { } - - message(const message_t m, const char *msg, const char *section = NULL, size_t id = 0) - : m_streamID(id), m_timestamp(timeStamp()), m_fields(NULL), m_msg(msg), m_section(section), m_type(m), m_alreadyLogged(false) { } - - message(const message_t m, const char *section = NULL, size_t id = 0, const std::map<uniString::utf8,uniString::utf8> *fields = NULL) - : m_streamID(id), m_timestamp(timeStamp()), m_section(section), m_type(m), m_alreadyLogged(false) - { - if (fields) - m_fields = new std::map<uniString::utf8,uniString::utf8> (*fields); - } - - public: - inline bool done() const throw() { return (m_type == BM_DONE); } - inline bool rotate() const throw() { return (m_type == BM_ROTATE); } - - inline message_t getType() const throw() { return m_type; } - inline void setType(message_t m) { m_type = m; } - inline const uniString::utf8 &getTimestamp() const throw() { return m_timestamp; } - inline const std::map<uniString::utf8,uniString::utf8> *getFields() const throw() { return m_fields; } - inline const char *fromSection() const throw() { return m_section; } - inline const uniString::utf8 &getMsg() const throw() { return m_msg; } - inline size_t getID() const throw() { return m_streamID; } - - static message makeDone() throw() { return message(BM_DONE); } - static message makeRotate() throw() { return message(BM_ROTATE); } - static message makeUpdate (const std::map<uniString::utf8,uniString::utf8> *f) throw() { return message(BM_UPDATE,NULL,0,f); } - static message makeDebug (const std::map<uniString::utf8,uniString::utf8> *f) throw() { return message(BM_DEBUG,NULL,0,f); } - static message makeInfo (const std::map<uniString::utf8,uniString::utf8> *f) throw() { return message(BM_INFO,NULL,0,f); } - - static message makeUpdate (const uniString::utf8 &s) throw() { std::map<uniString::utf8,uniString::utf8> f; f["msg"] = s; return message(BM_UPDATE,NULL,0,&f); } - - static message makeDebug (const uniString::utf8 &s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_DEBUG,s,sct,id); } - static message makeDebug (const char *s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_DEBUG,s,sct,id); } - - static message makeInfo (const uniString::utf8 &s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_INFO,s,sct,id); } - static message makeInfo (const char *s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_INFO,s,sct,id); } - - static message makeWarning (const uniString::utf8 &s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_WARNING,s,sct,id); } - static message makeWarning (const char *s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_WARNING,s,sct,id); } - - static message makeError (const uniString::utf8 &s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_ERROR,s,sct,id); } - static message makeError (const char *s, const char *sct = NULL, size_t id = 0) throw() { return message(BM_ERROR,s,sct,id); } - - const char *typeAsStr() const - { - const char *str; - switch (m_type) - { - case BM_INFO: str = "INFO"; break; - case BM_ERROR: str = "ERROR"; break; - case BM_WARNING: str = "WARN"; break; - case BM_DEBUG: str = "DEBUG"; break; - case BM_UPDATE: str = "UPDATE"; break; - default: str = ""; break; - } - return str; - } - }; - - // a base virtual message class for use by the logger - template<class M> - class logger_element - { - protected: - // the message class used by the logger - - private: - virtual void install() throw(std::exception) = 0; - virtual void log(M &m) throw(std::exception) = 0; - virtual void logNOTHROW(M &m) throw() { try { log(m); } catch(...){} } - virtual void uninstall() throw() = 0; - virtual void rotate() throw() {} - - public: - virtual ~logger_element() throw() {} - friend class AOL_logger::logger<M,AOL_logger::logger_element<M> >; - }; - -//////////////////////////////////////////////////////////////////////////////////// -///////////////////////// WIN32 ELEMENTS /////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////// - -#ifdef _WIN32 - // Win32 file logger - class fileLogger_element: public logger_element<AOL_logger::message> - { - private: - uniFile::filenameType m_fileName; - HANDLE m_file; - time_t m_lastRolloverTime; - const int m_rolloverInterval; - const int m_numFileBackups; - const bool m_archiveFileBackups; - bool m_first; - size_t m_SID; - - void rotate() throw(); - - virtual void install() throw(std::exception){} - virtual void log(AOL_logger::message &m) throw(std::exception); - virtual void uninstall() throw(){} - - static uniFile::filenameType make_backup_log(const uniFile::filenameType &filename, int which) throw(); - static uniFile::filenameType make_archive_log() throw(); - - public: - fileLogger_element(const uniFile::filenameType &filename, - const uniFile::filenameType &defaultFilename, - bool &useDefaultPath, int backups, - bool archive, int rolloverInterval, size_t SID = 0) throw(std::exception); - ~fileLogger_element() throw(); - }; - - class consoleLogger_element: public logger_element<AOL_logger::message> - { - private: - HANDLE m_stdoutConsole; - HANDLE m_stderrConsole; - - virtual void install() throw(std::exception){} - virtual void log(AOL_logger::message &m) throw(std::exception); - virtual void uninstall() throw(){} - - public: - consoleLogger_element() throw(std::exception); - ~consoleLogger_element() throw(); - }; - - class systemLogger_element: public logger_element<AOL_logger::message> - { - private: - HANDLE m_systemLog; - const uniString::utf8 m_loggerConfigString; - - void registerEventLog(const uniString::utf8 &log_object_name, - const uniFile::filenameType &fullExePath) throw(); - - virtual void install() throw(std::exception){} - virtual void uninstall() throw() {} - virtual void log(AOL_logger::message &m) throw(std::exception); - - public: - systemLogger_element(const uniString::utf8 &log_object_name, - const uniFile::filenameType &fullExePath, - const uniString::utf8 &loggerConfigString) throw(std::exception); - ~systemLogger_element() throw(); - static uniString::utf8 panicConfiguration() throw() { return "EEW Z"; } - }; - -#else // Unix - - ////////////////////////////////////////////////////////////////////////////////////////// - //////////////////////////// Unix ELEMENTS /////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////////// - - class fileLogger_element: public logger_element<AOL_logger::message> - { - private: - uniFile::filenameType m_fileName; - int m_file; - time_t m_lastRolloverTime; - const int m_rolloverInterval; - const int m_numFileBackups; - const bool m_archiveFileBackups; - bool m_first; - size_t m_SID; - - void rotate() throw(); - - virtual void install() throw(std::exception){} - virtual void log(AOL_logger::message &m) throw(std::exception); - virtual void uninstall() throw(){} - - static uniFile::filenameType make_backup_log(const uniFile::filenameType &filename,int which) throw(); - static uniFile::filenameType make_archive_log() throw(); - - public: - fileLogger_element(const uniFile::filenameType &filename, - const uniFile::filenameType &defaultFilename, - bool &useDefaultPath, int backups, - bool archive, int rolloverInterval, size_t SID = 0) throw(std::exception); - ~fileLogger_element() throw(); - }; - - class consoleLogger_element: public logger_element<AOL_logger::message> - { - private: - int m_stdoutConsole; - int m_stderrConsole; - - virtual void install() throw(std::exception){} - virtual void log(AOL_logger::message &m) throw(std::exception); - virtual void uninstall() throw(){} - - public: - consoleLogger_element() throw(std::exception); - ~consoleLogger_element() throw(); - }; - - // unix system logger (not implemented) - class systemLogger_element: public logger_element<AOL_logger::message> - { - private: - virtual void install() throw(std::exception){} - virtual void uninstall() throw() {} - virtual void log(const AOL_logger::message &/*m*/) throw(std::exception){} - - public: - explicit systemLogger_element(const uniString::utf8 &/*srcName*/) throw(){} - ~systemLogger_element() throw(){} - }; - - #endif - typedef messageThread<AOL_logger::logger<AOL_logger::message,AOL_logger::logger_element<AOL_logger::message> > > stdLog_t; -} // namespace AOLLogger - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/messagefile.mc b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/messagefile.mc deleted file mode 100644 index 8b3a4be8..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/messagefile.mc +++ /dev/null @@ -1,7 +0,0 @@ -MessageId=0x1 -Severity=Error -SymbolicName=MSG_CMD_ERR -Language=English -%1 - - diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.cpp deleted file mode 100644 index 915cbb3d..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.cpp +++ /dev/null @@ -1,876 +0,0 @@ -#include "serviceMain.h" -#include <string> -#include <string.h> -#include <curl/curl.h> -#include "expat.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include "../../versions.h" -#include "../../global.h" -#ifdef _WIN32 -#include "win32/rezFuncs.h" -#include <crtdbg.h> -#include <shlwapi.h> -#else -#ifdef PLATFORM_LINUX -#include "../stacktrace/StackTrace.h" -#endif -#include <libgen.h> -#include "unixversion.h" -#include <pthread.h> -#include <sys/param.h> -#include <signal.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <iostream> -#include <stdio.h> -#include <stdlib.h> -#ifdef __APPLE_CC__ -#include <mach-o/dyld.h> -#include "file/fileUtils.h" -#endif -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#ifndef _WIN32 -#define TRUE true -#define FALSE false -#endif - -// are we running as a daemon or service -bool sDaemon = false; - -event serviceMain::sStop(TRUE); -#ifndef _WIN32 -event serviceMain::sWINCH(FALSE); -event serviceMain::sHUP(FALSE); -event serviceMain::sUSR1(FALSE); -event serviceMain::sUSR2(FALSE); -#endif - -#ifdef _WIN32 -static SERVICE_STATUS_HANDLE ssh=NULL; // does not have to be closed - -BOOL WINAPI _console_handler(DWORD fdwCtrlType) -{ - switch (fdwCtrlType) - { - // Handle the CTRL+C signal. - case CTRL_CLOSE_EVENT: - case CTRL_BREAK_EVENT: - case CTRL_C_EVENT: - { - _SetEvent(serviceMain::sStop); - return TRUE; - } - default: - { - return FALSE; - } - } -} - -#else -#ifdef PLATFORM_LINUX -static void custom_signal_handler(int signum) -{ - signal(signum, SIG_DFL); - // http://sourceforge.net/p/stacktrace/code/HEAD/tree/ - // ensure we building with -rdynamic so this works ok - - static char buf[256] = {0}; - static time_t last_ttt; - - struct tm ttm; - time_t ttt = ::time(NULL); - if (ttt != last_ttt) - { - last_ttt = ttt; - ::strftime(buf, 255, "%Y-%m-%d %H:%M:%S", ::localtime_r(&ttt, &ttm)); - } - - FILE *fp = freopen(("/tmp/sc_serv_segfault_" + tos(getpid()) + ".log").c_str(), "w", stderr); - fprintf(stderr, "Shoutcast DNAS/" SERV_OSNAME " v%s (" __DATE__ ")\n" - "An unrecoverable error (%d) has occurred @ %s.\n\n", - gOptions.getVersionBuildStrings().hideAsString().c_str(), signum, buf); - stacktrace::displayCurrentStackTrace(/*-1U, 0*/); - fflush(fp); - kill(getpid(), signum); -} -#endif -unsigned sigWatcher() -{ - while (::WaitForSingleObject(serviceMain::sStop,0) != WAIT_OBJECT_0) - { - sigset_t catchset; - sigemptyset(&catchset); - sigaddset(&catchset,SIGPIPE); - sigaddset(&catchset,SIGTERM); - sigaddset(&catchset,SIGHUP); - sigaddset(&catchset,SIGINT); - sigaddset(&catchset,SIGQUIT); - sigaddset(&catchset,SIGTSTP); // ^Z allow this - sigaddset(&catchset,SIGCHLD); - sigaddset(&catchset,SIGWINCH); - sigaddset(&catchset,SIGUSR1); - sigaddset(&catchset,SIGUSR2); - - //struct timespec ts; - //ts.tv_sec = 1; - //ts.tv_nsec = 0; - //apple is missing sigtimed wait. - int err = 0; - if (::sigwait(&catchset,&err)) - { - err = SIGTERM; - } - - switch (err) - { - case SIGTERM: case SIGINT: case SIGQUIT: case SIGTSTP: - { - _SetEvent(serviceMain::sStop); - break; - } - case SIGHUP: - { - _SetEvent(serviceMain::sHUP); - break; - } - case SIGWINCH: - { - _SetEvent(serviceMain::sWINCH); - break; - } - case SIGUSR1: - { - _SetEvent(serviceMain::sUSR1); - break; - } - case SIGUSR2: - { - _SetEvent(serviceMain::sUSR2); - break; - } - } - } - return 0; -} - -// We need access to this for Apple, because we don't have sigtimedwait(). This means there -// circumstances when we need access to this thread so we can signal it and force sigwait() to exit -Tthread<pointer_to_thread_function> gSigWatcherThread(sigWatcher); - -#endif - -#ifdef _WIN32 -int run_install(const vector<uniString::utf8> &args) throw(); -int run_uninstall(const vector<uniString::utf8> &args) throw(); -int run_run(const vector<uniString::utf8> &args) throw(std::exception); -int run_daemon(const vector<uniString::utf8> &args) throw(std::exception); -#else -int run_run(const vector<uniString::utf8> &args, const vector<uniString::utf8> &arg) throw(std::exception); -int run_daemon(const vector<uniString::utf8> &args, const vector<uniString::utf8> &arg) throw(std::exception); - -int blockSignals() throw() -{ - return thread_CORE::standard_signal_block(); -} -#endif - - -uniString::utf8 getVersionBuildStrings() throw() -{ -#ifdef _WIN32 - static utf8 version = ""; - if (version.empty()) - { - getVersionInfo(version); - } -#else - static utf8 version = ""; - if (version.empty()) - { - for (int x = 0; x < VENT; ++x) - { - if (x) version += "."; - version += tos(PRODUCTVERSION[x]); - } - } -#endif -#ifdef LICENCE_FREE - version += " no-licence-check"; -#endif - return version; -} - -#ifdef _WIN32 -int do__main(vector<uniString::utf8> &args) throw(std::exception) -#else -int do__main(vector<uniString::utf8> &args, vector<uniString::utf8> &arg) throw(std::exception) -#endif -{ - if (!args.empty()) - { - utf8 s = toLower(args.front()); - - if (s == "--version" || s == "-v") - { - XML_Expat_Version expat = XML_ExpatVersionInfo(); - printf("%s", utf8("Shoutcast DNAS/" SERV_OSNAME " v" + getVersionBuildStrings() + - " (" __DATE__ ") " + utf8(curl_version()) + " expat/" + - tos(expat.major) + "." + tos(expat.minor) + "." + tos(expat.micro) + -//#ifdef _WIN32 -// " pthread-win32/" PTW32_VERSION_STR "-mod" + -//#endif - eol()).toANSI().c_str()); - return 0; - } - - if (s == "--help" || s == "/?") - { - #ifdef _WIN32 - #define SC_SERV_END ".exe" - #else - #define SC_SERV_END "" - #endif - - printf("%s", utf8("*********************************************************************" + eol()).toANSI().c_str()); - printf("%s", utf8("** Shoutcast Distributed Network Audio Server (DNAS) **" + eol()).toANSI().c_str()); - printf("%s", utf8("** Copyright (C) 2014-2023 Radionomy SA, All Rights Reserved **" + eol()).toANSI().c_str()); - printf("%s", utf8("*********************************************************************" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "Usage: sc_serv" SC_SERV_END " [OPTION] [PARAMETERS]... [conf]" + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "\t[conf] - File path to the configuration file (this can be" + - eol() + "\t\t relative or absolute) [optional]" + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "\t\t If not specified then sc_serv.conf / sc_serv.ini" + - eol() + "\t\t in the same folder will be automatically loaded." + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "Options:").toANSI().c_str()); - - printf("%s", utf8(eol() + "\t-s, setup\t\tRun the DNAS in setup mode for" + eol() + - "\t\t\t\tcreating a basic configuration" + eol()).toANSI().c_str()); -#ifdef CONFIG_BUILDER - printf("%s", utf8(eol() + "\t-b, builder\t\tRun the DNAS in builder mode for" + eol() + - "\t\t\t\tcreating an advanced configuration" + eol()).toANSI().c_str()); -#endif - printf("%s", utf8(eol() + "\t-v, --version\t\tDisplay version information" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t/?, --help\t\tDisplay this information" + eol()).toANSI().c_str()); - - #ifdef _WIN32 - printf("%s", utf8(eol() + eol() + "Service Options:" + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "\tinstall [servicename] [username] [password] [conf]" + eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + "\t\tservicename - Unique name for the service install" + eol() + - "\t\t\t if the default is not appropriate or" + eol() + - "\t\t\t needing multiple services [optional]" + eol() + - "\t\t\t Default is: \"Shoutcast DNAS Service\"" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t\tusername - User under which to run the service as" + eol() + - "\t\t\t or '0' for the local system [optional]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t\tpassword - Password for user or '0' for the local" + eol() + - "\t\t\t system or with no password [optional]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t\tconf - File path to the configuration file either" + eol() + - "\t\t as a full or relative path [optional]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\texample:" + eol() + "\t\tsc_serv.exe install" + eol() + - "\t\tor" + eol() + "\t\tsc_serv.exe install sc_serv" + eol() + - "\t\tor" + eol() + "\t\tsc_serv.exe install sc_serv 0 0 sc_serv.conf" + - eol()).toANSI().c_str()); - - printf("%s", utf8(eol() + eol() + "\tuninstall [servicename]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\t\tservicename - Name used to install the service or" + eol() + - "\t\t\t leave blank for default [optional]" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\texample:" + eol() + "\t\tsc_serv.exe uninstall" + eol() + - "\t\tor" + eol() + "\t\tsc_serv.exe uninstall sc_serv" + eol() + eol()).toANSI().c_str()); - #else - #define SC_SERV_FILE "sc_serv" - printf("%s", utf8(eol() + "Daemon Options:" + eol()).toANSI().c_str()); - printf("%s", utf8(eol() + "\tdaemon [conf]\t\tRun the DNAS in daemon mode " + eol()).toANSI().c_str()); - #endif - XML_Expat_Version expat = XML_ExpatVersionInfo(); - printf("%s", utf8(eol() + eol() + "Built with: " + utf8(curl_version()) + - " expat/" + tos(expat.major) + "." + tos(expat.minor) + "." + - tos(expat.micro) + eol()).toANSI().c_str()); - return 0; - } - - if (s == "install") - { - #ifdef _WIN32 - args.erase(args.begin()); - return run_install(args); - #else - cerr << "install is not supported on this platform" << endl; - return -1; - #endif - } - - if (s == "uninstall") - { - #ifdef _WIN32 - args.erase(args.begin()); - return run_uninstall(args); - #else - cerr << "uninstall is not supported on this platform" << endl; - return -1; - #endif - } - - if (s == "daemon") - { - args.erase(args.begin()); - #ifdef _WIN32 - return run_daemon(args); - #else - return run_daemon(args, arg); - #endif - } - } - -#ifdef _WIN32 - return run_run(args); -#else - return run_run(args, arg); -#endif -} - -int main(int argc, char* argv[]) throw(std::exception) -{ - int result = 0; - try - { - vector<utf8> args; - - // convert args to vector of strings - for (int x = 1; x < argc; ++x) - { - args.push_back(argv[x]); - } - - // grab the calling program param as - // will be needed to ensure relative - // path handling will work correctly -#ifdef _WIN32 - result = do__main(args); -#else - vector<utf8> arg; - arg.push_back(argv[0]); - result = do__main(args, arg); -#endif - } - catch(const std::exception &err) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Exception in main: " + err.what()).c_str()); - } - return result; -} - -///////////////////////////////////////////////////// - -// surround by quotes -#ifdef _WIN32 -static wstring quote(const wstring &s) throw() -{ - return wstring(L"\"") + s + wstring(L"\""); -} - -int run_install(const vector<utf8> &args) throw() -{ - int result = -1; - - SC_HANDLE schSCManager = 0; - SC_HANDLE schService = 0; - - try - { - wstring serviceName = (!args.empty() ? args[0].toWString().c_str() : L"Shoutcast DNAS Service"); - wstring account = (args.size() > 2 ? (args[1] == "0" ? L"" : args[1].toWString()) : L""); - wstring password = (args.size() > 3 ? (args[2] == "0" ? L"" : args[2].toWString()) : L""); - - const size_t SIZ(2048); - wchar_t nameBuffer[SIZ+2] = {0}; - ::GetModuleFileNameW(0,nameBuffer,SIZ); - - schSCManager = ::OpenSCManagerW(NULL, // local machine - NULL, // ServicesActive database - SC_MANAGER_ALL_ACCESS); // full access rights - - if (schSCManager == NULL) - { - if (GetLastError() == ERROR_ACCESS_DENIED) - { - throw runtime_error("Aborting service install due to a lack of required permissions.\n\n" - "Ensure you are using an Administrator Command Prompt or that you have administrator access to be able to install a service."); - } - else - { - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service install due to OpenSCManager(..) failure.\n\nError code: %d\n[%s]", - GetLastError(), errMessage().c_str()); - throw runtime_error(error); - } - } - - wstring cmdString = quote(nameBuffer) + L" " + quote(L"daemon") + L" " + quote(serviceName); - if (args.size() > 4) cmdString += L" " + quote(args[3].toWString()); - - schService = ::CreateServiceW( - schSCManager, // SCManager database - serviceName.c_str(), // name of service - serviceName.c_str(), // service name to display - SERVICE_ALL_ACCESS, // desired access - SERVICE_WIN32_OWN_PROCESS, // service type - SERVICE_DEMAND_START, // start type - SERVICE_ERROR_NORMAL, // error control type - cmdString.c_str(), - NULL, // no load ordering group - NULL, // no tag identifier - NULL, // no dependencies - (account == L"" ? NULL : account.c_str()), // LocalSystem account - (password == L"" ? NULL : password.c_str())); // no password - - if (schService == NULL) - { - int err = GetLastError(); - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service install due to CreateService(..) failure.\n\nError code: %d\n[%s]%s", - err, errMessage().c_str(), - (err == ERROR_SERVICE_EXISTS ? "\n\nCheck the service name has not already been used." : - (err == ERROR_SERVICE_MARKED_FOR_DELETE ? "\n\nCheck the previous service instance has been completely stopped." : ""))); - throw runtime_error(error); - } - else - { - SERVICE_DESCRIPTION schServiceDesc; - schServiceDesc.lpDescription = L"Shoutcast DNAS Server (sc_serv) v2"; - ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, &schServiceDesc); - } - ::CloseServiceHandle(schService); - ::CloseServiceHandle(schSCManager); - - result = 0; - } - catch(const exception &ex) - { - ::MessageBox(0,tows(ex.what()).c_str(),L"Shoutcast DNAS Error",MB_OK|MB_ICONEXCLAMATION); - if (schService) - ::CloseServiceHandle(schService); - if (schSCManager) - ::CloseServiceHandle(schSCManager); - } - catch(...) - { - ::MessageBox(0,L"Unknown exception",L"Shoutcast DNAS Error",MB_OK); - if (schService) - ::CloseServiceHandle(schService); - if (schSCManager) - ::CloseServiceHandle(schSCManager); - } - - return result; -} - -///////////////////////////////////////////////////// - -int run_uninstall(const vector<utf8> &args) throw() -{ - int result = -1; - - SC_HANDLE schSCManager = 0; - SC_HANDLE service = 0; - try - { - schSCManager = ::OpenSCManagerW(NULL, // local machine - NULL, // ServicesActive database - SC_MANAGER_ALL_ACCESS); // full access rights - - if (schSCManager == NULL) - { - if (GetLastError() == ERROR_ACCESS_DENIED) - { - throw runtime_error("Aborting service uninstall due to a lack of required permissions.\n\n" - "Ensure you are using an Administrator Command Prompt or that you have administrator access to be able to uninstall a service."); - } - else - { - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service uninstall due to OpenSCManager(..) failure.\n\nError code: %d\n[%s]", - GetLastError(), errMessage().c_str()); - throw runtime_error(error); - } - } - - service = ::OpenServiceW(schSCManager, (!args.empty() ? args[0].toWString().c_str() : L"Shoutcast DNAS Service"), DELETE); - if (!service) - { - int err = GetLastError(); - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service uninstall due to OpenService(..) failure.\n\nError code: %d\n[%s]%s", - err, errMessage().c_str(), - (err == ERROR_SERVICE_DOES_NOT_EXIST ? "\n\nCheck the service has not already been uninstalled and the\n" - "service name matches what was used to register the service." : "")); - throw runtime_error(error); - } - - if (!::DeleteService(service)) - { - int err = GetLastError(); - static char error[512]; - snprintf(error, sizeof(error), - "Aborting service uninstall due to DeleteService(..) failure.\n\nError code: %d\n[%s]%s", - err, errMessage().c_str(), - (err == ERROR_SERVICE_DOES_NOT_EXIST ? "\n\nCheck the service has not already been removed and that the\n" - "service name matches what was used to register the service." : - (err == ERROR_SERVICE_MARKED_FOR_DELETE ? "\n\nCheck the previous service instance has been completely stopped." : ""))); - throw runtime_error(error); - } - - ::CloseServiceHandle(service); - ::CloseServiceHandle(schSCManager); - - result = 0; - } - catch(const exception &ex) - { - ::MessageBox(0,tows(ex.what()).c_str(),L"Shoutcast DNAS Error",MB_OK|MB_ICONEXCLAMATION); - if (service) - { - ::CloseServiceHandle(service); - } - if (schSCManager) - { - ::CloseServiceHandle(schSCManager); - } - } - catch(...) - { - if (service) - ::CloseServiceHandle(service); - if (schSCManager) - ::CloseServiceHandle(schSCManager); - } - - return result; -} -#endif - -///////////////////////////////////////////////////// -static vector<utf8> gServiceArgs; - -#ifdef _WIN32 - -// Wraps SetServiceStatus. -void SetTheServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, - DWORD dwCheckPoint, DWORD dwWaitHint) -{ - SERVICE_STATUS ss; // Current status of the service. - - // Disable control requests until the service is started. - if (dwCurrentState == SERVICE_START_PENDING) - ss.dwControlsAccepted = 0; - else - ss.dwControlsAccepted = - SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; - // Other flags include SERVICE_ACCEPT_PAUSE_CONTINUE - // and SERVICE_ACCEPT_SHUTDOWN. - - // Initialize ss structure. - ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - ss.dwServiceSpecificExitCode = 0; - ss.dwCurrentState = dwCurrentState; - ss.dwWin32ExitCode = dwWin32ExitCode; - ss.dwCheckPoint = dwCheckPoint; - ss.dwWaitHint = dwWaitHint; - - // Send status of the service to the Service Controller. - ::SetServiceStatus(ssh, &ss); -} - -static void WINAPI service_ctrl(DWORD dwCtrlCode) -{ - DWORD dwState = SERVICE_RUNNING; - - switch (dwCtrlCode) - { - case SERVICE_CONTROL_STOP: - dwState = SERVICE_STOP_PENDING; - break; - - case SERVICE_CONTROL_SHUTDOWN: - dwState = SERVICE_STOP_PENDING; - break; - - case SERVICE_CONTROL_INTERROGATE: - break; - - default: - break; - } - - // Set the status of the service. - SetTheServiceStatus(dwState, NO_ERROR, 0, 0); - - // Tell service_main thread to stop. - if ((dwCtrlCode == SERVICE_CONTROL_STOP) || - (dwCtrlCode == SERVICE_CONTROL_SHUTDOWN)) - { - _SetEvent(serviceMain::sStop); - } -} - -static void WINAPI service_main(DWORD dwArgc, LPTSTR *lpszArgv) -{ - try - { - // Register the service ctrl handler. - //if (dwArgc == 0) - if (gServiceArgs.empty()) - { - throw runtime_error("service_main - no name"); - } - ssh = ::RegisterServiceCtrlHandler(lpszArgv[0],(LPHANDLER_FUNCTION)service_ctrl); - if (!ssh) - { - throw runtime_error("RegisterServiceCtrlHandler returned NULL"); - } - // The service has started. - SetTheServiceStatus(SERVICE_RUNNING, 0, 0, 0); - - vector<utf8> args(gServiceArgs.begin() + 1,gServiceArgs.end()); - - #ifdef _WIN32 - ::SetConsoleCtrlHandler(_console_handler,TRUE); - #else - gSigWatcherThread.start(); - #endif - - sm_main(args); - - #ifndef _WIN32 - ::pthread_kill(gSigWatcherThread,SIGTERM); - gSigWatcherThread.join(); - #endif - - // Stop the service. - OutputDebugString(TEXT("SetTheServiceStatus, SERVICE_STOPPED\n")); - SetTheServiceStatus(SERVICE_STOPPED, NO_ERROR, 0, 0); - } - catch(...) - { - SetTheServiceStatus(SERVICE_STOPPED, ::GetLastError(), 0, 0); - } -} - -#endif - -#ifdef _WIN32 -int run_daemon(const vector<uniString::utf8> &args) throw(std::exception) -#else -int run_daemon(const vector<uniString::utf8> &args, const vector<uniString::utf8> &arg) throw(std::exception) -#endif -{ - sDaemon = true; - - gServiceArgs = args; - _ResetEvent(serviceMain::sStop); - -#ifdef _WIN32 - SERVICE_TABLE_ENTRY ste[] = - {{TEXT("Shoutcast DNAS"),(LPSERVICE_MAIN_FUNCTION)service_main}, {NULL, NULL}}; - - gStartupDirectory = utf32(getfwd()).toUtf8(); - - if (!::StartServiceCtrlDispatcher(ste)) - { - static TCHAR error[512]; - _snwprintf(error, sizeof(error), - TEXT("Error code for StartServiceCtrlDispatcher: %u [%hs].\n"), - GetLastError(), errMessage().c_str()); - MessageBox (NULL, error, NULL, MB_SERVICE_NOTIFICATION); - return -1; - } - return 0; - -#else - pid_t pid; - if ((pid = fork()) < 0) - { - return -1; - } - else if (pid != 0) - { - cout << "sc_serv2 going daemon with PID [" << tos(pid) << "]" << endl; - exit(0); // parent goes away - } - // child continues - setsid(); - gStartupDirectory = getfwd((const char*)&(arg[0])); - - blockSignals(); - gSigWatcherThread.start(); - - int result = sm_main(args); - - ::pthread_kill(gSigWatcherThread,SIGTERM); - gSigWatcherThread.join(); - - return result; -#endif -} - -////////////////////////////////////////////////////// -#ifdef _WIN32 -wchar_t* getfwd() throw() -{ - // determine the actual location of ourselves and use as needed - static wchar_t fwd[MAX_PATH]; - if (!fwd[0]) - { - GetModuleFileNameW(NULL, fwd, ARRAYSIZE(fwd)); - - // this is needed for the service mode - // so simpler to set it here than later - gStartupPath = utf32(fwd).toUtf8(); - - PathRemoveFileSpecW(fwd); - PathAddBackslashW(fwd); - - // this mirrors existing Windows handling despite - // other 2.4.2 changes needing to be made for it. - SetCurrentDirectory(fwd); - } - return fwd; -} -#else -char* getfwd(const char* argv) throw() -{ - // determine the actual location of ourselves and use as needed - static char fwd[MAXPATHLEN + 1]; - if (!fwd[0]) - { - // first attempt to use readlink(..) as per the platform build - #if (defined PLATFORM_LINUX || defined PLATFORM_ARMv6 || defined PLATFORM_ARMv7) - if(readlink("/proc/self/exe", fwd, sizeof(fwd) - 1) == -1) - #endif - #ifdef PLATFORM_BSD - if(readlink("/proc/curproc/file", fwd, sizeof(fwd) - 1) == -1) - #endif - #ifdef __APPLE_CC__ - uint32_t fwdSize = sizeof(fwd); - if(!_NSGetExecutablePath(fwd, &fwdSize)) - #endif - { - #ifdef __APPLE_CC__ - // for this, we get the full program path which can include symlinks - // so this will adjust it all so as to get a clean path and then to - // strip off the program file name (also included) so we match all of - // the other OS versions of this method so it will work consistently. - strncpy(fwd, fileUtil::onlyPath(fileUtil::getFullFilePath(string(fwd))).hideAsString().c_str(), sizeof(fwd) - 1); - #endif - - // now look at argv for a / in it - if (strchr(argv, '/')) - { - // if it starts with a / it's absolute so just use - if (argv[0] == '/') - { - strncpy(fwd, argv, sizeof(fwd) - 1); - } - // otherwise attempt to append to the cwd - // only risk is if the cwd changed onload - else - { - if (getcwd(fwd, sizeof(fwd) - 1)) - { - int len = sizeof(fwd) - strlen(fwd); - strncat(fwd, argv, min(len - 1, (int)sizeof(fwd) - 1)); - } - // and if that doesn't work then set - // it as / and behave like older builds - else - { - strncpy(fwd, "/", sizeof(fwd) - 1); - } - } - } - } - else - { - char tmp[MAXPATHLEN + 1] = {0}; - strncpy(fwd, strncpy(tmp, dirname(fwd), sizeof(tmp) - 1), sizeof(fwd) - 1); - } - - // must be slash terminated - size_t fwd_len = strlen(fwd); - if (fwd_len && (fwd_len < (sizeof(fwd) - 1)) && fwd[fwd_len - 1] != '/') - { - strncat(fwd, "/", sizeof(fwd) - 1); - } - } - - return fwd; -} -#endif - -#ifdef _WIN32 -int run_run(const vector<uniString::utf8> &args) throw(std::exception) -#else -int run_run(const vector<uniString::utf8> &args, const vector<uniString::utf8> &arg) throw(std::exception) -#endif -{ -#ifdef _WIN32 - ::SetConsoleCtrlHandler(_console_handler,TRUE); - gStartupDirectory = utf32(getfwd()).toUtf8(); -#else - if (blockSignals()) - { - cerr << "pthread_sigmask failed in run_run()" << endl; exit(-1); - } - gSigWatcherThread.start(); - -#ifdef PLATFORM_LINUX - struct sigaction sa; - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = custom_signal_handler; - sigaction(SIGSEGV, &sa, NULL); - sigaction(SIGABRT, &sa, NULL); - sigaction(SIGFPE, &sa, NULL); -#endif - - gStartupDirectory = getfwd((const char*)&(arg[0])); -#endif - - int result = 0; - try - { - result = sm_main(args); - } - catch(const std::runtime_error &err) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Exception in main: " + err.what()).c_str()); - } - catch(const std::exception &err) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Exception in main: " + err.what()).c_str()); - } - catch(...) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Unknown exception in main()").c_str()); - } - -#ifndef _WIN32 - ::pthread_kill(gSigWatcherThread,SIGTERM); - gSigWatcherThread.join(); -#endif - - return result; -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.h deleted file mode 100644 index f6ed4134..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/serviceMain.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once -#ifndef serviceMain_H_ -#define serviceMain_H_ - -#ifdef _WIN32 -#include <windows.h> -#endif -#include <vector> -#include <string> -#include "threading/thread.h" -#include "unicode/uniFile.h" -#include "../../versions.h" - -/* - Class to encapsulate command line or service based launching. - convention is that the first parameter will determine the action - taken, either "install" (install service) "uninstall" (uninstall service) - "daemon" (run as windows service or unix daemon) or "run" (run as application). - If the keyword is missing then "run" is assumed. - - if action is "install" then you must provide the following arguments - - servicename logon password .... application arguments ..... - - for example - - pm.exe install procmgr myaccount mypassword param1 param2 param3 - - To use the default account and password you use a zero - - pm.exe install procmgr 0 0 param1 param2 - - if action is "uninstall" then you must provide the following arguments - - servicename - - This only deals with process services. -*/ - -class serviceMain -{ -public: - static event sStop; // if this is signaled, the service must stop. You must monitor this variable -#ifndef _WIN32 - static event sHUP; // other unix signals - static event sWINCH; - static event sUSR1; - static event sUSR2; -#endif -}; - -extern int main(int argc, char* argv[]) throw(std::exception); - -// you must define this guy: -extern int sm_main(const std::vector<uniString::utf8> &args) throw(); - -#ifdef _WIN32 -BOOL WINAPI _console_handler(DWORD fdwCtrlType); -wchar_t* getfwd() throw(); -#else -int blockSignals() throw(); -char* getfwd(const char* argv) throw(); -#endif - -#ifndef _WIN32 -// We need access to this for Apple, because we don't have sigtimedwait(). This means there -// circumstances when we need access to this thread so we can signal it and force sigwait() to exit - -extern Tthread<pointer_to_thread_function> gSigWatcherThread; -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.cpp deleted file mode 100644 index fcc61279..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include "stdServiceImpl.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -AOL_logger::stdLog_t *gLog = 0; -uniFile::filenameType gStartupDirectory; -uniFile::filenameType gStartupPath; - -// shutdown the logger -void stdServiceBase::stopLog() throw() -{ - if (!gLog) return; - //ILOG(LIBRARY_LOG_TAG "Logger shutdown"); - gLog->postMessage(AOL_logger::message::makeDone()); // logger shutdown message - gLog->join(); // wait for logger to stop - forget(gLog); -} - -// start log in minimal panic mode -void stdServiceBase::startPanicLog() throw() -{ - stopLog(); - try - { - gLog = new AOL_logger::stdLog_t; - addPanicLogElements(); - gLog->start(); - } - catch(...){} -} - -// start log in normal mode -void stdServiceBase::startNormalLog(bool partial) throw(std::runtime_error) -{ - if (partial == false) - { - stopLog(); - } - try - { - if (partial == false) - { - gLog = new AOL_logger::stdLog_t; - } - addNormalLogElements(partial); - gLog->start(); - if (partial == false) - { - //ILOG(LIBRARY_LOG_TAG "Logger startup"); - } - else - { - ILOG("[MAIN] Logger updating log file to use"); - } - } - catch(...) - { - forget(gLog); - throw; - } -} - - -// start log in normal mode -void stdServiceBase::startScreenLog() throw() -{ - try - { - addConsoleLogElements(); - } - catch(...){} -} - -void stdServiceBase::postloop() throw() -{ - comUninit(); - _SetEvent(serviceMain::sStop); -} - -///// main entry point to primary flow of control (after daemon nonsense, Win32 service nonsense, etc). -int stdServiceBase::sm_main(const vector<utf8> &args) throw() -{ - int result = -1; - try - { - preloop(/* args */); // moved to preflight so logger can be reconfigured on internal restart - result = loop(args); // will only throw during preflight - } - catch(const exception &err) - { - panic(err.what()); - } - catch(...) - { - panic("Unknown exception"); - } - postloop(); - return result; -} - -#ifdef _WIN32 -////////////////////////////////////////////////////////////////////////////// -//////////////////////// win32 specific /////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -void stdServiceWin32generic::comInit() throw(exception) -{ - if (FAILED(CoInitialize(NULL))) - { - throw runtime_error("CoInitialize failure"); - } -} - -void stdServiceWin32generic::comUninit() throw() -{ - CoUninitialize(); -} - -// panic occurs when an error happens before the loggers -// are brought up. -void stdServiceWin32generic::panic(const utf8 &errM) throw() -{ - wstring err_m(errM.toWString()); - if (!sDaemon) - { - ::MessageBox(0,err_m.c_str(),L"SHOUTcast DNAS Error",MB_OK|MB_ICONEXCLAMATION); - } - - // try to build the event logger - if (FAILED(CoInitialize(NULL))) - { - return; - } - - try - { - startPanicLog(); - ELOG(LIBRARY_LOG_TAG + errM); - stopLog(); - } - catch(...){} - CoUninitialize(); -} - -#else -////////////////////////////////////////////////////////////////////////////// -//////////////////////// unix specific /////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -void stdServiceUnixgeneric::panic(const utf8 &errM) throw() -{ - try - { - startPanicLog(); - ELOG(LIBRARY_LOG_TAG + errM); - stopLog(); - } - catch(...){} -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.h deleted file mode 100644 index aa3b2c7c..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/stdServiceImpl.h +++ /dev/null @@ -1,322 +0,0 @@ -#pragma once -#ifndef stdServiceImpl_H_ -#define stdServiceImpl_H_ - -#include <vector> -#include <string> -#include <stdexcept> -#include <stdio.h> - -#include "serviceMain.h" -#include "logger.h" -#include "../../config.h" - -#ifdef _WIN32 -#define __F__ __FUNCTION__ -#else -#define __F__ string(__PRETTY_FUNCTION__) + -#endif - -#define LIBRARY_LOG_TAG "<***> " - -extern AOL_logger::stdLog_t *gLog; -extern uniFile::filenameType gStartupDirectory; -extern uniFile::filenameType gStartupPath; -extern config gOptions; - -// are we running as a daemon or service -extern bool sDaemon; - -#define ELOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeError(__VA_ARGS__)); } while (0) -#define WLOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeWarning(__VA_ARGS__)); } while (0) -#define ILOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeInfo(__VA_ARGS__)); } while (0) -#define DLOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeDebug(__VA_ARGS__)); } while (0) -#define ULOG(...) do { if (gLog) gLog->postMessage(AOL_logger::message::makeUpdate(__VA_ARGS__)); } while (0) -#define ROTATE do { if (gLog) gLog->postMessage(AOL_logger::message::makeRotate()); } while (0) - -#define HUP_SIGNAL 45 - -class stdServiceBase -{ -protected: - virtual ~stdServiceBase() throw(){} - virtual void addPanicLogElements() throw(std::exception) = 0; - virtual void addConsoleLogElements() throw(std::exception) = 0; - virtual void addNormalLogElements(bool partial) throw(std::exception) = 0; - virtual void preloop() throw(std::exception) = 0; - virtual int loop(const std::vector<uniString::utf8> &args) throw(std::exception) = 0; - - void base_preloop() throw(std::exception) - { - comInit(); - } - - virtual void postloop() throw(); - - static void preflight(const std::vector<uniString::utf8> &args) throw(std::exception) - { - // get cmd line settings - const std::vector<uniString::utf8> leftover(gOptions.fromArgs(args)); - if (!leftover.empty()) - { - uniString::utf8 s; - for (std::vector<uniString::utf8>::const_iterator i = leftover.begin(); i != leftover.end(); ++i) - { - s += (*i) + " "; - } - throw std::runtime_error(std::string(LIBRARY_LOG_TAG) + "Bad cmd line parameters: `" + s.hideAsString() + "'"); - } - } - - template<typename APP> - int base_loop(const std::vector<uniString::utf8> &args) throw(std::exception) - { - int result = -1; - bool done(false); - while (!done) - { - _ResetEvent(serviceMain::sStop); - - try - { - preflight(args); - startNormalLog(false); - result = APP().go(*this); - } - catch(const std::exception &err) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Exception in main: " + err.what()).c_str()); - done = true; - } - catch(...) - { - printf("%s", (std::string(LIBRARY_LOG_TAG) + "Unknown exception in main()").c_str()); - done = true; - } - - stopLog(); - if (result != HUP_SIGNAL) - { - done = true; - } - } - return result; - } - -public: - virtual void comInit() throw(std::exception) = 0; - virtual void comUninit() throw() = 0; - virtual void stopLog() throw(); - virtual void startNormalLog(bool partial) throw(std::runtime_error); - virtual void startScreenLog() throw(); - virtual void startPanicLog() throw(); - virtual void panic(const uniString::utf8 &errM) throw() = 0; - int sm_main(const std::vector<uniString::utf8> &args) throw(); -}; - -#ifdef _WIN32 -// stuff that doesn't require templates -class stdServiceWin32generic: public stdServiceBase -{ -public: - virtual void comInit() throw(std::exception); - virtual void comUninit() throw(); - virtual void panic(const uniString::utf8 &errM) throw(); -}; - -template<typename APP> -class stdServiceWin32: public stdServiceWin32generic -{ -protected: - uniString::utf8 m_serviceName; - - virtual void addPanicLogElements() throw(std::exception) - { - gLog->addElement(new AOL_logger::systemLogger_element(m_serviceName, gStartupPath, AOL_logger::systemLogger_element::panicConfiguration())); - } - - virtual void addConsoleLogElements() throw(std::exception) - { - _ASSERTE(gLog); - - AOL_logger::consoleLogger_element *c = 0; - - try - { - if (gOptions.getConsoleLogging()) - { - gLog->addElement(c = new AOL_logger::consoleLogger_element()); - c = 0; - } - } - catch(...) - { - forget(c); - throw; - } - - // handler must be set after console is created - if (!sDaemon && (gOptions.getConsoleLogging())) - { - ::SetConsoleCtrlHandler(_console_handler,TRUE); - } - } - - // start log in normal mode (may throw) - virtual void addNormalLogElements(bool partial) throw(std::exception) - { - _ASSERTE(gLog); - - AOL_logger::fileLogger_element *f = 0; - AOL_logger::systemLogger_element *s = 0; - - try - { - APP::addCustomLogElements();// give app opportunity to add special elements - if (!gOptions.getFileLog().empty()) - { - if (partial == true) - { - gLog->postMessage(AOL_logger::message::makeDone()); // logger shutdown message - gLog->join(); - } - bool m_useDefault = false; - gLog->addElement(f = new AOL_logger::fileLogger_element(gOptions.getFileLog(), gOptions.logFile_Default(), - m_useDefault, gOptions.logRotates(), - gOptions.logArchive(), gOptions.rotateInterval())); - if (m_useDefault) - { - wchar_t m_defaultFileName[MAX_PATH] = {0}; - ExpandEnvironmentStringsW(DEFAULT_LOGW, m_defaultFileName, MAX_PATH); - gOptions.setOption(uniString::utf8("logfile"), uniString::utf32(m_defaultFileName).toUtf8()); - } - - f = 0; - } - if ((partial == false) && sDaemon) - { - gLog->addElement(s = new AOL_logger::systemLogger_element(m_serviceName, gStartupPath, - gOptions.getSystemLogConfigString())); - s = 0; - } - } - catch(...) - { - forget(f); - forget(s); - throw; - } - - // handler must be set after console is created - if ((partial == false) && !sDaemon && (gOptions.getConsoleLogging())) - { - ::SetConsoleCtrlHandler(_console_handler,TRUE); - } - } - - virtual void preloop() throw(std::exception) { stdServiceBase::base_preloop(); } - virtual int loop(const std::vector<uniString::utf8> &args) throw(std::exception) { return stdServiceBase::base_loop<APP>(args); } - -public: - explicit stdServiceWin32(const std::string &serviceName):m_serviceName(serviceName){} -}; - -#else - -// stuff that doesn't require templates -class stdServiceUnixgeneric: public stdServiceBase -{ -public: - virtual void comInit() throw(std::exception){} - virtual void comUninit() throw(){} - virtual void panic(const uniString::utf8 &errM) throw(); -}; - -template<typename APP> -class stdServiceUnix: public stdServiceUnixgeneric -{ -protected: - virtual void addPanicLogElements() throw(std::exception) - { - gLog->addElement(new AOL_logger::consoleLogger_element()); - } - - virtual void addConsoleLogElements() throw(std::exception) - { - assert(gLog); - - AOL_logger::consoleLogger_element *c = 0; - - try - { - if (gOptions.getConsoleLogging()) - { - gLog->addElement(c = new AOL_logger::consoleLogger_element()); - c = 0; - } - } - catch(...) - { - forget(c); - throw; - } - } - - // start log in normal mode (may throw) - virtual void addNormalLogElements(bool partial) throw(std::exception) - { - assert(gLog); - - AOL_logger::fileLogger_element *f = 0; - - try - { - APP::addCustomLogElements(); // give app an opporunity to add special loggers - if (!gOptions.getFileLog().empty()) - { - if (partial == true) - { - gLog->postMessage(AOL_logger::message::makeDone()); // logger shutdown message - gLog->join(); - } - size_t sid; - size_t count = gOptions.count_stream_logFile(); - int i; - - for (i = 0; i < count; ++i) - { - sid = 0; - uniString::utf8 fn = gOptions.fetchMulti (gOptions.stream_logFile_map(), i, "", &sid); - bool m_useDefault = false; - f = new AOL_logger::fileLogger_element (fn, fn, m_useDefault, gOptions.logRotates(), - gOptions.logArchive(), gOptions.rotateInterval(), sid); - gLog->addElement (f); - } - - bool m_useDefault = false; - gLog->addElement(f = new AOL_logger::fileLogger_element(gOptions.getFileLog(), gOptions.logFile_Default(), - m_useDefault, gOptions.logRotates(), - gOptions.logArchive(), gOptions.rotateInterval())); - if (m_useDefault) - { - gOptions.setOption(uniString::utf8("logfile"),gOptions.logFile_Default()); - } - f = 0; - } - } - catch(...) - { - forget(f); - throw; - } - } - - virtual void preloop() throw(std::exception) { stdServiceBase::base_preloop(); } - virtual int loop(const std::vector<uniString::utf8> &args) throw(std::exception) { return stdServiceBase::base_loop<APP>(args); } - -public: - stdServiceUnix() throw(){} -}; -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/GNUmakefile b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/GNUmakefile deleted file mode 100644 index b66827ec..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/GNUmakefile +++ /dev/null @@ -1,78 +0,0 @@ -default: release - -CXX=gcc - -CXXFLAGS_DEBUG= -g -D_REENTRANT -D_INC_PROCESS -Wall -Wno-unused-function -Wno-sign-compare -Werror - -CXXFLAGS_RELEASE= -D_REENTRANT -D_INC_PROCESS -DNDEBUG -Wall -Wno-unused-function -Wno-sign-compare -Werror - -INCLUDES= \ - -I. \ - -I.. \ - -I../.. - -HEADER_FILES= \ - $(wildcard *.h) \ - $(wildcard ../*.h) \ - -SOURCE_FILES= \ - $(wildcard *.cpp) \ - $(wildcard ../*.cpp) \ - $(wildcard ../../threading/thread.cpp) \ - $(wildcard ../../file/fileUtils.cpp) - -OBJECT_FILES= \ - $(addsuffix .o,$(basename $(notdir $(SOURCE_FILES)))) - -DEBUG_OBJECTS= \ - $(addprefix debug/,$(OBJECT_FILES)) - -RELEASE_OBJECTS= \ - $(addprefix release/,$(OBJECT_FILES)) - -debug/%.o: ../../threading/%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: ../../threading/%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -debug/%.o: ../../file/%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: ../../file/%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -debug/%.o: ../%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: ../%.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -debug/%.o: %.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_DEBUG) $(INCLUDES) -c $< -o $@ - -release/%.o: %.cpp $(HEADER_FILES) - $(CXX) $(CXXFLAGS_RELEASE) $(INCLUDES) -c $< -o $@ - -releasedir: - -mkdir -p release - -debugdir: - -mkdir -p debug - -release/test: $(RELEASE_OBJECTS) - $(CXX) $(CXXFLAGS_RELEASE) $(RELEASE_OBJECTS) -lrt -lsocket -lnsl -lpthread -lstdc++ -lz -lm - -debug/test: $(DEBUG_OBJECTS) - $(CXX) $(CXXFLAGS_DEBUG) $(DEBUG_OBJECTS) -lrt -lsocket -lnsl -lpthread -lstdc++ -lz -lm - -release: releasedir $(RELEASE_OBJECTS) release/test - -debug: debugdir $(DEBUG_OBJECTS) debug/test - -clean: - rm -rf release - rm -rf debug - -all: release debug - diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/main.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/main.cpp deleted file mode 100644 index cfd204cf..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/main.cpp +++ /dev/null @@ -1,169 +0,0 @@ -#include "stdServiceImpl.h" - -using namespace std; - -#ifndef WIN32 -#define DWORD int -#define TRUE true -#define FALSE false -#endif - -static bool valToBool(const string &s) throw() -{ - if (s.empty()) return false; - return (s[0] == '1' || s[0] == 't' || s[0] == 'T' || s[0] == 'y' || s[0] == 'Y'); -} - -class options -{ -public: - string m_name; - string m_fileLog; - bool m_consoleLogging; - - vector<string> fromArgs(const vector<string> &args) throw() - { - vector<string> unused; - - for(vector<string>::const_iterator i = args.begin(); i != args.end(); ++i) - { - string::size_type colon_pos = (*i).find(":"); - if (colon_pos != string::npos) - { - string key = (*i).substr(0,colon_pos); - string value= (*i).substr(colon_pos+1); - if (key == "name") { m_name = value; } - else if (key == "clog") { m_consoleLogging = valToBool(value); } - else if (key == "flog") { m_fileLog = value; } - else - { - unused.push_back(*i); - } - } - else - { - unused.push_back(*i); - } - } - - return unused; - } - - string logText() const throw() - { - ostringstream o; - o << endl; - o << "name = " << m_name << endl; - o << "file log = " << m_fileLog << endl; - o << "console logging = " << m_consoleLogging << endl; - return o.str(); - } -}; - -options gOptions; - -class testService -{ -private: - bool m_done; - int m_goResult; - -public: - explicit testService(stdServiceBase &b) : - m_done(false), - m_goResult(0){} - - int go(stdServiceBase &b) throw(exception) - { - DLOG(__F__ ""); - - m_goResult = 0; - bool comInitialized = false; - - try - { - b.comInit(); - - // event loop (until done) - while (!m_done) - { - event dummyEvent(TRUE); - HANDLE evts[2]; - DWORD evtCount = 0; - - evts[evtCount++] = serviceMain::sStop; -// evts[evtCount++] = m_webServer.getRequestQueueEvent();//m_webServer.getCommandSignal(); - - //wait for a single from the webserver or console abort and take action - DWORD waitResult = ::WaitForMultipleObjects(evtCount,evts,FALSE,250); - -// gProcessTable.update(); - switch(waitResult) - { - case WAIT_OBJECT_0: - { - ILOG("Ctrl+C application termination"); - m_done = true; - break; - } -// case WAIT_OBJECT_0+1: -// { -// DLOG("Got a web event"); -// handleWebEvent(); -// break; -// } - default: - { -// if (m_perfmon) -// { -// time_t ttt = time(NULL); -// m_perfmon->updateEPOCH(ttt); -// m_perfmon->updateAppCounter(gProcessTable.countRunning()); -// } - - //DLOG("PM: Got a periodic event"); - // periodic event -// if (gProcessTable.isIdle()) -// { -// if (m_QuitWhenIdle) -// { -// m_done = true; -// m_goResult = 0; -// } -// else if (m_HUPWhenIdle) -// { -// m_done = true; -// m_goResult = HUP_SIGNAL; -// } -// } - break; - } - } - } - b.comUninit(); - comInitialized = false; - ::SetEvent(serviceMain::sStop); - } - catch(...) - { - ELOG(__F__ " Caught an exception"); - if (comInitialized) - { - b.comUninit(); - } - ::SetEvent(serviceMain::sStop); - throw; - } - return m_goResult; - } -}; - -int sm_main(const vector<string> &args) throw() -{ -#ifdef WIN32 - stdServiceWin32<testService,options> s("testService"); -#else - stdServiceUnix<testService,options> s; -#endif - return s.sm_main(args); -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/messagefile.mc b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/messagefile.mc deleted file mode 100644 index 8b3a4be8..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/messagefile.mc +++ /dev/null @@ -1,7 +0,0 @@ -MessageId=0x1 -Severity=Error -SymbolicName=MSG_CMD_ERR -Language=English -%1 - - diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/resource.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/resource.h deleted file mode 100644 index d6780c17..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/resource.h +++ /dev/null @@ -1,14 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by test.rc - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.rc b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.rc deleted file mode 100644 index 0d0fd098..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.rc +++ /dev/null @@ -1,101 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,1,0,0 - PRODUCTVERSION 0,1,0,0 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "FileDescription", "test Application" - VALUE "FileVersion", "0, 1, 0, 0" - VALUE "InternalName", "test" - VALUE "LegalCopyright", "Copyright (C) 2005" - VALUE "OriginalFilename", "test.exe" - VALUE "ProductName", " test Application" - VALUE "ProductVersion", "0, 1, 0, 0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.sln b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.sln deleted file mode 100644 index 15c8dadf..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcproj", "{07D71318-C429-4ED4-A42C-C1A3FC2C40C5}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {07D71318-C429-4ED4-A42C-C1A3FC2C40C5}.Debug.ActiveCfg = Debug|Win32 - {07D71318-C429-4ED4-A42C-C1A3FC2C40C5}.Debug.Build.0 = Debug|Win32 - {07D71318-C429-4ED4-A42C-C1A3FC2C40C5}.Release.ActiveCfg = Release|Win32 - {07D71318-C429-4ED4-A42C-C1A3FC2C40C5}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.vcproj b/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.vcproj deleted file mode 100644 index bb2de619..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/services/test/test.vcproj +++ /dev/null @@ -1,202 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="7.10" - Name="test" - ProjectGUID="{07D71318-C429-4ED4-A42C-C1A3FC2C40C5}" - Keyword="Win32Proj"> - <Platforms> - <Platform - Name="Win32"/> - </Platforms> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory="Debug" - IntermediateDirectory="Debug" - ConfigurationType="1" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories=".;..;..\.." - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_WIN32_WINNT=0x0500" - MinimalRebuild="TRUE" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="0" - WarningLevel="3" - Detect64BitPortabilityProblems="TRUE" - DebugInformationFormat="4" - DisableSpecificWarnings="4290"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="winmm.lib version.lib" - OutputFile="$(OutDir)/test.exe" - LinkIncremental="2" - GenerateDebugInformation="TRUE" - ProgramDatabaseFile="$(OutDir)/test.pdb" - SubSystem="2" - TargetMachine="1"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCWebDeploymentTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory="Release" - IntermediateDirectory="Release" - ConfigurationType="1" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories=".;..;..\.." - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_WIN32_WINNT=0x0500" - RuntimeLibrary="2" - UsePrecompiledHeader="0" - WarningLevel="3" - Detect64BitPortabilityProblems="TRUE" - DebugInformationFormat="3" - DisableSpecificWarnings="4290"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="winmm.lib version.lib" - OutputFile="$(OutDir)/test.exe" - LinkIncremental="1" - GenerateDebugInformation="TRUE" - SubSystem="2" - OptimizeReferences="2" - EnableCOMDATFolding="2" - TargetMachine="1"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCWebDeploymentTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" - UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> - <File - RelativePath=".\main.cpp"> - </File> - <File - RelativePath=".\messagefile.mc"> - <FileConfiguration - Name="Debug|Win32"> - <Tool - Name="VCCustomBuildTool" - CommandLine="mc $(InputFileName)" - Outputs="$(InputName).rc"/> - </FileConfiguration> - <FileConfiguration - Name="Release|Win32"> - <Tool - Name="VCCustomBuildTool" - CommandLine="mc $(InputFileName)" - Outputs="$(InputName).rc"/> - </FileConfiguration> - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl;inc;xsd" - UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> - <File - RelativePath=".\resource.h"> - </File> - </Filter> - <Filter - Name="Resource Files" - Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" - UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> - <File - RelativePath=".\test.rc"> - </File> - </Filter> - <Filter - Name="generated" - Filter=""> - <File - RelativePath=".\messagefile.rc"> - </File> - </Filter> - <Filter - Name="common" - Filter=""> - <File - RelativePath="..\logger.cpp"> - </File> - <File - RelativePath="..\logger.h"> - </File> - <File - RelativePath="..\..\threading\messageThread.h"> - </File> - <File - RelativePath="..\..\threading\MT_stl.h"> - </File> - <File - RelativePath="..\serviceMain.cpp"> - </File> - <File - RelativePath="..\serviceMain.h"> - </File> - <File - RelativePath="..\stdServiceImpl.cpp"> - </File> - <File - RelativePath="..\stdServiceImpl.h"> - </File> - <File - RelativePath="..\..\threading\thread.cpp"> - </File> - <File - RelativePath="..\..\threading\thread.h"> - </File> - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.cpp deleted file mode 100644 index d78fa9a1..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.cpp +++ /dev/null @@ -1,868 +0,0 @@ -#ifdef PLATFORM_LINUX -#if !defined(__APPLE__) && !defined(_GNU_SOURCE) -# define _GNU_SOURCE // enable dladdr and getline -#endif - -#include "StackTrace.h" -#include <unistd.h> - -#if defined(__APPLE__) // need atos -# if defined(STACKTRACE_USE_BACKTRACE) -# include <execinfo.h> // to record the backtrace addresses -# endif -// for display: -# include </usr/include/util.h> // forkpty to make a pseudo-terminal for atos -# include <termios.h> // set pseudo-terminal to raw mode -# include <sys/select.h> // test whether atos has responded yet - -#elif defined(STACKTRACE_USE_BACKTRACE) -# include <execinfo.h> // to record the backtrace addresses -// for display: -# include <dlfcn.h> // dladdr() -# include <sys/param.h> // realpath() -# include <errno.h> -# if defined(__GNUC__) && defined(__cplusplus) -# include <cxxabi.h> // demangling -# include <string> -# endif -# if defined(__linux__) -# include <sys/stat.h> -# endif -#endif - -#ifdef __cplusplus -# include <cstdio> -# include <cstdlib> -# include <cstring> -#else -# include <stdio.h> -# include <stdlib.h> -# include <string.h> -#endif - -#ifdef ST_UNUSED -#elif defined(__GNUC__) && __GNUC__>3 -//! portable access to compiler hint not to warn if a function argument is ignored (goes in argument list) -# define ST_UNUSED(x) UNUSED_##x __attribute__((unused)) -//! portable access to compiler hint not to warn if a function argument is ignored (goes at beginning of function body) -# define ST_BODY_UNUSED(x) /*no body necessary*/ - -#elif defined(__LCLINT__) -//! portable access to compiler hint not to warn if a function argument is ignored (goes in argument list) -# define ST_UNUSED(x) /*@unused@*/ x -//! portable access to compiler hint not to warn if a function argument is ignored (goes at beginning of function body) -# define ST_BODY_UNUSED(x) /*no body necessary*/ - -#else -//! portable access to compiler hint not to warn if a function argument is ignored (goes in argument list) -# define ST_UNUSED(x) UNUSED_##x -//! portable access to compiler hint not to warn if a function argument is ignored (goes at beginning of function body) -# define ST_BODY_UNUSED(x) (void)UNUSED_##x /* ugly hack to avoid warning */ -#endif - -#ifdef __cplusplus -namespace stacktrace { -#endif /* __cplusplus */ - -int unrollStackFrame(struct StackFrame* curFrame, struct StackFrame* nextFrame) { - if(curFrame==NULL) - return 0; - curFrame->caller=NULL; - if(nextFrame==NULL) - return 0; - - -#ifdef STACKTRACE_USE_BACKTRACE - - if(curFrame->packedRA==NULL) - return 0; // don't have current frame - if(*curFrame->packedRAUsed<=curFrame->depth+1) { - // last element - if(curFrame!=nextFrame) { - nextFrame->packedRA = NULL; - nextFrame->packedRAUsed = nextFrame->packedRACap = NULL; - } - return 0; - } - if(curFrame!=nextFrame) { - nextFrame->packedRA = curFrame->packedRA; - nextFrame->packedRAUsed = curFrame->packedRAUsed; - nextFrame->packedRACap = curFrame->packedRACap; - nextFrame->depth = curFrame->depth; // will be incremented below - } - nextFrame->ra = (*nextFrame->packedRA)[++(nextFrame->depth)]; - curFrame->caller=nextFrame; - return 1; - -#else - - void* nsp=NULL; - machineInstruction * nra=NULL; - -#if defined(__i386__) || defined(__x86_64__) || defined(__amd64__) - if(curFrame->sp==NULL) - return 0; - if(((void**)curFrame->sp)-1==NULL) - return 0; - nsp=((void***)curFrame->sp)[-1]; - if(nsp==NULL) - return 0; - nsp=(void**)nsp+1; //move from frame pointer to stack pointer of previous frame - nra=*((machineInstruction**)curFrame->sp); - if(nsp<=curFrame->sp) { - fprintf(stderr,"stacktrace::unrollStackFrame(sp=%p,ra=%p) directed to invalid next frame: (sp=%p,ra=%p)\n",curFrame->sp,curFrame->ra,nsp,nra); - return 0; - } -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p ) -> { %p %p }\n",curFrame->sp,curFrame->ra,nsp,nra); - nextFrame->debug=curFrame->debug; -# endif - nextFrame->sp=nsp; - nextFrame->ra=nra; - curFrame->caller=nextFrame; - return 1; -#endif -#ifdef __POWERPC__ - if(curFrame->sp==NULL) - return 0; - if(*(void**)curFrame->sp==NULL) - return 0; - nsp=*(void**)curFrame->sp; - nra=((machineInstruction**)nsp)[2]; - if(nsp<=curFrame->sp) { - fprintf(stderr,"stacktrace::unrollStackFrame(sp=%p,ra=%p) directed to invalid next frame: (sp=%p,ra=%p)\n",curFrame->sp,curFrame->ra,nsp,nra); - return 0; - } -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p ) -> { %p %p }\n",curFrame->sp,curFrame->ra,nsp,nra); - nextFrame->debug=curFrame->debug; -# endif - nextFrame->sp=nsp; - nextFrame->ra=nra; - curFrame->caller=nextFrame; - return 1; -#endif -#if defined(__MIPSEL__) || defined(__MIPS__) /* we're running on PLATFORM_APERIOS */ - if(curFrame->sp==NULL) - return 0; - /* Have to scan through intructions being executed because stack pointer is not stored directly on the stack */ - machineInstruction * ins; - const machineInstruction * INS_BASE=(const machineInstruction *)0x2000; // lowest valid memory address? - -#ifdef __PIC__ - ins = reinterpret_cast<machineInstruction*>(curFrame->gp-curFrame->ra); -#else - ins = curFrame->ra; -#endif - // find previous return address - for(; ins>=INS_BASE; ins--) { - // gcc will always save the return address with the instruction - // sw ra, offset(sp) - // - // the high word in this case is sw sp ra - if ( ( *ins & 0xffff0000 ) == 0xafbf0000 ) - { - // the low word is the offset from sp - int offset = *ins & 0x000ffff; - - // in case things went horribly awry, don't deref the non-aligned ptr - if (offset & 0x3) - return 0; - - nra = *reinterpret_cast<machineInstruction**>((char*)curFrame->sp + offset); - break; // now search for stack pointer - } - - //it appears the aperios stub entry functions always begin with "ori t0,ra,0x0" - //if we hit one of these, return 0, because we can't unroll any more - //(or at least, I don't know how it returns from these... there's no return statements!) - if ( *ins == 0x37e80000 ) { -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p %p ) -> { kernel? }\n",curFrame->sp,curFrame->ra,curFrame->gp); -# endif - return 0; - } - } - // find previous stack pointer - for(; ins>=INS_BASE; ins--) { - // gcc will always change the stack frame with the instruction - // addiu sp,sp,offset - // - // at the beginning of the function the offset will be negative since the stack grows - // from high to low addresses - // - // first check the high word which will be instruction + regs in this case (I-type) - if ( ( *ins & 0xffff0000 ) == 0x27bd0000 ) { - // the offset is in the low word. since we're finding occurrence at the start of the function, - // it will be negative (increase stack size), so sign extend it - int offset = ( *ins & 0x0000ffff ) | 0xffff0000; - - // in case things went horribly awry, don't deref the non-aligned ptr - if (offset & 0x3) - return 0; - - nsp = (char*)curFrame->sp - offset; - break; - } - } - - - if(ins>=INS_BASE) { - if(nsp<=curFrame->sp) { -#ifdef __PIC__ - fprintf(stderr,"stacktrace::unrollStackFrame(sp=%p,ra=%p,gp=%p) directed to invalid next frame: (sp=%p,ra=%p,gp=%p)\n",curFrame->sp,(void*)curFrame->ra,(void*)curFrame->gp,nsp,nra,(void*)(reinterpret_cast<size_t*>(nsp)[4])); -#else - fprintf(stderr,"stacktrace::unrollStackFrame(sp=%p,ra=%p) directed to invalid next frame: (sp=%p,ra=%p)\n",curFrame->sp,(void*)curFrame->ra,nsp,nra); -#endif - return 0; - } - -#ifdef __PIC__ -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p %p ) -> { %p %p %p }\n",curFrame->sp,curFrame->ra,curFrame->gp,nsp,nra,reinterpret_cast<size_t*>(nsp)[4]); - nextFrame->debug=curFrame->debug; -# endif - // I'm not actually sure this is a valid stop criteria, but in testing, - // after this it seems to cross into some kind of kernel code. - // (We get a really low gp (0x106), although a fairly normal nra, and then go bouncing - // around in memory until we hit sp=0x80808080, ra=0x2700, which seems to be the 'real' last frame) - //if(reinterpret_cast<size_t>(nra)>reinterpret_cast<size_t*>(nsp)[4]) - //return 0; - //instead of this however, now we check for the ori t0,ra,0 statement, and reuse previous gp below - - nextFrame->sp=nsp; - //not sure how valid this is either: - if(reinterpret_cast<size_t>(nra)>reinterpret_cast<size_t*>(nsp)[4]) { - nextFrame->gp = curFrame->gp; - } else { - nextFrame->gp = reinterpret_cast<size_t*>(nsp)[4]; // gp is stored 4 words from stack pointer - } - nextFrame->ra = nextFrame->gp-reinterpret_cast<size_t>(nra); -#else -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p ) -> { %p %p }\n",curFrame->sp,curFrame->ra,nsp,nra); - nextFrame->debug=curFrame->debug; -# endif - nextFrame->sp=nsp; - nextFrame->ra=nra; -#endif /* __PIC__ */ - curFrame->caller=nextFrame; - return 1; - } -#ifdef __PIC__ -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p %p ) -> { %p %p --- }\n",curFrame->sp,curFrame->ra,curFrame->gp,nsp,nra); -# endif -#else -# ifdef DEBUG_STACKTRACE - if(curFrame->debug) - printf("( %p %p ) -> { %p %p }\n",curFrame->sp,curFrame->ra,nsp,nra); -# endif -#endif - return 0; -#endif -#endif /* backtrace */ -} - -#ifdef STACKTRACE_USE_BACKTRACE -static int growAlloc(struct StackFrame* frame) { - void** r = (void**)realloc(*frame->packedRA, *frame->packedRACap * sizeof(void*) * 2); - if(r==NULL) - return 0; - *frame->packedRACap *= 2; - *frame->packedRA = r; - return 1; -} -#endif - -#ifdef STACKTRACE_USE_BACKTRACE -const size_t MIN_CAP=50; -static void allocBacktraceRegion(struct StackFrame* frame, size_t /*cap*/) { - /*if(cap < MIN_CAP) - cap=MIN_CAP;*/ - frame->packedRACap = (size_t*)malloc(sizeof(size_t)); - *frame->packedRACap = MIN_CAP; - frame->packedRAUsed = (size_t*)malloc(sizeof(size_t)); - *frame->packedRAUsed = 0; - frame->packedRA = (void***)malloc(sizeof(void**)); - *frame->packedRA = (void**)malloc(*frame->packedRACap * sizeof(void*)); - //printf("Allocated %p\n",*frame->packedRA); -} - -static void freeBacktraceRegion(struct StackFrame* frame) { - //printf("Freeing %p\n",*frame->packedRA); - free(frame->packedRACap); - frame->packedRACap = NULL; - free(frame->packedRAUsed); - frame->packedRAUsed = NULL; - free(*frame->packedRA); - *frame->packedRA=NULL; - free(frame->packedRA); - frame->packedRA=NULL; -} -#endif - -void getCurrentStackFrame(struct StackFrame* frame) { -#ifdef STACKTRACE_USE_BACKTRACE - - // first call? allocate the storage area - if(frame->packedRA==NULL) - allocBacktraceRegion(frame,MIN_CAP); - - // call backtrace, if we hit the capacity, grow the buffer and try again - do { - *frame->packedRAUsed = backtrace(*frame->packedRA, *frame->packedRACap); - } while(*frame->packedRAUsed==*frame->packedRACap && growAlloc(frame)); - - // if we used an oversized buffer, shrink it back down - if(*frame->packedRACap > *frame->packedRAUsed*2 && *frame->packedRACap>MIN_CAP) { - unsigned int newsize = *frame->packedRAUsed * 3 / 2; - if(newsize < MIN_CAP) - newsize = MIN_CAP; - void** r = (void**)realloc(*frame->packedRA, newsize * sizeof(void*) * 2); - if(r!=NULL) { - *frame->packedRACap = newsize; - *frame->packedRA = r; - } - } - frame->depth=1; - -#else - - void** csp=NULL; - machineInstruction* cra=NULL; - -#ifdef __POWERPC__ - __asm __volatile__ ("mr %0,r1" : "=r"(csp) ); // get the current stack pointer - __asm __volatile__ ("mflr %0" : "=r"(cra) ); // get the current return address -#endif /* __POWERPC__ */ - -#if defined(__MIPSEL__) || defined(__MIPS__) -#ifdef __PIC__ - size_t cgp=0; - __asm __volatile__ ("move %0,$gp" : "=r"(cgp) ); //get the gp register so we can compute link addresses -#endif /* __PIC__ */ - __asm __volatile__ ("move %0,$sp" : "=r"(csp) ); // get the current stack pointer - __asm __volatile__ ("jal readepc; nop; readepc: move %0,$ra" : "=r"(cra) ); // get the current return address -#endif /* __MIPSEL__ */ - -#if defined(__i386__) - __asm __volatile__ ("movl %%ebp,%0" : "=m"(csp) ); // get the caller's stack pointer - csp++; //go back one to really be a stack pointer - //__asm __volatile__ ("movl (%%esp),%0" : "=r"(cra) ); // get the caller's address - cra=*((machineInstruction**)csp); - csp=((void***)csp)[-1]+1; -#endif /* __i386__ */ - -// basically the same as i386, but movq instead of movl, and rbp instead of ebp -#if defined(__x86_64__) || defined(__amd64__) - __asm __volatile__ ("movq %%rbp,%0" : "=m"(csp) ); // get the caller's stack pointer - csp++; //go back one to really be a stack pointer - //__asm __volatile__ ("movq (%%rsp),%0" : "=r"(cra) ); // get the caller's address - cra=*((machineInstruction**)csp); - csp=((void***)csp)[-1]+1; -#endif /* amd64/x86_64 */ - - frame->sp=csp; -#if defined(__PIC__) && (defined(__MIPSEL__) || defined(__MIPS__)) - frame->ra=cgp-reinterpret_cast<size_t>(cra); - frame->gp=cgp; -#else - frame->ra=cra; -#endif /* __PIC__ */ - -#if !defined(__i386__) && !defined(__x86_64__) && !defined(__amd64__) - //with ia-32 it was more convenient to directly provide caller, so don't need to unroll - //otherwise we actually want to return *caller's* frame, so unroll once - unrollStackFrame(frame,frame); -#endif /* not __i386__ */ -#endif /* backtrace */ -} - -void freeStackTrace(struct StackFrame* frame) { -#ifdef STACKTRACE_USE_BACKTRACE - if(frame!=NULL && frame->packedRA!=NULL) { - freeBacktraceRegion(frame); - } -#endif - while(frame!=NULL) { - struct StackFrame * next=frame->caller; - free(frame); - if(frame==next) - return; - frame=next; - } -} - -struct StackFrame* allocateStackTrace(unsigned int size) { - struct StackFrame * frame=NULL; - while(size--!=0) { - struct StackFrame * prev = (struct StackFrame *)malloc(sizeof(struct StackFrame)); - memset(prev, 0, sizeof(*prev)); -#ifdef STACKTRACE_USE_BACKTRACE - if(frame==NULL) { - allocBacktraceRegion(prev,size); - } else { - prev->packedRA = frame->packedRA; - prev->packedRAUsed = frame->packedRAUsed; - prev->packedRACap = frame->packedRACap; - } - prev->depth = size-1; -#endif - prev->caller=frame; - frame=prev; - } - return frame; -} - - -struct StackFrame * recordStackTrace(unsigned int limit/*=-1U*/, unsigned int skip/*=0*/) { - if(limit==0) - return NULL; - struct StackFrame * cur = allocateStackTrace(1); -#ifdef DEBUG_STACKTRACE - cur->debug=0; -#endif - getCurrentStackFrame(cur); - for(; skip!=0; skip--) - if(!unrollStackFrame(cur,cur)) { - freeStackTrace(cur); - return NULL; - } - struct StackFrame * prev = (struct StackFrame *)malloc(sizeof(struct StackFrame)); - memset(prev, 0, sizeof(*prev)); -#ifdef DEBUG_STACKTRACE - prev->debug=0; -#endif - - unrollStackFrame(cur,prev); //unroll once more for the current frame -#ifdef STACKTRACE_USE_BACKTRACE - memset(cur,0,sizeof(*cur)); // clear cur, prev is now responsible for packedRA allocation -#endif - freeStackTrace(cur); - cur=prev; - - for(--limit; limit!=0; limit--) { - struct StackFrame * next = (struct StackFrame *)malloc(sizeof(struct StackFrame)); - memset(next, 0, sizeof(*next)); -#ifdef DEBUG_STACKTRACE - next->debug=0; -#endif - if(!unrollStackFrame(prev,next)) { - // reached end of trace - free(next); - prev->caller=NULL; //denotes end was reached - return cur; - } - prev=next; - } - // reaching here implies limit was reached - prev->caller=prev; //denotes limit was reached - return cur; -} - -struct StackFrame * recordOverStackTrace(struct StackFrame* frame, unsigned int skip) { - struct StackFrame * cur = allocateStackTrace(1); -#ifdef DEBUG_STACKTRACE - cur->debug=0; -#endif - if(frame==NULL) - return frame; - getCurrentStackFrame(cur); - for(; skip!=0; skip--) - if(!unrollStackFrame(cur,cur)) { - freeStackTrace(cur); - return frame; - } -#ifdef STACKTRACE_USE_BACKTRACE - if(frame->packedRA!=NULL) - freeBacktraceRegion(frame); -#endif - unrollStackFrame(cur,frame); //unroll once more for the current frame -#ifdef STACKTRACE_USE_BACKTRACE - memset(cur,0,sizeof(*cur)); // clear cur, frame is now responsible for packedRA allocation -#endif - freeStackTrace(cur); - - for(; frame->caller!=NULL && frame->caller!=frame; frame=frame->caller) { - struct StackFrame *ans=frame->caller; //don't lose remainder of free list if we hit the end - if(!unrollStackFrame(frame,frame->caller)) { - return ans; // reached end of trace - } - } - // reaching here implies limit was reached - frame->caller=frame; //denotes limit was reached - return NULL; -} - - -#ifdef __APPLE__ -// use atos to do symbol lookup, can lookup non-dynamic symbols and also line numbers -/*! This function is more complicated than you'd expect because atos doesn't flush after each line, - * so plain pipe() or socketpair() won't work until we close the write side. But the whole point is - * we want to keep atos around so we don't have to reprocess the symbol table over and over. - * What we wind up doing is using forkpty() to make a new pseudoterminal for atos to run in, - * and thus will use line-buffering for stdout, and then we can get each line. */ -static void atosLookup(unsigned int depth, void* ra) { - static int fd=-1; - int isfirst=0; - - if(fd==-1) { - struct termios opts; - cfmakeraw(&opts); // have to set this first, otherwise queries echo until child kicks in - pid_t child = forkpty(&fd,NULL,&opts,NULL); - if(child<0) { - perror("Could not forkpty for atos call"); - return; - } - if(child==0) { - //sleep(3); - char pidstr[50]; - snprintf(pidstr,50,"%d",getppid()); - execlp("atos","atos","-p",pidstr,(char*)0); - //snprintf(pidstr,50,"atos -p %d",getppid()); - //execlp("sh","sh","-i","-c",pidstr,(char*)0); - fprintf(stderr,"Could not exec atos for stack trace!\n"); - _exit(1); - } - isfirst=1; - } - - { - char q[50]; - size_t qlen = snprintf(q,50,"%p\n",ra); - //printf("query: %.*s",50,q); - write(fd,q,qlen); - } - - if(isfirst) { - // atos can take a while to parse symbol table on first request, which is why we leave it running - // if we see a delay, explain what's going on... - int err; - struct timeval tv = {3,0}; - fd_set fds; - FD_ZERO(&fds); - FD_SET(fd,&fds); - err = select(fd+1,&fds,NULL,NULL,&tv); - if(err<0) - perror("select for atos output"); - if(err==0) // timeout - printf("Generating... first call takes some time for 'atos' to cache the symbol table.\n"); - } - - { - const unsigned int MAXLINE=1024; - char line[MAXLINE]; - size_t nread=0; - char c='x'; - while(c!='\n' && nread<MAXLINE) { - if(read(fd,&c,1)<=0) { - fprintf(stderr,"Lost atos connection for stacktrace\n"); - close(fd); - fd=-1; - break; - } - //printf("Read %d\n",c); - if(c!='\r') - line[nread++]=c; - } - if(nread<MAXLINE) - line[nread++]='\0'; - fprintf(stderr,"%4u %.*s",depth,MAXLINE,line); - } -} - -#elif defined(STACKTRACE_USE_BACKTRACE) - -# if defined(__GNUC__) && defined(__cplusplus) - static std::string demangle(const std::string& name) - { - int status = 0; - char *d = 0; - std::string ret = name; - try { if ((d = abi::__cxa_demangle(name.c_str(), 0, 0, &status))) ret = d; } - catch(...) { } - std::free(d); - return ret; - } -# endif - -# ifndef __linux__ -// on bsd based systems, we have fgetln() instead of getline() -static int getline(char** s, size_t* len, FILE* f) { - size_t _len; - char * _s = fgetln(f,&_len); - if(_s==NULL) - return -1; - if(*len<_len+1) { - char * ns = (char*)realloc(*s,_len+1); - if(ns==NULL) - return -1; - *s=ns; - } - memcpy(*s,_s,_len); - (*s)[_len]='\0'; - return _len; -} -# endif - -static int addr2lineLookup(const char* const ex, const void* const off, char** srcfile, size_t* srcfilelen, char** func, size_t* funclen) { - const char * cmdfmt = "addr2line -fe '%s' %p"; - const size_t cmdlen = snprintf(NULL,0,cmdfmt,ex,off)+1; - char * cmd = (char*)malloc(cmdlen*sizeof(char)); - if(cmd==NULL) { - fprintf(stderr,"[ERR Could not malloc addr2line command]\n"); - return -1; - } - const int cmdused = snprintf(cmd,cmdlen,cmdfmt,ex,off); - if(cmdused<0) { - perror("snprintf for addr2line command"); - free(cmd); - return -1; - } - if((size_t)cmdused>=cmdlen) { - fprintf(stderr, "[ERR addr2line command grew? %d vs %lu]\n",cmdused,(unsigned long)cmdlen); - free(cmd); - return -1; - } - FILE* look=popen(cmd,"r"); - free(cmd); - if(look==NULL) { - fprintf(stderr, "[Missing addr2line]\n"); - return -1; - } - if(getline(func,funclen,look)<=0) { - pclose(look); - return -1; - } - if(getline(srcfile,srcfilelen,look)<=0) { - pclose(look); - return -1; - } - pclose(look); - char* nl = strrchr(*func,'\n'); - if(nl!=NULL) - *nl='\0'; - nl = strrchr(*srcfile,'\n'); - if(nl!=NULL) - *nl='\0'; - return 0; -} - -static void displayRelPath(FILE* os, const char * wd, const char* path) { - unsigned int same=0,i=0; - for(i=0; path[i]!='\0'; ++i) { - if(wd[i]=='/') - same=i+1; - else if(wd[i]=='\0') { - same=i; - break; - } else if(wd[i]!=path[i]) - break; - } - if(wd[same]=='\0') - ++same; - else if(same>1) { - // really want to be relative to source tree root, don't bother with ..'s - /*for(i=same; wd[i]!='\0'; ++i) - if(wd[i]=='/') - fprintf(os,"../"); - fprintf(os,"../");*/ - } - fprintf(os,"%s",&path[same]); -} -#endif - -//! attempts to read symbol information and displays stack trace header -static void beginDisplay() { -#ifdef STACKTRACE_USE_BACKTRACE - //fprintf(stderr,"Stack Trace:\n"); -#elif defined(PLATFORM_APERIOS) - fprintf(stderr,"Run trace_lookup:"); -#elif defined(__APPLE__) - fprintf(stderr,"backtrace_symbols() unavailable, try 'atos' to make human-readable backtrace (-p %d):",getpid()); -#else - fprintf(stderr,"backtrace_symbols() unavailable, try addr2line or tools/trace_lookup to make human-readable backtrace:"); -#endif -} - -#ifdef __APPLE__ -static void displayStackFrame(unsigned int depth, const struct StackFrame* frame) { - atosLookup(depth,(void*)frame->ra); -} -#elif defined(STACKTRACE_USE_BACKTRACE) -static void displayStackFrame(unsigned int depth, const struct StackFrame* frame) { - void* ra = (void*)frame->ra; - Dl_info sym; - memset(&sym,0,sizeof(Dl_info)); - int dlres = dladdr(frame->ra, &sym); - - int isExe = (sym.dli_fname==NULL); // if lib unknown, assume static linkage, implies executable -# ifdef __linux__ - // detect if /proc/self/exe points to sym.dli_fname - if(!isExe && sym.dli_fname[0]!='\0') { - struct stat exeStat; - struct stat libStat; - if(stat("/proc/self/exe",&exeStat)!=0) { - perror(" stat /proc/self/exe"); - } else if(stat(sym.dli_fname,&libStat)!=0) { - perror(" stat lib"); - } else { - isExe = (exeStat.st_dev==libStat.st_dev && exeStat.st_ino==libStat.st_ino); - } - } -# endif - - if(dlres==0 || sym.dli_sname==NULL) { - if(sym.dli_fname==NULL || sym.dli_fname[0]=='\0') { - fprintf(stderr,"%4u [non-dynamic symbol @ %p]",depth,ra); - fprintf(stderr," (has offset %p in unknown library)\n",sym.dli_fbase); - } else { - // use addr2line for static function lookup - const void* const off = (isExe) ? ra : (void*)((size_t)ra-(size_t)sym.dli_fbase); - char* srcfile=NULL, *func=NULL; - size_t srcfilelen=0, funclen=0; - if(addr2lineLookup(sym.dli_fname,off,&srcfile,&srcfilelen,&func,&funclen)==0) { - fprintf(stderr,"%4u %s",depth,(strlen(func)==0) ? "[unknown symbol]" : func); - if(!isExe) { - const char * base = strrchr(sym.dli_fname,'/'); - fprintf(stderr," (%s)",(base==NULL)?sym.dli_fname:base+1); - } - if(strcmp(srcfile,"??:0")!=0) { - fprintf(stderr," "); - char * wd = getcwd(NULL,0); - if(wd==NULL) { - perror("getcwd"); - return; - } - fprintf(stderr,"("); - displayRelPath(stderr,wd,srcfile); - fprintf(stderr,")"); - free(wd); - } - fprintf(stderr,"\n"); - } - free(srcfile); - free(func); - } - return; - } else { - const char * dispFmt="%4d %s +%#lx"; -# ifdef __cplusplus - fprintf(stderr,dispFmt,depth,demangle(sym.dli_sname).c_str(),(size_t)ra-(size_t)sym.dli_saddr); -# else - fprintf(stderr,dispFmt,depth,sym.dli_sname,(size_t)ra-(size_t)sym.dli_saddr); -# endif - } - - if(sym.dli_fname==NULL || sym.dli_fname[0]=='\0') { - fprintf(stderr," (%p, offset %p in unknown lib)\n",ra,sym.dli_fbase); - return; - } else if(isExe) { - // don't bother listing executable name, just show return address - // ...or since the symbol name and offset imply the return address, just skip it - //fprintf(stderr," (%p)",ra); - } else { - // ra is meaningless in dynamically loaded libraries... address space layout randomization (ASLR) - // just show library name - const char * base = strrchr(sym.dli_fname,'/'); - fprintf(stderr," (%s)",(base==NULL)?sym.dli_fname:base+1); - } - - // now do file and line number lookup of function via addr2line - const void* const off = (isExe) ? ra : (void*)((size_t)ra-(size_t)sym.dli_fbase); - char* srcfile=NULL, *func=NULL; - size_t srcfilelen=0, funclen=0; - if(addr2lineLookup(sym.dli_fname,off,&srcfile,&srcfilelen,&func,&funclen)==0 && strcmp(srcfile,"??:0")!=0) { - fprintf(stderr," "); - char * wd = getcwd(NULL,0); - if(wd==NULL) { - perror("getcwd"); - return; - } - fprintf(stderr,"("); - displayRelPath(stderr,wd,srcfile); - fprintf(stderr,")"); - free(wd); - } - fprintf(stderr,"\n"); - free(srcfile); - free(func); -} -#else -static void displayStackFrame(unsigned int ST_UNUSED(depth), const struct StackFrame* frame) { - ST_BODY_UNUSED(depth); - fprintf(stderr," %p",(void*)frame->ra); -} -#endif - -//! releases symbol information used during display -static void completeDisplay(int isend) { -#if defined(STACKTRACE_USE_BACKTRACE) -#endif - if(!isend) - fprintf(stderr," ...\n"); -} - -void displayCurrentStackTrace(unsigned int limit/*=-1U*/, unsigned int skip/*=0*/) { - struct StackFrame * cur = allocateStackTrace(1); -#ifdef DEBUG_STACKTRACE - cur->debug=0; -#endif - unsigned int i; - int more; - if(limit==0) - return; - getCurrentStackFrame(cur); - //printf(" initial (%p\t%p\t%p)\n",cur.ra,cur.sp,*(void**)cur.sp); - beginDisplay(); - for(; skip!=0; skip--) { - if(!unrollStackFrame(cur,cur)) { - completeDisplay(1); - return; - } - //printf(" skip (%p\t%p\t%p)\n",cur.ra,cur.sp,*(void**)cur.sp); - } - for(i=0; (more=unrollStackFrame(cur,cur)) && i<limit; i++) { - //printf(" out (%p\t%p\t%p)\n",cur.ra,cur.sp,*(void**)cur.sp); - displayStackFrame(i,cur); - } - completeDisplay(!more); - freeStackTrace(cur); -} - -void displayStackTrace(const struct StackFrame* frame) { - int i; - beginDisplay(); - for(i=0; frame!=NULL && frame->caller!=frame; i++) { - displayStackFrame(i,frame); - frame=frame->caller; - } - if(frame!=NULL) - displayStackFrame(i+1,frame); - completeDisplay(frame==NULL); -} - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -/*! @file - * @brief Implements functionality for performing stack traces - * @author ejt (Generalized and implementation for non-MIPS platforms) - * @author Stuart Scandrett (original inspiration, Aperios/MIPS stack operations) - * - * $Author: ejtttje $ - * $Name: $ - * $Revision: 1.2 $ - * $State: Exp $ - * $Date: 2009/11/20 00:50:23 $ - */ -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.h deleted file mode 100644 index fe79f863..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stacktrace/StackTrace.h +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef INCLUDED_StackTrace_h_ -#define INCLUDED_StackTrace_h_ - -#ifdef __APPLE__ -# include <AvailabilityMacros.h> -#endif -// Aperios and Mac OS X 10.4 and prior need the "manual" unroll; otherwise assume execinfo.h and backtrace() are available -#if !defined(PLATFORM_APERIOS) && (!defined(__APPLE__) || defined(MAC_OS_X_VERSION_10_5)) -# define STACKTRACE_USE_BACKTRACE -#endif - -#ifndef __cplusplus -# include <stddef.h> - -#else -# include <cstddef> -//! Holds the C-style interface for the stack trace routines -namespace stacktrace { -extern "C" { -#endif /* __cplusplus */ - -typedef int machineInstruction; //!< typedef in case type needs to change on other platforms (i.e. long for 64 bit architectures?) - -//! Stores information about a single stack frame -struct StackFrame { - -#ifdef STACKTRACE_USE_BACKTRACE - //! pointer to array of return addresses, shared by all StackFrames in the list - void*** packedRA; - //! pointer to number of entries available at #packedRA - size_t* packedRAUsed; - //! pointer to size of array at #packedRA - size_t* packedRACap; - //! entry in #packedRA corresponding to this frame - size_t depth; - //! return address, points to instruction being executed within current frame - void* ra; -#else - //! stack pointer, points to end of stack frame - void * sp; - -# if defined(__PIC__) && (defined(__MIPSEL__) || defined(__MIPS__)) - //! return address, points to instruction being executed within current frame - /*! Note that this is the address that is being returned to by the @e sub-function, - * @e not the address that this frame itself is returning to. - * When executing position independent code (PIC), this is the address relative - * to #gp. In other words, subtract this from #gp to get current memory address, - * or subtract from the binary's _gp symbol to get link-time address (for looking up file/line) */ - size_t ra; - - //! global offset used in position independent code (PIC) - /*! subtract #ra from this to get the actual run-time memory address of the instruction */ - size_t gp; - -# else - //! return address, points to instruction being executed within current frame - /*! Note that this is the address that is being returned to by the @e sub-function, - * @e not the address that this frame itself is returning to. */ - machineInstruction * ra; -# endif /* __PIC__ */ - -# ifdef DEBUG_STACKTRACE - //! if DEBUG_STACKTRACE is defined, this field is available which, if non-zero, will cause debugging info to be displayed on each unroll - int debug; -# endif -#endif - - //! points to the caller's stack frame (stack frame of function which called this one), may be NULL or self-referential at end of list - /*! a self-referential value indicates the frame is not the last on the stack, but is the last recorded. */ - struct StackFrame * caller; - -}; - - -//! stores information about the caller's stack frame into @a frame -void getCurrentStackFrame(struct StackFrame* frame); - -//! stores information about the caller to @a curFrame into @a nextFrame -/*! @return 0 if error occurred (i.e. bottom of the stack), non-zero upon success - * @a nextFrame @e can be the same instance as @a curFrame, will update in place. - * @a curFrame->caller will be set to @a nextFrame. */ -int unrollStackFrame(struct StackFrame* curFrame, struct StackFrame* nextFrame); - -//! frees a list of StackFrames, such as is returned by recordStackTrace -void freeStackTrace(struct StackFrame* frame); - -//! preallocates a stack trace of a particular size (doesn't actually perform a stack trace, merely allocates the linked list) -/*! this is a good idea if you want to do a stack trace within an exception handler, which might have been triggered by running out of heap */ -struct StackFrame* allocateStackTrace(unsigned int size); - -//! dumps stored stack trace to stderr -void displayStackTrace(const struct StackFrame* frame); - -#ifndef __cplusplus - -//! dumps current stack trace to stderr, up to @a limit depth and skipping the top @a skip frames -/*! pass -1U for limit to request unlimited trace, and 0 to start with the function calling recordStackTrace */ -void displayCurrentStackTrace(unsigned int limit, unsigned int skip); - -//! repeatedly calls unrollStackFrame() until the root frame is reached or @a limit is hit, skipping the top @a skip frames -/*! pass -1U for limit to request unlimited trace, and 0 to start with the function calling recordStackTrace */ -struct StackFrame * recordStackTrace(unsigned int limit, unsigned int skip); -//! repeatedly calls unrollStackFrame() until the root frame is reached or end of @a frame list is hit, skipping the top @a skip frames -/*! This is handy for reusing previously allocated frames, returns the unused portion (if return value equals @a frame, none were used -- implies never cleared @a skip) */ -struct StackFrame * recordOverStackTrace(struct StackFrame* frame, unsigned int skip); - -#else /* __cplusplus */ - -//! dumps current stack trace to stderr, up to @a limit depth and skipping the top @a skip frames -/*! pass -1U for limit to request unlimited trace, and 0 to start with the function calling recordStackTrace */ -void displayCurrentStackTrace(unsigned int limit=-1U, unsigned int skip=0); - -//! repeatedly calls unrollStackFrame() until the root frame is reached or @a limit is hit, skipping the top @a skip frames -/*! pass -1U for limit to request unlimited trace, and 0 to start with the function calling recordStackTrace */ -struct StackFrame * recordStackTrace(unsigned int limit=-1U, unsigned int skip=0); -//! repeatedly calls unrollStackFrame() until the root frame is reached or end of @a frame list is hit, skipping the top @a skip frames -/*! This is handy for reusing previously allocated frames, returns the unused portion (if return value equals @a frame, none were used -- implies never cleared @a skip) */ -struct StackFrame * recordOverStackTrace(struct StackFrame* frame, unsigned int skip=0); - -} -} - -#endif /* __cplusplus */ - -/*! @file - * @brief Describes functionality for performing stack traces - * @author ejt (Creator) - * - * $Author: ejtttje $ - * $Name: $ - * $Revision: 1.2 $ - * $State: Exp $ - * $Date: 2009/11/20 00:50:23 $ - */ -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/functors.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/functors.h deleted file mode 100644 index fb8c53da..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/functors.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#ifndef functors_H_ -#define functors_H_ - -namespace stlx -{ - template<typename T> - void delete_fntr(T *t) - { - if (t) - { - try - { - delete t; - t = 0; - } - catch(...) - { - } - } - } -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h deleted file mode 100644 index 89ec3a9c..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stlx.h +++ /dev/null @@ -1,324 +0,0 @@ -#pragma once -#ifndef _stlx_H_ -#define _stlx_H_ - -#include <functional> - -namespace stlx { - -template<class Type1, class Type2, class Type3> -struct triple -{ - typedef Type1 first_type; - typedef Type2 second_type; - typedef Type3 third_type; - Type1 first; - Type2 second; - Type3 third; - triple(){} - triple(const Type1& __Val1, const Type2& __Val2,const Type3& __Val3) - :first(__Val1),second(__Val2),third(__Val3){} - template<class Other1, class Other2, class Other3> - triple(const triple<Other1, Other2, Other3>& _Right) - :first(_Right.first),second(_Right.second),third(_Right.third){} -}; - -template<class Type1, class Type2, class Type3> - triple<Type1, Type2, Type3> make_triple( - Type1 _Val1, - Type2 _Val2, - Type3 _Val3 - ) - { return triple<Type1,Type2,Type3>(_Val1,_Val2,_Val3); } - -/// templates which allow STL iterations using a class and it's method -/// (as opposed to mem_fun which requires the container class to hold the -/// class and it's method -/// -/// ie -/// -/// vector<CLASSA> a -/// B b; -/// for_each(a.begin(),a.end(),class_method_ref(b,B::foo)) -/// -/// this will invoke b.foo(a) for each element. - -template<typename Result,typename T,typename P> -class class_method_functor: public std::unary_function<P,Result> -{ - typedef Result (T::*methodType)(P s); - T *m_class; - methodType m_method; -public: - class_method_functor(T *c,methodType m):m_class(c),m_method(m){} - Result operator()(P s) { return (m_class->*m_method)(s); } -}; - -template<typename Result,typename T,typename P> -class class_method_functor_const: public std::unary_function<P,Result> -{ - typedef Result (T::*methodType)(P s) const; - const T *m_class; - methodType m_method; -public: - class_method_functor_const(const T *c,methodType m):m_class(c),m_method(m){} - Result operator()(P s) const { return (m_class->*m_method)(s); } -}; - -template<typename Result,typename T,typename P> -class class_method_ref_functor: public std::unary_function<P,Result> -{ - typedef Result (T::*methodType)(P s); - T &m_class; - methodType m_method; -public: - class_method_ref_functor(T &c,methodType m):m_class(c),m_method(m){} - Result operator()(P s) { return (m_class.*m_method)(s); } -}; - -template<typename Result,typename T,typename P> -class class_method_ref_functor_const: public std::unary_function<P,Result> -{ - typedef Result (T::*methodType)(P s) const; - const T &m_class; - methodType m_method; -public: - class_method_ref_functor_const(const T &c,methodType m):m_class(c),m_method(m){} - Result operator()(P s) const { return (m_class.*m_method)(s); } -}; - -template<typename Result,typename T,typename P,typename PP> -class class_method_functor1: public std::binary_function<P,PP,Result> -{ - typedef Result (T::*methodType)(P s,PP ss); - T *m_class; - methodType m_method; -public: - class_method_functor1(T *c,methodType m):m_class(c),m_method(m){} - Result operator()(P s,PP ss) { return (m_class->*m_method)(s,ss); } -}; - -template<typename Result,typename T,typename P,typename PP> -class class_method_functor1_const: public std::binary_function<P,PP,Result> -{ - typedef Result (T::*methodType)(P s,PP ss) const; - const T *m_class; - methodType m_method; -public: - class_method_functor1_const(const T *c,methodType m):m_class(c),m_method(m){} - Result operator()(P s,PP ss) const { return (m_class->*m_method)(s,ss); } -}; - -template<typename Result,typename T,typename P,typename PP> -class class_method_ref_functor1: public std::binary_function<P,PP,Result> -{ - typedef Result (T::*methodType)(P s,PP ss); - T &m_class; - methodType m_method; -public: - class_method_ref_functor1(T &c,methodType m):m_class(c),m_method(m){} - Result operator()(P s,PP ss) { return (m_class.*m_method)(s,ss); } -}; - -template<typename Result,typename T,typename P,typename PP> -class class_method_ref_functor1_const: public std::binary_function<P,PP,Result> -{ - typedef Result (T::*methodType)(P s,PP ss) const; - const T &m_class; - methodType m_method; -public: - class_method_ref_functor1_const(const T &c,methodType m):m_class(c),m_method(m){} - Result operator()(P s,PP ss) const { return (m_class.*m_method)(s,ss); } -}; - -template<typename Result,typename T,typename P> - class_method_functor<Result,T,P> - class_method(T *c,Result (T::*m)(P s)) - { return class_method_functor<Result,T,P>(c,m); } - -template<typename Result,typename T,typename P> - class_method_functor_const<Result,T,P> - class_method(const T *c,Result (T::*m)(P s) const) - { return class_method_functor_const<Result,T,P>(c,m); } - -template<typename Result,typename T,typename P> - class_method_ref_functor<Result,T,P> - class_method_ref(T &c,Result (T::*m)(P s)) - { return class_method_ref_functor<Result,T,P>(c,m); } - -template<typename Result,typename T,typename P> - class_method_ref_functor_const<Result,T,P> - class_method_ref(const T &c,Result (T::*m)(P s) const) - { return class_method_ref_functor_const<Result,T,P>(c,m); } - -template<typename Result,typename T,typename P,typename PP> - class_method_functor1<Result,T,P,PP> - class_method(T *c,Result (T::*m)(P s,PP ss)) - { return class_method_functor1<Result,T,P,PP>(c,m); } - -template<typename Result,typename T,typename P,typename PP> - class_method_functor1_const<Result,T,P,PP> - class_method(const T *c,Result (T::*m)(P s,PP ss) const) - { return class_method_functor1_const<Result,T,P,PP>(c,m); } - -template<typename Result,typename T,typename P,typename PP> - class_method_ref_functor1<Result,T,P,PP> - class_method_ref(T &c,Result (T::*m)(P s,PP ss)) - { return class_method_ref_functor1<Result,T,P,PP>(c,m); } - -template<typename Result,typename T,typename P,typename PP> - class_method_ref_functor1_const<Result,T,P,PP> - class_method_ref(const T &c,Result (T::*m)(P s,PP ss) const) - { return class_method_ref_functor1_const<Result,T,P,PP>(c,m); } - -/////////////////////////////////////////////////////////// -/* - Allows search matches on members - - class foo - { - string m_memberToMatchOn; - }; - - vector<foo> myList; - find_if(myList.begin(),m_myList.end(), - member_match(string("hello"),&foo::m_memberToMatchOn)); - -*/ -//////////////////////////////////////////////////////////// -template<typename T,typename OBJ> -class member_match_functor -{ -private: - T m_value; - T (OBJ::*m_member); -public: - member_match_functor(const T &s,T OBJ::*m):m_value(s),m_member(m){} - bool operator()(const OBJ &obj) throw() - { - return m_value == (obj.*m_member); - } -}; - -template<typename T,typename OBJ> - member_match_functor<T,OBJ> member_match(const T &s,T OBJ::* m) - { return member_match_functor<T,OBJ>(s,m); } - -template<typename T1,typename T2,typename OBJ> -class member2_match_functor -{ -private: - T1 m_value1; - T1 (OBJ::*m_member1); - T2 m_value2; - T2 (OBJ::*m_member2); -public: - member2_match_functor(const T1 &s1,T1 OBJ::*m1,const T2 &s2,T2 OBJ::*m2):m_value1(s1),m_member1(m1),m_value2(s2),m_member2(m2){} - bool operator()(const OBJ &obj) throw() - { return ((m_value1 == (obj.*m_member1)) && (m_value2 == (obj.*m_member2))); } -}; - -template<typename T1,typename T2,typename OBJ> - member2_match_functor<T1,T2,OBJ> member2_match(const T1 &s1,T1 OBJ::* m1,const T2 &s2,T2 OBJ::* m2) - { return member2_match_functor<T1,T2,OBJ>(s1,m1,s2,m2); } - -//*********************************************************** -//* accumulate with a delimiter -//* -//*********************************************************** -template<class _InIt,class _Ty,class _Tdel> inline _Ty accumulate_with_delimiter(_InIt _First, _InIt _Last, _Ty _Val, _Tdel _del) -{ // return sum of _Val and all in [_First, _Last) - if (_First != _Last) - { - _Val = _Val + *_First; - ++_First; - } - - for (; _First != _Last; ++_First) - { - _Val = _Val + _del + *_First; - } - return (_Val); -} - -// with binop. Not sure if this one makes much sense -template<class _InIt,class _Ty,class _Fn2,class _Tdel> inline _Ty accumulate_with_delimiter(_InIt _First, _InIt _Last, _Ty _Val, _Tdel _del,_Fn2 _Func) -{ // return sum of _Val and all in [_First, _Last), using _Func - if (_First != _Last) - { - _Val = _Func(_Val, *_First); - ++_First; - } - - for (; _First != _Last; ++_First) - { - _Val = _Val + _del; - _Val = _Func(_Val, *_First); - } - return (_Val); -} - -//********************************************************** -//* streamOutFunctor -//* -//* functor class which will output an element to a stream -//* with a prefix and suffix string. Useful for outputing -//* elements of a container -//********************************************************* -template<class T> class streamOutFunctor -{ - std::ostream &m_o; - const std::string m_prefix; - const std::string m_suffix; -public: - inline streamOutFunctor(std::ostream &o) : m_o(o){} - inline streamOutFunctor(std::ostream &o,const std::string &prefix,const std::string &suffix) - : m_o(o),m_prefix(prefix),m_suffix(suffix){} - inline void operator()(const T &t) { m_o << m_prefix << t << m_suffix; } -}; - -//// for use on maps. Sort of the opposite of lower_bound. Returns the largest element -//// less than the key -template<typename Map> typename Map::const_iterator -greatest_less(Map const& m, typename Map::key_type const& k) { - typename Map::const_iterator it = m.lower_bound(k); - if(it != m.begin()) { - return --it; - } - return m.end(); -} - -template<typename Map> typename Map::iterator -greatest_less(Map & m, typename Map::key_type const& k) { - typename Map::iterator it = m.lower_bound(k); - if(it != m.begin()) { - return --it; - } - return m.end(); -} - -template<typename Map> typename Map::const_iterator -greatest_less_or_equal(Map const& m, typename Map::key_type const& k) { - typename Map::const_iterator it = m.lower_bound(k); - if ((it != m.end()) && ((*it).first == k)) - return it; - if(it != m.begin()) { - return --it; - } - return m.end(); -} - -template<typename Map> typename Map::iterator -greatest_less_or_equal(Map & m, typename Map::key_type const& k) { - typename Map::iterator it = m.lower_bound(k); - if ((it != m.end()) && ((*it).first == k)) - return it; - if(it != m.begin()) { - return --it; - } - return m.end(); -} - -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stringUtils.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stringUtils.h deleted file mode 100644 index 647fc242..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/stl/stringUtils.h +++ /dev/null @@ -1,383 +0,0 @@ -#pragma once -#ifndef _stringUtils_H_ -#define _stringUtils_H_ - -#include <sstream> -#include <string> -#include <functional> -#include <vector> -#include <locale> -#include <ctype.h> - -namespace stringUtil -{ - #ifdef _WIN32 - inline std::string eol() throw() { return "\r\n"; } - #elif MACINTOSH - inline std::string eol() throw() { return "\r"; } - #else - inline std::string eol() throw() { return "\n"; } - #endif - - ////////////////////////////////////////////////////////////////// - //////////////////// String Conversion /////////////////////////// - ////////////////////////////////////////////////////////////////// - - // the 'safe' functions are to avoid bad_cast exceptions when the - // passed in type does not have a facet, or the facet indicates that - // the value is out of range. Since I may be running this against Unicode - // strings, I need to deal with this. Most likely there's a way to set the - // proper locale and facet so the error doesn't occur, but this is beyond - // me right now - NMR - template<typename T> - bool safe_is_alpha(T v) - { - if (((unsigned int)v) > 0x7f) return false; - return std::isalpha((char)v,std::locale()); - } - - template<typename T> - bool safe_is_digit(T v) - { - if (((unsigned int)v) > 0x7f) return false; - return std::isdigit((char)v,std::locale()); - } - - template<typename T> - bool safe_is_space(T v) - { - if (((unsigned int)v) > 0x7f) return false; - return std::isspace((char)v,std::locale()); - } - - template<typename T> - T safe_to_lower(T v) - { - if (((unsigned int)v) > 0x7f) return v; - return std::tolower((char)v,std::locale()); - } - - template<typename T> - T safe_to_upper(T v) - { - if (((unsigned int)v) > 0x7f) return v; - return std::toupper((char)v,std::locale()); - } - - template<typename S> - S toLower(const S &s) throw() - { - S result; - for (typename S::const_iterator i = s.begin(); i != s.end(); ++i) - { - result += (stringUtil::safe_is_alpha(*i) ? stringUtil::safe_to_lower(*i) : *i); - } - - return result; - } - - template<typename S> - S toUpper(const S &s) throw() - { - S result; - for (typename S::const_iterator i = s.begin(); i != s.end(); ++i) - { - result += (stringUtil::safe_is_alpha(*i) ? stringUtil::safe_to_upper(*i) : *i); - } - - return result; - } - - template<typename S> - inline bool compareStringsWithoutCase(const S &s1,const S &s2) throw() - { - S s1c(toLower(s1)); - S s2c(toLower(s2)); - return (s1c == s2c); - } - - inline std::string dosToUnix(const std::string &s) throw() - { - std::string result; - bool r(false); - for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) - { - if ((*i) == '\n') - { - if (r) - { - result += '\n'; - } - else - { - result.push_back(*i); - } - r = false; - } - else if ((*i) == '\r') - { - if (r) - result.push_back('\r'); - r = true; - } - else - { - if (r) - result.push_back('\r'); - r = false; - result.push_back(*i); - } - } - return result; - } - - inline std::string unixToDos(const std::string &s) throw() - { - std::string result; - for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) - { - if ((*i) == '\n') - result += "\r\n"; - else - result.push_back(*i); - } - return result; - } - - //*************************************************************** - //* tos, tows - //* - //* These templates and overloaded functions allow you to convert - //* any streamable value to a string or wide-string. It can be a - //* great convenience to be able to do - //* - //* string("test five ") + tos(5); - //* - //* instead of - //* - //* ostringstream o; - //* o << "test five " << 5; - //* o.str() - //* - //* tows is just like tos, but for wide strings. You can also use these - //* to convert standard strings to wide strings and vice-versa - //* - //* for example: - //* - //* wstring ws = tows(string("hello")); - //* string s = tos(wstring(L"goodbye")); - //* - //************************************************************************ - - template<typename S,typename T> - S tobs(T v) // to basic string - { - std::basic_ostringstream<typename S::value_type> o; - o << v; - return o.str(); - } - - template<typename S> - S tobs(const S v) { return v; } - template<typename S> - S tobs(const typename S::value_type *v) { return S(v); } - - template<typename t> - std::string tos(t v) - { - std::ostringstream o; - o << v; - return o.str(); - } - - inline std::string tos(const std::string &v) { return v; } - inline std::string tos(const char *v) { return std::string(v); } - - template<typename t> - std::string tohex(t v) - { - std::ostringstream o; - o << std::hex << v; - return o.str(); - } - - #ifdef _WIN32 - template<typename t> - std::wstring tows(t v) - { - std::wostringstream o; - o << v; - return o.str(); - } - - inline std::string tos(const wchar_t *value) - { - if (!value) return ""; - - size_t len = ::wcslen(value); - - char *s = new char[len + 1]; - ::wcstombs(s,value,len); - s[len] = '\0'; - std::string result(s); - delete [] s; - - return result; - } - - inline std::string tos(const std::wstring &s) - { - return tos(s.c_str()); - } - - inline std::wstring tows(const char *value) - { - if (!value) return L""; - - size_t len = ::strlen(value); - - wchar_t *s = new wchar_t[len + 1]; - ::mbstowcs(s,value,len); - s[len] = 0; - std::wstring result(s); - delete [] s; - - return result; - } - - inline std::wstring tows(const std::string &value) - { - return tows(value.c_str()); - } - #endif - - //////////////////////////////////////////////////////////////////// - ////////////////////// String stripping //////////////////////////// - //////////////////////////////////////////////////////////////////// - - //****************************************************************** - //* A collection of templates and functions to allow stripping of - //* leading and trailing items from a string - //* - //* --- stripItem - //* - //* Strip leading and trailing items from a container - //* template parameters are the container type, and a function which returns - //* true if we have the value to strip - //* - //* - //* ---- stripChar - //* strips characters off a string by either a function (which returns - //* true if the character is found), or by an actual character mathc. - //* There are also forms for wide strings - //* - //* ---- stripWhitespace - //* removes leading and trailing spaces from a string using isspace() - //************************************************************************* - template <typename S,typename F> - S stripItem(const S &s,F func,bool stripLeading = true, bool stripTrailing = true) - { - typename S::const_iterator leftit = s.begin(); - typename S::const_reverse_iterator rightit = s.rbegin(); - - if (s.length() < 1 ) - return s; - - if (stripLeading) - { - while (leftit != s.end() && func(*leftit)) - { - ++leftit; - } - } - if (leftit == s.end()) return S(); - - if (stripTrailing) - { - while (rightit != s.rend() && func(*rightit)) - { - ++rightit; - } - } - if (rightit == s.rend()) return S(); - - typename S::const_iterator endpnt = (++rightit).base(); - - if (leftit > endpnt) - return S(); - - return s.substr( (leftit - s.begin()) ,(endpnt-leftit) +1); - } - - template<typename S,typename FUNC> - S stripChar(const S &s,FUNC f,bool stripLeading = true,bool stripTrailing = true) - { return stripItem(s,f,stripLeading,stripTrailing); } - - template<typename S> - inline S stripChar(const S &s,typename S::value_type c,bool stripLeading = true,bool stripTrailing = true) - { return stripItem(s,bind1st(std::equal_to<typename S::value_type>(),c),stripLeading,stripTrailing); } - - template<typename S> - bool myspace(S c) { return safe_is_space(c); } - template<typename S> - inline S stripWhitespace(const S &s) { return stripChar(s,stringUtil::myspace<typename S::value_type>); } - - template<typename S> - bool myalphadigit(S c) { return !(safe_is_alpha(c) || safe_is_digit(c)); } - template<typename S> - inline S stripAlphaDigit(const S &s) { return stripChar(s,stringUtil::myalphadigit<typename S::value_type>); } - - //***************************************************************** - //* tokenizer - //* - //* break up a string into substrings based on a delimiter item. - //****************************************************************** - template<typename S,typename F> - std::vector<S> tokenizer_if(const S &ins,F isdelimiter) throw() - { - std::vector<S> result; - S accum; - - for (typename S::const_iterator i = ins.begin(); i != ins.end(); ++i) - { - if (!isdelimiter(*i)) - { - accum.push_back(*i);// was += - } - else - { - if (!accum.empty()) - { - result.push_back(accum); - accum = S(); - } - } - } - - if (!accum.empty()) - { - result.push_back(accum); - } - return result; - } - - template<typename S> - inline std::vector<S> tokenizer(const S &ins,typename S::value_type delim) throw() - { return tokenizer_if(ins,bind1st(std::equal_to<typename S::value_type>(),delim)); } - - inline std::string escapeBackslashes(const std::string &s) throw() - { - std::string result; - for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) - { - result += (*i); - if ((*i) == '\\') - result += (*i); - } - return result; - } - - ////////////////////////////////////////////////////////////////////////// -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/MT_stl.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/MT_stl.h deleted file mode 100644 index 7b4de1bf..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/MT_stl.h +++ /dev/null @@ -1,110 +0,0 @@ -#pragma once -#ifndef MT_stl_H_ -#define MT_stl_H_ - -#include <queue> -#include "thread.h" - -/***** STL like containers that have Multithread features *******/ - -template <class T> -class MT_queue -{ - std::queue<T> m_container; - mutable AOL_namespace::mutex m_mutex; - conditionVariable m_conditionVariable; - -public: - typedef T value_type; - typedef T message_t; - typedef typename std::queue<T>::size_type size_type; - - MT_queue(){} - - size_type size() const - { - stackLock sl(m_mutex); - return m_container.size(); - } - - bool empty() const - { - stackLock sl(m_mutex); - return m_container.empty(); - } - - // note, it is important that this is T and not T&. If it was - // T& and we did something like this - // - // T &f = mtq.front(); - // - // Then f would be able to manipulate a queue entry outside the - // protection of the lock. We avoid this by returning T (a copy) - // instead. - T front() const - { - stackLock sl(m_mutex); - return m_container.front(); - } - - void has_front(T &t,bool &has) const - { - stackLock sl(m_mutex); - has = false; - if (!m_container.empty()) - { - has = true; - t = m_container.front(); - } - } - - void push(const T &t) // push_back - { - stackLock sl(m_mutex); - m_container.push(t); - m_conditionVariable.signal(); - } - - void pop() // pop_front - { - stackLock sl(m_mutex); - if (!m_container.empty()) - { - m_container.pop(); - } - } - - std::queue<T> getAll() - { - stackLock sl(m_mutex); - - std::queue<T> result = m_container; - m_container.clear(); - return result; - } - - void clear() - { - stackLock sl(m_mutex); - m_container.clear(); - } - - // blocking retrieval. Will block until something is in the - // queue to get - T get() - { - stackLock sl(m_mutex); - - while (m_container.empty()) - { - m_conditionVariable.wait(m_mutex); - } - - T t = m_container.front(); - m_container.pop(); - - return t; - } -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/messageThread.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/messageThread.h deleted file mode 100644 index 8b47bf09..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/messageThread.h +++ /dev/null @@ -1,184 +0,0 @@ -#ifndef messageThread_H_ -#define messageThread_H_ - -#include "thread.h" -#include "MT_stl.h" -#include <deque> -#ifdef _WIN32 -#include <crtdbg.h> -#else -#include <assert.h> -#endif - -#ifndef _WIN32 -#define _ASSERTE assert -#endif - -///////////////////////////////////////////////////////////////// -//* templates that allow you to build a message driven thread -//* -//* -//* define a class that is your handler. It must have a type -//* message_t which is the message type, and a method -//* bool operator()(const message_t &m) which is the message handler. -//* this method should return false when all processing is done and -//* the thread should shutdown -//* -/* example - -class mh -{ - string m_string; - -public: - struct message - { - int m_v; - message(int v):m_v(v){} - }; - typedef message message_t; - -protected: - - bool operator()(const message_t &mm) - { - if (!mm.m_v) return false; // if value is zero, then we are done - ::MessageBox(0,tos(mm.m_v).c_str(),m_string.c_str(),MB_OK); - return true; - } - - mh(const string &s):m_string(s){} -}; - -main() -{ -messageThread<mh> m("this is a test"); -m.start(); -m.postMessage(m::message(1)); -m.postMessage(m::message(2)); -m.postMessage(m::message(3)); -m.postMessage(m::message(4)); -m.postMessage(m::message(0)); -m.join(); -} - -*/ - -template<class Handler,class Queue> -class messageHandler: public Handler -{ -private: - Queue m_queue; - -protected: - unsigned operator()() throw() - { - unsigned result = (unsigned)-1; - try - { - while (true) - { - typename Queue::value_type m = m_queue.get(); - if (!Handler::operator()(m)) - break; - } - result = 0; - } - catch(...){} - - return result; - } -public: - inline void postMessage(const typename Queue::message_t &m) - { - m_queue.push(m); - } - - inline typename Queue::size_type pendingMessages() const throw() { return m_queue.size(); } - inline void clearMessageQueue() throw() { m_queue.clear(); } - - messageHandler(){} - template <class P1> messageHandler(const P1 &p1):Handler(p1){} - template <class P1,class P2> messageHandler(const P1 &p1,const P2 &p2):Handler(p1,p2){} - template <class P1,class P2,class P3> messageHandler(const P1 &p1,const P2 &p2,const P3 &p3):Handler(p1,p2,p3){} - template <class P1,class P2,class P3,class P4> messageHandler(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4):Handler(p1,p2,p3,p4){} - template <class P1,class P2,class P3,class P4,class P5> messageHandler(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5):Handler(p1,p2,p3,p4,p5){} - template <class P1,class P2,class P3,class P4,class P5,class P6> messageHandler(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6):Handler(p1,p2,p3,p4,p5,p6){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7> messageHandler(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6,const P7 &p7):Handler(p1,p2,p3,p4,p5,p6,p7){} - template <class P1> messageHandler(P1 &p1):Handler(p1){} -}; - -template<class Handler,class Message = typename Handler::message_t> -class messageThread: public Tthread<messageHandler<Handler,MT_queue<Message> > > -{ -public: - messageThread(){} - template <class P1> messageThread(const P1 &p1):Tthread<messageHandler<Handler,MT_queue<Message> > >(p1){} - template <class P1,class P2> messageThread(const P1 &p1,const P2 &p2):Tthread<messageHandler<Handler,MT_queue<Message> > >(p1,p2){} - template <class P1,class P2,class P3> messageThread(const P1 &p1,const P2 &p2,const P3 &p3):Tthread<messageHandler<Handler,MT_queue<Message> > >(p1,p2,p3){} - template <class P1,class P2,class P3,class P4> messageThread(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4):Tthread<messageHandler<Handler,MT_queue<Message> > >(p1,p2,p3,p4){} - template <class P1,class P2,class P3,class P4,class P5> messageThread(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5):Tthread<messageHandler<Handler,MT_queue<Message> > >(p1,p2,p3,p4,p5){} - template <class P1,class P2,class P3,class P4,class P5,class P6> messageThread(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6):Tthread<messageHandler<Handler,MT_queue<Message> > >(p1,p2,p3,p4,p5,p6){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7> messageThread(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6,const P7 &p7):Tthread<messageHandler<Handler,MT_queue<Message> > >(p1,p2,p3,p4,p5,p6,p7){} - template <class P1> messageThread(P1 &p1):Tthread<messageHandler<Handler,MT_queue<Message> > >(p1){} -}; - -//////////////// Finite state machine -template <class Handler,typename RETVAL = bool> -class fsm: public Handler { - -public: - typedef RETVAL (Handler::*state)(const typename Handler::message_t &m);// throw(); // should not throw an exception - - // this is broken in VC 7, so trans must be made public - //friend class Handler; -public: - RETVAL operator()(const typename Handler::message_t &m) throw() { _ASSERTE(m_State);return (this->*m_State)(m); } - - void trans(state target) throw() - { - if (target == m_State) return; - _ASSERTE(m_State); -#ifndef NDEBUG - state tmp = m_State; -#endif - (this->*m_State)(Handler::message_t::exitStateMessage()); -#ifndef NDEBUG - // sanity check - don't change states in exit_sig - _ASSERTE(tmp == m_State); -#endif - m_State = target; - (this->*m_State)(Handler::message_t::enterStateMessage()); - _ASSERTE(m_State == target); // don't change states in enter_sig - } -public: - - fsm():m_State(&fsm<Handler,RETVAL>::initialState){} - template <class P1> fsm(const P1 &p1): - Handler(p1),m_State(&fsm<Handler,RETVAL>::initialState){} - template <class P1> fsm(P1 &p1): - Handler(p1),m_State(&fsm<Handler,RETVAL>::initialState){} - - template <class P1,class P2> fsm(const P1 &p1,const P2 &p2): - Handler(p1,p2),m_State(&fsm<Handler,RETVAL>::initialState){} - template <class P1,class P2> fsm(const P1 &p1,P2 &p2): - Handler(p1,p2),m_State(&fsm<Handler,RETVAL>::initialState){} - template <class P1,class P2> fsm(P1 &p1,P2 &p2): - Handler(p1,p2),m_State(&fsm<Handler,RETVAL>::initialState){} - - template <class P1,class P2,class P3> fsm(const P1 &p1,const P2 &p2,const P3 &p3): - Handler(p1,p2,p3),m_State(&fsm<Handler,RETVAL>::initialState){} - template <class P1,class P2,class P3,class P4> fsm(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4): - Handler(p1,p2,p3,p4),m_State(&fsm<Handler,RETVAL>::initialState){} - template <class P1,class P2,class P3,class P4,class P5> fsm(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5): - Handler(p1,p2,p3,p4,p5),m_State(&fsm<Handler,RETVAL>::initialState){} - template <class P1,class P2,class P3,class P4,class P5,class P6> fsm(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6): - Handler(p1,p2,p3,p4,p5,p6),m_State(&fsm<Handler,RETVAL>::initialState){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7> fsm(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5,const P6 &p6,const P7 &p7): - Handler(p1,p2,p3,p4,p5,p6,p7),m_State(&fsm<Handler,RETVAL>::initialState){} - -private: - state m_State; -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.cpp deleted file mode 100644 index 3100453a..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.cpp +++ /dev/null @@ -1,375 +0,0 @@ -#include "threading/thread.h" -#ifndef _WIN32 -#include <unistd.h> -#include "global.h" -#else -#include <pthread.h> -#endif - -using namespace std; - -// thread safe sleep function -// which is clamped to 10 ms. -void safe_sleep(int sec, int usec) -{ -#ifdef _WIN32 - int ms = (usec / 1000); - ms += (sec * 1000); - if (ms < 10) ms = 10; - ::Sleep(ms); -#else - struct timeval mytime; - if (!sec && (usec < 10000)) usec = 10000; - mytime.tv_sec = sec; - mytime.tv_usec = usec; - select(0, NULL, NULL, NULL, &mytime); -#endif -} - -#ifndef _WIN32 -#include <errno.h> -#include <vector> -#endif - -using namespace AOL_namespace; - -rwLock::rwLock() -{ -#ifdef PTHREAD_RWLOCK_PREFER_WRITER_NP - pthread_rwlockattr_t attr; - ::pthread_rwlockattr_init (&attr); - ::pthread_rwlockattr_setkind_np (&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP); - int r = ::pthread_rwlock_init (&m_lock, &attr); - ::pthread_rwlockattr_destroy (&attr); -#else - int r = ::pthread_rwlock_init (&m_lock, NULL); -#endif - if (r) - throw runtime_error("Could not create rwlock"); -} - -rwLock::~rwLock() -{ - ::pthread_rwlock_destroy (&m_lock); -} - -void rwLock::lock() -{ - ::pthread_rwlock_wrlock (&m_lock); -} - -void rwLock::rdLock() -{ - ::pthread_rwlock_rdlock (&m_lock); -} - -bool rwLock::tryRdLock() -{ - int n = ::pthread_rwlock_tryrdlock (&m_lock); - if (n == 0) - return true; - if (n != EBUSY) - throw runtime_error("Error with trying rwlock, " + n); - return false; -} - -void rwLock::unlock() -{ - ::pthread_rwlock_unlock (&m_lock); -} - - -mutex::mutex() throw(runtime_error) -{ - if (::pthread_mutex_init(&m_mutex, NULL)) - { - throw runtime_error("Could not create mutex"); - } -} - -mutex::~mutex() throw() -{ - ::pthread_mutex_destroy(&m_mutex); -#ifdef _WIN32 - m_mutex = NULL; -#endif -} - -void mutex::lock() throw(runtime_error) -{ - if (::pthread_mutex_lock(&m_mutex)) - { - throw runtime_error("Could not lock mutex"); - } -} - -bool mutex::timedLock(int milliseconds) throw(runtime_error) -{ - if (milliseconds == INFINITE) - { - lock(); - return true; - } - - if (milliseconds == 0) - { - int err = ::pthread_mutex_trylock(&m_mutex); - if (err == EBUSY) - { - return false; - } - if (err) - { - throw runtime_error("Could not trylock mutex"); - } - return true; - } - - int tenth_second_sleep_intervals = (milliseconds / 100); - for (int x = 0; x < tenth_second_sleep_intervals; ++x) - { - int err = ::pthread_mutex_trylock(&m_mutex); - if (!err) - { - return true; - } - safe_sleep(0, 100000); - if (err == EBUSY) - { - continue; - } - throw runtime_error("Could not trylock mutex"); - } - return false; -} - -void mutex::unlock() throw(runtime_error) -{ - if (::pthread_mutex_unlock(&m_mutex)) - { - throw runtime_error("Could not unlock mutex"); - } -} - -conditionVariable::conditionVariable() throw(runtime_error) -{ - if (::pthread_cond_init(&m_conditionVariable,NULL)) - { - throw runtime_error("Could not create conditionVariable"); - } -} - -conditionVariable::~conditionVariable() throw() -{ - ::pthread_cond_destroy(&m_conditionVariable); -} - -void conditionVariable::wait(mutex &m) throw(runtime_error) -{ - if (::pthread_cond_wait(&m_conditionVariable,&m.m_mutex)) - { - throw runtime_error("Could not wait on condition variable"); - } -} - -bool conditionVariable::timedWait(AOL_namespace::mutex &m,int milliseconds) throw(runtime_error) -{ - struct timespec ts; - ts.tv_sec = ::time(NULL) + (milliseconds / 1000); - ts.tv_nsec = (milliseconds - ((milliseconds / 1000) * 1000)) * 1000000; - int err = ::pthread_cond_timedwait(&m_conditionVariable,&m.m_mutex,&ts); - if (!err) - { - return true; - } - if (err == ETIMEDOUT) - { - return false; - } - throw runtime_error("timedWait error"); -} - -void conditionVariable::signal() throw(runtime_error) -{ - if (::pthread_cond_signal(&m_conditionVariable)) - { - throw runtime_error("Could not signal condition variable"); - } -} - -void conditionVariable::broadcast() throw(runtime_error) -{ - if (::pthread_cond_broadcast(&m_conditionVariable)) - { - throw runtime_error("Could not broadcast on condition variable"); - } -} - -#ifdef _WIN32 -event::event(BOOL bManualReset) throw(runtime_error) : m_event(NULL) -{ - m_event = ::CreateEvent(NULL,bManualReset,FALSE,NULL); - if (!m_event) - { - throw runtime_error("Could not create event object"); - } -} - -event::~event() throw() -{ - forgetHandleNULL(m_event); -} - -void event::wait() throw(std::runtime_error) -{ - if (::WaitForSingleObject(m_event,INFINITE) != WAIT_OBJECT_0) - { - throw runtime_error("event::wait() - wait error"); - } -} - -void event::setEvent() throw(std::runtime_error) -{ - if (!::SetEvent(m_event)) - { - throw runtime_error("event::setEvent() - set error"); - } -} - -void event::resetEvent() throw(std::runtime_error) -{ - if (!::ResetEvent(m_event)) - { - throw runtime_error("event::resetEvent() - reset error"); - } -} -#else -event::event(bool manualReset) throw(runtime_error) - : m_manualReset(manualReset), m_signaled(false) -{ -} - -void event::wait() throw(runtime_error) -{ - stackLock sl(m_mutex); - while (!m_signaled) - { - m_conditionVariable.wait(m_mutex); - } - if (!m_manualReset) - { - m_signaled = false; - } -} - -bool event::timedWait(int milliseconds) throw(runtime_error) -{ - if (milliseconds == INFINITE) - { - wait(); - return true; - } - - if (milliseconds == 0) - { - stackLock sl(m_mutex); - bool result = m_signaled; - if (m_signaled && !m_manualReset) - { - m_signaled = false; - } - return result; - } - - stackLock sl(m_mutex); - while(!m_signaled) - { - if (!m_conditionVariable.timedWait(m_mutex,milliseconds)) - { - return false; - } - } - - if (!m_manualReset) - { - m_signaled = false; - } - return true; -} - -void event::setEvent() throw(runtime_error) -{ - stackLock sl(m_mutex); - m_signaled = true; - m_conditionVariable.broadcast(); -} - -void event::resetEvent() throw(runtime_error) -{ - stackLock sl(m_mutex); - m_signaled = false; -} - -int WaitForSingleObject(Win32SyncObject &o, int milli_timeout) throw() -{ - int result = WAIT_ABANDONED; - - try - { - result = (o.syncObjectTimedWait(milli_timeout) ? WAIT_OBJECT_0 : WAIT_TIMEOUT); - } - catch(...) {} - - return result; -} - -int WaitForMultipleObjects(int count, Win32SyncObjectPtr *objs, bool waitall, int milliseconds) throw() -{ - __uint64 start = time_now_ms(); - - try - { - std::vector<bool> signaled(count,false); - int sig_count = 0/*, ms = (milliseconds % 1000)*/, - quantum = 100;/*(ms > 100 ? (ms / 10) : 100);*/ - - // as milliseconds is only set as '1000' in main.cpp - // then we don't need to do the checking and can just - // hard-code the quantum value to give 100ms interval - - for (int x = 0; (x <= milliseconds) || (milliseconds == INFINITE); x += quantum) - { - for (int oo = 0; oo < count; ++oo) - { - if (!signaled[oo]) - { - if (objs[oo]->syncObjectTimedWait(0)) - { - signaled[oo] = true; - ++sig_count; - if (!waitall) - { - return WAIT_OBJECT_0 + oo; - } - if (sig_count == count) - { - return WAIT_OBJECT_0; - } - } - } - } //for - - safe_sleep(0, quantum * 1000); - - __uint64 now = time_now_ms(); - if ((int)(now - start) >= milliseconds) - { - break; - } - } // for - return WAIT_TIMEOUT; - } //try - catch(...) {} - return WAIT_ABANDONED; -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.h deleted file mode 100644 index 05fd8033..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/threading/thread.h +++ /dev/null @@ -1,575 +0,0 @@ -#pragma once -#ifndef _THREAD_H_ -#define _THREAD_H_ - -#ifdef _WIN32 -#include <windows.h> -#include <process.h> -#include <pthread.h> -#else -#include <pthread.h> -#include <assert.h> -#include <signal.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/errno.h> -#endif -#include <stdexcept> -#include "macros.h" - -/////////////////////////////////////////////////////////////////////////////// -/// Various thread classes for applications that need to do threading and -/// aren't going to be including various Microsoft class libraries -////////////////////////////////////////////////////////////////////////////// - - -//******************************************************************** -//* Tthread and thread -//* -//* allows you to run code on a thread via a template. Create a class -//* which has a method const unsigned operator()() and use it to instantiate -//* the template. If you want to use a bare function, encapsulate it in the -//* class pointer_to_thread_function. The Vthread class uses the traditional -//* virtual function approach -/* - Example: - - class foo - { - const unsigned operator()() - { - for (int x = 0; x < 4: ++x) - { - cout << x << endl; - } - return 1; - } - }; - - unsigned bar() - { - for (int x = 0; x < 4; ++x) - cout << x << endl; - return 1; - } - - class narf: public Vthread - { - const unsigned operator()() - { - for (int x = 0; x < 4; ++x) - { - cout << x << endl; - } - return 1; - } - }; - - main() - { - Tthread<foo> f; - Tthread<pointer_to_thread_function> b(bar); - narf n; - n.start(); - f.start(); - b.start(); - ::WaitForSingleObject(f,INFINITE); // or f.join(); - ::WaitForSingleObject(b,INFINITE); // or b.join(); - ::WaitForSingleObject(n,INFINITE); // or n.join(); - } - -*/ - -//********************************************************************** - -#ifdef _WIN32 -#ifndef ASSERT -#define ASSERT(x) { if (!(x)) ::MessageBoxW(0,L"Assert failure",L"ASSERT",MB_OK); } -#endif -#else -#ifndef ASSERT -#define ASSERT(x) assert(x) -#endif -#endif - -#ifdef _WIN32 -#define THREAD_FUNC unsigned __stdcall -#else -#define THREAD_FUNC void* -#endif - -#ifdef _WIN32 -class thread_CORE -{ -#pragma warning(push) -#pragma warning(disable: 4127) -#pragma warning(disable: 4100) - nocopy(thread_CORE) -#pragma warning(pop) - -protected: - HANDLE m_threadHandle; - -public: - static int standard_signal_block() throw(){return 0;} // unix only - - thread_CORE() : m_threadHandle(0) {} - - ~thread_CORE() throw() - { - if (m_threadHandle) - { - ::WaitForSingleObject(m_threadHandle, INFINITE); - ::CloseHandle(m_threadHandle); - } - m_threadHandle = 0; - } - - inline void join() - { - if (m_threadHandle) - { - ::WaitForSingleObject(m_threadHandle, INFINITE); - } - } - inline operator HANDLE() const throw() { return m_threadHandle; } - static unsigned long getCurrentThreadID() { return (unsigned long)GetCurrentThreadId(); } -}; - -template<class Handler> -class Tthread: public thread_CORE, public Handler -{ - static inline unsigned __stdcall _start_func(void *arg) - { return reinterpret_cast<Tthread<Handler> *>(arg)->operator()(); } - -public: - Tthread(){} - template <class P1> Tthread( P1 &p1):Handler(p1){} - template <class P1,class P2> Tthread( P1 &p1, P2 &p2):Handler(p1,p2){} - template <class P1,class P2,class P3> Tthread( P1 &p1, P2 &p2, P3 &p3):Handler(p1,p2,p3){} - template <class P1,class P2,class P3,class P4> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4):Handler(p1,p2,p3,p4){} - template <class P1,class P2,class P3,class P4,class P5> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5):Handler(p1,p2,p3,p4,p5){} - template <class P1,class P2,class P3,class P4,class P5,class P6> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5,P6 &p6):Handler(p1,p2,p3,p4,p5,p6){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6,P7 &p7):Handler(p1,p2,p3,p4,p5,p6,p7){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7,P8 &p8):Handler(p1,p2,p3,p4,p5,p6,p7,p8){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8,class P9> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8,class P9,class P10> Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8,class P9,class P10,class P11> Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10,P11 &p11):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8,class P9,class P10,class P11,class P12> Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10,P11 &p11,P12 &p12):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12){} - - void start(int __unused = 1) throw(std::runtime_error) - { - unsigned m_threadIdentifier = 0; - m_threadHandle = (HANDLE)::_beginthreadex(NULL, 0, _start_func, this, 0, &m_threadIdentifier); - if (!m_threadHandle) - { - throw std::runtime_error("Could not start thread"); - } - } -}; - -class SimpleThread -{ -protected: - HANDLE m_threadHandle; - -public: - SimpleThread(unsigned (__stdcall *_start_func) (void *arg) = 0, void *user = 0) : m_threadHandle(0) - { - if (_start_func) - { - start(_start_func, user); - } - } - - ~SimpleThread() throw() - { - if (m_threadHandle) - { - ::CloseHandle(m_threadHandle); - } - m_threadHandle = 0; - } - - void start(unsigned (__stdcall *_start_func) (void *arg), void *user) throw(std::runtime_error) - { - unsigned m_threadIdentifier = 0; - m_threadHandle = (HANDLE)::_beginthreadex(NULL, 0, _start_func, user, 0, &m_threadIdentifier); - if (!m_threadHandle) - { - throw std::runtime_error("Could not start thread"); - } - } -}; - -#else - -class thread_CORE -{ - nocopy(thread_CORE) - -protected: - pthread_t m_threadHandle; - -public: - static int standard_signal_block() throw() - { - sigset_t catchset; - sigemptyset(&catchset); - sigaddset(&catchset,SIGPIPE); - sigaddset(&catchset,SIGTERM); - sigaddset(&catchset,SIGHUP); - sigaddset(&catchset,SIGINT); - sigaddset(&catchset,SIGQUIT); - sigaddset(&catchset,SIGTSTP); // ^Z allow this - sigaddset(&catchset,SIGCHLD); - sigaddset(&catchset,SIGWINCH); - sigaddset(&catchset,SIGUSR1); - sigaddset(&catchset,SIGUSR2); - return pthread_sigmask(SIG_BLOCK,&catchset,NULL); - } - - thread_CORE() : m_threadHandle(0) {} - - ~thread_CORE() throw() - { - if (m_threadHandle) - { - ::pthread_join(m_threadHandle, NULL); - } - m_threadHandle = 0; - } - - inline void join() - { - if (m_threadHandle) - { - ::pthread_join(m_threadHandle,NULL); - m_threadHandle = 0; - } - } - inline operator pthread_t() const throw() { return m_threadHandle; } - static unsigned long getCurrentThreadID() { return (unsigned long)::pthread_self(); } -}; - -template<class Handler> -class Tthread: public thread_CORE, public Handler -{ - static inline void* _start_func(void *arg) - { - standard_signal_block(); - long x = (long)(reinterpret_cast<Tthread<Handler> *>(arg))->operator()(); - return (void*)x; - } - -public: - Tthread(){} - template <class P1> Tthread( P1 &p1):Handler(p1){} - template <class P1,class P2> Tthread( P1 &p1, P2 &p2):Handler(p1,p2){} - template <class P1,class P2,class P3> Tthread( P1 &p1, P2 &p2, P3 &p3):Handler(p1,p2,p3){} - template <class P1,class P2,class P3,class P4> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4):Handler(p1,p2,p3,p4){} - template <class P1,class P2,class P3,class P4,class P5> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5):Handler(p1,p2,p3,p4,p5){} - template <class P1,class P2,class P3,class P4,class P5,class P6> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5,P6 &p6):Handler(p1,p2,p3,p4,p5,p6){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6,P7 &p7):Handler(p1,p2,p3,p4,p5,p6,p7){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7,P8 &p8):Handler(p1,p2,p3,p4,p5,p6,p7,p8){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8,class P9> Tthread( P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8,class P9,class P10> Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8,class P9,class P10,class P11> Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10,P11 &p11):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11){} - template <class P1,class P2,class P3,class P4,class P5,class P6,class P7,class P8,class P9,class P10,class P11,class P12> Tthread(P1 &p1, P2 &p2, P3 &p3, P4 &p4, P5 &p5, P6 &p6, P7 &p7, P8 &p8, P9 &p9, P10 &p10,P11 &p11,P12 &p12):Handler(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12){} - - void start(int joined = 1) throw(std::runtime_error) - { - if (joined && m_threadHandle) - { - throw std::runtime_error("Thread already exists"); - } - int ret = pthread_create(&m_threadHandle, NULL, _start_func, this); - if (ret) - { - throw std::runtime_error("Could not start thread" + std::string(ret == EAGAIN ? " [Increase the open files (ulimit -n) limit]" : "")); - } - } -}; - - -class SimpleThread -{ -public: - SimpleThread(void *(*_start_func) (void *arg) = 0, void *user = 0) - { - if (_start_func) - { - start(_start_func, user); - } - } - - void start(void *(*_start_func) (void *arg), void *user) throw(std::runtime_error) - { - pthread_t m_threadHandle = 0; - pthread_attr_t attr; - int ret = pthread_attr_init(&attr); - if (ret) - { - throw std::runtime_error("Could not start thread - pthread_attr_init failure"); - } - - ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - if (ret) - { - pthread_attr_destroy(&attr); - throw std::runtime_error("Could not start thread - pthread_attr_setdetachstate failure"); - } - - ret = pthread_create(&m_threadHandle,&attr,_start_func,user); - if (ret) - { - pthread_attr_destroy(&attr); - throw std::runtime_error("Could not start thread" + std::string(ret == EAGAIN ? " [Increase the open files (ulimit -n) limit]" : "")); - } - - pthread_attr_destroy(&attr); - } -}; -#endif - -class pointer_to_thread_function -{ -public: - typedef unsigned (*func_t)(); - - inline pointer_to_thread_function(func_t f):m_function(f){} -private: - func_t m_function; -protected: - inline const unsigned operator()() { return (*m_function)(); } -}; - -class vthread_stub -{ - protected: - virtual const unsigned operator()() = 0; - virtual ~vthread_stub(){} -}; - -typedef Tthread<vthread_stub> Vthread; - -#ifdef _WIN32 -class event -{ -#pragma warning(push) -#pragma warning(disable: 4127) -#pragma warning(disable: 4100) - nocopy(event) -#pragma warning(pop) - -private: - HANDLE m_event; - -public: - event(BOOL bManualReset) throw(std::runtime_error); - ~event() throw(); - - inline operator HANDLE() const throw() { return m_event; } - void wait() throw(std::runtime_error); - void setEvent() throw(std::runtime_error); - void resetEvent() throw(std::runtime_error); -}; - -#else - -class Win32SyncObject -{ -public: - virtual void syncObjectWait() throw(std::runtime_error) = 0; - virtual bool syncObjectTimedWait(int milliseconds) throw(std::runtime_error) = 0; - virtual ~Win32SyncObject(){} -}; -typedef Win32SyncObject* Win32SyncObjectPtr; - -/// these provide basic resource mgmt for typical uses -#endif - -class conditionVariable; - -namespace AOL_namespace { -#pragma pack(push, 1) -// conflicts with headers in solaris -#ifndef _WIN32 -class mutex : public Win32SyncObject -#else -class mutex -#endif -{ - nocopy(mutex) - -private: - pthread_mutex_t m_mutex; - -public: - mutex() throw(std::runtime_error); - ~mutex() throw(); - void lock() throw(std::runtime_error); - bool timedLock(int milliseconds) throw(std::runtime_error); - void unlock() throw(std::runtime_error); - void syncObjectWait() throw(std::runtime_error) { lock(); } - bool syncObjectTimedWait(int milliseconds) throw(std::runtime_error) { return timedLock(milliseconds); } -#ifndef _WIN32 - inline operator Win32SyncObject*() throw() { return this; } -#endif - friend class ::conditionVariable; -}; -#pragma pack(pop) - -class rwLock -{ - pthread_rwlock_t m_lock; - -public: - rwLock(); - ~rwLock(); - bool tryRdLock(); - void lock(); - void rdLock(); - void unlock(); -}; - -} - -class conditionVariable -{ - nocopy(conditionVariable) - -private: - pthread_cond_t m_conditionVariable; - -public: - conditionVariable() throw(std::runtime_error); - ~conditionVariable() throw(); - void wait(AOL_namespace::mutex &m) throw(std::runtime_error); - bool timedWait(AOL_namespace::mutex &m,int milliseconds) throw(std::runtime_error); - void signal() throw(std::runtime_error); - void broadcast() throw(std::runtime_error); -}; - -#ifndef _WIN32 -class event : public Win32SyncObject -{ - nocopy(event) - -private: - conditionVariable m_conditionVariable; - AOL_namespace::mutex m_mutex; - bool m_manualReset; - bool m_signaled; - -public: - event(bool bManualReset) throw(std::runtime_error); - void wait() throw(std::runtime_error); - bool timedWait(int milliseconds) throw(std::runtime_error); - void setEvent() throw(std::runtime_error); - void resetEvent() throw(std::runtime_error); - void syncObjectWait() throw(std::runtime_error) { wait(); } - bool syncObjectTimedWait(int milliseconds) throw(std::runtime_error) { return timedWait(milliseconds); } - inline operator Win32SyncObject*() throw() { return this; } - -}; -#endif - -/* class stackLock - - Stack based mutex locker/unlocker for unwrapped Win32 mutexes. - Equivalent to CAutoLock for CCritSec objects. -*/ - -class stackLock -{ - AOL_namespace::mutex &m_m; -public: - stackLock(AOL_namespace::mutex &m) : m_m(m) - { - m_m.lock(); - } - ~stackLock() - { - m_m.unlock(); - } -}; - -class stackRWLock -{ - AOL_namespace::rwLock &m_rw; - bool m_locked; - -public: - stackRWLock(AOL_namespace::rwLock &l, bool reader = true, bool lockNow = true) : m_rw(l), m_locked(lockNow) - { - if (lockNow == false) - return; - if (reader) - m_rw.rdLock(); - else - m_rw.lock(); - } - ~stackRWLock() - { - if (m_locked) - m_rw.unlock(); - } - bool tryRdLock() - { - if (m_locked == false) - { - if (m_rw.tryRdLock()) - { - m_locked = true; - return true; - } - } - return false; - } - void lock() { if (m_locked == false) { m_rw.lock(); m_locked = true; } } - void rdLock() { if (m_locked == false) { m_rw.rdLock(); m_locked = true; } } - void unlock() { if (m_locked) { m_rw.unlock(); m_locked = false; } } - -}; - -#ifndef _WIN32 - -#define WAIT_ABANDONED (-1) -#define WAIT_TIMEOUT (0) -#define WAIT_OBJECT_0 (1) -#define INFINITE (-1) - -int WaitForSingleObject(Win32SyncObject &o,int milli_timeout) throw(); -inline int WaitForSingleObject(Win32SyncObject *o,int milli_timeout) throw() { return WaitForSingleObject(*o,milli_timeout); } -int WaitForMultipleObjects(int count,Win32SyncObjectPtr *objs,bool waitall,int milliseconds) throw(); -inline void CloseHandle(Win32SyncObject *o) { delete o; } -typedef Win32SyncObject *HANDLE; - -#endif - -inline bool _SetEvent(event &e) { bool result=false; try {e.setEvent(); result=true; }catch(...){} return result; } -inline bool _SetEvent(event *e) { return _SetEvent(*e); } -inline bool _ResetEvent(event &e) { bool result=false; try {e.resetEvent();result=true;}catch(...){} return result; } -inline bool _ResetEvent(event *e) { return _ResetEvent(*e); } - -namespace AOL_namespace -{ - template <typename T> class synchronizedPrimitive - { - private: - mutable AOL_namespace::mutex m_lock; - T m_t; - - public: - synchronizedPrimitive(){} - synchronizedPrimitive(const T &t):m_t(t){} - T get() const throw() { stackLock sl(m_lock); return m_t; } - void set(const T &t) throw() { stackLock sl(m_lock); m_t = t; } - }; -} - -// thread safe sleep function -void safe_sleep(int sec, int usec = 0); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.cpp deleted file mode 100644 index 102ee4b3..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#ifdef _WIN32 -#include <windows.h> -#include <io.h> -#else -#include <unistd.h> -#endif -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include "uniFile.h" -#include "stl/stringUtils.h" - -using namespace std; -using namespace stringUtil; - -FILE* uniFile::fopen(const uniFile::filenameType &f,const char *mode) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - return _wfopen(u16.c_str(),tows(mode).c_str()); -#else - return ::fopen((const char *)f.c_str(),mode); -#endif -} - -void uniFile::unlink(const uniFile::filenameType &f) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - ::DeleteFileW(u16.c_str()); -#else - ::unlink((const char *)f.c_str()); -#endif -} - -bool uniFile::fileExists(const uniFile::filenameType &f) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - struct _stat64i32 st = {0}; - int result = _wstat(u16.c_str(),&st); - if (st.st_mode & _S_IFDIR) return 0; - return (result == 0); -#else - struct stat st; - int result = stat((const char *)f.c_str(),&st); - if (S_ISDIR(st.st_mode)) return 0; - return (result == 0); -#endif -} - -size_t uniFile::fileSize(const uniFile::filenameType &f) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - struct _stat64i32 st; - if (_wstat(u16.c_str(),&st) == -1) return 0; - return st.st_size; -#else - struct stat st; - if (stat((const char *)f.c_str(),&st) == -1) return 0; - return st.st_size; -#endif -} - -time_t uniFile::fileTime(const uniFile::filenameType &f) throw() -{ -#ifdef _WIN32 - uniString::utf32 u32(f); - std::wstring u16; - u32.toUtf16(u16); - struct _stat64i32 st; - if (_wstat(u16.c_str(),&st) == -1) return 0; - return st.st_mtime; -#else - struct stat st; - if (stat((const char *)f.c_str(),&st) == -1) return 0; - return st.st_mtime; -#endif -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.h deleted file mode 100644 index b90d59c2..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniFile.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#ifndef uniFile_H_ -#define uniFile_H_ - -#include "uniString.h" -#include <stdio.h> - -// functions that help bridge the difference between -// unicode file handling on various platforms - -namespace uniFile -{ - // posix uses utf8 for unicode filenames. Msft uses utf16. To avoid lots - // of platform conditional code, we will standardize on utf8 and convert - // as necessary on Msft platforms. This should be okay since file opens are - // not a high speed inner loop type of operation - typedef uniString::utf8 filenameType; - - //typedef enum { OPENFILE_READ = 1,OPENFILE_WRITE = 2,OPENFILE_BINARY=4 } OpenFile_t; - //FILE* fopen(const filenameType &f,int open_file_type) throw(); - - FILE* fopen(const filenameType &f, const char *mode) throw(); - void unlink(const filenameType &f) throw(); - bool fileExists(const filenameType &f) throw(); - size_t fileSize(const filenameType &f) throw(); - time_t fileTime(const filenameType &f) throw(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.cpp deleted file mode 100644 index 317a1015..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.cpp +++ /dev/null @@ -1,786 +0,0 @@ -#include "uniString.h" -#include <sstream> -#include <map> -#include <stdlib.h> - -using namespace std; -using namespace uniString; - -/*****************************************************************/ -//////////////// various helping funcs ///////////////////////// - -// helper function that throws exceptions -static void throwBadUTF8Code(utf8::value_type v, int position) throw(badUnicodeData) -{ - ostringstream o; - o << "Bad UTF-8 code (" << hex << (int)v << ") at position " << position; - throw uniString::badUnicodeData(o.str()); -} - -static void throwBadUTF16Code(utf16::value_type v, int position) throw(badUnicodeData) -{ - ostringstream o; - o << "Bad UTF-16 code (" << hex << (int)v << ") at position " << position; - throw uniString::badUnicodeData(o.str()); -} - -bool utf8::isValid(bool allowIncompleteEndingSequence) const throw() -{ - int position = 0; - for (utf8::const_iterator i = begin(); i != end(); ++i, ++position) - { - utf8::value_type v8 = (*i); - if (v8 & 0x80) - { - // count number of follow up bytes - utf8::value_type follow_up_mask = 0xc0; - utf8::value_type leading_value_mask = 0x3f; - int follow_up_bytes = 0; - - while ((v8 & follow_up_mask) == follow_up_mask) - { - if (follow_up_mask == 0xff) - { - return false; - } - - ++follow_up_bytes; - follow_up_mask = (follow_up_mask >> 1) | 0x80; - leading_value_mask = leading_value_mask >> 1; - } - - // we should always have follow up bytes since 0x80 is illegal - if (!follow_up_bytes) - { - return false; - } - - utf32::value_type v = v8 & leading_value_mask; - while(follow_up_bytes--) - { - ++i; - ++position; - if (i == end()) - { - if (allowIncompleteEndingSequence) - { - break; - } - else - { - return false; - } - } - v8 = *i; - if ((v8 & 0xc0) != 0x80) // follow ups must begin with 10xxxxxx - { - return false; - } - v = (v << 6) | (v8 & 0x3f); - } - } - } - return true; -} - -// convert utf8 to utf32 -/* - u32 - utf32 string to set - ibegin,iend - template iterators for the beginning and end of the UTF-8 bitstream - allowIncompleteEndingSequence - if true then we just ignore missing values at the very end - of the bitstream. Otherwise we throw an exception. -*/ - -template<typename ITER> -static void Utf8ToUtf32(utf32 &u32, ITER ibegin, ITER iend, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - // use temp so an exception leaves this string in tact - utf32 newValue; - int position = 0; - - for (ITER i = ibegin; i != iend; ++i,++position) - { - utf8::value_type v8 = (*i); - if (!(v8 & 0x80)) - { - newValue.push_back(v8); - } - else - { - // count number of follow up bytes - utf8::value_type follow_up_mask = 0xc0; - utf8::value_type leading_value_mask = 0x3f; - int follow_up_bytes = 0; - - while ((v8 & follow_up_mask) == follow_up_mask) - { - if (follow_up_mask == 0xff) - { - throwBadUTF8Code(v8, position); - } - ++follow_up_bytes; - follow_up_mask = (follow_up_mask >> 1) | 0x80; - leading_value_mask = leading_value_mask >> 1; - } - - // we should always have follow up bytes since 0x80 is illegal - if (!follow_up_bytes) - { - throwBadUTF8Code(v8, position); - } - - utf32::value_type v = v8 & leading_value_mask; - while (follow_up_bytes--) - { - ++i; - ++position; - if (i == iend) - { - if (allowIncompleteEndingSequence) - { - break; - } - else - { - throw badUnicodeData("Bad UTF-8 data. Ending sequence is incomplete"); - } - } - v8 = *i; - if ((v8 & 0xc0) != 0x80) // follow ups must begin with 10xxxxxx - { - throwBadUTF8Code(v8, position); - } - v = (v << 6) | (v8 & 0x3f); - } - if (v != Utf16BOM) - { - newValue.push_back(v); - } - } - } - - u32.clear(); - u32 = newValue; -} - -///////////////////// byte swap stuff for UTF-16 ////////////////////////////////////////////////////// -// endian swap of 16 bit value -static inline utf16::value_type byteSwap(utf16::value_type nValue) throw() -{ - return (((nValue>> 8)) | (nValue << 8)); -} - -#if __BYTE_ORDER == __LITTLE_ENDIAN -// push a value into a UTF-16 encoding string based on the endian of the value and what -// the machine natively stores. On entry "v" is in the native format of the machine since -// it was just converted from the 32 bit code point. -template<typename T> -static void Utf16EndianPush(T &u16, utf16::value_type v, bool littleEndian) throw() -{ - if (littleEndian) - { - u16.push_back(v); - } - else - { - u16.push_back(byteSwap(v)); - } -} - -// convert a UTF-16 value to machine native value -static inline utf16::value_type unswap(utf16::value_type v, bool littleEndianData) throw() -{ - return (littleEndianData ? v : byteSwap(v)); -} -#else -template<typename T> -static void Utf16EndianPush(T &u16, utf16::value_type v, bool littleEndian) throw() -{ - if (!littleEndian) - { - u16.push_back(v); - } - else - { - u16.push_back(byteSwap(v)); - } -} - -static inline utf16::value_type unswap(utf16::value_type v,bool littleEndianData) throw() -{ - return (!littleEndianData ? v : byteSwap(v)); -} -#endif -/////////////////////////////////// - -// assign UTF-32 from UTF-16 encoding -/* - u32 - utf32 string to set - ibegin,iend - iterators for UTF-16 encoding source - assumeLittleEndian - assume the UTF-16 encoding is little endian unless a BOM is detected - allowIncompleteEndingSequence - if true ignore final code point if UTF-16 sequence is incomplete, otherwise - throw an exception -*/ - -template<typename ITER> -static void Utf16ToUtf32(utf32 &u32, ITER ibegin, ITER iend, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - bool littleEndianData = assumeLittleEndian; - - utf32 newValue; - - int position = 0; - - for (ITER i = ibegin; i != iend; ++i,++position) - { - utf16::value_type w1 = (utf16::value_type)(*i); // yes, use utf16 value even for wstring since we know it's good - if (w1 == 0xfeff) - { - littleEndianData = leSystem; - continue; - } - else if (w1 == 0xfffe) - { - littleEndianData = !leSystem; - continue; - } - - w1 = unswap(w1,littleEndianData); - if (w1 < 0xd800 || w1 > 0xdfff) - { - newValue.push_back(w1); - } - else if (w1 > 0xdbff) - { - throwBadUTF16Code(w1,position); - } - else - { - ++i; - ++position; - if (i == iend) - { - if (allowIncompleteEndingSequence) - { - break; - } - else - { - throw badUnicodeData("Bad UTF-16 data. Ending sequence is incomplete"); - } - } - utf16::value_type w2 = (*i); - w2 = unswap(w2, littleEndianData); - if (w2 < 0xdc00 || w2 > 0xdfff) - { - throwBadUTF16Code(w2, position); - } - utf32::value_type v1 = w1 & 0x03ff; - utf32::value_type v2 = w2 & 0x03ff; - newValue.push_back((v1 << 10) | v2); - } - } - - u32.clear(); - u32 = newValue; -} - -template<typename U8> -static void Utf32CodeToUtf8(utf32::value_type v, U8 &u8) throw() -{ - if (v < 0x00000080) - { - // only allow \t, \r, \n if in 0-31 ranage - // otherwise expat in the DNAS will refuse - if (v <= 31) - { - if (v == 9 || v == 10 || v == 13) - { - u8.push_back((utf8::value_type)v); - } - } - else - { - u8.push_back((utf8::value_type)v); - } - } - else - { - utf32::value_type maxTopValue = 0x0000003f; - utf8::value_type topValueBitPattern = 0x80; - vector<utf8::value_type> buf; - - // filter out the extended control characters just incase - if (v >= 0x80 && v <= 0x9F) - { - u8.push_back((utf8::value_type)0x3F); - return; - } - // and also filter this so we don't insert BOMs - else if (v == 0xFFFE || v == 0xFFFF) - { - return; - } - - while (v > maxTopValue) - { - buf.push_back(0x00000080 | (v & 0x0000003f)); - v = v >> 6; - maxTopValue = maxTopValue >> 1; - topValueBitPattern = ((topValueBitPattern >> 1) | 0x80); - } - - buf.push_back(topValueBitPattern | v); - u8.insert(u8.end(), buf.rbegin(), buf.rend()); - } -} - -template<typename U8> -static void Utf32ToUtf8(const utf32 &u32, U8 &u8, bool leadingBOM) throw() -{ - u8.clear(); - if (leadingBOM) - { - // we rarely want a BOM in utf-8. But I've run into template bugs where - // the utf8 constructor is accidentally getting called with true for the BOM - // this compile time flag checks for that - Utf32CodeToUtf8(Utf16BOM,u8); - } - for (utf32::const_iterator i = u32.begin(); i != u32.end(); ++i) - { - Utf32CodeToUtf8(*i, u8); - } -} - -// create UTF-16 from unicode (according to rfc2781) -template<typename U16> -static void Utf32ToUtf16(const utf32 &u32, U16 &u16, bool leadingBOM, bool littleEndian) throw() -{ - u16.clear(); - if (leadingBOM) - { - Utf16EndianPush(u16, Utf16BOM, littleEndian); - } - for (utf32::const_iterator i = u32.begin(); i != u32.end(); ++i) - { - utf32::value_type v = *i; - if (v < 0x00010000) - { - Utf16EndianPush(u16, v, littleEndian); - } - else - { - utf32::value_type vp = v - 0x00010000; - utf16::value_type w1 = 0xd800; - utf16::value_type w2 = 0xdc00; - w1 = w1 | ((vp & 0x000ffc00) >> 10); - w2 = w2 | (vp & 0x000003ff); - Utf16EndianPush(u16,w1,littleEndian); - Utf16EndianPush(u16,w2,littleEndian); - } - } -} - -utf32::utf32(const __int8 *s, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s, s + strlen((const char *)s), allowIncompleteEndingSequence); -} - -utf32::utf32(const __int8 *s, size_t len, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s, s + len, allowIncompleteEndingSequence); -} - -utf32::utf32(const std::string &s, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s.begin(), s.end(), allowIncompleteEndingSequence); -} - -utf32::utf32(const utf8 &u8, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8.begin(), u8.end(), allowIncompleteEndingSequence); -} - -utf32::utf32(const utf8::value_type *u8, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8, u8 + strlen((const char *)u8), allowIncompleteEndingSequence); -} - -utf32::utf32(const utf8::value_type *u8,size_t len, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8, u8 + len, allowIncompleteEndingSequence); -} - -utf32::utf32(const utf16 &u16,bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16.begin(), u16.end(), assumeLittleEndian, allowIncompleteEndingSequence); -} - -utf32::utf32(const utf16::value_type *u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - utf16::size_type len = 0; - const utf16::value_type *tmp = u16; - if (tmp && *tmp) - { - while(*(tmp++)) - { - ++len; - } - } - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -utf32::utf32(const utf16::value_type *u16, size_t len, bool assumeLittleEndian ,bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -#ifdef _WIN32 -utf32::utf32(const std::wstring &w, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, w.begin(), w.end(), assumeLittleEndian, allowIncompleteEndingSequence); -} - -utf32::utf32(const wchar_t *u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - size_t len = 0; - const wchar_t *tmp = u16; - if (tmp && *tmp) - { - while(*(tmp++)) - { - ++len; - } - } - Utf16ToUtf32(*this,u16,u16+len,assumeLittleEndian,allowIncompleteEndingSequence); -} - -utf32::utf32(const wchar_t *u16, size_t len, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} -#endif - -void utf32::assign(const __int8 *s, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s, s + strlen((const char *)s), allowIncompleteEndingSequence); -} - -void utf32::assign(const __int8 *s, size_t len, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s, s + len, allowIncompleteEndingSequence); -} - -void utf32::assign(const std::string &s, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, s.begin(), s.end(), allowIncompleteEndingSequence); -} - -void utf32::assign(const utf8 &u8, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8.begin(), u8.end(), allowIncompleteEndingSequence); -} - -void utf32::assign(const utf8::value_type *u8, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8, u8 + strlen((const char *)u8), allowIncompleteEndingSequence); -} - -void utf32::assignAsHighBitANSI(const utf8::value_type *u8) throw() -{ - if (u8) - { - while (*u8) - { - push_back(*u8); - ++u8; - } - } -} - -void utf32::assign(const utf8::value_type *u8, size_t len, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf8ToUtf32(*this, u8, u8 + len, allowIncompleteEndingSequence); -} - -void utf32::assign(const utf16 &u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16.begin(), u16.end(), assumeLittleEndian, allowIncompleteEndingSequence); -} - -void utf32::assign(const utf16::value_type *u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - utf16::size_type len = 0; - const utf16::value_type *tmp = u16; - if (tmp && *tmp) - { - while(*(tmp++)) - { - ++len; - } - } - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -void utf32::assign(const utf16::value_type *u16, size_t len, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -#ifdef _WIN32 -void utf32::assign(const std::wstring &w, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, w.begin(), w.end(), assumeLittleEndian, allowIncompleteEndingSequence); -} - -void utf32::assign(const wchar_t *u16, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - size_t len = 0; - const wchar_t *tmp = u16; - if (tmp && *tmp) - { - while(*(tmp++)) - { - ++len; - } - } - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} - -void utf32::assign(const wchar_t *u16, size_t len, bool assumeLittleEndian, bool allowIncompleteEndingSequence) throw(badUnicodeData) -{ - Utf16ToUtf32(*this, u16, u16 + len, assumeLittleEndian, allowIncompleteEndingSequence); -} -#endif - -void utf32::assignFromLatinExtended(const std::string &s) throw() -{ - clear(); - for (string::const_iterator i = s.begin(); i != s.end(); ++i) - { - push_back((utf32::value_type)(*i)); - } -} - -void utf32::assignFromLatinExtended(const __uint8 *s) throw() -{ - clear(); - if (s) - { - while (*s) - { - push_back(*(s++)); - } - } -} - -void utf32::assignFromLatinExtended(const __uint8 *s, size_t len) throw() -{ - clear(); - if (s && len > 0) - { - while (len--) - { - push_back(*(s++)); - } - } -} - -utf8 utf32::toUtf8(bool leadingBOM) const throw() -{ - utf8 u8; - Utf32ToUtf8(*this, u8, leadingBOM); - return u8; -} - -void utf32::toUtf8(utf8 &u8, bool leadingBOM) const throw() -{ - Utf32ToUtf8(*this, u8, leadingBOM); -} - -void utf32::toUtf8(std::string &s, bool leadingBOM) const throw() -{ - Utf32ToUtf8(*this, s, leadingBOM); -} - -utf16 utf32::toUtf16(bool leadingBOM, bool littleEndian) const throw() -{ - utf16 u16; - Utf32ToUtf16(*this, u16, leadingBOM, littleEndian); - return u16; -} - -void utf32::toUtf16(utf16 &u16, bool leadingBOM, bool littleEndian) const throw() -{ - Utf32ToUtf16(*this, u16, leadingBOM, littleEndian); -} - -#ifdef _WIN32 -void utf32::toUtf16(std::wstring &w, bool leadingBOM, bool littleEndian) const throw() -{ - Utf32ToUtf16(*this, w, leadingBOM, littleEndian); -} -#endif - -namespace uniString -{ - template<typename T> - class xmlEscapes: public map<typename T::value_type,T> - { - public: - xmlEscapes() - { - static const typename T::value_type lessthan[] = - {(typename T::value_type)'&',(typename T::value_type)'l',(typename T::value_type)'t',(typename T::value_type)';',(typename T::value_type)0}; - static const typename T::value_type greaterthan[] = - {(typename T::value_type)'&',(typename T::value_type)'g',(typename T::value_type)'t',(typename T::value_type)';',(typename T::value_type)0}; - static const typename T::value_type ampersand[] = - {(typename T::value_type)'&',(typename T::value_type)'a',(typename T::value_type)'m',(typename T::value_type)'p',(typename T::value_type)';',(typename T::value_type)0}; - static const typename T::value_type apostrophe[] = - {(typename T::value_type)'&',(typename T::value_type)'a',(typename T::value_type)'p',(typename T::value_type)'o',(typename T::value_type)'s',(typename T::value_type)';',(typename T::value_type)0}; - static const typename T::value_type quote[] = - {(typename T::value_type)'&',(typename T::value_type)'q',(typename T::value_type)'u',(typename T::value_type)'o',(typename T::value_type)'t',(typename T::value_type)';',(typename T::value_type)0}; - - (*this)['<'] = T(lessthan); - (*this)['>'] = T(greaterthan); - (*this)['&'] = T(ampersand); - (*this)['\''] = T(apostrophe); - (*this)['"'] = T(quote); - } - }; -} - -static const uniString::xmlEscapes<utf32> gUtf32XmlEscapes; -static const uniString::xmlEscapes<utf16> gUtf16XmlEscapes; -static const uniString::xmlEscapes<utf8> gUtf8XmlEscapes; - -template<typename T> -static T xml_escape(const T &t, const uniString::xmlEscapes<T> &m) throw() -{ - T result; - - for (typename T::const_iterator i = t.begin(); i != t.end(); ++i) - { - typename uniString::xmlEscapes<T>::const_iterator e = m.find(*i); - if (e != m.end()) - { - result.insert(result.end(),(*e).second.begin(),(*e).second.end()); - } - else - { - result.push_back(*i); - } - } - return result; -} - -utf32 utf32::escapeXML() const throw() -{ - return xml_escape(*this, gUtf32XmlEscapes); -} - -utf16 utf16::escapeXML() const throw() -{ - return xml_escape(*this, gUtf16XmlEscapes); -} - -utf8 utf8::escapeXML() const throw() -{ - return xml_escape(*this, gUtf8XmlEscapes); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void utf8::assign(const utf32 &u32, bool leadingBOM) throw() -{ - u32.toUtf8(*this, leadingBOM); -} - -void utf16::assign(const utf32 &u32, bool leadingBOM, bool littleEndian) throw() -{ - u32.toUtf16(*this, leadingBOM, littleEndian); -} - -//////////////////////////////////////////////////////////////////////////////////////////// -string utf8::toANSI(bool allowHighBitCodePoints) const throw() -{ - string result; - bool utf32MethodWorked = false; - - try - { - // convert to utf32 so we can easily remove code points - const utf32 u32(*this); - if (allowHighBitCodePoints) - { - for (utf32::const_iterator i = u32.begin(); i != u32.end(); ++i) - { - result.push_back((char)*i); - } - } - else - { - for (utf32::const_iterator i = u32.begin(); i != u32.end(); ++i) - { - if ((*i) <= 0x7f) - { - result.push_back((char)*i); - } - else - { - result.push_back((char)'?'); - } - } - } - utf32MethodWorked = true; - } - catch(...) - { - } - - // if the string actually has high bit ANSI values (for instance, from a badly - // formed playlist), we should still do something sensible. - if (!utf32MethodWorked) - { - result.clear(); - if (allowHighBitCodePoints) - { - for (utf8::const_iterator i = begin(); i != end(); ++i) - { - result.push_back((char)*i); - } - } - else - { - for (utf8::const_iterator i = begin(); i != end(); ++i) - { - if ((*i) <= 0x7f) - { - result.push_back((char)*i); - } - else - { - result.push_back((char)'?'); - } - } - } - } - return result; -} - -#ifdef _WIN32 -wstring utf8::toWString() const throw(badUnicodeData) -{ - utf32 u32(*this); - wstring result; - u32.toUtf16(result); - return result; -} -#endif - -int utf8::toInt() const throw() -{ - return ::atoi((*this).hideAsString().c_str()); -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.h deleted file mode 100644 index 51bbbd49..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/unicode/uniString.h +++ /dev/null @@ -1,354 +0,0 @@ -#pragma once -#ifndef uniString_H_ -#define uniString_H_ - -#include "intTypes.h" -#include <stdexcept> -#include <string> -#include <vector> - -namespace uniString -{ - // exception for bad utf8/utf16 conversions - class badUnicodeData: public std::runtime_error - { - public: - explicit badUnicodeData(const std::string &msg) : std::runtime_error(msg){} - }; - - #if __BYTE_ORDER == __LITTLE_ENDIAN - static const bool leSystem = true; - #else - static const bool leSystem = false; - #endif - - class utf8; - class utf16; - class utf32; - - template<typename S> - size_t strlen(const S *s) throw() - { - if (!s) return 0; - size_t len(0); - while (*(s++)) - { - ++len; - } - return len; - } - - // string length calculator with a limit (in case the string is badly formed) - template<typename S> - size_t strlen(const S *s, size_t maxamt) throw() - { - if (!s) return 0; - size_t len(0); - while (maxamt && (*s)) - { - ++s; - ++len; - --maxamt; - } - return len; - } - - template<typename T> - bool is_a_number(T t) - { - return (((int)t) >= ((int)'0') && ((int)t) <= ((int)'9')); - } - - template <typename I> - bool is_a_number(I ibegin,I iend) - { - for (I i = ibegin; i != iend; ++i) - { - if (!is_a_number(*i)) - { - return false; - } - } - return true; - } - - class utf16: public std::basic_string<__uint16> - { - public: - typedef std::basic_string<__uint16> base_t; - - utf16(){} - utf16(const utf16 &u16) : base_t(u16){} - explicit utf16(const utf16::value_type *u16) : base_t(u16){} - explicit utf16(const utf16::value_type *u16, utf16::size_type len) : base_t(u16, len){} - #ifdef _WIN32 - explicit utf16(const std::wstring &w) : base_t(w.begin(), w.end()){} - #endif - explicit utf16(utf16::size_type Cnt,utf16::value_type Val) : base_t(Cnt, Val){} - explicit utf16(const base_t &u16) : base_t(u16){} - - void assign(const utf32 &u32,bool leadingBOM = true, bool littleEndian = leSystem) throw(); - utf16 escapeXML() const throw(); - }; - - class utf8: public std::basic_string<__uint8> - { - public: - typedef std::basic_string<__uint8> base_t; - utf8(){} - - utf8(const utf8 &u8) : base_t(u8) {} - - utf8(const utf8::value_type *u8) : base_t(u8) {} - - explicit utf8(const utf8::value_type *u8, utf8::size_type len) : base_t(u8, len) {} - - utf8(const char *u8) : base_t((const utf8::value_type *)u8) {} - - explicit utf8(const char *u8,utf8::size_type len) : base_t((const utf8::value_type *)u8, len) {} - - utf8(const std::string &s) : base_t(s.begin(), s.end()) {} - - explicit utf8(utf8::size_type Cnt, utf8::value_type Val) : base_t(Cnt, Val) {} - - utf8(const base_t &u8) : base_t(u8) {} - - template<typename T> - explicit utf8(T ibegin, T iend) : base_t(ibegin, iend) {} - - explicit utf8(const utf32 &u32, bool leadingBOM = false) - { - assign(u32, leadingBOM); - } - - void assign(const utf32 &u32, bool leadingBOM = false) throw(); - bool isValid(bool allowIncompleteEndingSequence = false) const throw(); - utf8 escapeXML() const throw(); - int toInt() const throw(); - - // sometimes we need to stuff this in a string. For example if we want to throw - // a runtime_error exception with the utf8 data. - std::string hideAsString() const throw() - { - std::string s(begin(), end()); - return s; - } - - // remove code points above 0x7f - std::string toANSI(bool allowHighBitCodePoints = false) const throw(); - // convenience function for windows - #ifdef _WIN32 - // converts to utf16 - std::wstring toWString() const throw(badUnicodeData); - #endif - - utf8 operator+(const utf8 &u8) const throw() - { - utf8 result(*this); - result.insert(result.end(), u8.begin(), u8.end()); - return result; - } - - utf8 operator+(const char *s) const throw() - { - utf8 result(*this); - result.insert(result.end(), s, s + strlen(s)); - return result; - } - - utf8 operator+(const std::string &s) const throw() - { - utf8 result(*this); - result.insert(result.end(), s.begin(), s.end()); - return result; - } - - template<typename T> - utf8 operator+(T v) const throw() - { - utf8 result(*this); - result += v; - return result; - } - - template<typename T> - utf8& operator+=(T v) throw() - { - base_t::operator+=(v); - return *this; - } - - utf8& operator+=(const std::string &s) throw() - { - utf8 result = (*this) + s; - *this = result; - return *this; - } - - utf8& operator+=(const char *s) throw() - { - utf8 result = (*this) + s; - *this = result; - return *this; - } - - template<typename ITER> - bool equals(ITER ibegin, ITER iend) const throw() - { - const_iterator i1 = begin(); - ITER i2 = ibegin; - while ((i1 != end()) && (i2 != iend)) - { - if (((utf8::value_type)*i1) != ((utf8::value_type)*i2)) - { - return false; - } - ++i1; - ++i2; - } - return ((i1 == end()) && (i2 == iend)); - } - - bool operator==(const char *s) const throw() - { - return equals(s, s + strlen(s)); - } - - bool operator==(const std::string &s) const throw() - { - return equals(s.begin(), s.end()); - } - }; - - inline utf8 operator+(const char *s, const utf8 &u8) throw() - { - utf8 r(s); - r.insert(r.end(), u8.begin(), u8.end()); - return r; - } - - inline utf8 operator+(const std::string &s, const utf8 &u8) throw() - { - utf8 r(s); - r.insert(r.end(), u8.begin(), u8.end()); - return r; - } - - class utf32: public std::basic_string<__uint32> - { - public: - typedef std::basic_string<__uint32> base_t; - - utf32(){} - utf32(const utf32 &us): base_t(us){} - utf32(const utf32::value_type *u32) : base_t(u32){} - explicit utf32(const utf32::value_type *u32, utf32::size_type len) : base_t(u32, len){} - explicit utf32(utf32::size_type Cnt, utf32::value_type Val) : base_t(Cnt, Val){} - utf32(const base_t &s) : base_t(s){} - explicit utf32(utf32::const_iterator b, utf32::const_iterator e) : base_t(b, e){} - explicit utf32(utf32::const_reverse_iterator b, utf32::const_reverse_iterator e) : base_t(b, e){} - - explicit utf32(const __int8 *s, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const __int8 *s, size_t len, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const std::string &s, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf8 &u8, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf8::value_type *u8, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf8::value_type *u8, size_t len, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assignAsHighBitANSI(const utf8::value_type *u8) throw(); - void assign(const __int8 *s, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const __int8 *s, size_t len, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const std::string &s, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf8 &u8, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf8::value_type *u8, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf8::value_type *u8, size_t len, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - - // use this one if the source is LATIN-1 and it may contain high bit characters - void assignFromLatinExtended(const std::string &s) throw(); - void assignFromLatinExtended(const __uint8 *s) throw(); // null terminated - void assignFromLatinExtended(const __uint8 *s, size_t len) throw(); // no termination - ////////////////// - - explicit utf32(const utf16 &u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf16::value_type *u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const utf16::value_type *u16, size_t len, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - #ifdef _WIN32 - explicit utf32(const std::wstring &w, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const wchar_t *u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - explicit utf32(const wchar_t *u16, size_t len, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - #endif - void assign(const utf16 &u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf16::value_type *u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const utf16::value_type *u16, size_t len, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - #ifdef _WIN32 - void assign(const std::wstring &w, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const wchar_t *u16, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - void assign(const wchar_t *u16, size_t len, bool assumeLittleEndian = leSystem, bool allowIncompleteEndingSequence = false) throw(badUnicodeData); - #endif - utf8 toUtf8(bool leadingBOM = false) const throw(); - void toUtf8(utf8 &u8, bool leadingBOM = false) const throw(); - void toUtf8(std::string &s, bool leadingBOM = false) const throw(); - utf16 toUtf16(bool leadingBOM = false, bool littleEndian = leSystem) const throw(); - void toUtf16(utf16 &u16, bool leadingBOM = false, bool littleEndian = leSystem) const throw(); - #ifdef _WIN32 - void toUtf16(std::wstring &w, bool leadingBOM = false, bool littleEndian = leSystem) const throw(); - #endif - - utf32 escapeXML() const throw(); - - utf32& operator+=(const utf32 &u32) - { - insert(end(), u32.begin(), u32.end()); - return *this; - } - - utf32 operator+(const utf32 &u32) - { - utf32 result(*this); - result += u32; - return result; - } - }; - - static const utf16::value_type Utf16BOM = 0xfeff; -} - -inline uniString::utf8 asciiToUtf8(std::string s) -{ - uniString::utf8 result; - const size_t siz = s.size(); - for (size_t i = 0; i < siz; i++) - { - int c = s[i]; - - // nothing specicial to do if 0-127 - if (c < 128 && c >= 0) - { - if (c >= 0 && c <= 31) - { - if (c == 9 || c == 10 || c == 13) - { - result.push_back((__uint8)c); - } - } - else - { - result.push_back((__uint8)c); - } - } - // otherwise we need to attempt to convert - else - { - // bump back to +ve - if (c < 128) - { - c += 256; - } - result.push_back((__uint8)(c >> 6) | 0xC0); - result.push_back((__uint8)(c & 0x3F) | 0x80); - } - } - - return result; -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp b/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp deleted file mode 100644 index a667b3f5..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include <windows.h> -#include <tchar.h> -#include "rezFuncs.h" -#include "stl/stringUtils.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -void getVersionInfo(utf8 &version) throw() -{ - version = ""; - - TCHAR filename[_MAX_PATH + 1] = {0}; - DWORD junk = 0; - char *versionData = 0; - - // version information from the application resources - ::GetModuleFileName(0,filename,_MAX_PATH); - DWORD versionInfoSize = ::GetFileVersionInfoSize(filename,&junk); - versionData = new char[versionInfoSize]; - if (::GetFileVersionInfoW(filename,0,versionInfoSize,versionData)) - { - void *valPtr = 0; - UINT valSize = 0; - if (::VerQueryValue(versionData,_T("\\"), &valPtr, &valSize)) - { - const VS_FIXEDFILEINFO *ffi = reinterpret_cast<const VS_FIXEDFILEINFO *>(valPtr); - version = - tos(((ffi->dwProductVersionMS & 0xffff0000) >> 16)) + "." + - tos(((ffi->dwProductVersionMS & 0x0000ffff))) + "." + - tos(((ffi->dwProductVersionLS & 0xffff0000) >> 16)) + "." + - tos(((ffi->dwProductVersionLS & 0x0000ffff))); - } - } - delete [] versionData; -} diff --git a/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.h b/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.h deleted file mode 100644 index 3db0d496..00000000 --- a/Src/Plugins/DSP/sc_serv3/nmrCommon/win32/rezFuncs.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#ifndef rezFuncs_H_ -#define rezFuncs_H_ - -#include "unicode/uniString.h" - -void getVersionInfo(uniString::utf8 &version) throw(); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.cpp b/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.cpp deleted file mode 100644 index 82a49bca..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "protocol_FlashPolicyServer.h" -#include "webNet/urlUtils.h" -#include "services/stdServiceImpl.h" -#include "global.h" -#include "bandwidth.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -protocol_FlashPolicyServer::protocol_FlashPolicyServer(const socketOps::tSOCKET s, - const uniString::utf8 &clientLogString) throw(std::exception) - : runnable(s), m_outBufferSize(0), m_clientLogString(clientLogString), - m_outBuffer(0), m_state(&protocol_FlashPolicyServer::state_Send) -{ - // flash x-domain file - m_outMsg = gOptions.getCrossDomainFile(false); - if (m_outMsg.empty()) m_outMsg = MSG_HTTP404; - m_outBuffer = m_outMsg.c_str(); - bandWidth::updateAmount(bandWidth::FLASH_POLICY, (m_outBufferSize = (int)m_outMsg.size())); -} - -protocol_FlashPolicyServer::~protocol_FlashPolicyServer() throw() -{ - socketOps::forgetTCPSocket(m_socket); -} - -void protocol_FlashPolicyServer::timeSlice() throw(std::exception) -{ - (this->*m_state)(); -} - -// send buffer text -void protocol_FlashPolicyServer::state_Send() throw(std::exception) -{ - if (sendDataBuffer(DEFAULT_CLIENT_STREAM_ID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - m_result.done(); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.h b/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.h deleted file mode 100644 index 2972a08d..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_FlashPolicyServer.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#ifndef protocol_FlashPolicyServer_H_ -#define protocol_FlashPolicyServer_H_ - -#include "threadedRunner.h" -#include <map> - -// this class takes any necessary actions indicated by an HTTP -// call with the <policy-file-request/> url (typically on :843) -class protocol_FlashPolicyServer: public runnable -{ -private: - int m_outBufferSize; - const uniString::utf8& m_clientLogString; - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - uniString::utf8 m_outMsg; - - typedef void (protocol_FlashPolicyServer::*state_t)(); - - state_t m_state; - - void state_Send() throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_FlashPolicyServer"; } - -public: - protocol_FlashPolicyServer(const socketOps::tSOCKET s, const uniString::utf8 &clientLogString) throw(std::exception); - virtual ~protocol_FlashPolicyServer() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.cpp deleted file mode 100644 index 1406cbcc..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.cpp +++ /dev/null @@ -1,305 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "protocol_HTTPClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.HTTPClientDebug()) DLOG(__VA_ARGS__); } while (0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_HTTPClient::protocol_HTTPClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const utf8 &addr, const uniString::utf8 &XFF) throw(std::exception) - : protocol_shoutcastClient (hs, streamID, hostName, addr, XFF, streamData::HTTP) -{ - setCallback (&protocol_shoutcastClient::state_AttachToStream); -} - - -protocol_HTTPClient::~protocol_HTTPClient() throw() -{ - cleanup("HTTP", gOptions.HTTPClientDebug(), false, true); -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_HTTPClient::timeSlice() throw(exception) -{ - int ret = doTimeSlice(); - if (ret == 1) - { - m_state = &protocol_HTTPClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - - -void protocol_HTTPClient::setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next) -{ - m_state = callback ? callback : m_nextState; - m_nextState = callback ? next : NULL; -} - - -void protocol_HTTPClient::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_HTTPClient::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - if (sendText()) - { - m_metaIntervalCounter = 0; - m_state = m_nextState; - } -} - -// find the appropriate stream and try to attach to it -void protocol_HTTPClient::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - int read_bitrate = 0, dataType = 0; - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - if (processReject("HTTP", bandWidth::CLIENT_HTTP_SENT, MSG_ICY_HTTP401, - MSG_ICY_HTTP401_LEN, &read_bitrate, &dataType)) - { - goto fall_through; - } - - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { -fall_through: - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - const int add = processAdd("HTTP", bandWidth::CLIENT_HTTP_SENT, - MSG_ICY_HTTP401, MSG_ICY_HTTP401_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - m_OKResponse = MSG_ICY_HTTP200; - if (!isPodcast) - { - utf8 title = (m_streamData ? m_streamData->streamName() : gOptions.stream_backupTitle(m_streamID)); - if (!m_streamData) - { - if (!gOptions.read_stream_backupTitle(m_streamID)) - { - title = gOptions.backupTitle(); - } - - if (title.empty()) - { - title = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - title = gOptions.backupFile(); - } - - if (!title.empty()) - { - title = fileUtil::stripSuffix(fileUtil::stripPath(title)); - } - } - } - - m_OKResponse += "icy-name:" + title + "\r\n" - "icy-genre:"; - if (m_streamData) - { - for (int i = 0; i < 5; i++) - { - if (!m_streamData->m_streamInfo.m_streamGenre[i].empty()) - { - m_OKResponse += (i ? ", " : "") + m_streamData->m_streamInfo.m_streamGenre[i]; - } - } - } - else - { - m_OKResponse += "Misc"; - } - - m_OKResponse += "\r\n" - "icy-br:" + tos((m_streamData ? m_streamData->streamBitrate() : read_bitrate)) + "\r\n" + - "icy-sr:" + tos((m_streamData ? m_streamData->streamSampleRate() : 0)) + "\r\n" + - (m_streamData ? (m_streamData->streamIsVBR() ? "icy-vbr:1\r\n" : "") : ""); - } - - if (m_streamData) - { - m_OKResponse += "icy-url:" + m_streamData->streamURL() + "\r\n"; - - if (isUserAgentRelay(toLower(m_userAgent)) && (!m_streamData->allowPublicRelay())) - { - m_OKResponse += "icy-pub:0\r\n"; - } - else - { - m_OKResponse += "icy-pub:" + tos(m_streamData->streamPublic()) + "\r\n"; - } - - m_OKResponse += "content-type:" + m_streamData->streamContentType() + "\r\n"; - } - else - { - utf8 path = getStreamPath(m_streamID); - if (!path.empty() && path.find(utf8("/")) == 0) - { - path = path.substr(1); - } - - m_OKResponse += "Content-Type:" + utf8(dataType == AACP_DATA ? "audio/aacp" : "audio/mpeg") + "\r\n"; - - if (!isPodcast) - { - utf8 pub = toLower(gOptions.stream_publicServer(m_streamID)); - if (pub.empty()) - { - pub = toLower(gOptions.publicServer()); - } - if (pub == "always") - { - m_OKResponse += "icy-pub:1\r\n"; - } - else if (pub == "never") - { - m_OKResponse += "icy-pub:0\r\n"; - } - } - else - { - m_OKResponse += "Content-Disposition:attachment;filename=\"" + path + "\"\r\n" - "Content-Length:" + tos(m_backupFile.size()) + "\r\n"; - } - } - - if (gOptions.clacks()) - { - m_OKResponse += "X-Clacks-Overhead:GNU Terry Pratchett\r\n"; - } -//#define USE_CHUNKED -#ifdef USE_CHUNKED - m_OKResponse += "Transfer-Encoding:chunked\r\n\r\n"; -#else - m_OKResponse += "\r\n"; -#endif - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_HTTP_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_shoutcastClient::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_shoutcastClient::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_shoutcastClient::state_Close; - } - m_result.schedule(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("HTTP"); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("HTTP", bandWidth::CLIENT_HTTP_SENT, movedUrl, 2); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - } -} - -void protocol_HTTPClient::state_SendIntro() throw(exception) -{ - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - m_state = &protocol_shoutcastClient::state_Stream; - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntroFile; - } - } -} - -void protocol_HTTPClient::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetReadPtr(); - - if (!m_streamData || m_introFile.empty()) - { - // send intro file if we have it - acquireIntroFile(); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntro; - } - - setW3CState(); - - m_result.run(); -} - - -void protocol_HTTPClient::return_403(void) -{ - protocol_shoutcastClient::return_403(); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.h b/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.h deleted file mode 100644 index 3a20c999..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPClient.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#ifndef protocol_HTTPClient_H_ -#define protocol_HTTPClient_H_ - -#include "protocol_shoutcastClient.h" -#include <vector> - -class streamData; - -class protocol_HTTPClient: public protocol_shoutcastClient -{ -private: - - typedef void (protocol_HTTPClient::*state_t)(); - state_t m_state; - state_t m_nextState; - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_SendText() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_SendIntro() throw(std::exception); - - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_HTTPClient"; } - -public: - protocol_HTTPClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, const uniString::utf8 &hostName, - const uniString::utf8 &addr, const uniString::utf8 &XFF) throw(std::exception); - - virtual ~protocol_HTTPClient() throw(); - - virtual void setCallback (protocol_shoutcastClient::state_t callback = NULL, protocol_shoutcastClient::state_t next = NULL); - - void return_403(void); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.cpp b/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.cpp deleted file mode 100644 index cc0479fe..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.cpp +++ /dev/null @@ -1,462 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include "protocol_HTTPSource.h" -#include "protocol_backup.h" -#include "streamData.h" -#include "global.h" -#include "base64.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "SRC" -#define DEBUG_LOG(...) do { if (gOptions.HTTPSourceDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_HTTPSource::protocol_HTTPSource (microConnection &mc, const string &firstLine) throw(exception) : - runnable (mc), m_srcPort(mc.m_srcPort), m_srcAddr(mc.m_srcAddress) -{ - m_srcStreamID = DEFAULT_SOURCE_STREAM; - m_remainder = new __uint8[BUF_SIZE * 4]; - m_remainderSize = 0; - m_denied = false; - m_outBuffer = NULL; - m_outBufferSize = 0; - m_streamData = NULL; - m_state = &protocol_HTTPSource::state_GetLine; - m_nextState = &protocol_HTTPSource::state_AnalyzeHeaders; - - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - // to be able to do certain things later on - // we need to determine the stream from the - // mountpoint which is in the PUT request - string request, url, protocolAndVersion; - getHTTPRequestDetails(firstLine, request, url, protocolAndVersion); - - bool htmlPage = false; - m_srcStreamID = (int)streamData::getStreamIdFromPath(url, htmlPage); - if ((m_srcStreamID > 0) && (m_srcStreamID <= INT_MAX)) - { - // update the log message for the read stream number - m_srcLogString = srcAddrLogString (m_srcAddr, m_srcPort, m_srcStreamID); - - // if we have a moved stream then now we have the stream id - // then we need to check and block the source as applicable - utf8 movedUrl = gOptions.stream_movedUrl(m_srcStreamID); - - if (!movedUrl.empty()) - { - m_denied = true; - ELOG(m_srcLogString + "HTTP source rejected. Stream is configured as having moved."); - - m_outBuffer = MSG_STREAMMOVED; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMMOVED_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - return; - } - } - else - { - m_denied = true; - ELOG(m_srcLogString + "Bad Stream ID (" + tos(m_srcStreamID) + "). Stream ID cannot be below 1 or above 2147483647."); - - m_outBuffer = MSG_BADSTREAMID; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_BADSTREAMID_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - } -} - -protocol_HTTPSource::~protocol_HTTPSource() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (m_streamData) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_remainder); - - if (!m_denied) - { - ILOG(m_srcLogString + "HTTP source disconnected."); - } -} - -void protocol_HTTPSource::state_AnalyzeHeaders() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - int maxHeaderLineCount = gOptions.maxHeaderLineCount(); - if ((int)m_headers.size() >= maxHeaderLineCount) - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "Max header lines exceeded"); - } - - m_lineBuffer = stripWhitespace(m_lineBuffer); - if (m_lineBuffer.empty()) - { - // adjust headers for titleFormat and urlFormat - utf8 titleFormat = gOptions.titleFormat(); - utf8 urlFormat = gOptions.urlFormat(); - if (!titleFormat.empty()) - { - utf8::size_type pos = titleFormat.find(utf8("%s")); - m_headers["ice-name"] = (pos == utf8::npos ? titleFormat : titleFormat.replace(pos,2,m_headers["ice-name"])); - } - - if (!urlFormat.empty()) - { - utf8::size_type pos = urlFormat.find(utf8("%s")); - m_headers["ice-url"] = (pos == utf8::npos ? urlFormat : urlFormat.replace(pos,2,m_headers["ice-url"])); - } - - // dump headers to log - if (gOptions.HTTPSourceDebug()) - { - for (map<utf8,utf8>::const_iterator i = m_headers.begin(); i != m_headers.end(); ++i) - { - DEBUG_LOG(m_srcLogString + "Source client header [" + (*i).first + ":" + (*i).second + "]"); - } - } - - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_srcStreamID); - - if (!found && gOptions.requireStreamConfigs()) - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "HTTP source rejected. Stream " + - tos(m_srcStreamID) + " must be defined in config file"); - } - - // check that these bitrates are allowed (looking at both max and average values) - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int bitrate = getStreamBitrate(m_headers) * 1000, - ret = gOptions.isBitrateDisallowed(m_srcStreamID, bitrate, streamMinBitrate, streamMaxBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - throwEx<runtime_error>(m_srcLogString + "HTTP source rejected. Only bitrates " + mode + " " + - tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + - " kbps are allowed - detected " + tos(bitrate / 1000) + " kbps."); - } - - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, m_srcAddr, - (found ? stream.m_authHash : ""), m_srcUserID, "", - stream.m_backupUrl.url(), streamData::HTTP, - m_srcStreamID, m_srcPort, stream.m_maxStreamUser, - stream.m_maxStreamBitrate, stream.m_minStreamBitrate, - stream.m_allowPublicRelay, false, getStreamSamplerate(m_headers), - mapGet(m_headers, "icy-vbr", (bool)false), m_headers)); - if (!m_streamData) - { - m_denied = true; - ELOG(m_srcLogString + "HTTP source rejected. A source is already connected."); - m_outBuffer = MSG_STREAMINUSE; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMINUSE_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - m_result.run(); - return; - } - - utf8 sourceIdent = mapGet(m_headers, "user-agent", utf8()); - m_streamData->updateSourceIdent(sourceIdent); - - m_outBuffer = MSG_HTTP_VALIDPASSWORD; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_HTTP_VALIDPASSWORD_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_GetStreamData; - m_result.run(); - } - else - { - // find the colon that divides header lines into key/value fields - utf8::size_type pos = m_lineBuffer.find(utf8(":")); - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0, pos))); - if (pos == utf8::npos) - { - if (!key.empty() && ((key == "ice-name") || (key == "ice-url"))) - { - // allow through ice-name and ice-url if there is - // a titleformat and urlformat to use respectively - } - else - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "HTTP source connection rejected. " - "Bad header string [" + m_lineBuffer + "]"); - } - } - - utf8 value = stripWhitespace(m_lineBuffer.substr(pos+1)); - if (key.empty() || value.empty()) - { - if (!key.empty() && value.empty()) - { - if (key == "ice-genre") - { - value = "Misc"; - } - else if (((key == "ice-name") && !gOptions.titleFormat().empty()) || - ((key == "ice-url") && !gOptions.urlFormat().empty())) - { - // allow through ice-name and ice-url if there is - // a titleformat and urlformat to use respectively - } - else if (key == "ice-url") - { - value = "http://www.shoutcast.com"; - } - } - else - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "HTTP source connection rejected. " - "Bad header string [" + m_lineBuffer + "]"); - } - } - - if (!key.empty()) - { - if (key == "authorization") - { - if (!value.empty()) - { - utf8 password; - vector<utf8> vauth = tokenizer(value, (utf8::value_type)' '); - // format " Basic xxxxxxxxx" - vector<__uint8> va = base64::decode((vauth.size() < 2 ? "" : vauth[1]).hideAsString().c_str()); - password.insert(password.end(), va.begin(), va.end()); - - utf8::size_type ppos = password.find((utf8)":"); - if (ppos != utf8::npos) - { - // we're looking to see if this is an updated 1.x source - // which is able to indicate the stream # for the stream - // so that we're able to support multiple 1.x sources so - // we need to parse the password and extract the parts - utf8 m_srcPassword = password; - extractPassword(m_srcPassword, m_srcUserID, m_srcStreamID); - - // as we are a v1 source then we must adhere to the master password - // instead of using a specific per stream password as in v2 streams - // though we also accept connections as sid=1 so check for that too - utf8 srcPassword = gOptions.stream_password(m_srcStreamID); - if (srcPassword.empty()) - { - srcPassword = gOptions.password(); - } - - if (m_srcPassword.empty() || (m_srcPassword != srcPassword)) - { - m_denied = true; - ELOG(m_srcLogString + "HTTP source connection denied" + (m_srcUserID.empty() ? "" : " for user (" + m_srcUserID + ")") + - ". " + (m_srcPassword.empty() ? "Empty password not allowed." : "Bad password: " + m_srcPassword)); - m_outBuffer = MSG_INVALIDPASSWORD; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_INVALIDPASSWORD_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - } - else - { - // if we've got a source already connected and it's not a backup - // then it's better that we just abort processing now than later - bool isSourceActive = false; - streamData *sd = streamData::accessStream(m_srcStreamID, isSourceActive); - if (sd && (isSourceActive == true) && (sd->isBackupStream(m_srcStreamID) == false)) - { - m_denied = true; - ELOG(m_srcLogString + "HTTP source rejected. A source is already connected."); - m_outBuffer = MSG_STREAMINUSE; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMINUSE_LEN)); - m_state = &protocol_HTTPSource::state_SendBuffer; - m_nextState = &protocol_HTTPSource::state_CloseConnection; - return; - } - else - { - ILOG(m_srcLogString + "HTTP source connection starting."); - } - - if (sd) - { - sd->releaseStream(); - } - } - } - else - { - // TODO need to send a valid rejection response for this - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "HTTP source connection rejected. " - "Bad header string [" + m_lineBuffer + "]"); - } - - } - else - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "HTTP source connection rejected. " - "Bad header string [" + m_lineBuffer + "]"); - } - } - } - m_headers[key] = value; - m_nextState = &protocol_HTTPSource::state_AnalyzeHeaders; - m_state = &protocol_HTTPSource::state_GetLine; - m_result.read(); - m_lineBuffer.clear(); - } -} - -void protocol_HTTPSource::timeSlice() throw(std::exception) -{ - try - { - if (m_streamData && m_streamData->isDead()) - { - m_result.done(); - return; - } - (this->*m_state)(); - } - catch(const exception &) - { - throw; - } -} - -void protocol_HTTPSource::state_SendBuffer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (sendDataBuffer(m_srcStreamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_HTTPSource::state_GetLine() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (getHTTPStyleHeaderLine(m_srcStreamID, m_lineBuffer, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_HTTPSource::state_GetStreamData() throw(exception) -{ - time_t cur_time; - - try - { - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_srcStreamID, (m_srcLogString + "Timeout waiting for stream data")); - - int bitrate = m_streamData->streamBitrate(); - const int type = m_streamData->streamUvoxDataType(); - while (true) - { - char buf[BUF_SIZE * 4] = {0}; - int amt = (BUF_SIZE - 1); - - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if ((m_remainderSize > 0) && ((amt + m_remainderSize) <= (BUF_SIZE * 4))) - { - memcpy(buf, m_remainder, m_remainderSize); - } - else - { - m_remainderSize = 0; - } - - // adjust the position in the buffer based on the prior - // state of the remaining data as part of frame syncing - int rval = 0; - if ((rval = recv (&buf[m_remainderSize], (BUF_SIZE - 1), 0x0)) < 1) - { - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule (80); - m_result.read(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - WLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_srcStreamID); - } - else - DLOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_srcStreamID); - throwEx<runtime_error> (""); - } - - // update these details before we mess with anything - bandWidth::updateAmount(bandWidth::SOURCE_V1_RECV, rval); - - // if we're here then we account for what we already had in the total - // so that we then don't skip the new data read with the original data - rval += m_remainderSize; - m_remainderSize = 0; - amt = rval; - - if (m_streamData->syncToStream(m_remainderSize, m_remainder, amt, bitrate, - type, buf, m_srcLogString)) - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "HTTP source disconnected. " - "Unable to sync to the stream. Please check the " - "source is valid and in a supported format."); - } - - m_lastActivityTime = ::time(NULL); - } - } - catch (exception &e) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector<config::streamConfig> backupInfo = gOptions.getBackupUrl(m_srcStreamID); - if (!backupInfo.empty() && !m_denied) - { - m_denied = true; - if (m_streamData) - { - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } -#ifdef INCLUDE_BACKUP_STREAMS - ILOG (m_srcLogString + "HTTP source disconnected - trying source backup."); - threadedRunner::scheduleRunnable (new protocol_backup(backupInfo[0], getStreamBitrate(m_headers), - fixMimeType(m_headers["content-type"]))); -#endif - } - throw; - } -} - -void protocol_HTTPSource::state_CloseConnection() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - m_result.done(); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.h b/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.h deleted file mode 100644 index 82fe7256..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPSource.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once -#ifndef protocol_HTTPSource_H_ -#define protocol_HTTPSource_H_ - -#include "threadedRunner.h" -#include <map> - -class streamData; - -/* - Runnable object that handles the shoutcast source (broadcaster) - protocol -*/ - -class protocol_HTTPSource : public runnable -{ -private: - const u_short m_srcPort; - short unsigned int m_remainderSize; - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - // is a padding hole around here... - __uint8 * m_remainder; - const uniString::utf8 m_srcAddr; - uniString::utf8 m_srcLogString; - uniString::utf8 m_srcUserID; - int m_srcStreamID; - int m_outBufferSize; - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - uniString::utf8 m_lineBuffer; // received ICY header line - httpHeaderMap_t m_headers; // the received source headers - streamData *m_streamData; // associated stream object - - typedef void (protocol_HTTPSource::*state_t)(); - - state_t m_state; - state_t m_nextState; - - void state_ConfirmPassword() throw(std::exception); - void state_SendBuffer() throw(std::exception); - void state_GetLine() throw(std::exception); - void state_AnalyzeHeaders() throw(std::exception); - void state_CloseConnection() throw(std::exception); - void state_GetStreamData() throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_HTTPSource"; } - -public: - protocol_HTTPSource (microConnection &mc, const string &firstLine) throw(std::exception); - - virtual ~protocol_HTTPSource() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.cpp b/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.cpp deleted file mode 100644 index 23d7219f..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.cpp +++ /dev/null @@ -1,4808 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "protocol_HTTPStyle.h" -#include "protocol_shoutcast1Client.h" -#include "protocol_shoutcast2Client.h" -#include "protocol_HTTPClient.h" -#include "protocol_flvClient.h" -#include "protocol_m4aClient.h" -#include "protocol_admincgi.h" -#include "base64.h" -#include "banList.h" -#include "ripList.h" -#include "adminList.h" -#include "webNet/urlUtils.h" -#include "file/fileUtils.h" -#include "aolxml/aolxml.h" -#include "services/stdServiceImpl.h" -#include "global.h" -#include "bandwidth.h" -#include "updater.h" -#include "metadata.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define HEAD_REQUEST (m_httpRequestInfo.m_request == HTTP_HEAD) - -size_t gFF_fix = 0; - -CacheMap_t m_xmlStatsCache, m_xmlStatisticsCache, m_jsonStatsCache, - m_jsonStatisticsCache, m_7Cache, m_PLSCache, m_M3UCache, - m_ASXCache, m_QTLCache, m_XSPFCache, m_xmlTracksCache, - m_xmlMetadataCache, m_jsonMetadataCache, m_jsonTracksCache, - m_xmlPlayedCache, m_jsonPlayedCache, m_htmlPlayedCache, - m_streamArtCache, m_playingArtCache, m_crossdomainCache; - -AOL_namespace::mutex m_xmlStatsLock, m_xmlStatisticsLock, m_jsonStatsLock, - m_jsonStatisticsLock, m_7Lock, m_PLSLock, m_M3ULock, - m_ASXLock, m_QTLLock, m_XSPFLock, m_xmlTracksLock, - m_xmlMetadataLock, m_jsonMetadataLock, m_jsonTracksLock, - m_xmlPlayedLock, m_jsonPlayedLock, m_htmlPlayedLock, - m_streamArtLock, m_playingArtLock, m_crossdomainLock; - -#ifdef _WIN32 -typedef unsigned long in_addr_t; -#endif - -const utf8 getStreamHeader(const streamData::streamID_t sid, const utf8& headerTitle) -{ - return "<!DOCTYPE html><html><head><meta charset=\"utf-8\">" - "<meta name=viewport content=\"width=device-width, initial-scale=1\">" - "<title>Shoutcast Server</title>" - "<link href=\"index.css\" rel=\"stylesheet\" type=\"text/css\">" - "<link href=\"images/favicon.ico\" rel=\"shortcut icon\" type=\"" + - gOptions.faviconFileMimeType() + "\"></head><body style=\"margin:0;\">" - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>" - "<td><div style=\"float:left;clear:both;\" class=\"logo\">Shoutcast " + - headerTitle + "</div></td><td style=\"text-align:right;vertical-align:bottom;padding-right:0.1em;\">" - "<a target=\"_blank\" title=\"Built: " __DATE__ "\" href=\"http://www.shoutcast.com\">" - "Shoutcast Server v" + addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + - "</a></td></tr><tr><td class=\"thr\" align=\"center\" colspan=\"2\">" - "<div id=\"hdrbox\" class=\"tnl\" style=\"justify-content:space-around;display:flex;" - "flex-flow:row wrap;\"><div class=\"thr\"><a href=\"index.html?sid=" + tos(sid) + - "\">Status</a></div><div class=\"thr\"> | </div>"; -} - -const utf8 getStreamMiddlePlayingHeader(const streamData::streamID_t sid) -{ - return "<div class=\"thr\"><a href=\"played.html?sid=" + tos(sid) + - "\">History <img border=\"0\" title=\"History\" " - "alt=\"History\" style=\"vertical-align:middle\" " - "src=\"images/history.png\"></a></div>" - "<div class=\"thr\"> | </div>"; -} - -const utf8 getStreamMiddleListenHeader(const streamData::streamID_t sid) -{ - return "<div class=\"thr\"><a href=\"listen.pls?sid=" + tos(sid) + - "\">Listen <img border=\"0\" title=\"Listen to Stream\" " - "alt=\"Listen to Stream\" style=\"vertical-align:middle\" " - "src=\"images/listen.png\"></a></div>" - "<div class=\"thr\"> | </div>"; -} - -const utf8 getStreamEndHeader(const streamData::streamID_t sid) -{ - return "<div class=\"thr\"><a target=\"_blank\" href=\"home.html?sid=" + - tos(sid) + "\">Website</a></div><div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?sid=" + tos(sid) + - "\">Stream Login <img border=\"0\" title=\"Stream Login\nPassword Required\" " - "alt=\"Stream Login\nPassword Required\" style=\"vertical-align:middle\" " - "src=\"images/lock.png\"></a></div><div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi\">Server Login " - "<img border=\"0\" title=\"Server Login\nPassword Required\" " - "alt=\"Server Login\nPassword Required\" style=\"vertical-align:middle\" " - "src=\"images/lock.png\"></a></div></div></td></tr></table>"; -} - -const bool getHideState(const streamData::streamID_t sid) -{ - const utf8 &hideStats = gOptions.getStreamHideStats(sid); - if (!hideStats.empty()) - { - return ((hideStats == "stats" || hideStats == "all")) && !(hideStats == "none"); - } - return false; -} - -#define DEBUG_LOG(...) do { if (gOptions.httpStyleDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "[HTTPSTYLE] " - -#define COMPRESS(header, body) if (m_compressed && compressData(body)) header += "Content-Encoding:gzip\r\n" - -const utf8 getNewVersionMessage(const utf8& ending) -{ - utf8 body = ""; - // display update message where applicable - updater::verInfo ver; - if (updater::getNewVersion(ver)) - { - body += "<table cellspacing=\"0\" cellpadding=\"5\" align=\"center\"><tr><td align=\"center\" class=\"infb\">" - "<div align=\"center\" class=\"infh\"><b>New DNAS Version Available: " + ver.ver + "</b></div>" - "Please <a href=\"admin.cgi\"><b>login</b></a> or see <a target=\"_blank\" href=\"" + - aolxml::escapeXML(ver.log) + "\"><b>here</b></a> to find out more about the new DNAS version." - + (!ver.slimmsg.empty() ? "<br><br>" + ver.slimmsg : "") + "</tr></table>" + ending; - } - return body; -} - -const utf8 getStreamPath(const size_t sid, const bool for_public) -{ - utf8 streamPath; - config::streamConfig stream; - if (gOptions.getStreamConfig(stream, sid)) - { - // if not empty then set to the value otherwise leave as /stream/<sid> - if (!stream.m_urlPath.empty()) - { - // but ensure that a / is on the front if not manually specified - if (stream.m_urlPath[0] == '/') - { - streamPath = stream.m_urlPath; - } - else - { - streamPath = "/" + stream.m_urlPath; - } - - // this makes sure that if someone sets / or /stream/x/ then - // if we're asked for a 'public' url that we append the ';'. - if (for_public && (streamPath.rfind((utf8)"/") == streamPath.size() - 1)) - { - streamPath += ";"; - } - } - } - - if (streamPath.empty()) - { - if (!sid || (sid == DEFAULT_CLIENT_STREAM_ID)) - { - streamPath = (!for_public ? "/" : "/;"); - } - else - { - streamPath = "/stream/" + tos(sid) + (!for_public ? "/" : "/;"); - } - } - - return streamPath; -} - -protocol_HTTPStyle::protocol_HTTPStyle (microConnection &mc, const string &firstLine) throw(exception) : - runnable (mc), m_clientPort(mc.m_srcPort), m_clientHostName(mc.m_srcHostName), m_clientAddr(mc.m_srcAddress), m_clientLogString(dstAddrLogString(mc.m_srcHostName,mc.m_srcPort)) -{ - m_protocols = mc.m_protocols; - m_outBufferSize = 0; - m_outBuffer = NULL; - m_postRequest = 0; - m_compressed = 0; - m_postRequestLength = 0; - m_state = &protocol_HTTPStyle::state_GetLine; - m_nextState = &protocol_HTTPStyle::state_AnalyzeHTTPHeaders; - - // Parse the first line of the HTTP transaction into it's components - // (GET/POST etc, url, query etc.) and now is done first so we can - // abort the request asap if getting bad data instead of waiting to - // process the headers and then look at the actual HTTP request... - string request, url, protocolAndVersion; - const int state = getHTTPRequestDetails(firstLine, request, url, protocolAndVersion); - if (!request.empty()) - { - if (request == "GET") - { - m_httpRequestInfo.m_request = HTTP_GET; - } - else if (request == "POST") - { - m_httpRequestInfo.m_request = HTTP_POST; - m_postRequest = 1; - } - else if (request == "HEAD") - { - m_httpRequestInfo.m_request = HTTP_HEAD; - } - else - { - ELOG(m_clientLogString + "Badly formed HTTP request [" + firstLine + "]"); - sendMessageAndClose(MSG_HTTP405); - return; - } - } - else - { - ELOG(m_clientLogString + "Badly formed HTTP request [" + firstLine + "]"); - sendMessageAndClose(MSG_HTTP405); - return; - } - - if ((m_httpRequestInfo.m_request == HTTP_UNKNOWN) || - (state != 3) || url.empty() || protocolAndVersion.empty() || - (protocolAndVersion.find("/") == string::npos)) - { - ELOG(m_clientLogString + "Badly formed HTTP request [" + firstLine + "]"); - sendMessageAndClose(MSG_HTTP400); - return; - } - - // check for query data and finish up url - string::size_type pos = url.find("?"); - m_httpRequestInfo.m_url = urlUtils::unescapeString(url.substr(0, pos)); - - // provide a stripped version to speed up some of the checks - const utf8::size_type upos = m_httpRequestInfo.m_url.find(utf8("/")); - m_url = (((upos == 0) && m_httpRequestInfo.m_url.size() > 1) ? - m_httpRequestInfo.m_url.substr(upos + 1) : m_httpRequestInfo.m_url); - - // this is so we can do Icecast title updates which use - // a different path but will do a ?mode=updinfo request - if (m_url == "admin/metadata") - { - m_url = "admin.cgi"; - } - - string queryData = ""; - if (pos != string::npos) - { - queryData = url.substr(pos+1); - const vector<string> queryTokens = tokenizer(queryData,'&'); - utf8 lastToken; - for (vector<string>::const_iterator i = queryTokens.begin(); i != queryTokens.end(); ++i) - { - // this is for a specific case when we get xml titles - // and we need it to preserve the data instead of it - // tokenising and leaving broken xml for & cases - if (!lastToken.empty() && ((*i).find("amp;") == 0)) - { - m_httpRequestInfo.m_QueryParameters[lastToken] = m_httpRequestInfo.m_QueryParameters[lastToken] + - "&" + urlUtils::unescapeString((*i)); - // we don't want to process like normal so skip - continue; - } - pos = (*i).find("="); - if (pos == string::npos) - { - m_httpRequestInfo.m_QueryParameters[(lastToken = urlUtils::unescapeString(*i))] = ""; - } - else - { - m_httpRequestInfo.m_QueryParameters[(lastToken = urlUtils::unescapeString((*i).substr(0, pos)))] = - urlUtils::unescapeString((*i).substr(pos + 1)); - } - } - } - - if (gOptions.httpStyleDebug()) - { - DLOG(m_clientLogString + "HTTP Request [" + (m_httpRequestInfo.m_request == HTTP_GET ? "GET" : - (m_httpRequestInfo.m_request == HTTP_POST ? "POST" : - (HEAD_REQUEST ? "HEAD" : "UNKNOWN"))) + "]"); - DLOG(m_clientLogString + "HTTP Url [" + m_url + "]"); - if (!queryData.empty()) DLOG(m_clientLogString + "HTTP Query [" + queryData + "]"); - pos = protocolAndVersion.find("/"); - DLOG(m_clientLogString + "HTTP Protocol [" + protocolAndVersion.substr(0, pos) + "]"); - DLOG(m_clientLogString + "HTTP Version [" + protocolAndVersion.substr(pos + 1) + "]"); - } -} - -protocol_HTTPStyle::~protocol_HTTPStyle() throw() -{ - socketOps::forgetTCPSocket(m_socket); -} - -void protocol_HTTPStyle::timeSlice() throw(std::exception) -{ - (this->*m_state)(); -} - -void protocol_HTTPStyle::getPNGImage(const uniString::utf8 &png) throw() -{ - const utf8 &modified = mapGet(m_httpRequestInfo.m_HTTPHeaders, utf8("if-modified-since"),utf8("0")); - const time_t curTime = ::time(NULL), - readTime = readRFCDate(modified), - diffTime = (curTime - readTime); - - // check if we need to provide a copy or if we can just do a '304 Not Modified' response - if (!readTime || (diffTime > g_upTime) || (diffTime > 31536000)) - { - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:image/png\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Cache-Control:private,max-age=31536000\r\n" - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(g_upTime) + "\r\n" - "Content-Length:" + tos(png.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? png : "")); - } - else - { - sendMessageAndClose("HTTP/1.0 304 Not Modified\r\n\r\n"); - } -} - -const utf8 protocol_HTTPStyle::getClientIP(const bool streamPublic, const utf8 &publicIP) throw() -{ - // test for potentially invalid IPs or ones that will cause the playlist link generation to fail - // attempting to use the server path provided by the YP if in public mode, otherwise uses 'host' - DEBUG_LOG(m_clientLogString + "streamPublic: " + tos(streamPublic) + " " + - "publicIP: " + publicIP + " " + "hostIP: " + m_hostIP + " " + - "clientAddr: " + g_IPAddressForClients); - return (!streamPublic || publicIP.empty() ? - ((g_IPAddressForClients.find(utf8("0.")) == 0 || - // allow localhost / loopback connections through for admin access - ((!g_IPAddressForClients.empty() && g_IPAddressForClients.find(utf8("127.")) == 0)) || - g_IPAddressForClients.empty()) && !m_hostIP.empty() ? - m_hostIP : (!m_hostIP.empty() ? m_hostIP : g_IPAddressForClients)) : publicIP); -} - -const bool isCDNMaster(const streamData::streamID_t sid) -{ - if (!gOptions.cdn().empty()) - { - // check if opt-in or opt-out - bool isCDN = (gOptions.cdn() == "always" || gOptions.cdn() == "master"); - // then if manually specifed, we override - if (gOptions.read_cdn_master(sid)) - { - const int master = gOptions.cdn_master(sid); - if (master != -1) - { - isCDN = (!!master); - } - } - return isCDN; - } - return false; -} - -const bool isCDNSlave(const streamData::streamID_t sid) -{ - if (!gOptions.cdn().empty()) - { - // check if opt-in or opt-out - // for 'master' we run opt-in - bool isCDN = (gOptions.cdn() == "always"); - // then if manually specifed, we override - if (gOptions.read_cdn_slave(sid)) - { - const int slave = gOptions.cdn_slave(sid); - if (slave != -1) - { - isCDN = (!!slave); - } - } - return isCDN; - } - return false; -} - -const bool protocol_HTTPStyle::isAdminAccessAllowed(const uniString::utf8 &hostIP, const uniString::utf8 &hostName) throw() -{ - int inAdminIp = g_adminList.find(hostIP), - inAdminName = inAdminIp; - - DEBUG_LOG(m_clientLogString + "Pre-check admin access - hostIP: " + - hostIP + ", hostName: " + hostName + ", " + "inAdminIp: " + - tos(inAdminIp) + ", inAdminName: " + tos(inAdminName)); - - // 1 if found, 0 if not, -1 if empty (assume allowed) - if (inAdminIp == -1) - { - // abort and just pass through if there's no list - return true; - } - - // in a lot of cases it will work out that - // hostIP and hostName are set as the same - // so only try if there is a difference... - if (!hostName.empty() && (hostIP != hostName)) - { - inAdminName = g_adminList.find(hostName); - } - - DEBUG_LOG(m_clientLogString + "Checking admin access - hostIP: " + - hostIP + ", hostName: " + hostName + ", " + "inAdminIp: " + - tos(inAdminIp) + ", inAdminName: " + tos(inAdminName)); - - // if either check matches then we will allow the - // request as the host might map to an allowed IP - // etc. is only if both don't match then we block - return (inAdminIp || inAdminName); -} - -const bool protocol_HTTPStyle::isAccessAllowed(const streamData::streamID_t sid, const utf8 &hostAddr = "", - const bool showOutput = false) throw() -{ - if (isUserAgentOfficial(m_userAgentLowered)) - { - return true; - } - - const utf8& addr = (hostAddr.empty() ? m_clientAddr : hostAddr); - const bool inBan = g_banList.find(addr,((gOptions.read_stream_banFile(sid) && !gOptions.stream_banFile(sid).empty()) ? sid : 0)); - const bool inRip = g_ripList.find(addr,((gOptions.read_stream_ripFile(sid) && !gOptions.stream_ripFile(sid).empty()) ? sid : 0)); - const bool isCDN = isCDNMaster(sid); - bool ripOnly = (isCDN ? true : gOptions.stream_ripOnly(sid)); - - if (!gOptions.read_stream_ripOnly(sid)) - { - ripOnly = (isCDN ? true : gOptions.ripOnly()); - } - - if (gOptions.httpStyleDebug()) - { - string host = m_clientAddr.hideAsString(); - if (gOptions.nameLookups()) - { - host = m_clientAddr.hideAsString(); - string addr = host; - u_short port = 0; - socketOps::getpeername(this->m_socket, addr, port); - - if (socketOps::addressToHostName(addr, port, host)) - { - host = addr; - } - - DEBUG_LOG(m_clientLogString + "Checking access rights - addr: " + addr + ", " + - "host: " + host + ", " + "inBan: " + tos(inBan) + ", " + "inRip: " + - tos(inRip) + ", " + "isCDN: " + tos(isCDN) + ", " + "ripOnly: " + tos(ripOnly)); - } - else - { - DEBUG_LOG(m_clientLogString + "Checking access rights - addr: " + addr + ", " + - "inBan: " + tos(inBan) + ", " + "inRip: " + tos(inRip) + ", " + - "isCDN: " + tos(isCDN) + ", " + "ripOnly: " + tos(ripOnly)); - } - } - - // check here if we're ok to try to provide the stream to the client or not - bool allowed = true; - if ((ripOnly || inBan) && (!inRip)) - { - allowed = false; - if (ripOnly) - { - // allow localhost / loopback connections through for admin access - if (!m_clientAddr.empty() && m_clientAddr.find(utf8("127.")) == 0) - { - allowed = true; - } - else - { - if (showOutput) - { - if (gOptions.nameLookups()) - { - string hostName = m_clientAddr.hideAsString(); - string addr = hostName; - u_short port = 0; - socketOps::getpeername(this->m_socket, addr, port); - - if (socketOps::addressToHostName(addr, port, hostName)) - { - hostName = addr; - } - - if (hostName != addr) - { - WLOG("[" + hostName + " (" + m_clientAddr + ") sid=" + tos(sid) + "] Host not in reserved list - disconnecting."); - } - else - { - WLOG("[" + m_clientAddr + " sid=" + tos(sid) + "] IP not in reserved list - disconnecting."); - } - } - else - { - WLOG("[" + m_clientAddr + " sid=" + tos(sid) + "] IP not in reserved list - disconnecting."); - } - - m_result.schedule(1000); - } - } - } - else - { - // allow loopback address through for admin access - if (!m_clientAddr.empty() && m_clientAddr.find(utf8("127.")) == 0) - { - allowed = true; - } - else - { - utf8::size_type pos; - if (!m_referer.empty() && (pos = m_referer.rfind(utf8("/admin.cgi"))) != utf8::npos) - { - allowed = true; - } - - if (showOutput && !(m_url == "index.css")) - { - allowed = false; - if (gOptions.nameLookups()) - { - string hostName = m_clientAddr.hideAsString(); - string addr = hostName; - u_short port = 0; - socketOps::getpeername(this->m_socket, addr, port); - - if (socketOps::addressToHostName(addr, port, hostName)) - { - hostName = addr; - } - - if (hostName != addr) - { - ILOG("[" + hostName + " (" + m_clientAddr + ") sid=" + tos(sid) + "] Host in banned list - disconnecting."); - } - else - { - ILOG("[" + m_clientAddr + " sid=" + tos(sid) + "] IP in banned list - disconnecting."); - } - } - else - { - ILOG("[" + m_clientAddr + " sid=" + tos(sid) + "] IP in banned list - disconnecting."); - } - - m_result.schedule(1000); - } - } - } - } - return allowed; -} - -const bool protocol_HTTPStyle::isViewingAllowed(const streamData::streamID_t sid, const utf8 &password, - const bool no_stream, bool &adminOverride, - const bool hide, bool &passworded) throw() -{ - adminOverride = false; - // when the hidestats option is enabled, still need to allow it on the admin page - if (m_referer.rfind(utf8("/admin.cgi")) != utf8::npos) - { - adminOverride = true; - } - - // do a password check if we've got a hidden page or if a password param is present - bool proceed = false; - - if ((hide == true) || (passworded == true)) - { - passworded = false; - if (!password.empty()) - { - utf8 streamPassword; - if (!no_stream) - { - streamPassword = gOptions.stream_password(sid); - if (!gOptions.read_stream_password(sid) && streamPassword.empty()) - { - streamPassword = gOptions.password(); - } - } - - utf8 streamAdminPassword = gOptions.stream_adminPassword(sid); - if (!gOptions.read_stream_adminPassword(sid) && streamAdminPassword.empty()) - { - streamAdminPassword = gOptions.adminPassword(); - } - - passworded = ((!streamPassword.empty() && (password == streamPassword)) || - (!streamAdminPassword.empty() && (password == streamAdminPassword))); - - if (hide) - { - proceed = passworded; - } - } - } - - return proceed; -} - -const bool protocol_HTTPStyle::findBaseStream(bool& no_sid, streamData::streamID_t& sid) -{ - // if no sid is specified, attempt to match to the only stream (v1 like behaviour) - // before just attempting to provide the results for the default stream id (sid=1) - if (no_sid) - { - bool htmlPage = false; - streamData::streamID_t found_sid = streamData::getStreamIdFromPath(m_httpRequestInfo.m_url, htmlPage); - if (found_sid > 0) - { - sid = found_sid; - no_sid = false; - } - - streamData::streamID_t lastSID = 0; - if (!found_sid && streamData::totalActiveStreams(lastSID) == (streamData::streamID_t)DEFAULT_CLIENT_STREAM_ID) - { - sid = lastSID; - return true; - } - } - return false; -} - -const bool protocol_HTTPStyle::getCachedResponse(cacheItem *item, AOL_namespace::mutex &lock, const int limit) -{ - utf8 response; - if (GetFromCache(item, lock, m_lastActivityTime, !!m_compressed, HEAD_REQUEST, response, limit)) - { - sendMessageAndClose(response); - return true; - } - return false; -} - -void protocol_HTTPStyle::sendCachedResponse(cacheItem *item, CacheMap_t &cache, AOL_namespace::mutex &lock, - uniString::utf8 &header, uniString::utf8 &body, - const streamData::streamID_t sid, - const bool jsonp, const bool noCompress) -{ - if (sid && !noCompress) - { - COMPRESS(header, body); - } - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - - const utf8 &response = (header + body); - if (!jsonp) - { - // if a callback is specified then is best to not cache - AddorUpdateCache(item, m_lastActivityTime, !!m_compressed, - header, response, cache, lock, sid); - } - sendMessageAndClose((!HEAD_REQUEST ? response : header)); -} - -// look at the HTTP intro line and headers and decide what to do next -void protocol_HTTPStyle::state_DetermineAction() throw(exception) -{ - utf8 relayHostIP, relayHostName, XFF; - - // figure out what to do next based on HTTP intro line and headers - // dump http headers to log - for (map<utf8,utf8>::const_iterator i = m_httpRequestInfo.m_HTTPHeaders.begin(); i != m_httpRequestInfo.m_HTTPHeaders.end(); ++i) - { - DEBUG_LOG(m_clientLogString + "HTTP Header [" + (*i).first + ":" + (*i).second + "]"); - // grab the ip used for accessing to determine - // the ip to return in the listen action when - // destip has not been specified or is invalid - if ((*i).first == "host") - { - m_hostIP = (*i).second; - if (!m_hostIP.empty()) - { - // strip off the port from the ip though - // could just use it but want to ensure - // the correct port is used for it all - utf8::size_type pos = utf8::npos; - if ((pos = m_hostIP.find(utf8(":"))) != utf8::npos) - { - m_hostIP.resize(pos); - } - } - } - - // used specificially with the fire buuilds to be able to work around - // issues with the VIPs and what is checked against the reserved list - // -this gets the IP and also will resolve the hostname as applicable - else if ((*i).first == "icy-host") - { - relayHostIP = (*i).second; - if (gOptions.nameLookups()) - { - u_short port = 0; - string addr, hostName; - socketOps::getpeername(m_socket, addr, port); - hostName = relayHostIP.hideAsString(); - if (socketOps::addressToHostName(addr, port, hostName)) - { - hostName = relayHostIP.hideAsString(); - } - relayHostName = hostName; - } - } - - else if ((*i).first == "x-forwarded-for") - { - //utf8 blah = "129.78.138.66";//", 129.78.64.103"; - // this can be in the format of client - // or client, proxy1, proxy2, etc. and - // it can be open to spoofing so we'll - // see what complaints that will arise - if (!(*i).second.empty()) - { - utf8::size_type pos = utf8::npos; - if ((pos = (*i).second.find(utf8(","))) != utf8::npos) - { - utf8 tempAddr = (*i).second.substr(0, pos); - if (!tempAddr.empty()) - { - tempAddr = stripWhitespace(tempAddr); - in_addr_t ip = inet_addr((const char *)tempAddr.c_str()); - if (ip != INADDR_NONE) - { - XFF = tempAddr; - } - } - } - else - { - utf8 tempAddr = stripWhitespace((*i).second); - if (!tempAddr.empty()) - { - in_addr_t ip = inet_addr((const char *)tempAddr.c_str()); - if (ip != INADDR_NONE) - { - XFF = tempAddr; - } - } - } - } - } - - else if ((*i).first == "referer") - { - m_referer = (*i).second; - } - - else if ((*i).first == "accept-encoding") - { - utf8 encoding = (*i).second; - if (!encoding.empty()) - { - vector<utf8> encodingTokens = tokenizer(stripWhitespace(encoding), ','); - for (vector<utf8>::const_iterator i = encodingTokens.begin(); i != encodingTokens.end(); ++i) - { - utf8 value = stripWhitespace(*i); - if (value == "gzip") - { - m_httpRequestInfo.m_AcceptEncoding |= ACCEPT_GZIP; - m_compressed = 1; - } - else if (value == "deflate") - { - m_httpRequestInfo.m_AcceptEncoding |= ACCEPT_DEFLATE; - } - } - } - } - } - - // attempt to work out the streamid to use, keeping a track of things, etc - // - // for b195+ we recognise the sid from the password if - // its not provided as a specific parameter on the url - streamData::streamID_t sid = mapGet(m_httpRequestInfo.m_QueryParameters, "sid", -1), realSID = sid; - // with means in b72+ to do this based on the streampath instead of by sid - utf8 sp = mapGet(m_httpRequestInfo.m_QueryParameters, "sp", (utf8)""); - bool hasMount = false; - if (sp.empty()) - { - // this allows us to support icecast based title updates and on - // reflection would have been the better naming to use vs 'sp'. - sp = mapGet(m_httpRequestInfo.m_QueryParameters, "mount", (utf8)""); - hasMount = !sp.empty(); - } - if (!sp.empty()) - { - bool htmlPage = false; - // make sure there is a / on the front so that we're - // going to be able to search for a match correctly. - if (sp.find(utf8("/")) != 0) - { - sp = "/" + sp; - } - streamData::streamID_t found_sid = streamData::getStreamIdFromPath(sp, htmlPage); - if (found_sid > 0) - { - realSID = sid = found_sid; - } - } - - bool no_sid = ((int)sid <= 0); - // check that we've got a valid sid, otherwise force assume it's sid=1 i.e. helps for just /listen.pls - sid = ((sid >= DEFAULT_CLIENT_STREAM_ID) && !(no_sid && ((int)sid <= -1)) ? sid : DEFAULT_CLIENT_STREAM_ID); - - // this will better handle user agents which could have high bit code points - // so we attempt to convert the string to a hopefully valid utf8 encoded string - string agent = string(mapGet(m_httpRequestInfo.m_HTTPHeaders, "user-agent", (utf8)"").toANSI()); - m_userAgentLowered = toLower((m_userAgent = asciiToUtf8(agent))); - - if (isUserAgentRelay(m_userAgentLowered)) - { - bool allowRelay = gOptions.stream_allowRelay(sid); - if (!gOptions.read_stream_allowRelay(sid)) - { - allowRelay = gOptions.allowRelay(); - } - - if (!allowRelay && !(m_url == "admin.cgi")) - { - ILOG(m_clientLogString + "Relay not allowed: `" + m_userAgent + "'."); - sendMessageAndClose(MSG_HTTP403); - return; - } - } - - if ((m_userAgentLowered.find(utf8("rip")) != utf8::npos) || - (m_userAgentLowered.find(utf8("copy")) != utf8::npos)) - { - if (!(m_url == "admin.cgi")) - { - ILOG(m_clientLogString + "Stream savers not allowed."); - sendMessageAndClose(MSG_HTTP403); - return; - } - } - - utf8::size_type ipos = m_url.find(utf8("images/")); - if ((ipos == 0) || (m_url == "favicon.ico")) - { - utf8 url = (ipos == 0 ? m_url.substr(7) : m_url); - if (url == "favicon.ico") - { - const utf8 &modified = mapGet(m_httpRequestInfo.m_HTTPHeaders, utf8("if-modified-since"), utf8("0")); - const time_t curTime = ::time(NULL), - readTime = readRFCDate(modified), - diffTime = (curTime - readTime); - - // check if we need to provide a copy or if we can just do a '304 Not Modified' response - if (!readTime || (diffTime > gOptions.m_favIconTime) || (diffTime > 31536000)) - { - - const int g_favIconSize = 1150; - const uniString::utf8::value_type g_favIcon[] = { - "\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x20\x00\x68\x04" - "\x00\x00\x16\x00\x00\x00\x28\x00\x00\x00\x10\x00\x00\x00\x20\x00" - "\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x40\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x14\x9a\xfd\x2f\x13\x95\xfe\x54\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x98\xfd\x3d\x16\x98\xfd\xff\x15\x97" - "\xfd\xab\x11\x95\xfd\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x4c\xba\xfc\x02\x31\xa5\xfc\xa2\x1a\x9a" - "\xfd\xff\x16\x99\xfd\xea\x13\x95\xfd\x5a\x07\x7a\xfe\x01\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\xb4\xfb\x05\x46\xb2" - "\xfc\xb2\x28\xa0\xfb\xff\x16\x98\xfd\xff\x15\x98\xfd\xb0\x11\x93" - "\xfd\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xb5" - "\xfd\x09\x4b\xb7\xfd\xbf\x3a\xaa\xfb\xff\x1a\x98\xfc\xff\x16\x98" - "\xfd\xed\x14\x98\xfe\x60\x08\x81\xfe\x01\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x98" - "\xfd\x21\x1e\x9e\xfd\x82\x41\xb1\xfd\xfa\x49\xb4\xfc\xff\x28\x9e" - "\xfa\xff\x16\x97\xfd\xff\x15\x98\xfd\xb6\x10\x95\xfd\x1d\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x98" - "\xfd\x48\x16\x98\xfd\xff\x19\x99\xfd\xff\x42\xb0\xfc\xff\x4d\xb7" - "\xfc\xff\x3a\xa9\xfa\xff\x1a\x97\xfb\xff\x14\x98\xf9\x8f\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x99" - "\xf9\x17\x3a\xa8\xfa\xaf\x3d\xaa\xfa\xfe\x40\xad\xfb\xff\x3d\xac" - "\xfb\xff\x4d\xb7\xfc\xff\x49\xb4\xfc\xf6\x24\x97\xf5\x6c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x4a\xb5\xfd\x48\x4c\xb7\xfc\xd7\x1f\x97" - "\xf9\xff\x36\xa7\xfa\xff\x19\x9a\xfd\xc8\x0e\x92\xfe\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\xac\xfd\x07\x1e\x98" - "\xfa\xd6\x4c\xb6\xfc\xf1\x27\x9d\xfa\xff\x15\x97\xfd\xbe\x10\x9a" - "\xfd\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x90" - "\xfa\x8d\x4a\xb5\xfc\x1b\x4a\xb6\xfc\xa4\x29\xa0\xfb\xfd\x15\x97" - "\xfd\xb6\x10\x94\xfd\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x8e" - "\xf9\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x49\xb6\xfc\x3d\x27\xa1" - "\xfc\xce\x15\x97\xfd\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x2d\x2d\x2d\x02\x2e\x2e\x2e\x08\x0f\x8c" - "\xfa\x4a\x2a\x2a\x2a\x09\x00\x00\x00\x00\x00\x00\x00\x00\x45\xb4" - "\xf8\x04\x13\x92\xf7\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x36\x36\x36\x29\x2f\x2f\x2f\x2d\x0e\x7f" - "\xe7\x2e\x31\x31\x31\x38\x33\x33\x33\x21\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x35\x35\x35\x33\x31\x31\x31\x50\x23\x55" - "\x85\x38\x32\x32\x32\x4d\x33\x33\x33\x21\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x2b\x2b\x2b\x02\x34\x34\x34\x4d\x35\x35" - "\x35\x60\x32\x32\x32\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\xff" - "\x00\x00\xc3\xff\x00\x00\xc0\xff\x00\x00\xe0\x7f\x00\x00\xf0\x1f" - "\x00\x00\xf0\x0f\x00\x00\xf0\x0f\x00\x00\xf0\x0f\x00\x00\xfc\x0f" - "\x00\x00\xfe\x07\x00\x00\xff\x03\x00\x00\xff\x63\x00\x00\xfc\x33" - "\x00\x00\xfc\x1f\x00\x00\xfc\x1f\x00\x00\xfc\x3f\x00\x00" - }; - - const int g_favIconSizeGZ = 498; - const uniString::utf8::value_type g_favIconGZ[] = { - "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x63\x60\x60\x04\x42\x01" - "\x01\x06\x20\xa9\xc0\x90\xc1\xc2\xc0\x20\xc6\xc0\xc0\xa0\x01\xc4" - "\x40\x21\xa0\x08\x44\x1c\x04\x1c\x58\x18\x70\x02\x91\x59\x7f\xf5" - "\x85\xa7\xfe\x0b\xc1\xad\x02\x3f\x90\x98\xf1\xd7\x56\x6c\xc6\xdf" - "\xff\xa2\xd3\xff\xae\x16\x9c\xfa\x57\x9c\x54\xfd\x3e\xbb\xfe\x30" - "\x19\x2e\xfd\xb3\x48\x6a\xd6\xdf\xff\x62\x33\xff\xbe\x12\x9e\xfa" - "\x37\x8a\xbd\xea\x1f\x23\x29\x66\xb8\x6c\xf9\xcd\xea\xb6\xe9\xcf" - "\x26\x8d\x05\xbf\xff\x83\xdd\x32\xe3\xef\x06\xc1\xc9\x7f\xa5\x49" - "\x31\xc3\x6d\xeb\x5f\x4e\xef\xed\x7f\xf7\x5b\xad\xfa\xfd\x5f\x6a" - "\xc6\x1f\x90\x39\x6f\x45\x66\xfc\x4b\xe0\x68\x24\xce\x2d\xc2\x33" - "\xfe\x2a\xca\xcd\xfb\xdb\xe4\xb8\xf1\xef\x2f\xcf\x2d\x7f\xfe\x6b" - "\xcc\xfb\xf5\x5f\x6c\x3a\xd8\x2d\xdb\x04\xa6\xfe\x95\x25\xa4\x1f" - "\xa8\xce\x03\xe4\x76\xc9\x99\x7f\xff\x3b\x6d\xf8\xf3\xdf\x77\xfb" - "\x9f\xff\x56\x2b\x7f\xfd\x97\x9a\xfe\xfb\xbf\xc8\x8c\x9f\xfd\x84" - "\xf4\xab\xcd\xfc\x29\x6e\xb5\xe2\xd7\x7a\xdb\x55\xbf\xfe\x39\xac" - "\xfd\xfd\xdf\x76\xcd\x6f\xb0\x19\x40\xb7\x7c\x53\x99\xfe\x35\x87" - "\x18\x3f\x80\x80\xd7\xd6\xbf\x1e\x3e\xdb\xff\x5c\x97\x9f\xfe\xf3" - "\xbf\xd9\xf2\x5f\xff\x25\x67\xfd\x3d\xc1\x37\xe9\x1f\x0f\xb1\xfa" - "\x41\x40\x77\xcd\x5f\x76\xb9\x19\xbf\xae\xf9\x6c\xfb\xf3\x51\x7d" - "\xee\x2f\x50\xda\xd8\x27\x30\xeb\x2f\x17\x29\x66\x08\x4d\xf8\xd5" - "\xeb\xb5\xf5\x8f\xb4\xd7\xb6\x3f\x4b\x34\x17\xfc\xfe\x0b\x34\x63" - "\x9b\xc0\x94\xbf\x6c\xc4\xea\x17\xec\xfb\x09\xf7\xb3\xe7\xb6\x3f" - "\xb6\xea\x0b\xff\x9c\x03\x9a\xa1\x4a\xd0\xed\xba\xba\x4c\x7a\x7a" - "\x7a\x1c\xfc\x3d\xbf\xbc\xb4\xb4\xb4\x38\x61\xe2\xae\x5b\x7e\xb0" - "\x08\x4f\xfa\x4e\xd0\x7e\x33\x33\x33\x4d\x7d\x7d\x7d\x5d\xbe\xfa" - "\xe7\x7a\x86\x86\x86\x16\xc6\xc6\xc6\x8a\xc4\xba\x19\x04\x4c\x4d" - "\x4d\x8d\x81\xfa\x02\x94\x43\x5b\x2d\x8c\x8c\x8c\x7c\x49\xd5\xaf" - "\xad\xad\xcd\x64\x62\x62\xe2\x0b\x34\x27\x01\xa8\xdf\x01\x97\xba" - "\xf3\xff\x19\x18\x0e\x03\xf1\x01\x20\x7e\x50\xcf\xc0\xf0\x41\x1e" - "\x88\xf9\x11\xf8\x0f\x10\xff\x63\x67\x60\xf8\xcf\x0c\xc4\xc9\x40" - "\xbe\x31\x10\xcb\x43\xb1\x3d\x03\x03\x00\x34\x69\x3c\x26\x7e\x04" - "\x00\x00" - }; - - const time_t modTime = (!gOptions.m_favIconTime ? (gOptions.m_favIconTime = curTime) : gOptions.m_favIconTime); - utf8 header = "HTTP/1.0 200 OK\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Content-Type:" + gOptions.faviconFileMimeType() + "\r\n" - "Content-Length:" + tos((m_compressed ? g_favIconSizeGZ : g_favIconSize)) + "\r\n" - + (m_compressed ? "Content-Encoding:gzip\r\n" : "") + - "Cache-Control:private,max-age=31536000\r\n" - "Expires:" + getRFCDate(::time(NULL) + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(0) + "\r\n\r\n", - body = (m_compressed ? utf8(g_favIconGZ,g_favIconSizeGZ) : utf8(g_favIcon,g_favIconSize)); - - if(gOptions.faviconFile() == "") - { - } - else - { - if (gOptions.m_faviconBody.empty()) - { - body = loadLocalFile(fileUtil::getFullFilePath(gOptions.faviconFile())); - if (!body.empty()) - { - gOptions.m_faviconBodyGZ = gOptions.m_faviconBody = body; - - gOptions.m_faviconHeader = "HTTP/1.0 200 OK\r\n" - "Content-Type:" + gOptions.faviconFileMimeType() + "\r\n" - "Content-Length:" + tos(body.size()) + "\r\n" - "Cache-Control:private,max-age=31536000\r\n" - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(modTime) + "\r\n\r\n"; - - if (compressData(gOptions.m_faviconBodyGZ)) - { - gOptions.m_faviconHeaderGZ = "HTTP/1.0 200 OK\r\n" - "Content-Type:" + gOptions.faviconFileMimeType() + "\r\n" - "Content-Length:" + tos(gOptions.m_faviconBodyGZ.size()) + "\r\n" - "Cache-Control:private,max-age=31536000\r\n" - "Content-Encoding:gzip\r\n" - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(modTime) + "\r\n\r\n"; - } - else - { - gOptions.m_faviconHeaderGZ.clear(); - } - } - else - { - body = MSG_HTTP404; - } - } - - if (!gOptions.m_faviconBody.empty()) - { - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_faviconBodyGZ.empty()) - { - body = gOptions.m_faviconBodyGZ; - header = gOptions.m_faviconHeaderGZ; - } - else - { - body = gOptions.m_faviconBody; - header = gOptions.m_faviconHeader; - } - } - } - - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - else - { - sendMessageAndClose("HTTP/1.0 304 Not Modified\r\n\r\n"); - } - return; - } - else if (url == "listen.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x16\x00\x00\x00\x0D\x08\x04\x00\x00\x00\x07\xAC\x56" - "\xE8\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC3\x00\x00\x0E" - "\xC3\x01\xC7\x6F\xA8\x64\x00\x00\x01\x2A\x49\x44\x41\x54\x28\xCF" - "\x63\xF8\xC7\x88\x05\xBA\x82\x21\xF3\x3F\xAD\x5F\x13\x9E\x4F\x7D" - "\x33\xF9\x9F\xF2\x3F\x1E\x90\x38\x03\x16\xA5\xE9\xFF\xFE\xEF\xFA" - "\xFF\xEF\xFF\x3F\x96\x4F\x3A\xC7\xF6\xA4\xBD\xBB\x76\xF7\xE3\xAD" - "\x7F\x1A\x20\xE5\x98\x8A\x3B\xFF\xFD\x9F\xF1\x9F\x01\xA4\xD8\xF0" - "\xBD\xF1\xB9\x5D\x1E\x9F\x95\x7E\x5E\xBC\xF7\x76\xDD\x3F\x41\x54" - "\xC5\xAB\xC1\xF0\x7F\x19\x50\x29\x48\xF1\xB7\xA5\xBB\xB6\x3E\xDF" - "\xF2\xEA\x76\xE4\xCF\xA0\x5F\x6F\x3F\xFE\xD3\xFE\xC7\x8F\xAC\xF8" - "\x7F\x08\x18\x32\x40\x15\x9F\x5F\xEF\xF5\xD4\xF3\xE9\x8B\x3D\xD7" - "\x3F\xF1\xFF\xBB\xF8\xE9\x6E\x1E\x9A\x62\x06\x24\xF8\xF7\xFF\xCB" - "\x15\x4F\xF6\x58\xBC\x9A\x7D\xEE\xF5\x47\xD7\xDF\x53\xBF\x3D\x6A" - "\xC0\xAB\xB8\x5E\xED\xED\xD1\xDC\x87\xA5\xF7\x5F\xEE\xF3\x79\x56" - "\x74\x8B\x80\xE2\x57\x5D\x4F\x8E\x1B\x7E\x58\x78\xE5\xF5\x17\xE7" - "\x3F\x33\x7E\x60\x28\x46\x75\xF3\x8B\xEE\xCC\x47\xC1\xCF\x5F\x1D" - "\x3B\xF3\x95\xE7\xDF\xA5\xAF\x77\x73\x51\x15\xA3\x85\xC6\x9F\xD6" - "\xB3\x2B\x5E\xEE\x7E\x71\xD1\xED\x4F\xEE\xAF\xF7\x5F\xD0\x43\x03" - "\x3D\x9C\x15\x7F\x68\x9F\x3B\x68\xF7\x51\xEB\xEB\x8D\xCB\xAF\xA7" - "\xFC\xE3\xC7\x1F\x83\xCC\x9F\x74\x4E\x1C\xCE\x7C\x71\xE3\xF2\xA7" - "\xF3\xFF\x14\xB0\xC7\x20\x6A\xDA\xE8\x7A\xD6\xFF\xAA\x0F\xA8\x94" - "\x0B\x24\x0E\x00\x69\xB1\x67\x35\x8E\x65\x16\x39\x00\x00\x00\x00" - "\x49\x45\x4E\x44\xAE\x42\x60\x82", 376); - getPNGImage(png); - } - else if (url == "history.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0F\x08\x04\x00\x00\x00\x95\x2A\x8D" - "\xFC\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0B\x12\x00\x00\x0B" - "\x12\x01\xD2\xDD\x7E\xFC\x00\x00\x00\xA5\x49\x44\x41\x54\x18\xD3" - "\x6D\x90\xA1\x12\xC3\x20\x0C\x86\x79\x84\x49\xEC\xE4\x64\x65\xED" - "\x24\x72\x72\x76\xB2\xB2\x72\xB6\xB2\xB2\x12\x5B\x89\x9C\x9C\xED" - "\x23\x20\x79\x95\x7F\x3F\xA1\x39\x22\xC6\x77\x90\xE3\xBE\x4B\x02" - "\x71\x01\x16\x8F\x19\x4E\x57\xE0\xA5\x73\xC3\xD8\x65\xC0\x62\x18" - "\x28\xEE\x2A\x03\x36\xC3\x20\x78\x55\xBB\x21\x09\x93\xAA\x0F\x59" - "\xF1\x34\x31\xA8\x3A\x58\xE8\xC5\x5D\x63\x64\xCE\x17\x0F\x55\x91" - "\x05\x22\xB2\xC4\x84\x0B\xCF\xB5\xF7\x9A\xB8\xB3\xC4\xC4\x27\x78" - "\x16\x2D\x10\x95\x4D\xDE\x8E\xAB\x30\x57\x59\x7B\xB5\x6E\x35\x26" - "\x7E\xBA\x71\xE0\x7C\x61\xA7\xFD\xEC\xDD\xB2\x2C\x1B\x07\x35\xB2" - "\x7C\xE9\x93\xD4\x75\x70\x4C\xCB\x3F\xE1\x5C\x61\x0F\x15\x3F\x46" - "\x11\xE5\xA0\x02\x5A\xBC\xC7\x00\x00\x00\x00\x49\x45\x4E\x44\xAE" - "\x42\x60\x82", 243); - getPNGImage(png); - } - else if (url == "lock.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x08\x00\x00\x00\x0B\x08\x04\x00\x00\x00\xE8\x92\x04" - "\xAE\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC3\x00\x00\x0E" - "\xC3\x01\xC7\x6F\xA8\x64\x00\x00\x00\x81\x49\x44\x41\x54\x08\xD7" - "\x8D\xC8\x3D\x0E\x82\x40\x10\x86\xE1\xA1\xB1\xF2\xAF\x30\xA1\xE0" - "\x4A\xD6\x34\x9E\x80\xD6\x0A\xAD\x37\x14\x34\x44\xAF\xA0\xD7\xD2" - "\x1B\xD0\xC1\xEE\xB7\xCC\x30\xC3\x96\xD8\x99\xA7\x79\xF3\x92\x66" - "\x52\xA2\xF7\x09\x7A\x29\x35\xA3\xB9\x80\x7F\xC7\x5C\x73\x7D\x01" - "\xC3\x5C\x10\x57\xDF\x70\xB0\x2B\xDF\xA6\xA3\x7E\x46\xAE\x88\xDD" - "\x73\x3A\x0B\x3C\x86\x0B\x3F\xC0\x8E\x10\x6B\xB9\x0B\x80\xD0\x4A" - "\x2D\x88\xD4\xD9\xD6\x76\x76\x4A\xF6\xA9\x3A\x23\x67\x9B\x15\xF7" - "\xCF\x68\x7E\x46\x63\x14\x6C\x5C\x09\xB6\x00\x7C\x27\x7A\xE3\x33" - "\xC6\x13\x8C\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 207); - getPNGImage(png); - } - else if (url == "streamart.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0E\x08\x04\x00\x00\x00\x5E\x76\x5E" - "\x59\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\x77\x49\x44\x41\x54\x18\xD3" - "\x75\x90\x3B\x01\xC0\x20\x0C\x44\x4F\x02\x16\x90\x50\x0B\xC8\xA8" - "\x85\x4A\xE8\xDA\x11\x09\x58\x40\x42\x57\x64\xC4\xCA\xEB\x40\x7F" - "\x14\x9A\x6C\x79\xB9\x24\x17\xA9\x0B\x23\x30\xA3\x51\x04\x84\x7E" - "\x20\x62\xC1\xFE\x50\x46\x92\xE1\x99\x48\x18\x85\x42\x22\x52\x55" - "\x92\x0A\x1A\xA7\x64\x43\xE0\xB9\x67\x7F\x33\x57\xE4\x3A\xB0\xF1" - "\xF2\xE1\x09\x37\x88\xCF\xD9\x19\x91\xB8\xB6\x2E\x34\x8F\x71\xD7" - "\x6C\xAD\xEC\xAD\xD5\x48\x38\x0B\x5B\xAB\xAA\xB0\x76\x97\xD7\x83" - "\x0E\xF0\x9F\x7B\xB8\x7B\x95\x61\x07\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 197); - getPNGImage(png); - } - else if (url == "playingart.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0E\x08\x04\x00\x00\x00\x5E\x76\x5E" - "\x59\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\x77\x49\x44\x41\x54\x18\xD3" - "\x75\x90\x41\x15\x80\x20\x10\x44\x27\x02\x15\x88\x60\x05\x62\x58" - "\x81\x08\x5E\x3D\x12\x81\x0A\x46\xF0\x4A\x0C\xAA\x7C\x0F\x08\x28" - "\xE2\xCE\x69\xF7\xBF\x79\xB3\xBB\x92\x56\x1C\x19\x7D\x6B\x45\x08" - "\x37\x43\x19\x8F\xD0\x0C\x49\xC7\x3F\x2A\xAE\x40\x24\x91\xC8\x44" - "\x16\xEC\x9D\xCE\x4C\x09\x49\x76\x8A\x32\x3D\x6B\x54\xA9\xFD\x03" - "\x4C\x5F\x2B\xB4\xA1\xC3\x8E\x77\xFA\x96\x10\x11\xC7\x13\x9D\x6C" - "\xD4\x3B\xCD\xFB\x71\x9E\xFD\x6E\x1D\x81\xE1\x61\x89\xE2\xAE\xE0" - "\x02\xE8\xCB\x7B\xB8\xAB\x17\xF7\x85\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 197); - getPNGImage(png); - } - else if (url == "noadavail.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC1\x00\x00\x0E" - "\xC1\x01\xB8\x91\x6B\xED\x00\x00\x02\x66\x49\x44\x41\x54\x38\xCB" - "\x63\xF8\xFF\xFF\x3F\x03\x0A\x66\x60\xD0\x00\xE2\x66\x20\xDE\x0C" - "\xC4\xAF\x81\xF8\x31\x10\xAF\x07\xE2\x1A\xB0\x1C\x9A\x7A\x74\xCD" - "\x39\x40\xFC\x19\x2C\x8C\x1D\x7F\x07\xE2\x02\xEC\x06\x30\x30\x6C" - "\x87\x29\xFC\xCA\xC0\xB0\x6E\x29\xBF\x40\xC7\x82\xBE\xCA\x9B\xAB" - "\xA6\x57\x3F\x9C\x2F\x21\x32\xF9\x33\x03\xC3\x62\x24\x83\x40\x6A" - "\x59\x10\x06\x40\x6C\x06\x73\xFF\x30\x30\xBC\x2D\xF3\x70\x4A\xCF" - "\x2E\x4E\x9B\xB3\xFE\xF0\x82\x77\xDB\x4E\xCE\xFB\x94\x53\x9B\xBC" - "\x36\x30\xDA\x2B\xF6\x14\x1F\x4F\x18\x50\xCD\x73\xA8\xDA\x12\x88" - "\x01\x10\x3F\x83\x9D\xFD\x9B\x81\xE1\x3A\x88\x7E\xA8\xAD\xF2\x7A" - "\xDA\xB2\xCE\x5B\xBB\xCF\x2C\xF9\x7A\xF0\xCA\xC2\x5F\x53\xD6\x36" - "\xBF\xEA\x98\x5B\x71\x38\x3C\xCD\x2F\xEE\x36\x2B\x8B\x0F\x92\x77" - "\x34\x18\xA0\x01\x06\x12\x58\x3E\x5B\x5E\xDE\xE9\x17\x2B\xCB\x4F" - "\x10\x7F\x8F\x87\xE5\xD1\x45\xBB\xFA\x1F\x2E\x39\xD8\xF8\x21\xAD" - "\x21\xEE\x40\xF5\xB4\xEC\x4B\xA1\x39\xBE\x13\x54\x0D\x55\x95\x80" - "\xF2\xD3\xA1\x7A\x6A\x18\xA0\xA1\x0D\x72\x7A\xA0\x95\xAD\x95\xC6" - "\x4E\x37\xAB\x43\x20\xFE\x5F\x46\xC6\x7F\x3B\x0B\xFD\xDE\x77\x6C" - "\x8C\x7F\xA1\xED\xA8\x5F\xE6\x91\xE4\x98\x68\xE1\x67\x16\x2C\xAB" - "\x25\x2F\x06\x94\x87\xB9\x62\x3D\x03\x34\xAA\x40\x1C\x19\x19\x45" - "\x79\x7E\xC7\x70\xFB\xA4\x43\xD6\xCA\x30\xB1\xFF\xFB\xE2\x8C\xFE" - "\xC4\x77\x07\x5F\x30\x0D\xB3\x6C\x10\x51\x92\x52\xE7\xE4\xE3\x66" - "\x06\x8A\x8B\x40\xE5\x1F\xA3\x18\xA0\xA0\xA5\xCC\x24\xAD\x26\xC7" - "\x2B\xAC\x2C\x6B\xB3\x5C\x51\xFC\x10\xCC\x90\x93\x1E\x1A\xBF\xAB" - "\x16\x47\xBF\x0A\x28\x72\xE9\x53\x31\x51\x96\x43\x37\x00\xEE\x05" - "\x03\x3B\x23\x59\xBF\x0C\xDF\xE4\x90\xC2\xC0\x34\x2D\x4B\x6D\xD3" - "\xCD\xE9\xEE\x0F\xFF\x30\x31\x82\x0D\xB9\xAC\x2F\xF5\x25\xAD\x37" - "\xF0\x90\x55\x98\xA9\x19\x30\xB0\x3D\x91\xBD\x00\x0B\xC4\xD9\x56" - "\x1E\x56\x86\x89\x0D\xD1\x1B\x73\xA7\x26\x5D\x0B\x2F\x0F\x68\x6D" - "\x5C\x59\x76\x77\x6E\xB1\xC3\xC7\x9F\xCC\x4C\xBF\x41\x6A\xEE\x49" - "\xF1\xBF\x8C\xB7\x56\xB5\x00\xB2\xFB\x91\x03\x51\x03\x1A\x25\xFF" - "\xCF\x71\x73\x06\x7B\xA5\xBA\x96\x24\x74\x84\x9C\x4C\xEB\x8B\xB9" - "\xD1\xB0\xB6\xE8\x6B\xD9\xCA\xA4\x9F\x0D\xF9\x2E\xCF\x3F\x71\xB1" - "\xFD\x02\xA9\xF9\xC5\xC0\x70\x15\x48\xFF\x46\x44\x23\x24\x21\x15" - "\x40\x4D\x7C\xBE\x97\x8F\x2B\xDA\x22\xD0\x34\xCE\x3D\xCD\x79\x7E" - "\xE6\xEC\xF8\x77\x59\x73\xE2\x3E\x7A\xE6\xBA\xAE\x2D\xB4\x51\x2B" - "\x04\x3A\xFD\x09\x50\xCD\x3F\xD4\x84\x84\x25\x29\x7F\x02\x7A\x67" - "\x36\x1F\x77\x5B\x52\x89\xFB\xF5\xF4\x4A\xEF\xFB\x93\xC5\x04\xBA" - "\x3F\x30\x32\xCC\x80\xDA\x0C\x52\xB3\x1B\x35\x29\x43\x0C\x60\x01" - "\x9B\x0A\xF5\x0E\x9E\xCC\x54\x02\xD3\x8C\x99\x1B\xC9\xC8\xCE\x00" - "\x29\x75\xE7\x5B\x81\xE0\xCE\xEC\x00\x00\x00\x00\x49\x45\x4E\x44" - "\xAE\x42\x60\x82", 692); - getPNGImage(png); - } - else if (url == "adavail.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC2\x00\x00\x0E" - "\xC2\x01\x15\x28\x4A\x80\x00\x00\x02\xF6\x49\x44\x41\x54\x38\xCB" - "\x63\x60\xC0\x00\x8C\x2C\xEC\x6C\x1C\xEA\x2A\xCA\x1A\x39\x33\x57" - "\x4D\x7C\xBA\x74\xEB\xE4\x37\xBA\xC6\xBA\x8D\x6C\xEC\x1C\x5A\x20" - "\x49\x06\xFC\x80\x91\x95\x95\x85\x4D\x41\x48\x40\xD4\xC7\xDC\xDC" - "\xBA\x77\xF5\xE1\x45\xDF\xB7\x9D\x5C\xF8\xC3\x3D\xD4\x7D\xA3\xA0" - "\xA0\x70\x10\x0B\x2B\x9B\x12\x50\x11\x13\x56\xAD\x4C\x8C\x4C\x3C" - "\xFC\xBC\x42\xF6\xF6\x0E\x8E\x5D\xB5\x2D\x15\xE7\x96\xEF\x98\xFD" - "\xF1\xFC\xBD\x8D\xFF\x2E\x3E\x5C\xFB\x6F\xD9\xFE\x49\x3F\xCA\xDB" - "\xF2\xAE\x5A\x39\x59\x4D\xE4\xE4\xE6\xD6\x01\x2A\x67\xC5\xB0\x9A" - "\x9D\x95\x43\xC5\xC1\xD1\xA9\x65\xDD\xEE\x45\x1F\x4E\xDE\xDA\xF8" - "\x77\xEA\xEA\xB6\xF7\xFB\x2E\x2C\xFB\x7B\xF2\xF6\xAA\x7F\xF3\x77" - "\xF5\xFD\x3A\x7A\x6B\xF9\xBF\xC5\xBB\x26\x7C\xD6\x37\xD7\x2F\x62" - "\x62\x62\x92\x44\xF3\x0E\x23\xB3\x88\x90\xB8\x5B\x65\x6D\xD9\xE1" - "\x2B\x8F\x77\xFD\xEF\x9D\x53\xF3\x40\xCD\x56\xA7\x7E\xE3\xF1\x85" - "\x5F\x76\x5E\x9A\xF6\xCB\x21\xC1\xFD\x58\xCB\x82\x92\xB7\xEB\xCE" - "\xF6\xFC\x0F\x4E\xF5\xD9\x06\x74\x85\x39\x9A\x57\x18\x99\xA5\xA5" - "\xE4\xC3\xBA\x27\xB7\xDC\xB8\xF8\x68\xFB\xFF\xEC\xAA\x94\xF3\x9C" - "\x7C\xDC\x6A\x93\xB7\xD6\xBC\x99\xBA\x27\xF9\xBB\x94\x86\x42\xA3" - "\xBA\xBD\x7A\x7D\x68\xB9\xCF\x6D\xC7\x24\x97\x73\xFC\xA2\xC2\xBE" - "\x40\x4D\xCC\x28\x41\xC0\xCF\x27\x68\x97\x92\x9B\xB4\x7B\xFD\xB9" - "\x89\xFF\xDB\xD7\xA7\x7E\x4D\xEF\xCD\xBE\x30\x75\x4F\xFD\xAF\xEE" - "\x9D\xB1\xBF\x14\xCC\xB5\x26\xB2\xB0\xB3\xF2\x73\x0B\xF1\x6A\x81" - "\x30\x33\x0B\x8B\x00\x66\xF8\x33\x32\x71\x8B\xCA\x4A\xC7\x07\x56" - "\xFA\xDE\x6D\xD9\x96\xF4\x7F\xE6\xA1\xFC\xFF\x13\xF7\xE6\xFD\xEF" - "\xD8\x99\xF2\xAF\x74\x69\xC2\x77\xBF\x1A\xBF\xDB\x52\x3A\x2A\x4D" - "\xCC\x2C\xAC\x32\x78\x23\x12\xA8\x40\x41\x44\x5D\xB1\xC1\x26\xD5" - "\xF9\x7C\xE3\xC6\x8C\x3F\xAD\xDB\x52\xFF\x35\x6D\x49\xFD\xD3\xBF" - "\x2F\xFD\x5F\xDD\xC6\x94\xFF\xC6\x5E\xC6\xF3\x59\xD9\xD8\xD5\x31" - "\xD2\x04\x1B\x3B\xBB\x98\xA0\x94\x88\x81\xB0\x8C\x98\x11\x3B\x17" - "\x87\x30\x2B\x1B\xA7\x5E\xE7\x86\xEA\x8F\x4D\x1B\x93\x7E\x9B\xC5" - "\x3A\x9E\x8A\x68\x0F\xBC\xD5\xB1\x2B\xFD\x5F\xCE\xE2\xB8\xBF\x92" - "\xCA\xD2\x09\x28\x61\xC0\xC8\xC8\xC8\xAA\xA4\xAE\x96\x97\x33\x29" - "\xFF\x7D\xC9\x9C\xA2\x2F\xDA\x96\xBA\xB9\x40\x41\xB6\xA6\xD5\xA5" - "\x6F\xEA\xD6\x26\x7E\x17\x93\x97\x2E\xD4\xB4\x56\x49\x6C\xD8\x9C" - "\xFA\xB7\x70\x65\xD2\x7F\x69\x55\x4C\x03\x58\x94\x54\x94\x53\xAB" - "\xE6\x15\xBC\x9E\xB0\xBF\xFC\x3F\x30\xB4\x0F\x2B\xEA\x69\x64\x76" - "\x6C\xA8\xFF\x5C\xB5\x36\xF1\xA7\xA6\x9B\xF1\x4A\xCF\x3C\xE7\x0D" - "\x0D\x9B\xD3\xFF\xC5\x74\x86\xBE\x14\x96\x12\x0B\x41\x8F\x05\x46" - "\x4E\x4E\x2E\x6D\x33\x6F\xCB\x59\x79\x0B\x93\x7E\x54\x6D\x48\xF9" - "\x5F\x3C\x35\xEB\x45\xE7\xD6\x9A\xBF\x15\x6B\x92\xFF\xA5\x4C\x8B" - "\xFD\x52\xB1\x2E\xED\x7F\xEE\x82\xC4\x5F\xDA\x2E\x7A\x3D\xAC\x6C" - "\x6C\x8A\x18\x61\x00\x8C\x05\x5E\x1E\x3E\x7E\x47\x2D\x1B\x9D\xBE" - "\x80\x52\xEF\x9B\x79\xF3\x53\x7E\xD4\x6D\xCC\xFE\x57\xBB\x01\xE8" - "\x6F\xA0\xC6\x60\x60\xEC\x68\xD9\xEA\xF4\x73\x70\x71\x81\x32\x15" - "\x1B\xCE\xCC\xC4\xC2\xCA\xAA\x0C\x34\xC8\x43\xD1\x40\xB5\x2F\x61" - "\x7A\xF4\xF7\xB4\x99\x71\xDF\x0D\xBD\xCD\xD6\xF3\xF2\xF3\x7B\x03" - "\xE5\x14\x88\xC8\x91\xC0\x9C\xC2\xC6\xAE\x29\x26\x2F\x99\x15\xDA" - "\x1A\xF4\x34\xB6\x27\xFC\xB5\xBC\x8E\x72\x2D\x34\xEA\x30\x00\x00" - "\xBB\x07\x15\x4B\xC6\x05\x9A\xAA\x00\x00\x00\x00\x49\x45\x4E\x44" - "\xAE\x42\x60\x82", 836); - getPNGImage(png); - } - else if (url == "adplayed.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC1\x00\x00\x0E" - "\xC1\x01\xB8\x91\x6B\xED\x00\x00\x02\x50\x49\x44\x41\x54\x38\xCB" - "\x63\x60\xA0\x22\x60\x04\x02\x39\x31\x71\x89\xB2\xA9\x4B\x3A\x5E" - "\x29\xA8\x2A\xF4\x02\xF9\xF2\x20\x71\x62\x34\xB3\x00\x81\x86\x9A" - "\x86\x6A\x59\x62\x56\xCC\xC1\x3D\xE7\x96\xFE\xCA\xAD\x4B\xBA\xA6" - "\xA6\xA5\x5C\xCD\xCC\xCC\x4C\xD8\x10\x46\x06\x46\x31\x6D\x1D\xAD" - "\xD6\x65\x9B\xA7\xBD\xE9\x5F\xDC\xF8\xFE\xF0\xD5\x15\x7F\xE7\xED" - "\xE8\xF9\xB9\x60\x73\xD7\x3B\x79\x65\xD9\x76\x31\x31\xF1\x3A\xBC" - "\xAE\x62\x61\x61\x35\xCA\x2F\xC9\x3C\x3B\x67\x55\xE7\x6B\x31\x05" - "\xF1\xD2\x95\x87\xFA\xBF\x19\xB8\x19\xEF\xCB\x6B\x8D\x7B\xED\x13" - "\xEE\x7E\x0F\xE8\xAA\xD3\x78\x5D\x05\x34\xC0\x38\xA7\x34\xE5\x42" - "\xEF\xB2\xF2\xB7\x7A\x76\xFA\xF5\xDD\x9B\xB2\xBE\x0A\xCB\x89\x4E" - "\x37\xB1\x36\xDE\xB4\x7C\xDB\x8C\xAF\x40\x57\x7D\x84\xB9\x6A\xE1" - "\x96\xEE\x77\x4A\xEA\xF2\xE5\x40\x6D\xFC\xC8\x8E\xE0\x95\x56\x96" - "\xAE\x2D\x9C\x1D\xF5\xA9\x67\x4B\xF6\xF7\x9E\x9D\x19\x7F\x83\x4B" - "\xDD\xDE\x94\xD5\x17\xBC\x99\xB3\xB2\xF3\x9D\xA8\xBC\x78\x19\xC8" - "\x55\x86\xEE\xA6\x7B\xEB\x66\x66\x3F\x77\x8F\x70\x38\xC4\xC4\xC4" - "\xA4\x81\x6C\x00\x13\xD0\x6F\xDC\xAC\x5C\x9C\xFE\x3A\x1E\xFA\xDB" - "\x1B\x37\xA4\xFE\x4E\x68\xF1\xFB\xD6\x3C\xA5\xEC\xDF\xC4\x35\x55" - "\xBF\xF4\xEC\xF5\x27\x80\x5C\x25\xA2\x20\xDE\x2B\x2A\x2F\x1C\x2F" - "\xA3\x2D\x5B\x0B\x34\x40\x01\xAE\x9B\x95\x8D\x4D\xD7\xC4\xDD\xB4" - "\x5F\x56\x4D\x36\x91\x95\x9D\x55\xA9\x66\x59\xFA\x67\x59\x3D\xC5" - "\x65\xCE\xB1\x36\x0F\xCB\x16\xC7\xFF\xEF\xDD\x92\xF5\x13\xE4\xAA" - "\xE4\x9E\xA0\xE7\xAA\x36\xEA\x73\x98\x98\x99\x35\x51\xC2\x80\x93" - "\x8B\xD3\xBD\x70\x6A\xC6\xDB\xA8\x2A\xBF\x4B\x02\xA2\x42\x71\xD5" - "\xCB\xB3\xBF\xCA\xE8\x29\x2C\xF1\xCA\xB6\x3B\xE9\x96\xE1\xF4\x59" - "\xD7\xCB\xF0\x04\xC8\x55\xC5\x0B\x63\xBE\x34\x6E\x48\xFA\x65\x1E" - "\x60\xB8\x93\x91\x89\x49\x11\x39\x05\x49\xA9\x18\xAB\x4C\xCF\x9C" - "\x11\xF9\x31\xAB\x3B\xF1\x75\xFD\xFA\xDC\xBF\xA1\x75\x7E\xDF\x13" - "\x3B\x63\x7F\xEA\x3B\xEB\x6F\x07\xBA\xCA\x08\xE4\x2A\x39\x43\xA5" - "\x85\x01\x45\x8E\x47\x0A\x96\xC7\xFF\x65\xE3\x64\x77\x42\x89\x49" - "\x66\x16\x66\x2D\x29\x35\xC9\x2A\x87\x58\x9B\xA3\x79\x0B\x13\x7E" - "\xD9\x84\x59\x3E\x2C\x9E\x9E\xF9\x2D\xB2\xCA\xEF\x3A\xD0\x55\xF1" - "\x10\x57\x29\x2E\xF6\x2D\x70\x3C\x1E\xDB\x19\xFC\x8E\x95\x8D\xD5" - "\x1A\x5B\x52\x96\xE5\x15\xE6\x2B\x09\x6E\xF0\x7B\x25\x2C\x23\x3A" - "\x15\xE8\xAA\x45\xC8\xAE\x4A\x9A\x14\xF9\x35\x7D\x46\xD4\x27\x39" - "\x5D\xD9\x2E\xA0\x7A\x61\x82\xC9\x1B\xDD\x55\xEE\xD9\xCE\xD7\xA4" - "\xD5\xA5\xAA\x99\x98\x99\xE4\x40\x31\x47\x6C\x06\x83\xBB\x0A\x98" - "\x1E\x3A\x81\x7C\x19\x6A\xE6\x60\x06\x00\x9A\x6E\xEF\x92\x09\x7E" - "\x22\xAD\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 670); - getPNGImage(png); - } - else if (url == "v1.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x81\x49\x44\x41\x54\x38\xCB" - "\xA5\x93\x41\x4B\x02\x51\x14\x85\xFD\x29\xFD\x8A\x16\x2D\x5A\xB4" - "\x68\xD1\x22\x08\x5A\xB4\x94\xA0\x7F\x20\xB4\x6C\x11\x11\xC1\x14" - "\x42\x84\x60\x44\x66\xB5\x08\x22\x08\xC1\xC1\xC4\xAC\x4D\x61\x46" - "\x12\x8E\x9A\x49\x9A\x59\x56\x9A\xCE\x28\x64\x24\xC4\x69\xCE\x90" - "\xC3\x3C\x67\x5C\x75\xE1\x83\xC7\xB9\xE7\x1E\xDE\x7B\xF3\xC6\xE5" - "\xEA\x2B\x49\x92\xDC\x3A\x71\x1D\xF4\x41\xCD\xED\x1A\x54\x7A\x73" - "\x48\x27\xE5\xF7\xFB\xA1\x28\x0A\x5A\xAD\x16\x7A\xC5\x35\x35\xF6" - "\xE8\xA1\xD7\x69\x58\x95\x65\xD9\x18\x78\x6C\x76\x11\xBC\x56\xB1" - "\x18\x7D\x37\xE0\x9A\x1A\x8B\x1E\x7A\x85\x10\xA6\xF6\x86\x03\xC9" - "\x26\x66\x76\xCB\x8E\xB0\x67\x09\x49\x99\x67\xE6\xD6\x58\xDB\x89" - "\x06\xA6\x03\x25\x93\x83\x94\x8A\xD3\xFB\xB6\xA0\xD1\xC3\xFA\x3B" - "\x8E\x9B\x01\x71\x9E\xAF\xD8\xF8\xC6\xD4\xD6\x83\x49\x48\xD1\xD0" - "\xE9\xFE\x20\xA6\x07\x58\x75\x42\x2F\x67\x38\xCB\x00\xE3\x92\x36" - "\x2F\xEA\x98\xF4\x17\x4C\x66\xF7\x8B\x08\x67\x34\x44\xEF\x34\x41" - "\x27\xF4\x72\x86\xB3\x46\x00\x6B\xFE\xB8\x82\x09\x5F\x5E\x60\x2F" - "\xF9\x81\x93\x9C\x66\xD3\xE9\x65\x09\x01\x9E\xA3\x32\xC6\xD7\x73" - "\x02\xC1\x44\x1D\x91\xAC\x6A\xD3\xE9\x15\x02\xB8\x9D\x8D\xF3\x57" - "\x8C\x79\x33\x02\x81\xCB\x1A\x64\xA5\x69\xD3\xE9\xB5\x1E\xC1\xB8" - "\xC4\x42\xED\x0B\xA3\xAB\x69\x13\xCF\x61\x09\x57\xA5\x36\xB2\xD5" - "\x4F\x2C\x84\xCA\x42\x8F\x5E\xEB\x25\x9A\x9F\xD1\x1B\x7B\xC1\xC8" - "\xCA\xAD\xC1\xB2\xFC\x04\x39\xDD\x44\x38\xDD\x80\xEF\xAC\x6A\xEA" - "\xF4\x08\x9F\xB1\xFF\x21\xAD\x45\x9F\x31\xBC\x74\xE3\x08\x7B\xB6" - "\x87\xE4\xF4\x94\xF3\x6F\x1D\x48\x91\x0A\xE6\x76\xF2\x06\x5C\x53" - "\x1B\xF8\x94\xFF\xFD\x33\xFD\xE7\x77\xFE\x05\xEF\x5F\x9A\xB1\x51" - "\x9D\x7F\x55\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 463); - getPNGImage(png); - } - else if (url == "v2.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\xA6\x49\x44\x41\x54\x38\xCB" - "\xA5\x93\xBD\x2F\x83\x51\x14\xC6\xFB\xA7\xF8\x2B\x0C\x06\x83\xC1" - "\x60\x90\x48\x0C\x6C\x5D\x98\x8C\x84\x58\x31\x54\x5E\xD5\x44\x9A" - "\x26\x15\x14\x11\xB1\xF8\x88\x44\x95\x52\x22\x48\x51\x8D\xB4\x48" - "\x35\xF4\x4B\x5B\x6D\xD3\x56\x69\x4A\x0D\x7D\xBC\xCF\x8D\xDE\xF4" - "\xAD\x9A\x9C\xE4\x97\xF7\xDE\x73\x9E\x73\x72\xCF\x7D\xCF\xD5\xE9" - "\xEA\x4C\x51\x14\xBD\x8A\x4B\x05\x75\xD0\xA7\xD7\xFD\x65\x6A\xB0" - "\x49\xC5\x6B\xB5\x5A\xE1\xF7\xFB\x51\x28\x14\x50\x35\xAE\xE9\x63" - "\x8C\x1A\x6A\x1B\x25\xE7\xED\x76\xBB\x48\x08\xE7\xBE\xB0\x74\x95" - "\xC7\xD8\x7E\x4A\xC0\x35\x7D\x34\x6A\xA8\xD5\x14\x61\xD5\x6A\xB2" - "\xED\x32\x87\x9E\xE5\x48\x43\x18\xAB\x29\xE2\x95\x3D\xF3\x68\xB4" - "\x05\x77\x16\xDD\xB6\x90\xE0\xF0\xE1\x4D\xF8\x2A\x95\x0A\x7C\x89" - "\x92\xF4\x53\x43\xFB\x69\x47\xCF\x02\x2E\xF6\xF7\x94\x2D\xA3\x6B" - "\xEE\x51\x70\x1E\x2A\xC2\x7C\x92\x86\x7E\x25\x2C\x18\x77\x24\x11" - "\xCC\x7C\xCA\x38\xB5\xCC\x61\x2E\x0B\x88\x4B\x9A\x3D\xCB\xA0\xD3" - "\x1A\x14\xF4\xAF\x86\xD0\x6B\x7B\x94\xFB\xD1\xED\x18\x92\x85\xB2" - "\xDC\x53\xCB\x1C\xE6\x8A\x02\xB4\xE1\xAD\x18\x3A\x2C\x01\x0D\x8A" - "\x33\x01\x4F\xB4\x88\xDD\xBB\x57\x0C\x6D\x44\xA5\x9F\x5A\x9A\xA6" - "\xC0\xE0\x7A\x04\xED\x33\xF7\x92\xE9\x83\x04\x96\xDC\x19\x18\xF6" - "\xE2\x18\xD9\xD4\xC6\xA8\xD5\x14\xE0\x71\xCC\xC7\x49\xB4\x99\x6E" - "\x05\x46\x67\x1C\xF3\xA7\x29\x0C\xAC\x3D\x49\x5F\x2D\xD4\xD6\xB6" - "\x20\x2E\x31\x98\xFE\x40\xEB\x94\x4F\xE0\x89\xBC\xC3\x79\x9F\x87" - "\xF9\x28\xA9\x92\x10\x4C\x3A\x9E\x65\x9C\xDA\xDA\x4B\x94\xBF\xD1" - "\x74\x10\x47\x8B\xE1\x06\x16\x35\x61\xC7\x97\x85\xDD\x97\x13\x5F" - "\xB2\x7A\x91\x16\x31\x6A\x34\xBF\xB1\x7E\x90\x8C\xFB\xCF\x68\x9E" - "\xB8\x6E\x08\x63\xBF\x06\xA9\xD1\x28\x07\x5E\x4A\x50\x1C\x31\xF4" - "\x2D\x06\x04\x5C\xD3\xF7\xE7\x28\xFF\xFB\x31\xFD\xE7\x39\x7F\x03" - "\x7B\x97\xA2\x69\xD2\xB0\x90\x85\x00\x00\x00\x00\x49\x45\x4E\x44" - "\xAE\x42\x60\x82", 500); - getPNGImage(png); - } - else if (url == "relay.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\xAB\x49\x44\x41\x54\x38\xCB" - "\xA5\x93\xCB\x4B\x02\x51\x14\xC6\xFD\x53\xFA\x2B\x5A\xB4\x68\xD1" - "\xA2\x45\x8B\x20\x68\x51\x3B\x5B\x04\xAD\x5A\x15\x41\xDB\x1E\x14" - "\x58\x08\x11\x81\x15\xBD\x89\x36\x45\x44\x98\x45\x58\x10\x45\x0F" - "\x33\x6B\x7A\x88\x54\xEA\x68\x9A\xA2\x26\x9A\x59\x0B\xBF\xE6\x3B" - "\xE4\xA0\x36\xAE\x3C\xF0\x63\xCE\xE3\x3B\x87\x7B\xEF\xDC\x6B\x32" - "\x55\x98\xC5\x62\x31\x6B\x38\x35\x50\x01\x73\x66\x53\x35\xD3\x8A" - "\x75\x1A\x6E\x9B\xCD\x06\x45\x51\x90\x4E\xA7\x51\x34\xFA\xCC\xB1" - "\x46\x0D\xB5\x46\xCD\x29\xBB\xDD\x2E\x0D\xFE\xE4\x0F\x96\xAF\x52" - "\x18\x3A\x78\x17\xE8\x33\x47\xA3\x86\xDA\xB2\x21\x9C\x5A\x6C\x5E" - "\xBC\x4C\xA2\x63\x25\x60\x08\x6B\x25\x43\xDC\xFA\x9E\xB9\x34\xDA" - "\xC2\x79\x02\xED\x8B\xAF\x50\x22\x39\x14\x0A\x05\xC9\xF1\x7B\xF7" - "\x96\x93\x3C\xA1\x86\xF6\xB7\x1D\x33\x07\x38\xB9\xBF\x97\xC4\x37" - "\xDA\xE6\x9F\x05\x36\xCC\x9D\xC5\x61\x5E\xF3\x0B\xC3\x8E\x08\x7C" - "\xF1\xBC\x5E\xA7\x96\x3D\xEC\xE5\x00\x39\xA4\xD9\xD3\x38\x5A\x6D" - "\x3E\xE1\x36\xFC\x09\xAB\x33\xAA\xC7\x83\x3B\x2A\x22\xE9\x6F\x3D" - "\xA6\x96\x3D\xEC\x95\x01\xB4\x81\x6D\x15\x2D\x33\x5E\xC1\x13\xFA" - "\x84\x3F\x91\x87\x2B\x98\x15\xF6\x1E\x3E\xD0\xBF\x15\xD4\xEB\xD4" - "\xD2\xCA\x06\xF4\x6D\x06\xD0\x3C\xF5\x28\xDC\xA8\x59\xEC\x2A\x29" - "\x8C\xEF\x87\xE5\xCB\xB8\x58\x23\xD4\x96\x0D\xE0\x72\xA6\x8F\x23" - "\x68\xB2\xDE\x0B\xD7\xC1\x0C\xC6\x1C\x21\xF1\xBB\x96\xB5\x25\x9F" - "\x44\x85\x62\x9D\xDA\xD2\x2D\xC8\x21\xFA\x62\x5F\x68\x9C\xB8\x13" - "\x5C\x81\x0C\x46\xED\xAA\x1E\xF7\x6E\x3C\x23\x9C\xCA\xEB\x31\xB5" - "\xA5\x87\xA8\xFF\x46\xEB\x61\x18\x0D\xE3\x1E\xCC\x1C\xBD\xA1\x67" - "\xD5\x27\x3E\xE9\x9C\x7D\xC2\xFA\x45\x4C\x7C\x6A\xCA\x7E\x63\xE5" - "\x45\x9A\x3C\x08\xA1\x7E\xE4\xDA\x10\xD6\xFE\x5D\x24\xA3\xAB\xEC" - "\x8D\xE6\x60\x71\xA8\xE8\x5E\xF2\x0A\xF4\x99\xAB\x7A\x95\x6B\x7E" - "\x4C\xB5\x3C\xE7\x5F\xCE\xEF\xA6\xA0\xA0\x37\x1F\x5A\x00\x00\x00" - "\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 505); - getPNGImage(png); - } - else if (url == "wa.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x02\x0D\x49\x44\x41\x54\x38\xCB" - "\x8D\x93\x4F\x68\x92\x71\x18\xC7\x35\xA3\xFF\x86\x5B\x5B\x32\x61" - "\x0D\xC2\xEE\xC5\x08\x22\x0F\x8D\xB5\x0E\x12\x81\x04\xEE\xE0\x41" - "\x21\xA2\xD8\x24\x2A\x56\xB1\x82\xC4\x0A\x06\xC5\xD0\x75\xD8\xA2" - "\x4D\x66\x10\x48\xB0\xB6\x5D\x94\x1D\xB2\x74\x68\x2D\xDD\x41\x93" - "\x2E\xC1\xCA\x2D\x8D\x6D\x81\x98\x22\x25\x82\x7C\xF2\x7D\xB7\x44" - "\x97\x6E\xFB\xC0\x73\x7A\xDF\xCF\xF3\xFE\x9E\xEF\xEF\x79\x25\x92" - "\xCD\x61\xBD\x2A\x51\x94\xCA\x2E\xD9\x06\x2C\x7C\x5D\x20\x10\x0C" - "\x54\x36\xD1\xE9\xF5\xFA\xB4\xF1\x62\x27\x5B\xCA\x8B\x4B\x8B\x08" - "\x24\x93\x49\xDC\x6E\x37\x6A\xB5\x3A\xEE\x9D\x70\x92\x9B\x3C\x8F" - "\xF5\xB2\x62\xD3\x06\x24\x12\x09\xFE\xD1\x77\xAB\x0F\xAB\xD5\xCA" - "\xCF\x99\x07\xA4\x1F\xB7\x10\x19\x6B\x46\xD9\x28\x9B\xDE\x52\xF6" - "\x78\x3C\x18\x8D\x46\xE2\x9F\x67\x29\x4C\x74\xB1\x7A\x4D\x46\xCA" - "\x21\xE7\xA8\x72\x47\x7A\x3D\x87\xFA\xB2\xD9\x6C\xC6\xE9\x74\xC2" - "\x97\x61\x0A\xE3\x2D\xAC\xF6\x4A\x49\x0D\xEE\xE4\xF8\x11\x29\x2E" - "\x97\xAB\x56\xB0\x6B\x33\x0B\xB3\x5A\x2C\x16\xD2\x3F\x62\x10\xBC" - "\x00\x6F\x4E\xF2\xC7\x75\x82\xE2\x5B\x3D\xF1\x29\x3D\x5E\x9B\x96" - "\xAB\xDD\x67\x09\x85\x43\x55\x4D\xC4\xB4\x05\x6E\x9B\xB4\x64\x46" - "\x3A\xC9\x3C\x3C\x44\xC6\x56\x12\x7F\x2D\x81\xBF\x1D\x66\x0E\x93" - "\x1B\xDA\x4F\x7E\x40\xCA\x3D\xD3\x69\xF1\x5D\x9F\xCF\x57\x6E\x22" - "\x5E\x95\xC0\xDD\x9E\x8E\xD2\x13\x15\x84\xBA\xE0\xF7\x77\x98\x3F" - "\x47\xE1\x75\x33\xB9\xC1\x3D\x14\x47\x77\xC1\xF8\x6E\x9E\x3D\xB9" - "\xB3\xD6\xC0\xEF\xAB\x3E\xC5\xDC\xC7\x39\x9E\xDA\x1E\x71\xE3\xD2" - "\x29\xC8\x97\xB2\xF8\xA4\x25\x37\xDA\x40\x7E\x64\x1F\xBC\x92\xE3" - "\xBB\xBF\x17\xDB\x40\xBF\x28\x87\xE7\xC3\xB5\x73\x30\x18\x0C\xA5" - "\xF9\xDF\x93\x77\xB7\x93\x1D\x92\x53\x9C\x6A\x24\xEE\x50\x70\xBD" - "\xFB\x18\xC1\x60\x50\x94\xA3\xD1\x68\x4D\x59\xA1\xD1\x68\x22\xA9" - "\x6F\x01\xB2\x63\x6D\xE4\x5D\x4D\xF0\x4E\x85\xBD\xF7\x20\x2F\x5F" - "\x3C\x2F\xEF\x44\x2C\x16\xAB\x29\x4B\x04\x79\xE5\xC3\x34\x59\x47" - "\x1B\xC5\xD9\x56\x7C\xC3\x4A\x7A\x4C\x67\xF0\xFB\xFD\x65\xB9\xDE" - "\x97\x45\xFA\x75\x6A\xF2\x93\x4A\xD2\xDE\x56\xAE\xE8\x0E\x08\x8B" - "\x42\x28\x14\x62\x79\x65\x59\x94\x37\x5E\xDB\x7F\x08\xBB\x6D\xBF" - "\xD9\x80\xAA\x49\xE6\xAC\xD8\x32\xF1\xAA\x36\xA6\x5D\x8F\x48\xA9" - "\x3A\xB6\xF9\x3B\x57\xF1\x17\x81\x38\xA3\x74\x72\x00\xB9\xAF\x00" - "\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 603); - getPNGImage(png); - } - else if (url == "curl.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\x4E\x49\x44\x41\x54\x38\xCB" - "\x63\x60\xA0\x0F\x68\xF8\x7F\xE0\xC0\x81\xFF\x98\x6C\xDA\x18\xD0" - "\xF0\x1F\x53\x11\xD1\x06\x40\x24\x61\x98\x2C\x03\x28\xF2\x02\x44" - "\x02\xBB\x17\x90\x31\xDE\x30\xC0\xE6\x05\x64\x31\x4C\xEF\x51\x3B" - "\xBE\x09\xC7\x02\x59\xF1\x4D\x4F\x03\x06\xAF\x17\x88\x4A\x07\xC8" - "\x71\x8C\x8D\x8D\x2D\x1D\x00\x00\x6B\x22\xE2\xA4\xD5\xBE\x1F\x4C" - "\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 156); - getPNGImage(png); - } - else if (url == "radionomy.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xAB\x49\x44\x41\x54\x38\xCB" - "\x63\x60\x00\x02\xB1\xAE\x33\xAC\x40\x5C\x0A\xC4\x37\x81\xF8\x1F" - "\x10\xFF\xC7\x81\xFF\x41\xD5\x80\xD4\xB2\x32\x20\x69\xDE\x81\x47" - "\x13\x2E\xBC\x03\x6C\x08\xD4\x34\x90\xC0\x3B\x20\x0E\x03\x62\x2E" - "\x06\x1C\x00\x24\x07\x55\xF3\x0E\xAA\xA7\x94\x01\xEA\x24\x10\x27" - "\x8C\x81\x48\x00\x35\x04\xA4\xE7\x26\x03\x92\x9F\xF1\xD9\xCC\x8A" - "\xC5\x25\xE0\x30\x61\x80\xF9\x09\x8B\xA6\xC9\x40\x7C\x0B\x88\x7B" - "\x81\xF8\x2F\x10\x37\xA0\xC9\x43\xF4\xE1\x31\x60\x03\x54\xEE\x2E" - "\x10\xD7\x03\xB1\x13\xB9\x06\xD8\xE3\xF0\x16\xD1\x06\x88\x50\x6A" - "\x80\x00\xCD\x0D\xC0\x1A\x8D\x40\x7E\x22\x10\x4F\x05\x62\x36\x1C" - "\x09\x0A\x1E\x8D\x14\x27\x24\x8A\x93\x32\xB9\x99\x69\x27\x7A\x8E" - "\x24\x2B\x3B\x03\x00\xC3\xBC\x4D\xD5\xF9\xC1\xBC\x7C\x00\x00\x00" - "\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 249); - getPNGImage(png); - } - else if (url == "chrome.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x02\xE8\x49\x44\x41\x54\x78\x01\x65\x93\xDD\x6B\xD6" - "\x65\x18\xC7\x3F\xD7\xFD\xB2\xFD\x9E\x47\x63\xB3\x74\x4D\xDB\xF2" - "\x99\x21\xC5\x93\x16\x19\x61\x27\xD1\x36\xF1\xA0\x37\x09\x02\xE7" - "\xEA\xC4\x88\x75\x24\x74\xE2\x69\x41\x45\x7F\xC1\x3C\x1B\x42\x45" - "\x50\x9E\x14\x41\x74\x12\x54\xD0\x91\x06\xE9\x81\x33\x59\xE5\x66" - "\x9B\x3A\x6D\xDB\xE3\xDA\xCB\xF3\x7B\xBB\xEF\xAB\x1F\x13\x65\xD5" - "\x07\x3E\x47\xF7\x75\x7F\xBF\x07\xF7\x7D\x09\xFF\xE1\xAF\x63\x2F" - "\x8A\x49\x3A\xFB\x4D\xAD\xE3\x29\x31\x66\xB7\x46\x25\xA6\xD9\xD5" - "\xB8\x96\x9E\x0F\xED\x6C\x16\x50\x36\xE1\xE6\x5F\x19\xE6\x2E\xB1" - "\x9D\xF7\xC6\xB5\x6C\x0C\x18\x01\x06\xC4\x99\x44\x43\x24\xA6\x79" - "\x1A\xB3\x62\xBA\x3A\x3F\x13\xD7\xF3\x09\x60\xFE\x5E\x40\xB9\xB8" - "\x0A\x80\xA6\x45\x53\x6A\xFE\x14\x30\xA8\x31\x4A\x35\x8C\x18\x41" - "\xA3\xA2\x45\xA8\x57\x01\x8F\x57\x41\xEF\x57\x0E\x69\xBB\x38\x01" - "\x5C\x02\x70\xA1\xB5\xC6\xD9\x47\x7D\xEF\xD3\xBF\x15\xE3\x3E\xC6" - "\xA1\x6A\x98\xE8\xEF\x5C\x46\x75\x43\x2D\xA9\x0C\x68\x16\x24\xE6" - "\xE5\x90\xE6\x61\x3C\xA6\xF2\x06\x30\xEF\xCA\x56\xE4\xAB\xD1\x1D" - "\x63\xEE\xB3\x5B\xC3\x07\x26\x33\xA4\xA3\x04\x03\x72\xFF\x36\x42" - "\x7F\x3F\x78\xB0\xE9\x34\xE4\xB7\x37\xC2\xAC\x46\xC4\xE8\xB0\xEB" - "\x29\xC7\x80\x0F\xDD\x3B\xA7\x1B\x0F\x47\x2F\x47\x7F\x38\xD4\x45" - "\xDF\xD4\x75\xB6\xB7\x03\x3C\xF9\x04\x53\xAF\xBD\xC9\xCC\x03\x0D" - "\x30\xC2\x9E\xCE\x3F\xD8\xEF\xC6\xD9\xC2\x39\xAC\x57\xAC\x8B\x18" - "\xA3\x47\xC5\xF1\x89\xBC\xF4\xCD\x0B\x47\xC4\xF2\xB9\x51\xAD\x1F" - "\xFA\xF4\x1A\x43\x17\x1D\x7F\x9E\xFC\x88\xAF\x69\x40\x54\x00\x04" - "\x61\xA4\x39\xC5\xF3\xF7\x9D\x80\xB0\x00\x22\x68\x94\x75\x8D\x76" - "\xD4\x10\xB4\x81\x92\x44\x67\xF8\x79\xB8\x9B\xB9\x67\xF6\x72\xD6" - "\xEE\x62\xEE\xD6\x0A\x8B\x7F\xB7\x59\xAA\x9C\x5D\x58\xE1\xA7\xB9" - "\x06\xA5\x6F\x02\x01\x94\x4A\x49\x62\x30\x0D\x17\x03\x18\x5B\x19" - "\x95\x56\x5F\x8D\x8B\x87\x7B\x58\x49\x0B\x16\x56\x53\x12\x6F\x01" - "\x48\x8B\xC0\xF2\x9A\xB2\x19\x8D\x86\x50\x5A\x9C\x16\x3A\xA3\x86" - "\x54\xAD\xD4\xC5\x18\x26\x77\x2E\xB1\x2F\x2C\x53\x4E\x15\xDC\x5C" - "\x2D\x01\xA8\x77\x78\x0E\xEE\xBC\x8E\x2F\x2F\xA3\x58\x54\x85\x50" - "\xBA\x34\xE4\x7E\xC6\xC5\x54\x2F\x00\x57\xC4\xCA\x3E\xE3\x85\xC5" - "\x6C\x89\x1B\x5B\xBF\xE5\xC8\xC1\xE7\xB8\xF4\xBB\x05\x60\xFF\xC0" - "\x2A\xCF\xEE\x38\x0D\xE5\x4D\xC0\x12\x4B\x47\x91\xFA\x2B\x45\xE6" - "\x2F\xC8\xE2\x77\x7D\x1C\xBB\xD6\x7C\xD7\xD6\xE5\x03\x5B\x37\x88" - "\x03\x50\xB6\x75\x74\xD3\xE3\x76\x91\xA5\xB0\x27\xFC\xC2\xDB\xBD" - "\xE7\x48\x0C\x54\xCD\x64\x6B\x09\x59\xBB\xF3\xBD\x8D\x67\x8C\x51" - "\x28\xDB\x71\x22\x06\x19\x24\x32\x6C\x6B\x82\x78\xA1\x95\xDD\x66" - "\x21\x6D\x51\xCF\x32\xDE\xEA\xF9\x95\x44\x84\xAA\x91\x6C\x3D\x21" - "\x5D\xED\xFC\xBE\xC8\xDD\x04\x80\xCC\x7E\xF9\x08\x00\xAF\xCF\x35" - "\x9A\xD6\xCB\x29\x57\x33\x83\xAE\x26\x62\xBC\x10\x81\x97\x6B\xF3" - "\x1C\xEF\x9A\x23\x14\x96\x74\xBD\x43\xF3\xB6\xFF\xB1\xCC\xED\xBD" - "\xAF\x2C\xD3\x5F\xEC\xE5\x2E\xA3\xB3\x7D\xBD\xD6\xC9\x58\x15\x34" - "\x22\x4E\x06\x1E\xF2\x45\x72\xB2\xFB\x06\x0F\x4A\x91\xE6\x85\x9D" - "\x0E\x85\x39\x53\x96\xE6\x5F\xCB\x24\x97\x3F\x7E\x8C\xCD\xBC\x3A" - "\xB9\x5D\xB6\x74\xB9\x3E\xB5\x72\xE0\x70\x7D\x7D\xF7\xF1\xAD\xCB" - "\xC4\x28\x57\x43\x90\xF3\x2B\x2D\xF7\xBF\x75\xFE\x07\xC1\xB8\x73" - "\x8C\xE9\x85\xD9\x6A\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60" - "\x82", 801); - getPNGImage(png); - } - else if (url == "firefox.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x03\x3C\x49\x44\x41\x54\x38\x11\x05\xC1\x4B\x68\x5C" - "\x55\x00\x80\xE1\xFF\xDC\x73\xE7\x95\x8C\x79\x4D\x26\x0E\x69\x4C" - "\x82\x8D\x49\x93\x2A\x41\x25\x89\x31\xE8\x46\x45\x22\x6E\x04\x11" - "\x45\x51\xD0\x8D\x2B\x17\x82\x10\x50\xF7\x2E\x45\x5D\xB8\x11\x5C" - "\xB6\x14\x2A\x5A\xAA\x3B\x43\x85\x28\xA8\x2D\x5A\x34\xE6\xD1\x4C" - "\x26\xCE\x8C\x93\xC7\xDC\xCC\xEB\xCE\xDC\xD7\x39\xF7\xF8\x7D\x02" - "\x00\x00\x00\xE0\xAB\xBD\x50\x96\x4E\xBD\x59\x3F\x8A\x57\x0D\x3C" - "\x08\x18\x01\x07\x29\xDB\xFA\x25\x9B\xCF\xDE\xDB\xB8\x24\x35\x00" - "\x00\x80\x00\xA8\x7F\x36\x67\xE5\xA2\x5D\xF1\xFE\xFC\xF1\x78\xAB" - "\xE3\xBF\xD7\x16\xF6\xCB\x76\x52\x5E\xC8\x24\xAC\x84\x40\x10\x46" - "\x2A\x4A\xC4\xAA\xBC\x38\x96\xB8\x92\x33\x9D\x2F\xE7\x9E\x9A\xAD" - "\x2C\x83\x01\x90\x00\xEF\x2E\x0C\x3E\xBA\x15\xAE\xBF\xBE\xE9\xCE" - "\x6E\x9C\x38\xCD\xD7\x72\xF6\xF6\x50\x26\xD1\x92\x75\x9D\xC7\xD3" - "\x31\x75\x3F\x94\xAD\x86\x3B\x9C\xE9\x36\xD6\x96\x46\x1B\xCF\x27" - "\x9E\xCC\xBB\x1F\x17\xB6\xFE\xFE\xF4\x36\xB1\x04\x78\x65\x7C\xEC" - "\x4D\xD1\xF3\x3F\x99\x32\x3B\x53\x2B\xD9\x9F\xC5\xCA\xC8\x6F\xDC" - "\x74\x57\x29\x47\x03\xB4\x83\x80\x66\xC7\x23\xAA\xB7\xB1\x3A\x81" - "\x58\x9B\x93\x63\x13\xF9\xF0\x99\xB0\x20\xF7\x3E\xBF\xB2\xBB\x6D" - "\x1B\x73\x59\xFC\xF9\x86\x9E\x1E\xC9\x34\xC4\x14\x0D\x92\x96\xA1" - "\x56\x1B\xE4\x89\xC6\x2D\xF6\xFA\x2B\xDC\xB5\x2F\x23\x23\x8D\xE8" - "\xFA\x94\xDB\x5D\xF6\xCA\x43\xAC\x3C\x9D\x1C\x08\xC7\xE5\xDB\xE6" - "\x9C\x1F\xE4\x5B\xCD\xDC\xBC\x34\xE6\x43\x23\xC4\x08\xB6\x05\x29" - "\x8B\x84\x0E\x99\x0C\xE0\x54\x8D\x51\x6E\x0F\x60\x39\x2D\x8C\x73" - "\x4E\xE8\x76\xE9\x35\x2B\x3C\xB7\x74\x4E\x7F\xA6\x9A\x08\xEB\x07" - "\x37\xEC\xC8\x63\x45\x79\x4C\x8A\x84\xC1\x28\xD0\xAE\x40\x0F\xDB" - "\x5C\xF5\xE6\xB9\xD5\x9A\xC0\x68\x07\xD5\x73\x51\x6E\x93\x38\xF4" - "\x99\x5A\x2C\xA0\xA3\x16\xBD\x60\xBA\xB0\x73\xFD\xE2\xBA\xED\xB9" - "\x0C\x11\x62\x27\x00\xE5\x41\xE3\x3F\xF8\x46\x2F\xF0\x63\xD4\x4F" - "\x37\x3E\x86\x58\x83\xD7\x80\xA0\x83\xF6\xBA\x3C\x94\x77\x18\xEE" - "\x3F\xA1\x78\x98\x4D\xEF\xB7\x06\xA7\xEC\xC0\x23\x24\x12\xB1\x25" - "\x8C\x15\x6B\x43\x9F\x84\x4B\x69\x87\xED\xB3\x32\xD9\xAC\x66\x3A" - "\xDF\xE5\x76\xA9\x9F\xC3\x33\x8F\xA4\xE9\x72\x9F\xEF\xA0\x3A\x4D" - "\x32\x7E\xA4\x17\x26\xED\xA2\x1D\xF8\xFC\x6A\x42\xEA\x16\x14\xD2" - "\x7D\x60\xA7\x0C\x6B\xE9\x0A\x0F\x4F\x9E\x12\xE9\x98\x83\x76\x92" - "\xFD\x68\x02\xD5\x4B\xF1\xC8\xCC\x39\x8F\x3F\x70\x42\xF7\xD8\xC7" - "\x2A\xC9\x5A\xAE\x19\xFF\x64\x1B\x6D\xFE\xF1\x3C\x71\xC7\xC4\xE2" - "\x05\x69\x19\x92\x02\x02\x0D\xBF\x57\x24\x9B\xD5\x01\xEE\x76\xB3" - "\x04\x96\x26\x97\x6A\xB0\x3E\xDF\x24\xD5\xD1\x9C\x15\xD3\x54\xFF" - "\x92\x55\x59\x8B\x4B\xF2\xEB\x03\x27\x7A\xF5\xFE\x9C\x1F\x45\xBC" - "\x88\x10\x49\x29\x20\x29\x21\x3F\x18\x93\xEE\x83\xA1\x74\xC8\x6A" - "\xC1\xE5\x9D\xC7\xDA\x2C\x8F\x87\x84\x65\xC1\xBF\xBB\x36\xC5\x43" - "\x79\xFD\xA5\xDC\xD1\x77\x12\xE0\xD9\xDC\x60\x31\x0E\xC4\x68\xAC" - "\xC4\x92\x41\x08\x61\x04\x69\x11\x73\x31\x1B\xB2\x9C\xF7\x59\x1C" - "\x0D\xC8\xA5\x34\xAA\x09\x5E\xDD\xC4\x61\xCB\x7C\x9F\x15\xEA\xA3" - "\x99\x1B\xB5\xA6\x04\xF8\xF6\xB4\x61\x9C\x40\xED\x0F\x18\x7B\x2C" - "\xA9\xAC\x59\xB4\xB0\xB5\x16\x28\x25\x88\x43\x81\xF2\xC1\xEB\x08" - "\x4A\x27\xC2\xEC\x54\xC3\x9B\xD7\x8A\xCE\x07\x1B\x7F\x54\x8A\x00" - "\x12\x00\xA0\x14\x04\xC1\x1D\xB7\xBB\xAD\x22\x4E\x2D\x65\xA5\x82" - "\x00\xDB\xF7\x31\xAD\x9E\xF1\x1C\x37\x3E\xAF\x36\xF5\xFE\xD6\x71" - "\x70\xED\xEA\x51\xFD\x8B\x4D\xA7\x75\x0F\x50\x00\x02\x00\x00\x00" - "\xB0\x81\xEC\x98\x4C\x14\x66\xD2\xE9\x89\x0B\xA9\x64\x2E\x30\x71" - "\x5C\x57\xCA\xA9\x06\x61\xED\x28\x0C\x6A\x80\x0B\x28\x00\x80\xFF" - "\x01\xD5\xC5\xB8\x35\x61\xCD\xB2\x5B\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 885); - getPNGImage(png); - } - else if (url == "safari.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x03\x2E\x49\x44\x41\x54\x38\x11\x75\xC1\x4B\x4C\x1C" - "\x75\x00\x07\xE0\xDF\xBC\x67\xFE\xF3\xDA\x61\xE9\xB6\xC0\x2E\x2C" - "\x94\xA6\x65\x23\xC5\x08\x41\xD3\x18\xAD\x35\x31\x69\x6F\x26\x90" - "\xE8\x49\xAE\xE8\xD5\x0B\x37\xCA\xCD\x8B\x37\x3D\x35\x69\xDA\x98" - "\x18\x83\x89\x26\x35\x8A\x89\x31\x5A\x63\x02\xB5\x07\xB7\x40\x28" - "\xB0\xB0\x0F\xB6\xFB\x90\xD9\x07\x3B\xCC\xEC\xEE\xCC\xEC\x8E\x7B" - "\xE0\x40\x7C\x7C\x1F\x85\xFF\xB0\xB4\xB4\x34\x23\x8A\xE2\x94\xEF" - "\xFB\x1B\x2B\x2B\x2B\xDB\x14\x45\x05\xF8\x1F\x14\xFE\x21\xB5\xBF" - "\xAF\x1E\xE5\xF3\x1F\x48\x92\xF4\x11\x91\xA4\x12\x21\xA4\x1C\x00" - "\x39\xDB\xB6\x1F\xA7\x52\xA9\xC7\x73\x73\x73\x0D\x9C\x43\xE1\x9C" - "\x64\x32\x39\x2B\x8A\xC2\x72\x26\x9D\xBE\x99\x3D\xCA\x4B\xB6\xD3" - "\x42\x10\x00\x22\xCF\x42\x53\xE5\x56\x37\x08\x7E\x3D\x3C\x38\x5C" - "\x5E\xBE\x7B\x77\x1D\x67\x18\x9C\x59\x5D\x5D\x7D\x93\xE7\xB9\x07" - "\x4F\x9E\x3C\x7D\x75\xEF\xA8\xCE\xB1\x72\x1C\x46\x78\x1C\x10\x86" - "\xD0\xEC\x88\x28\x16\x4B\x6C\xCD\x7C\x31\x6E\x1E\x1F\xDF\x1A\xBF" - "\x7C\x79\x73\x6B\x6B\x2B\x83\x1E\x06\x3D\x0B\x0B\x0B\xD1\xD1\x78" - "\xFC\x5E\x2E\xFF\x62\xB2\xD0\x54\x40\x5F\xB8\x0E\x85\x84\xA1\x13" - "\x02\xC7\xE7\x01\x36\x04\x86\xD1\xE0\x75\x02\x04\xFE\x89\x61\x59" - "\x8D\x97\x66\xA6\xA7\xD7\xFE\x4C\x26\x4F\x68\xF4\xF0\x3C\xFF\x5E" - "\xB9\x5C\x9A\x35\x3D\x05\x26\x1F\xC3\x5F\xCD\x0E\x52\x0D\x07\x0D" - "\x06\xC8\x35\x5B\x28\x17\x0E\xD0\xDA\xFB\x1D\x05\xAF\x0F\x6A\x6C" - "\x0A\x7D\x46\x68\x5A\x51\xD5\xF7\xD1\x43\x87\xFB\xFA\xB4\x4E\xC7" - "\xBF\x43\xB1\x02\x32\x6D\x03\x45\x1B\xA8\x77\x00\x4F\xE0\xE0\x0B" - "\x02\x94\xC6\x21\xA2\x7F\xDC\xC7\x73\x57\x41\xC5\x67\xD1\xA0\xC2" - "\x18\x88\xC5\x21\xCB\xE4\xCE\xE2\xE2\xA2\x4E\x0F\x0F\x0F\x5F\x92" - "\x09\x19\x65\x24\x03\x99\x3A\x8D\x74\xC9\x41\xBA\xEE\xC3\xF2\x19" - "\xFC\xF4\xF3\x53\x24\x7E\xFB\x0C\xFC\xF8\xCB\x88\xCC\xDC\x80\x04" - "\xC0\x69\x71\x30\x22\x31\x70\x1C\x17\x0F\x82\x60\x90\x95\x15\x85" - "\x84\x42\x21\xA1\x4B\xB3\xE0\xDA\x5D\x0C\xD0\x2C\x22\x9A\x88\xC4" - "\x25\x82\xB1\xA1\x18\xB6\xC9\x3C\x6A\x57\xDF\xC0\x81\x45\x23\xE5" - "\x11\x04\x39\x07\xD7\x07\x55\xB8\xED\xB6\x90\xCF\xE7\x09\xED\x79" - "\x9E\xA5\x6A\x9A\xAD\x4B\x0C\xF4\xB0\x06\x4F\x31\xB0\x55\xED\x80" - "\xF7\x4E\x91\x6D\x74\x51\x9F\x78\x1B\x0D\x51\x87\x2B\x89\x90\x06" - "\xFB\x61\x0C\x18\x30\x14\x0E\xA6\x69\xDA\x99\x74\xDA\xA2\x37\x36" - "\x36\x4A\x15\xB3\xB2\x23\x50\x1E\x86\x46\x14\x1C\xC9\x32\xC6\x06" - "\x78\x24\xCD\x36\x56\x8B\x1A\x44\xA2\x62\xBF\xE2\x83\x95\x45\x30" - "\x82\x80\x5B\x93\xFD\xF0\x4F\x2B\x48\x67\xB2\xCF\x77\xF7\xF6\x0A" - "\x0C\x00\x4F\xD5\x34\x89\x61\xE8\xDB\xB7\x6F\x4C\x31\x27\xBC\x82" - "\x1A\x58\x64\x69\x03\x3E\x2B\xC1\x2A\x05\x70\xC1\x81\x0E\xF1\x18" - "\x95\x80\xF9\x58\x13\xDF\x7E\xF5\x85\xF7\xEC\xD9\xE6\xA7\xA6\x69" - "\xAE\x33\xE8\xA9\x55\xAB\xB9\x53\xDB\x9E\x10\xE0\x5F\x9B\x7B\x7D" - "\x12\x6D\xA2\xC3\x62\x05\x04\x1C\x07\xC2\xF2\x08\xE9\x2C\x66\x2E" - "\x06\x98\xBF\xE8\xE0\x87\x2F\xEF\x63\x6D\xED\xC7\xEF\x8B\xC5\xE2" - "\x27\xAE\xEB\x3A\x0C\x7A\x9A\x3D\xED\x56\x6B\x33\x93\xCD\x5E\x3B" - "\x35\x0B\xF1\x77\xAE\xF4\x53\x37\x87\x55\xBC\x72\x81\xC1\xEC\x60" - "\x17\x6F\x45\x1C\x44\xCC\x1D\x7C\xFD\xF0\x5E\xF0\xE8\xD1\x77\xBF" - "\x94\xCB\xE5\x8F\x2D\xCB\xCA\xA0\x87\xC2\x39\xB2\x2C\xC7\x75\x5D" - "\xFF\x30\x16\x8D\xBE\x9B\x48\x4C\x44\x47\x46\x46\x04\x8E\xE7\x71" - "\x6C\x9A\xEE\xCE\xEE\x6E\x3E\xB5\x9F\xFA\xA6\x54\x28\x7C\x6E\xDB" - "\x76\x1A\x67\x28\xFC\x9B\x20\x49\x52\x42\xD3\xF5\xD7\x54\x4D\x1B" - "\xE3\x38\x0E\xAE\xEB\xA6\x6B\xD5\xEA\x7A\xB5\x52\xD9\x06\xD0\xC6" - "\x39\x7F\x03\x12\xDF\x5D\xB7\xD4\xC5\x56\x33\x00\x00\x00\x00\x49" - "\x45\x4E\x44\xAE\x42\x60\x82", 871); - getPNGImage(png); - } - else if (url == "ie.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x03\x50\x49\x44\x41\x54\x38\x11\x8D\xC1\x7B\x68\x1B" - "\x75\x00\x07\xF0\xEF\xEF\xEE\x72\x49\x2E\x97\x47\xD3\x24\xC6\x3E" - "\xB2\xDA\x9A\x59\xD9\xDC\x2B\x48\xB7\x76\xCC\xC1\xA8\x3A\x10\xB6" - "\x15\x57\x14\xDC\x40\x10\x59\xE9\x98\xFF\xC9\x90\xE1\x98\x22\x88" - "\x22\x28\x43\x68\x51\x51\xD8\x10\xCA\x5A\x51\xD9\xF0\xB1\x39\xD8" - "\xAB\xDB\x1C\x76\x63\xF6\x61\xB3\xD4\x35\x49\x93\xA6\x79\xF4\xD2" - "\xBC\x93\xBB\xDF\xFD\x0C\xAC\xC2\x10\x84\x7D\x3E\x04\x8F\x88\x95" - "\x86\xAD\x48\xFE\xEE\x67\xCA\xC2\x1A\x54\x8A\x45\xA6\xD3\x5B\x7C" - "\xCF\x75\x85\xE0\x7F\xF4\x9D\xBE\xDD\xD0\xD8\xE2\xEE\x5C\x67\x59" - "\x6C\x3E\xE8\x3E\xEB\xB3\x96\xA6\x7A\xD5\x42\xCA\x66\xD2\xB2\x77" - "\x41\xB9\x02\xA8\xBE\xC8\x74\x3A\x2C\xE0\x3F\xF6\x7F\x75\x4D\x7A" - "\x3A\xD0\xDE\xDF\xE0\x34\xBF\xE9\x37\x46\xD6\x6F\x2C\xFE\x2C\xD1" - "\x6C\x90\xBF\x24\xEC\xC4\x38\xDF\x35\x3D\x95\x90\x7E\x1D\x19\xE5" - "\x7F\x64\xAF\xF7\xED\x04\x83\x8F\xC7\x43\xFA\xBF\xBE\x2E\x6F\xEE" - "\x79\xEA\x7D\x5F\xB3\xF9\x44\xB7\x69\xA2\x2D\xB0\xFC\x85\x71\xA5" - "\x54\xE1\xC6\x9B\x8E\x60\xDE\xFB\x12\x54\xC9\xEB\xD6\x78\xE9\x45" - "\xA7\x97\x16\x7B\xE9\xD8\x5D\x59\xAC\x96\x38\x3C\xA4\x73\x4B\xC7" - "\xA1\x26\x97\xE1\xF0\x36\xF6\x9B\xD1\x1F\x3D\x89\xD9\x94\x18\x39" - "\x6B\x1A\xF8\x36\xA8\xAE\x3D\x4D\xAB\x6A\xD8\x21\x73\xF0\x7A\x4C" - "\x76\xD7\x63\xD6\x13\x47\x73\xEF\x6D\x03\x66\x63\x1C\x56\xF5\x8F" - "\x05\xFD\x4E\x1B\x06\xBA\x70\xD1\xD0\x1A\xFB\x06\x93\x19\xF7\xC4" - "\x68\xBA\xB7\xEF\xAD\x0F\xD6\xBD\x76\xAC\x49\x3A\xF0\xF7\x64\x6C" - "\x7F\xAD\x54\x9D\xB6\x5A\x78\x38\x1D\xA2\x23\x6A\xDE\xF8\x6A\xF3" - "\x4F\x17\x64\x0E\xAB\x7C\x0D\xDA\x8E\xAD\x86\x9B\x4F\xB4\x2D\x9D" - "\xC2\x9F\xEC\x59\xFD\x07\xD3\xE0\x97\x27\xCF\x3D\x3E\xB5\xB7\xFB" - "\xAA\xBC\x67\xF8\x8A\x75\xEC\xB3\x0B\x93\xD9\x64\xEE\x8C\x81\x07" - "\x64\x89\x87\x68\x16\xB7\x58\x9B\xDC\x9B\x09\xEA\x82\xF3\xE7\xF9" - "\x12\x4D\x0F\xB5\x6B\xBF\xBC\x71\xBF\xE4\xC1\xCD\x27\xDF\xD1\x0B" - "\x35\xE3\x2C\x61\x2C\x07\x80\xE0\x01\x46\x38\xE2\x12\x2D\xC6\x8E" - "\x44\x46\xC3\xED\x99\x3C\x0D\xCD\x24\x0F\x0B\xA8\x6B\xF7\xC4\x37" - "\xA8\xE9\x5B\xDB\x23\x4B\x2A\x2E\xFB\x06\xC0\x89\x76\x70\xB4\x6A" - "\x63\x8C\x88\x00\x08\xFE\x45\xA0\x97\x0B\xD5\x60\xA5\xA8\x42\xAB" - "\xD4\x74\x5D\xD3\xCA\x02\xD5\xCE\x9B\xB8\xC2\xD5\x5D\xB9\xE4\x5C" - "\xCB\x77\xB5\x43\x28\x72\xAD\xF0\xA8\x1A\x8D\xCE\xA5\x8E\x45\xEE" - "\x25\xCF\x99\x24\x51\xC0\x03\xAC\x94\x2F\xF3\x4C\x87\x50\xAE\xE8" - "\x48\x66\x35\xA8\x4A\x25\x23\x40\xCF\x78\xA0\x4C\x06\xE2\x69\xEE" - "\xAF\x2B\x5A\xA0\xAD\xB3\xA4\xBA\x74\x9B\x68\x70\x79\x6D\xCF\x87" - "\xEE\x44\xC6\xCE\xBC\x12\xC8\xA3\xEE\xE0\xE8\x84\x63\xD3\xD6\x8E" - "\xA3\x94\x13\x36\xCC\xC7\x6B\x58\x09\x65\x43\x6A\x22\x74\x5C\x40" - "\x79\xCE\xC9\x94\xC5\xE6\x16\x5A\xF8\x38\xB5\x82\x1D\x2E\x45\x1D" - "\x6C\xB0\xF1\x70\x38\x2C\x2F\xF7\xEC\x7E\xC6\xBC\x69\x7A\xE9\x7B" - "\x10\x08\xB2\x43\xDA\x27\xCA\xE6\x17\x32\x79\x5D\x28\x43\x67\x35" - "\x9D\x1C\x8F\x7E\xB2\x5B\x11\x48\x2E\x2C\xA1\x5C\x86\x5D\x54\xEE" - "\xC4\x62\xA5\x1B\x2E\x07\xB7\x5E\x96\xF8\xE7\x78\x4E\x34\xC8\x76" - "\xCB\x5E\xC9\x2E\xED\x41\x1D\x65\x84\xAC\x14\x28\xE2\xC9\x0A\xCB" - "\x2C\xE5\x47\xB2\xD1\xC4\xE7\xA8\xE3\xA0\x23\x0D\x5D\x50\x19\x2C" - "\xBE\xF8\xDB\x6B\x23\x8D\x89\x1B\x83\xD9\xE8\xC2\x48\x78\xA1\xA8" - "\xC4\x53\x35\x64\x72\x94\xA4\x73\x94\xC4\x92\x55\x16\x5E\x28\xC6" - "\x16\x23\xCA\x87\xA9\xFB\xF1\x23\xA1\x77\xB7\x2F\xA3\x8E\x50\x76" - "\x8A\x27\xE3\x43\xFB\x50\xC9\x77\x03\xEA\x1F\x84\x54\xEF\x5D\x4C" - "\xFA\xC3\x1F\xB1\x4F\xD7\xD8\x1B\x2D\x5D\x26\x93\xA1\x95\x81\xD1" - "\x72\x51\x9D\x5B\x4E\xE5\xAE\xCD\x8E\xCF\x04\x63\x43\xFD\x14\xAB" - "\x08\xEA\xF4\xE0\x01\x82\xF8\x94\x15\xB4\xC2\x03\x2C\xCF\xED\x9A" - "\xD1\xF0\x88\xFE\x01\xAA\x49\x94\xA9\xE6\x22\x1B\x06\x00\x00\x00" - "\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 905); - getPNGImage(png); - } - else if (url == "vlc.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x02\x20\x49\x44\x41\x54\x38\xCB" - "\x9D\x93\x4F\x48\x53\x71\x00\xC7\x3F\xBF\xF7\xDE\xDE\xDE\xB6\xE7" - "\xDE\x66\x30\x65\xFE\xEB\xCF\x92\x4A\x4A\xEC\x3F\x2E\x0B\xA2\xEC" - "\x10\x8C\x52\x30\xA3\x4B\x97\xEA\x10\x81\x78\x52\x28\x08\x3A\xD5" - "\xA9\x82\xB2\x82\x4E\x46\xC7\x0C\x22\x21\xE8\xCF\x41\xA8\x40\xC2" - "\x29\xE4\x44\x49\x62\xA6\x92\x6B\xBA\x5A\xC6\xB6\xB7\xED\x75\xC9" - "\x2E\x6B\xB6\xFA\x5E\xBF\x5F\xBE\x7C\xBE\x87\x2F\xAC\xA2\xF0\x39" - "\xED\x62\xF8\x8C\x72\x99\xFF\xD1\x83\x0E\x6F\xF5\x7C\x17\x56\xAC" - "\x1B\xAB\xFF\x58\xD9\xBA\x62\x39\xA9\x98\x91\xAF\x0D\x1E\x92\xAA" - "\xB6\x62\xF9\x1B\xB0\xD6\xEF\x6F\x2D\x96\x53\x8A\x19\xD6\x9E\xB3" - "\xA1\x58\x53\x23\x19\x33\x4B\x7A\x64\x2C\x04\x4F\xEF\x96\x4C\x70" - "\xF5\x46\x9F\xEE\xF6\x94\x1F\xB0\x84\x82\x90\x6C\xB8\x74\x77\xF0" - "\xDA\xCD\x3E\x4F\xC9\x04\x6B\xC2\xF7\x9A\xAB\x8C\xD6\x72\xBB\xDA" - "\x84\x2A\x43\xF5\xEC\xB0\x91\x1C\x7E\xD1\x02\x3C\x29\xA9\xC0\x58" - "\x8C\x84\xFC\xC3\x23\xB8\xC3\xA0\x1A\x60\xC4\x60\x76\xC1\x1E\xFA" - "\x53\x41\xC1\x84\xDB\x27\xEB\x65\xB7\x95\x3A\x22\x2B\x60\x01\x79" - "\x40\x75\x42\x59\x3E\x7D\xF8\xCE\xA9\x4D\xB6\xBF\x16\x24\x76\x75" - "\x35\xE4\xB6\xB7\x05\xB2\xC6\x5A\x72\x36\x9D\xAC\xAC\x93\x31\x6A" - "\x31\x1B\x8F\xD6\x2D\xED\xBC\xB0\x6D\xD5\x09\x1F\xEE\xB7\x7B\x07" - "\x13\x5F\xDA\x53\xCD\xDD\x7C\x2A\x77\xA2\xE6\x52\x08\x49\x90\x34" - "\x05\xC9\xCF\x09\xE4\xC8\x9B\xB6\x81\xF3\x5B\xA6\x8F\xDF\x1A\x5F" - "\x2A\x20\x88\x3E\x3C\xBD\x4F\x7B\x3D\x10\x35\x16\xA7\x2F\xD9\x1C" - "\x2E\x72\x42\x25\x6D\xF7\x92\x51\xBD\xE4\x25\x0D\x45\x73\xA0\x2E" - "\x7C\xEC\xF5\x4D\x8C\x47\x9F\xF7\xEC\x3D\x58\x40\xA0\xC5\x47\x3B" - "\x62\xCB\x79\xDD\x33\xFA\x08\x9F\x4F\x42\xDA\x10\xC4\x72\xFA\x90" - "\x64\x81\x2B\x39\x4F\xCD\xC4\x10\xE2\xFD\x63\xF1\x23\x8B\xEE\xCB" - "\xC4\x3A\x81\x97\x00\x02\x60\xEE\xD5\x15\xD9\xF5\xEE\xFA\x44\x7C" - "\x2A\x1E\x98\x99\x81\x4A\x0F\x38\x35\x50\x14\x81\xCD\x29\x90\x45" - "\x9E\x6F\x71\x98\x9C\x83\xAA\x6A\xA8\xDC\x6C\x44\xCD\x96\xDE\x40" - "\x45\x73\x8F\xA9\x00\x38\x48\x34\xDA\x95\x78\xC0\x5F\x0F\x5E\x0F" - "\xA4\x92\x20\xB2\x20\x59\x16\x92\x69\x21\x34\x28\xAB\x84\xDD\x35" - "\xE0\xA8\x00\xA1\x7D\xAD\x35\xB5\xE5\x1D\xC0\x5B\x05\x40\xCF\x0C" - "\x75\x2A\x1B\xFD\x00\xD8\xEB\x80\xEF\x2B\x87\xF8\xC5\xB8\x32\xD4" - "\x05\xE8\x80\x0C\x4A\x6A\xF0\xC4\xEF\x82\x67\xFD\x63\x93\xDE\x6C" - "\xEA\x9F\xDE\x9A\x76\x2F\x46\x00\x7E\x02\x6B\x20\xAD\x2C\x4A\xE3" - "\xCD\x0E\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 622); - getPNGImage(png); - } - else if (url == "fb2k.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x4C\x49\x44\x41\x54\x28\xCF" - "\x6D\x91\x3D\x28\xC4\x71\x1C\xC6\x9F\xDF\xEF\xDC\xFD\x4F\xE9\xF2" - "\x9A\xAB\x43\x28\x49\xC9\x62\xF0\x32\xB8\x52\x5E\xCA\x6D\xC2\x60" - "\x10\x16\x59\x44\xD8\x2E\x65\xB1\x5B\xA4\x2C\x22\xDB\x95\x41\x57" - "\x36\x2F\x25\x79\x49\x62\x21\x13\x65\x40\x4E\x49\x9D\xB7\xFB\x18" - "\x9C\xEB\x0E\x9F\xF1\xFB\xF4\x3C\xDF\x7A\x1E\x29\x89\xF1\xE7\x76" - "\xC9\x25\x49\x72\xF9\xDA\x6D\xA9\x32\x31\x39\x9D\x8B\x87\x77\xEE" - "\x26\x79\xE5\x64\xD5\xEF\xDC\x76\xAF\x18\x5F\xBA\xEE\xF1\x04\x6F" - "\x5E\x60\x66\xDF\xD6\xD9\xDA\xC9\x6D\xB8\x8B\x7B\x3B\xE4\xA4\xEC" - "\xA6\x28\xB4\x0A\x00\xC7\xB1\xA3\xC7\x04\x00\x7D\x11\xE3\x97\x49" - "\xFA\x5D\x0D\x27\x31\x7E\x71\xF9\x9C\xD5\x92\xCC\x30\x79\x15\x61" - "\xFE\xA1\x66\xCE\x14\x7C\x3F\x08\xF4\xAD\x87\x68\xE6\x3C\x25\x5D" - "\x10\xA4\x95\xE1\x4D\x5B\x26\x23\x19\x5B\x36\xB6\xDD\x86\xC8\xE7" - "\x0A\x80\x6B\x8A\x11\xCD\x84\x0F\x6C\xA5\xAC\x64\x8C\xBF\x27\xB2" - "\x86\x10\x21\x00\x7A\x11\x62\x89\xC1\xA8\x09\xC8\x48\x32\x39\x45" - "\x23\x1F\x89\x11\x84\x8B\x77\x12\x64\x23\x06\xF8\x24\x30\xF1\xD3" - "\x85\x35\x25\x53\x5B\xB0\x47\x14\x80\x4D\x76\x81\xD9\x7D\x5B\x9E" - "\x6C\x56\x92\xDB\xDD\x78\x70\x0F\xB0\xC0\x3C\x00\x67\x31\xA7\x45" - "\x9E\xF4\x2E\x9D\xC2\xFE\x87\xF8\x06\x8B\x2C\x13\xE1\xE9\xAD\x78" - "\x48\xDE\x5F\x6B\xC8\xA9\x1C\x3B\x79\x07\x38\xFD\xA8\x9E\xFE\x2B" - "\x4B\x92\xBB\x7C\xF4\x21\x1E\x7B\xAD\x1A\xCF\x0C\x4F\xC7\xFA\x3A" - "\x72\x43\xB2\xE9\xA7\x2F\x4C\x12\xCB\xB6\x7D\xA8\x6B\x13\x00\x00" - "\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 410); - getPNGImage(png); - } - else if (url == "wmp.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x02\x55\x49\x44\x41\x54\x38\xCB" - "\xD5\x93\x4B\x48\x94\x51\x14\xC7\xFF\xF7\x7E\xF7\x7B\xCC\xCB\xC7" - "\x8C\xAF\xD1\x31\xED\x81\xD1\xA6\x20\x22\x06\xAD\x45\x12\x6D\x82" - "\xA2\x08\x24\x42\xDA\xB5\x6F\x51\x50\xFB\x68\x23\x84\xBB\x96\x41" - "\x9B\xB6\x25\x84\xDA\x26\x8A\x94\x28\xA5\xA8\xA6\x30\x35\x23\xD4" - "\xC6\x79\xE9\x38\xE3\x7C\x8F\x7B\xEF\x69\x61\x46\xE3\xBA\x4D\x67" - "\x73\x76\x3F\x7E\xE7\x7F\xCE\x01\xFE\xFB\x62\x00\x70\xFD\xF1\x7C" - "\x6F\x22\xE6\x1C\x06\x10\xE3\x0C\x61\x00\xA6\x25\xB8\x30\x18\xB3" - "\x0C\x0E\xD3\x36\x85\xE0\x06\x17\x9B\x1B\x1B\x99\x8A\x62\x8B\xC2" - "\x09\x7D\xB8\x7D\xA2\xC3\x05\x00\x01\x00\xC9\x78\xE4\xF2\xD1\x7D" - "\xED\xA9\xB2\x1B\x9C\xB1\x75\xCD\x4A\xAC\xBF\x8F\xDB\xBA\xC6\xCA" - "\xD1\x3E\x7F\x2B\xDA\xED\x81\x73\xF2\x03\x65\x69\xA5\x0A\x51\x2D" - "\xB3\x39\x1F\x77\x00\x4C\xFC\x01\x70\x06\x80\x48\x8B\xD5\x99\xC6" - "\xFE\xC5\x91\x44\x48\x6F\x71\x88\x30\x60\x37\x44\x7E\xB4\x9C\xF6" - "\xBE\xF5\x5C\x2C\x49\xCD\x51\xF1\x14\x79\x41\x40\x9F\x4A\xA4\x77" - "\x46\x10\x00\x50\xA8\x2A\x35\x97\x2D\xAD\x5F\x98\xB9\x11\x0F\x1F" - "\x1F\xE6\x3C\xD4\x04\xF9\x72\x14\xE4\xCE\x21\x55\xCC\xDA\x55\xB3" - "\x3D\x5A\xE9\x18\xA8\x19\x8C\x18\xDF\x95\x01\x07\x00\x5F\x6A\x74" - "\x2F\x4F\x1C\x6B\x74\x0B\x06\x8B\x26\x21\x8E\x0C\xC1\xBA\xF2\x08" - "\xBC\x2B\x0D\xBD\xB6\x84\xD4\xE7\x87\x61\x59\xAD\x30\x02\x49\xCE" - "\xB6\x73\xAB\x03\x30\x06\x24\xCA\xF3\x9D\x14\x10\xA0\xB7\xED\x78" - "\xF3\x1E\x58\x43\xF7\x61\x0E\xDE\x84\xB3\xFA\x91\xBB\x9B\x65\x26" - "\x95\x96\xBE\xD2\xFE\xDF\x00\xF1\xBB\x13\x31\x2B\xD8\x06\x80\x76" - "\xB6\x03\xE9\x41\xE5\x97\xA1\x03\xA0\x2A\x49\x06\x80\xD2\x80\x4C" - "\x36\xDA\xBC\xCE\x80\x08\xC8\xB7\xA7\x17\xC8\x27\x90\xD2\x20\x22" - "\xC8\xAF\xD3\xD8\x1A\xBD\x84\xE0\xF9\x03\x94\x22\x07\x24\x8F\x34" - "\xF8\x96\x30\xE0\x08\x03\x51\xDB\x60\x75\x06\x04\x60\x35\xD9\x3F" - "\x9B\x6D\x4D\x9F\x4B\xCE\x3E\x75\xD4\x97\x69\x04\x6F\xC7\x00\x29" - "\x01\x26\xF0\xEE\xD0\xD5\x22\x0F\x37\x48\xF2\xD6\xA1\x88\x21\xBB" - "\xE1\xE9\x7A\x03\x30\xE6\x93\x21\x27\x07\x46\x16\x7F\x52\x53\x21" - "\x78\x3D\x06\x72\x03\xF8\x91\x94\x9E\x1A\xBC\x9B\x5B\xD9\x7B\x2A" - "\xE7\x4A\x42\xC5\x0D\x58\xAE\xB4\x69\x8C\xDF\xBB\xE5\x00\x08\x01" - "\x60\x02\x00\xB2\x0B\x99\x29\x77\x65\x2E\xCD\x80\xA9\xEF\x2D\xC3" - "\xA9\xCE\xF3\xD7\xE2\xB6\x72\xA9\x64\x36\x0B\x32\x9D\x30\xAB\x78" - "\x96\x94\x81\x59\xCC\x17\xEC\x62\x6E\x2D\x56\x5A\xCA\x30\x00\x26" - "\x80\x1A\xDB\x7D\xDB\xA9\x64\x17\x3F\x78\xF2\x6C\xBC\xB5\xB7\xAF" - "\x27\x96\x68\x6B\x73\xA2\x0D\x2D\xCC\x74\x3A\x88\xF1\xFD\x6F\x9E" - "\x3D\x79\x91\x79\x35\x3E\x59\x5E\x9E\xCF\xFF\xB3\x67\xFA\x05\xB0" - "\xB4\x12\x06\x04\xED\x6B\x1E\x00\x00\x00\x00\x49\x45\x4E\x44\xAE" - "\x42\x60\x82", 675); - getPNGImage(png); - } - else if (url == "icecast.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x02\xC7\x49\x44\x41\x54\x38\xCB" - "\x95\x92\x6B\x48\x93\x61\x14\xC7\x5F\x4B\x53\xBA\x78\x63\x66\x89" - "\x48\x89\x15\x95\xB7\xC4\xB4\x54\x4C\xA4\xCC\x10\xDC\xE5\xD5\xCD" - "\xCD\x4B\xD2\x74\x73\x7B\xA7\x73\xCB\xCB\x34\x35\xDC\xE6\x6D\xF3" - "\x92\xBE\x86\x69\x5E\xD2\xA6\xA9\x65\x98\x64\xA0\x29\xD2\x97\x0C" - "\xF1\x43\xA0\xF5\x41\x41\xBA\x48\x44\xA9\x88\xFA\xC5\x20\xFE\xBD" - "\x5A\x94\x5D\x2C\xFB\xC1\x03\x0F\x87\x73\xFE\xE7\xFF\x3C\xE7\x10" - "\xC4\x37\xEC\xEC\x1D\x59\xD6\x36\xF6\xE6\xC4\x06\x12\x94\xBD\xB6" - "\x11\x31\xA5\x07\x36\xC6\x76\xED\xB6\x71\x26\x36\xC3\xD6\xCE\xC1" - "\x92\xC5\x72\xDA\xB9\x76\x17\x52\x77\xEC\xE5\xC5\xD3\x63\x6C\x71" - "\xCB\x4B\x6F\x7F\xAE\x0B\x6B\xAF\xD3\x0E\xE6\x58\x12\xFF\xC2\x9E" - "\xB5\xDF\x2B\x30\x4C\xE1\x46\x95\xCE\x4C\xA8\x6A\x57\x20\x50\x0D" - "\x22\x22\x8E\x9E\x3E\xE4\xEA\x11\x4F\x6C\x05\x21\xD5\xE9\x1C\x97" - "\xD6\xF3\x5C\xAE\x7F\x01\x35\xBD\x82\xE8\xD4\x5E\x84\x73\x34\x88" - "\x4C\x6C\x78\xE5\x1B\x28\xF4\xF8\x6B\xF1\xC5\x8C\x01\x57\x85\xE1" - "\xCD\x8C\x9A\xE9\x9C\xAC\x19\x42\x6E\xC5\x38\xA2\x04\x99\x88\x52" - "\xF4\x22\x2A\xB5\x0F\x91\x97\x9A\xDF\x05\x9F\x4F\xF5\xF9\x63\xB1" - "\x88\xEA\x3C\x4C\x95\xBD\x7E\xAB\xAA\x59\x84\xC6\x30\x8A\xB2\x0A" - "\x13\x8A\x75\x85\x28\xD1\xEA\xD0\x7D\x6F\x18\x42\x49\x0D\x48\x46" - "\x84\x9D\xD4\xFA\xE1\x64\x50\xAC\xDF\x2F\x9D\x07\xBD\x52\x8D\xB3" - "\xEF\xD5\xF4\x32\xA4\x97\xDB\x61\x2C\xD2\xE2\x6E\x67\x07\x5A\xAF" - "\x57\x43\x2D\x15\xA3\xDD\x74\x1B\x55\xE5\xD5\x50\x66\xD1\x8C\x9B" - "\x07\x8C\x48\xDB\x62\xD0\x39\x2A\x74\xBD\x38\x4E\xD5\xEF\xAB\x30" - "\xCE\x7E\x5C\xB3\x4D\x15\x8E\x21\x2F\x27\x07\x49\x7C\x36\x2A\x4B" - "\xAA\xD0\xD6\xDC\x08\x89\x58\x8A\xDA\xEA\x6B\x68\x6F\xAA\x47\x7E" - "\x86\x06\x22\x49\x2D\x48\x45\x1F\xB8\x92\x8E\xE5\x80\xB3\xB2\x30" - "\x82\x2F\xEF\xEE\x11\x65\x3E\x81\x48\x3D\x00\x95\xBA\x10\xC3\x43" - "\x8F\x31\x36\xFA\x14\x94\xF2\x0A\x0C\xBA\x22\x94\xE8\xB5\x28\xC8" - "\xD1\xA0\xAD\xE5\x16\x5A\x1B\x6E\x40\x9F\x97\x8B\x70\x6E\x2E\x42" - "\x48\x03\x4E\x5F\xC8\x7A\x46\xB0\x13\x6A\xF7\x90\x29\x5D\x43\x9A" - "\x02\x1A\x0B\xF3\xF3\x98\x9B\x9B\x83\x20\x5A\x80\xF8\x58\x11\x74" - "\x45\x34\x04\x31\x72\xA4\x48\xE5\x50\x29\xD3\xC1\xE1\x70\xB0\xBC" - "\xBC\x82\xD2\xB2\x4A\x78\x9C\x8A\x1F\x77\x3B\x7A\xC6\x71\xFD\x19" - "\x64\x22\x6D\x55\x90\x9D\xBD\x60\xA2\x8D\x28\xD7\x5E\x45\x86\x2A" - "\x1D\x89\x62\x35\x63\xD3\x04\x9F\x10\x39\xBC\x03\xE2\x50\xA4\x2B" - "\x85\x97\xA7\xDF\xA7\x7A\x83\xEE\x73\x53\x4D\x15\xB8\x5C\x7E\xE8" - "\xF7\x4F\x64\xB6\xCF\x6A\x64\x64\x64\x61\x75\x75\x15\x75\x75\x75" - "\x98\x9C\x9C\x84\x48\xAC\x07\x4F\xD6\xFD\x55\x20\x58\x8E\xE3\x3E" - "\x1C\x3C\xEC\x7F\x34\x31\x35\x35\x35\xB4\xB4\xB4\x04\x83\xB1\x3C" - "\xED\xB7\x51\x5A\x5B\xDB\x99\x85\xF3\xF2\x6F\xF2\xA5\x8D\x88\xA2" - "\xEE\xFF\x24\xE0\x1D\x2C\xC3\x31\xF7\xD0\x1E\x07\x6B\x5B\x4B\x26" - "\xCF\x62\xD3\x65\xE2\x0A\xF5\xE6\xA4\xA4\xAD\x9E\x64\xC6\xF5\x43" - "\x40\x06\x4F\xFF\x18\xD3\x3E\x67\x77\x0B\x62\xAB\x90\xC9\xAD\x95" - "\xBC\x94\xAE\x75\x81\x23\x3E\x3C\xDA\xCD\xE5\xE0\x76\xE2\x7F\x60" - "\x9C\x98\x45\xF0\x8B\xCB\x4E\xF8\x91\x2D\x4C\xE7\x6D\x9B\xE5\x7D" - "\x01\xA7\x4F\x5F\xE6\xC8\x50\xBB\x4A\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 789); - getPNGImage(png); - } - else if (url == "html5.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x9F\x49\x44\x41\x54\x38\xCB" - "\x9D\x93\xCF\x4B\x02\x41\x14\xC7\xF7\x8F\xF0\xE8\x39\xED\x26\x1D" - "\x82\x08\xAA\x83\xD0\x29\x22\x82\x2C\x28\xD1\x48\xA8\x4B\x25\x88" - "\xD4\x29\x41\x88\xF5\x10\x74\x10\xBA\xF4\xC3\x2E\x21\x44\x10\x1D" - "\xCB\x4E\x92\xE0\xC9\xE8\x90\x1E\x3A\xA5\xEE\xB8\xAE\xAB\x64\x98" - "\x85\xD9\x6B\xE7\x35\xBB\x8C\xAB\x16\xF4\xE0\x0B\xBB\xCC\x77\x3F" - "\x33\xF3\x7D\x6F\x85\xC2\xD4\x80\x45\x13\xFC\x53\x16\x81\xD6\x6F" - "\xA6\xDA\xB2\xBD\x4B\xEA\x92\x1D\xD7\x04\xBD\xB4\x97\x3C\x7E\xE0" - "\x1A\x82\xA2\x77\x8C\xD3\x38\xBC\x6E\x39\x3B\x54\x5F\x1F\x06\xD5" - "\x8D\x80\x3C\x0F\xC8\x50\x00\x89\xEE\x80\xA2\x28\x86\x54\x55\x05" - "\x73\x35\xE3\xBB\x50\x59\x44\x40\x86\x07\x24\x28\x40\x12\x37\xF1" - "\xC3\xF2\x53\x0E\xE4\xE4\x35\x28\x77\x37\xD0\xCA\xA5\x3B\xD4\xD8" - "\xF7\x81\xB2\x60\xA3\x80\x04\x0F\x88\x21\x20\xE0\x42\x40\xE9\xF2" - "\xD4\xC8\xE0\xC5\x37\xD8\xA5\xF2\x3C\x02\x62\x3C\x40\xA4\xE6\xE2" - "\xEA\xE4\xCF\x09\xB2\x0F\x40\x0E\x45\x28\x1D\x45\xE0\xFD\x2A\xDA" - "\x21\x9A\x81\x3C\x87\x00\x91\x07\x04\x70\x47\xF7\xE8\x9F\x19\xD4" - "\xFD\x23\x40\x66\x11\x10\xE0\x01\x1E\xFD\xC8\x34\x07\x5D\x24\xE2" - "\x87\xB7\x93\x6D\xD4\x57\xB3\x81\x00\x7A\x05\x69\x06\xBD\x1E\x1E" - "\xE0\xD4\x01\x72\xEA\x16\xAF\x60\xCE\x80\x56\xBB\x4A\xF0\xB9\x38" - "\x8D\x6B\x4E\x1E\xE0\x30\x00\xF7\x69\x3C\xBE\xB4\x17\xC4\x2B\xD5" - "\x83\x13\xD0\x3C\x0B\x23\xE0\xF3\x39\x8B\x00\xE6\x75\xF0\x00\xAB" - "\x01\xA0\xED\xEB\x93\x41\xEB\x31\x85\x93\xC8\xBC\x56\x81\x2F\x63" - "\x7C\xB5\x69\x94\xC2\x6B\x50\xBA\x38\x86\x8A\x36\x0F\x6D\xA5\x00" - "\x1F\xC9\x73\x68\x1C\x6C\x60\x07\xAA\x5E\xD3\x18\x73\x00\xD2\xEB" - "\x5F\xE0\xFB\x4F\x77\x67\x33\x40\x7A\x01\x42\x9A\xB2\x66\x00\x9D" - "\x7B\xD9\x65\xD3\x93\x07\xE6\x09\x09\xFD\x8A\xE5\xB1\xA2\x29\xAE" - "\xA9\xC6\x14\x67\xAD\xB6\x9A\xFD\xDF\x6D\xBF\x3E\xC4\xFD\x38\xE7" - "\x3F\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 493); - getPNGImage(png); - } - else if (url == "flash.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x15\x49\x44\x41\x54\x38\xCB" - "\x95\x93\x41\x8A\xC2\x30\x14\x40\x7F\x3D\xC1\x78\x84\x7A\x04\x0F" - "\x20\x88\x5A\xAB\xAD\x8A\xB8\x1A\x10\xC6\xEE\xDD\x09\x6E\x5C\xBA" - "\x70\xA3\xCC\xC2\xBD\x17\xF0\x04\x2E\xBD\xC0\xE0\x09\xE6\x06\x95" - "\x42\xA1\x50\x28\xFD\x93\x84\x64\xF8\x69\xD3\xA2\x81\xB7\x69\xF3" - "\xDE\x4F\x03\x05\xDF\xB2\x70\xC2\x98\x02\xE0\x8C\x30\x95\xF0\x77" - "\x7C\x8F\xC7\x18\x37\x1A\x82\x91\xC4\x65\x40\x6D\xC0\xAA\x0E\xB8" - "\xA6\x80\x06\x91\x45\xC0\x30\x5D\x0B\x28\x94\x48\xE5\xFD\x7C\x8E" - "\xBF\x8F\x07\xF2\x65\x0C\xD4\xF1\x1D\x04\x48\x17\x95\x87\x3C\xC0" - "\x8F\xE6\x15\x24\x4F\x12\xB4\x5A\x98\xE7\x39\xC6\xCF\x27\x9E\x56" - "\xAB\x92\x2C\x02\xEA\x62\x3C\x82\x7A\x76\xBB\x5C\x30\xCB\x32\xDC" - "\x76\xBB\x46\xD9\xE1\x81\x11\x11\x28\x5F\xB6\x8D\x69\x9A\x6A\x50" - "\x59\x0B\x98\xB8\x1E\x8F\x98\x24\x89\x06\x15\x15\xE0\x92\xA3\x71" - "\x16\xCD\x26\x9E\xD7\x6B\x8C\xE3\x58\xB0\xE9\x74\x4A\x53\x15\x03" - "\x53\x20\x8A\xA2\x7F\x0E\xCB\x65\xA5\xA8\x80\x61\xE1\xBB\xC2\x30" - "\xC4\x9F\xFB\x1D\x77\xBE\x5F\x12\x8B\xB2\x08\x38\x86\x8B\x71\x5E" - "\x10\xFB\x12\x70\xDE\x90\x74\xD9\x12\xC0\xA0\x66\x63\xD5\x54\x2E" - "\xF6\x24\x20\x97\xCD\xF8\x7C\x03\xF6\xBF\x41\x9B\xF1\xF1\x07\x5A" - "\x4C\x80\x8C\x91\x5C\x9B\x60\x00\x00\x00\x00\x49\x45\x4E\x44\xAE" - "\x42\x60\x82", 355); - getPNGImage(png); - } - else if (url == "rtb.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xA9\x49\x44\x41\x54\x38\xCB" - "\xAD\x53\xC1\x0D\xC4\x20\x0C\xCB\x28\x1D\x25\x4B\xF4\xDF\x51\xB2" - "\xD9\x8D\x76\x95\x53\x19\xB8\xD6\x04\xA9\x3A\x24\x4B\xB4\xC2\xC6" - "\x4E\x82\x99\x5A\x11\x91\x70\xFF\x26\xF8\xBD\x5C\x11\x9E\x04\x33" - "\x8D\x4B\xCC\x35\x79\xDF\x3F\xB6\x6D\xFD\x20\xF7\x77\xE0\x3F\xCE" - "\x3E\x6E\x1E\x09\xD8\x47\xD4\x22\x3F\x4E\x94\x6D\xE6\xAF\xE2\xB4" - "\x82\x29\xDB\xC7\x51\x0B\x00\xC9\xBD\xF2\x74\xDB\x20\x81\x8C\x7D" - "\x15\x03\x48\xEE\x78\x0B\x0E\xF7\xD6\xAD\x45\x92\x3B\xB3\x49\x47" - "\x04\x85\x47\xB1\xE4\x32\xC2\x4A\x84\x35\x19\x1D\x25\x97\x45\xAC" - "\xAA\x0D\xF2\x3D\x66\x2B\xE2\xAC\x8D\xAB\x76\xB6\x36\xAA\x41\x52" - "\x31\x9E\x83\xE6\xF3\x51\x56\x22\x74\x21\x47\xF9\x2F\x8F\xE9\xE5" - "\x73\x3E\x01\x35\x60\x01\xA4\x93\x4C\xC0\x7E\x00\x00\x00\x00\x49" - "\x45\x4E\x44\xAE\x42\x60\x82", 247); - getPNGImage(png); - } - else if (url == "ps.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xE2\x49\x44\x41\x54\x28\xCF" - "\xA5\xCE\xBF\x2B\x04\x70\x00\xC6\xE1\xEF\x24\xC2\x9D\x23\x52\x26" - "\xD9\x0D\x97\xED\x22\x31\x28\x93\x01\x65\xB0\xF8\x03\xAE\x8C\xCA" - "\x20\x75\x83\x48\xE1\xE4\x72\x49\x91\xB2\xB2\x18\x64\x40\x16\x19" - "\xAE\x48\x91\xF2\xF3\xBA\x52\x2C\x06\x0A\x3D\x46\x91\x53\xF2\xCE" - "\x4F\x6F\x9F\x10\xFE\xB2\x9C\x82\x5F\x41\x9F\x61\xEB\xEE\x8B\xA3" - "\x84\x98\x3A\x8D\x92\xC5\x9E\xDA\x55\x19\xB3\xA5\x5C\xB3\x27\x3F" - "\x82\x88\x05\xE7\x6A\x55\xD8\x2D\x06\xD2\x4E\xD5\xAA\xB1\xE8\xC7" - "\x86\x88\x79\xC7\x62\xCA\xEC\x7D\x07\x2F\x2E\x25\x44\xA4\x3D\x18" - "\x90\xF2\xFE\x09\xDE\xDC\x59\x12\xD7\xA3\x5B\xA5\x19\x37\x46\x4D" - "\xCB\x98\x95\xF3\x2A\xE4\xF5\x6A\xD0\x22\xEB\x44\x87\xA8\x94\x21" - "\x5D\x56\x1D\x19\x54\x22\x29\x6C\x8B\x6A\xB2\x2C\x6B\x44\xA7\x88" - "\x09\x05\x67\x56\xB4\xAA\xD7\xEF\x42\x08\xE1\xDA\x81\x39\xE3\x76" - "\xB4\x29\x95\x32\xA9\x5A\x5C\x46\xDE\xAD\xC7\xAF\xA9\x57\xA6\xAC" - "\xD9\x70\xE8\x59\x08\x21\xEC\xDB\x14\xFE\xBD\x0F\x28\x4D\xB1\x81" - "\xCE\x50\xD3\x95\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 304); - getPNGImage(png); - } - else if (url == "mplayer.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\x9C\x00\x00\x0E" - "\xC4\x01\x75\xF6\x84\x81\x00\x00\x01\xBE\x49\x44\x41\x54\x38\xCB" - "\xB5\x93\x4D\x6B\x13\x41\x18\xC7\x97\x7C\x0A\x6F\x82\x37\xBF\x80" - "\x57\x3F\x81\x47\xD3\x83\xD4\x80\xF5\xE2\xCB\x21\xA8\xE8\x36\xC4" - "\x22\xE9\xC1\x1C\x12\x85\xE2\x41\x44\x6D\x11\xC1\x43\x63\x5A\xA5" - "\x9A\x88\x11\x8B\x07\xA1\x07\x6F\xBE\x20\xD9\x45\x21\x31\x11\xEB" - "\xEE\xEC\xEC\xEE\x64\x13\x4C\xF7\xE7\xCE\x56\xEA\x45\xD1\x06\xFD" - "\xC3\x33\xC3\xC0\xCC\xFF\x79\x66\xE6\xF7\x18\xC6\xFF\xD4\xCB\x0D" - "\x9F\xA5\xBB\x82\xB9\x79\x87\xE9\xE3\x9B\x1C\x38\xF8\x99\x3D\xFB" - "\xFA\xEC\xDD\xDF\xE3\x71\xD3\x67\x67\xA3\xA5\x14\x4A\x0D\x79\xFD" - "\x36\x62\xE5\x61\x40\x75\xC1\xE7\xDC\xAC\xC7\x19\x53\xFE\x36\xA6" - "\x8E\x6E\x6E\x1B\x5C\xF0\x24\xEF\xC7\x5B\xEC\x56\xC3\xD1\x38\x49" - "\x3A\xC0\x38\x24\x3C\x86\x4C\x26\x31\x48\x0C\x66\x3C\x9F\x49\xF5" - "\x2A\x0C\x31\x2E\x25\x57\xD0\x3A\x3B\xEB\x73\xF5\x5A\xC8\x8D\xDB" - "\x8A\xC3\xD3\x82\xC5\x3B\x16\xF5\x7A\x9D\x76\xBB\x4D\xA7\xD3\xA1" - "\xD7\xEB\x21\xA5\xA4\xDB\xED\x62\x59\x16\x51\x14\xB1\x1A\x2A\x8C" - "\x5B\x72\xBB\x82\x13\x79\xC9\x91\x63\x82\x99\x93\x5E\x3A\x2F\x2E" - "\x3D\x21\x9F\xCF\xA7\x51\xA9\x54\x28\x14\x0A\x14\x8B\x45\x6A\xB5" - "\x1A\xA6\x69\xE2\x38\x0E\x57\x82\xF0\x1F\x18\xAC\x27\x83\x56\xA8" - "\x62\x46\xA3\x18\xE1\xC5\xA8\x41\xCC\x20\x79\x20\xD7\x75\xE9\xF7" - "\xFB\xB4\x5A\x2D\x1A\x8D\x46\xBA\x56\xC9\x97\xEB\xF2\xB5\x4E\x27" - "\xC9\x0D\xFB\x87\xC1\xDF\xE8\xAB\xB3\xC5\xEA\x5A\xC4\x9B\x77\xDF" - "\xD2\xF5\x94\x9F\x54\xA0\x33\xC5\x71\xFC\xC7\xC3\x1F\x3E\x8E\xB9" - "\x38\xEF\x72\xBF\xBE\xC1\xF2\x4A\xC4\xBD\xE5\x88\x53\x09\x02\x29" - "\x4C\xD5\x05\xC1\x83\xB5\x90\x47\xCD\x20\x8D\xE6\xD3\x80\x67\xCF" - "\xE5\x4E\xAC\xBF\x90\x98\x73\x2E\xAE\x08\xC9\x64\x32\xE4\x72\x39" - "\xCE\x97\xBE\xFC\x44\x59\x73\xAD\xF9\xD6\x9C\x6B\xDE\x35\xF7\x9A" - "\x7F\xDD\x07\xBA\x1F\xBA\x9F\x02\xAE\xDF\x74\xB0\x6C\x9F\x6C\x36" - "\x8B\x6D\xDB\x94\x2E\x0B\x76\xDD\x5C\xA5\xB2\xA0\x5C\xF5\x29\x95" - "\x3D\x26\xEA\xCE\x5F\x19\x7C\x07\xD7\xA8\xAB\xC5\x53\x48\xD2\x2A" - "\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 524); - getPNGImage(png); - } - else if (url == "apple.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xAD\x49\x44\x41\x54\x28\xCF" - "\x63\x60\xC0\x02\x1E\xFD\x67\xC0\x0D\x2E\xFD\x8F\xFA\x5F\x86\x4F" - "\x41\xD4\xFF\xA0\xFF\xAB\xFE\xE3\xD1\xEF\x85\x5D\xFA\xD5\xFF\x26" - "\xA0\xCE\xB0\xFF\x9B\xFE\x9F\x03\x2A\x48\xFB\x9F\xF5\x7F\x1F\xAA" - "\xB2\xAC\xFF\x6E\x40\xBB\x93\xC0\x30\x0B\x0A\x91\xA4\xCF\x81\xA5" - "\xB3\xFE\x17\x01\x61\x1E\x18\x16\xFD\xBF\x86\xAC\x60\x11\xD0\xE6" - "\x24\xA8\x14\x04\x4E\x42\xB5\x60\xDA\x7F\x3F\xB0\xBD\x08\xD8\x86" - "\xAA\xE0\x10\x50\x41\x12\x8A\x82\xB4\xFF\xA7\xFE\xA3\x84\x9C\xDB" - "\xFF\x38\xA0\x20\x32\x8C\xFB\xBF\x0B\x59\x49\x1B\x50\x20\x09\x0D" - "\xDE\x42\x56\x70\x0D\x18\x0A\x51\x40\x45\x08\xB8\x0C\x3D\xB8\xB6" - "\x01\x15\x44\xFD\xAF\x02\x06\x18\xC8\xF8\xAA\xFF\x58\xE3\xF0\xDC" - "\x7F\x58\xB8\x30\x10\x0F\x00\x5E\x29\xAA\xB1\xD7\x27\xEE\x1B\x00" - "\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 251); - getPNGImage(png); - } - else if (url == "synology.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xAA\x49\x44\x41\x54\x28\xCF" - "\xB5\xD0\xCD\x4A\x02\x01\x18\x85\xE1\xEF\xFE\xAF\xC0\xBD\x84\x18" - "\x18\x22\xA1\x09\x35\x43\x19\x3A\x88\x3F\x19\x14\x49\x24\x41\xC5" - "\x40\xA6\x1B\x41\x21\x62\x9E\x16\x6D\x6A\xD1\xB4\xC9\xB3\x7E\x36" - "\xE7\x8D\xF8\x7B\x4A\xF7\x2F\xA0\x90\xDB\x94\x81\xB1\xB6\xBA\x87" - "\xDF\x41\x6A\xE7\xC9\xC8\x1C\x2B\xD7\x16\x66\xEE\x14\xE6\xFA\x76" - "\x22\xE2\x4A\xCD\xB9\xB5\x23\x5B\x03\xC7\x1A\x6E\x34\x25\x4E\x4C" - "\xF4\x45\xC4\xBB\xA5\x44\x22\x33\x96\xBA\x75\x86\x54\xC5\x0B\x86" - "\x22\xE2\xC2\xDA\x54\xD7\xAB\xAA\xCC\xB3\x0E\x4E\x1D\xC8\x2C\xF5" - "\x44\xC4\xBD\xA6\x8E\x37\x1C\x5A\x58\x19\x62\xE4\xD1\xA5\x96\xFC" - "\xAB\x43\x01\x26\x1A\xB6\x3F\x1E\x14\xDF\x43\x7D\x98\xCA\xF7\x95" - "\xBA\x1C\x7C\x02\xE6\xEF\xB0\xFE\x1C\xF5\x08\xB2\x00\x00\x00\x00" - "\x49\x45\x4E\x44\xAE\x42\x60\x82", 248); - getPNGImage(png); - } - else if (url == "roku.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\x64\x49\x44\x41\x54\x28\xCF" - "\x63\x60\xA0\x0A\x68\xF8\xCF\x80\x04\x03\xFE\x2F\xF8\x8F\x43\x81" - "\x03\x5C\x51\xC3\x7F\xEC\x26\x00\x81\x16\x98\xA5\x80\x5B\xC1\x01" - "\x28\x1B\xC5\x1A\x64\x05\x0B\xA0\xEC\x03\xD8\x14\x2C\x00\xDA\xAD" - "\x00\x75\x28\x1E\x5F\x60\xB8\x00\x53\x41\x16\x4E\x05\x50\x3F\x30" - "\xE0\x56\xC0\xC0\x00\x71\x83\x01\x6E\x6F\x02\x01\x98\x1D\x8A\xEA" - "\x0B\x07\x30\x84\xF0\xB2\xA0\x3C\x8C\x00\x27\x13\x00\x00\x9C\xD5" - "\x79\xC4\xEC\xC2\x17\x58\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42" - "\x60\x82", 178); - getPNGImage(png); - } - else if (url == "itunes.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0B\x13\x00\x00\x0B" - "\x13\x01\x00\x9A\x9C\x18\x00\x00\x03\x87\x49\x44\x41\x54\x38\xCB" - "\x4D\x93\x4B\x68\x5C\x65\x1C\x47\x7F\xFF\xEF\x3E\xE6\x95\x9B\x99" - "\x49\x9A\xF4\x26\xCD\x98\x4C\x93\x4E\x1E\x6D\x93\x4A\x5D\xB4\x2A" - "\x49\xB5\x69\xD0\x2A\x05\x17\x62\x0B\x85\x16\x34\x98\xB8\x51\x17" - "\x52\x15\x25\x62\xC1\x4D\x21\xB5\xB8\xA9\xD9\xA8\xC1\x85\x94\x08" - "\x52\x04\x51\x3A\xA5\xA6\x25\x09\x18\x43\x8A\xAF\xD8\x94\x32\x49" - "\x9A\x99\x49\xEA\xCC\x9D\xB9\xF3\xBE\x8F\xEF\x73\x13\xC1\xB3\x3F" - "\x67\x77\x08\x00\x88\x88\x84\x10\x00\x20\xA2\xD1\x68\x74\xE4\xC4" - "\xC8\xB9\xC7\x3A\x3A\x87\xEA\x83\xE1\x56\x22\x62\x05\x33\x97\x5C" - "\x4B\xDC\x9F\x8D\xC7\xE3\xD3\xAB\xAB\xAB\xAB\x00\xC0\x18\x63\x9C" - "\x73\x4E\x3B\xB2\x00\x80\xF1\xB1\xB1\x77\x9F\x38\x72\xEC\x22\xF3" - "\x86\x64\xBF\x16\x86\xEA\xF5\x03\x20\xD4\x6A\x35\x54\x8A\x26\x78" - "\x25\xCB\x7F\x5B\x9A\xFD\xE4\xD3\x2B\x57\x3E\xFC\x2F\x42\x00\x08" - "\x80\x98\x98\x98\x98\x6A\x8E\xEC\x1F\xAD\xB1\x3A\xEC\x6E\xEB\xB0" - "\x55\x2D\x4C\xDE\x80\x46\x8A\x22\x13\x83\x10\x76\xB5\xCC\x93\x89" - "\x84\x62\xE7\xD3\x28\x6C\xFD\x39\x73\xE1\xC2\x3B\x2F\x03\x80\x04" - "\x00\xA3\xA3\xAF\xBD\xD5\xD2\x31\xF0\x7E\xD2\x84\xAD\xE9\xED\x54" - "\x91\x7C\x32\x17\x9C\x6D\xAF\xAF\xB0\x07\x77\xE7\xE9\xAF\x5F\x7E" - "\x66\xBF\xCF\xC7\xA5\x6A\x29\x2B\x78\xB0\xC3\x12\xAE\xE8\x1F\xE8" - "\x8D\xA8\xF3\x0B\x0B\x37\x65\x5D\xD7\xF5\xFD\x03\x47\x3E\x9E\xFB" - "\x23\x0D\x7D\xDF\x01\x29\x61\x82\x85\x79\x09\x73\x5F\x7F\x86\xBC" - "\x61\xC0\xB5\x1D\x08\xCE\xE1\x58\x55\xEC\xEE\xEC\xA5\xFE\xD8\x33" - "\xEA\xF2\xE2\x12\x9E\xEC\x3D\xF4\x5E\x77\x77\xF7\xB4\x74\xE6\xCC" - "\xE9\xF1\xED\x52\xDD\x8B\xC9\xB2\xC7\xA9\x78\x1B\xA5\x6A\x40\x07" - "\xC1\xC5\xFD\xF8\x35\x54\xCD\x02\x98\x2C\xC1\x13\x0C\x41\x0D\x68" - "\x20\xC5\x0F\xA7\xE5\x71\x4A\xA6\x32\x76\x29\x97\x97\x0E\x76\xEE" - "\x2A\xC9\xAD\x7B\xA2\xCF\xFE\xB4\x5C\x40\x35\x14\x21\xB3\xE6\x85" - "\x4F\x04\xC1\x6D\x07\x6A\x43\x03\xDA\x4E\x9E\x85\xDA\xBA\x0F\x4E" - "\xA8\x1D\x52\x31\x8B\xD4\x37\x97\xB0\x59\x91\x91\xE5\x75\xCC\x58" - "\x4B\xE2\xD4\xE1\xC8\x90\x6C\xB9\x6A\xDB\xCA\x46\x0E\x1E\x45\x25" - "\xC5\x0E\xC0\x2F\x87\x21\x39\x29\x68\x91\xBD\xA8\x3B\x79\x0A\x8F" - "\x92\x40\xCE\x06\x84\x53\x86\x6D\x39\x28\x59\x2A\x52\x25\x99\x0A" - "\x1B\x65\x94\x0E\xD6\xB5\xCA\xB6\x23\x60\x94\x3D\x40\x49\x05\xAB" - "\x79\xE0\xE5\x1E\xF8\x5D\x0E\x3B\x6B\xC0\x63\x00\x39\x47\x40\x09" - "\x10\x90\xC9\x21\x9D\x33\x61\x14\x81\x94\xE1\x02\x26\xC1\xB2\x38" - "\x98\x6B\x15\x37\x43\xC1\x26\x00\x3E\xC1\xFC\x0D\xD0\x75\xA0\xB1" - "\x1E\x10\x12\x83\xAD\x01\x3E\x96\x47\x76\xF2\x4D\xDC\xFB\xE0\x2C" - "\xDC\x5A\x0D\x92\xE2\x03\x1C\x8F\xF0\x06\x1A\x41\xBC\x9A\x62\xDB" - "\xA9\xBF\x6F\xC7\xF6\x34\x00\x65\x45\xC4\xFC\x15\xB4\x5F\xFF\x08" - "\xC5\x2F\x2E\xC2\x1B\xD0\x00\x0D\x70\x96\x6E\xC0\xF8\xF1\x5B\x48" - "\x66\x06\xF5\x5A\x3D\xB8\xA5\x02\x59\x9B\x77\xB6\xEC\x42\x3E\xF3" - "\x60\x4E\xCA\x65\xD3\x1B\xCF\x0F\x8F\xBC\x3E\xBF\xA1\x7B\xFA\xA5" - "\x59\x2E\x96\x67\x88\x9B\x65\x04\x7B\x0E\xE0\xD1\xDE\x21\xD8\x52" - "\x13\x9A\xBD\x04\x2D\x12\x43\xBE\x6F\x14\x9B\xEB\x24\xEC\x95\x75" - "\xE9\xF4\xB0\x8A\x5B\x3F\x5C\x7D\x43\x32\x0B\x95\x5C\xA4\xC9\x15" - "\x7D\x87\x86\x8F\xFF\x9A\xD5\xDC\xCE\xA8\x82\x40\x57\x0F\xFD\x73" - "\xF4\x3C\x36\x4A\x41\x64\x9D\x00\xCC\xAE\x41\xA4\x9B\x8E\xE3\x61" - "\xCA\x27\xCA\x0B\xF7\xEC\xE7\x8E\x06\x24\x35\x77\xED\x72\xFC\xE6" - "\xEC\x57\x84\x1D\xC6\xC7\xC6\xBE\x34\xDA\xDF\x3E\xF7\x7D\x36\x04" - "\xD1\x15\x76\x2C\x3F\x23\xE1\x0A\x12\x42\xC0\xCD\x39\x02\x89\x82" - "\xC0\x6A\x5A\x7E\x21\x56\x45\x8C\xCD\x5C\xBF\x3C\x79\xE9\x25\x00" - "\x5C\x22\x22\x06\x40\x2C\x2E\x2E\x7E\xD7\x17\x5C\xA3\x63\xB1\xB6" - "\xA7\x4A\x5B\xB2\x62\xAE\x57\x59\x6D\xDB\x22\xB1\x55\x25\x2D\x53" - "\x64\x07\xA5\x3C\x7B\xA5\x67\xDD\xA5\xB5\xAB\x93\x9F\x4F\x4D\xBD" - "\x0A\x40\x10\x11\xA3\x9D\x9D\x99\x10\x82\x03\x40\x44\x0F\xF6\x0D" - "\x0E\x9E\x38\xDF\x10\x39\xFC\xB4\xF0\x36\xB7\x00\x8C\xA8\xB6\xBD" - "\x65\x6C\x2E\xDD\xB9\x73\xFB\xC6\x74\xE2\x61\xE6\xEE\xFF\x9D\x7F" - "\x01\x0D\x6F\xA1\x6E\xFB\xAE\xB6\x18\x00\x00\x00\x00\x49\x45\x4E" - "\x44\xAE\x42\x60\x82", 981); - getPNGImage(png); - } - else if (url == "warn.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1F\xF3\xFF" - "\x61\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x01\x88\x49\x44\x41\x54\x38\xCB" - "\x9D\x93\xCD\x4A\x02\x51\x18\x86\xA7\x24\xA2\x02\x47\xAC\x4C\x8C" - "\x68\x51\x37\x90\xAB\xDA\x55\x77\x90\x17\x50\x0B\x6F\xC1\xBA\x81" - "\x7E\xD6\x25\xD4\xA2\x85\x9B\xA0\x56\x6D\x2A\xC2\x28\xA2\xA0\xB0" - "\x06\x8C\x74\x61\x90\x41\x18\x92\x3F\xD8\x8F\x24\xF8\x33\xE3\xBC" - "\x7D\xE7\x8C\x33\x5A\x69\x69\x07\x1E\xCE\x7B\xDE\x73\xBE\xF7\xFB" - "\x66\x31\x82\xD0\x60\x25\xFD\xD6\xF1\xA2\x34\x08\x06\xD3\x42\xAB" - "\x8B\x15\x96\xDE\x56\x88\x65\x1E\xD2\x52\x31\xEB\x98\xBF\x72\x00" - "\xD8\xE6\xE4\x03\x8E\xD6\xA6\xC8\x5D\xD8\x79\x77\x3D\x80\x4D\xC1" - "\xBC\xA6\xBB\xBF\x9F\xD9\x00\xC5\xC7\x0A\x38\x2A\xE9\xEC\xB9\xAD" - "\xB9\x29\x32\x27\x7D\x28\xA6\x17\xA0\x16\xBC\xD5\x80\xC2\x1A\x79" - "\xF3\xC8\x9C\xF4\xE3\xCF\xEE\x49\x7F\x2F\xD4\x8F\x45\x62\xA9\x1A" - "\x40\x9A\x79\x74\xFF\xFB\x14\xF1\x3D\x0B\x0A\xB1\x39\x94\x5F\x3C" - "\x50\x09\x23\x80\x74\xF9\xD5\x83\x62\x6C\x16\xF1\x7D\x0B\x1A\x76" - "\x7F\xDC\x35\xA3\x9C\x70\x6B\x24\xDD\x46\x80\x7E\x66\xB0\x37\x75" - "\xA7\x88\xEE\xF4\x20\x17\x9A\x80\xF2\xE4\x82\x12\x9B\x21\x5C\xD5" - "\x00\xD2\xDC\x27\xB2\xB7\x93\xB8\xA7\xB7\x3F\xBA\x47\xB6\xBA\x20" - "\x47\xA7\xA0\x30\x1E\x18\xD3\x46\x80\xA2\xFB\x51\xCD\x67\x6F\xBF" - "\x4C\x11\xF2\x75\x22\x7D\x3A\x04\x39\x32\x56\x83\x13\xF2\x9D\xF3" - "\x9B\xA7\xF9\x89\xE3\x61\x84\xA9\xC6\xE8\x7E\xB3\xD9\x81\x52\x68" - "\x84\x18\x85\x4C\xBB\x1C\x26\x48\xEB\x13\x70\x4F\xF7\xC3\x9A\x0E" - "\x52\x0D\x9F\x42\x5A\x37\x21\x75\x64\x45\x29\x38\x40\xD8\xF9\x2E" - "\x57\x76\x23\x80\xCE\x72\xCD\x3D\x23\x71\x28\x42\xDA\x30\x41\x08" - "\x78\xDB\x91\xF2\x9B\x51\x92\xC4\x0A\x96\x1A\x5D\x87\x6B\x91\x7E" - "\x2E\x11\xCF\x07\xDD\x08\x78\xDB\xC0\x3F\xE1\x72\x55\xC0\x7F\x60" - "\xB5\x9F\x32\xEB\xC2\x92\x1E\xFA\xFF\x9A\x00\x00\x00\x00\x49\x45" - "\x4E\x44\xAE\x42\x60\x82", 470); - getPNGImage(png); - } - else if (url == "xff.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xB5\xFA\x37" - "\xEA\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0E\xC4\x00\x00\x0E" - "\xC4\x01\x95\x2B\x0E\x1B\x00\x00\x00\xCC\x49\x44\x41\x54\x28\xCF" - "\x63\x60\x08\x67\x68\x64\x68\x40\x83\xAD\x40\x28\xCC\x00\x05\xB5" - "\xDF\xFF\xA3\x83\xE3\xFF\x4D\xFE\x6B\xFD\xCF\xEA\xC1\xA9\xE0\xF0" - "\xFF\xD8\xFF\xEF\xFF\x5B\xFD\x77\x9E\x84\x43\xC1\xC1\xFF\x12\x40" - "\x69\xAB\xFF\x5C\xFF\x19\x8A\xB0\x2A\x40\x00\xA0\x5B\x88\x52\xD0" - "\xFC\x7F\xED\xFF\x9B\xFF\xE3\xFF\xBF\xFE\x1F\x0C\x86\x57\xFF\xA7" - "\x81\xE9\xED\x30\x05\x67\xFE\x8B\x01\x6D\xEC\xFB\xFF\xF6\x3F\xF7" - "\xFF\x3B\x40\xF8\xFD\xBF\xCC\xFF\x03\x40\xFA\x03\xC2\x8A\x98\xFF" - "\x72\xFF\xFF\x00\x15\xB0\xFE\x8F\xFE\x9F\x0A\xE4\xCB\xFC\xF7\x07" - "\xB2\xDE\xC0\x14\x3C\x07\x9A\x20\x05\x34\x10\x64\xC2\x95\xFF\xD7" - "\xC1\x0A\x76\x02\x59\xBF\x60\x0A\xC2\xFE\x97\xFF\xDF\xF1\x5F\xF1" - "\xFF\xA3\xFF\xBC\x50\xC7\xC9\xFC\xBF\x8F\xEC\xC8\x03\xFF\xBF\x81" - "\xC3\xEF\x19\x30\x88\x20\xE0\xD8\xFF\xEF\x24\x79\x93\x42\x05\x9E" - "\xE0\xC8\xC5\x05\xE3\x00\x1F\xF1\x7A\x19\x4B\x38\x03\x56\x00\x00" - "\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 282); - getPNGImage(png); - } - else - { - sendMessageAndClose(MSG_HTTP404); - } - return; - } - else if (m_url == "index.css") - { - const utf8 &modified = mapGet(m_httpRequestInfo.m_HTTPHeaders, utf8("if-modified-since"), utf8("0")); - const time_t curTime = ::time(NULL), - readTime = readRFCDate(modified), - diffTime = (curTime - readTime); - - // check if we need to provide a copy or if we can just do a '304 Not Modified' response - if (!readTime || (diffTime > gOptions.m_styleCustomHeaderTime) || (diffTime > 31536000)) - { - const time_t modTime = (!gOptions.m_styleCustomHeaderTime ? (gOptions.m_styleCustomHeaderTime = curTime) : gOptions.m_styleCustomHeaderTime); - utf8 body, - header = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/css\r\n" - "Vary:Accept-Encoding\r\n" - "Cache-Control:private,max-age=31536000\r\n" - + utf8(m_compressed ? "Content-Encoding:gzip\r\n" : "") + - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(modTime) + "\r\n", - // v2 DNAS style - g_styleV2Str = "a:visited,a:link{color:#2762AE;text-decoration:none;}" - "a:hover{text-decoration:underline;}" - ".logo,.titlespan,.tsp,.inp,.tll,b.w,.infh{color:#DEAC2F;}" - ".logo{font-weight:bold;font-size:2.25em;letter-spacing:-0.0625em;padding-left:0.1em;}" - "textarea,input,select,body,pre,table,b.i{color:#636363;font-family:arial,helvetica;font-size:small;}" - "textarea,input,select{background-color:#F0F0F0;border:1px solid #CCCCCC;}" - ".ls,.ls td,.en,.en td,.ent,fieldset,.infb{border-collapse:collapse;border:1px solid #CCCCCC;}" - ".ls a{display: block;}" - ".tsp{background:#4C4C4C;}" - ".inp{background:#636363;}" - ".tll,.infh,.thr{background:#F0F0F0;}" - "div.thr{padding:0.4em;display:inline-block;}" - ".tnl{color:#636363;font-weight:bold;text-decoration:none;}" - ".submit{color:white;background:#2350A5;border:1px solid #CCCCCC;}" - "span.default{overflow:auto;border:1px solid #CCCCCC;color:#636363;display:block;}" - ".titlespan{padding:3px 0 2px 0;display:block;}" - "input:disabled,font.t{color:#CCCCCC;}" - "hr{border:0;background-color:#CCCCCC;height:1px;margin:0 -15px;}" - "b.e{color:red;}" - "b.d{color:green;}" - "b.u{color:blue;}" - ".infh{position:relative;top:-15px;margin:0 -15px;padding:2px 0px;border-bottom:1px solid #CCCCCC;}" - ".infb{display:inline;float:left;margin:0px 15px;padding:15px 15px 10px;}", - // v1 DNAS style - g_styleV1Str = "a:visited,a:link,b.u{color:blue;text-decoration:none;}" - "a:hover{text-decoration:underline;}" - ".logo{color:red;font-weight:bold;font-size:2.25em;letter-spacing:-0.0625em;padding-left:0.1em;}" - "textarea,input,select,body,pre,b.i{color:#eeeeee;background:black;font-family:arial,helvetica;font-size:small;}" - ".ls,.en,.ent,fieldset,.infb{border-collapse:collapse;}" - "textarea,input,select,.ent,.ls td,.en td,.infb,span.default{border:1px solid #CCCCCC;}" - ".inp,.infh{background:#000080;}" - ".ls a{display: block;}" - ".tll{background:black;}" - ".tsp{background:#000025;}" - "div.thr{padding:0.4em;display:inline-block;}" - ".thr{background:#DDDDDD;}" - ".tnl{color:black;font-weight:bold;text-decoration:none;}" - "span.default{overflow:auto;color:white;display:block;}" - ".titlespan{color:white;padding:3px 0 2px 0;display:block;}" - "input:disabled,font.t{color:#CCCCCC;}" - "hr{border:0;background-color:#CCCCCC;height:1px;margin:0 -15px;}" - "b.e{color:red;}" - "b.d{color:green;}" - "b.w{color:yellow;}" - ".infh{position:relative;top:-15px;margin:0 -15px;padding:2px 0px;border-bottom:1px solid #CCCCCC;}" - ".infb{display:inline;float:left;margin:0px 15px 10px 0px;padding:15px 15px 10px;}"; - - if (gOptions.m_styleCustomStr.empty()) - { - bool compress = !!m_compressed; - const bool v2 = (gOptions.adminCSSFile() == "v2"); - if (!v2 && !(gOptions.adminCSSFile() == "v1")) - { - body = gOptions.getIndexCSS(compress); - } - - // fallback to v2 DNAS style - if (body.empty()) - { - // force things to the default style if not found so we're not re-trying all the time - gOptions.m_styleCustomStrGZ = gOptions.m_styleCustomStr = body = (v2 ? g_styleV2Str : g_styleV1Str); - compress = true; - } - - gOptions.m_styleCustomHeader = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/css\r\n" - "Vary:Accept-Encoding\r\n" - "Cache-Control:private,max-age=31536000\r\n" - "Expires:" + getRFCDate(curTime + 31536000) + "\r\n" - "Last-Modified:" + getRFCDate(modTime) + "\r\n"; - - if (compress && !gOptions.m_styleCustomStrGZ.empty() && compressData(gOptions.m_styleCustomStrGZ)) - { - gOptions.m_styleCustomHeaderGZ = gOptions.m_styleCustomHeader + "Content-Encoding:gzip\r\n"; - } - else - { - gOptions.m_styleCustomStrGZ.clear(); - } - } - - if (!gOptions.m_styleCustomStr.empty()) - { - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_styleCustomStrGZ.empty()) - { - body = gOptions.m_styleCustomStrGZ; - header = gOptions.m_styleCustomHeaderGZ; - } - else - { - body = gOptions.m_styleCustomStr; - header = gOptions.m_styleCustomHeader; - } - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - } - - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - else - { - sendMessageAndClose("HTTP/1.0 304 Not Modified\r\n\r\n"); - } - return; - } - - // now we do most of the processing depending on the mode the http instance has been started as - const utf8 &type = toLower(stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "type", (utf8)""))); - const int webSetupAllowed = (m_protocols & P_WEB_SETUP); - const utf8 host = (relayHostName.empty() ? m_clientHostName : relayHostName), - addr = (relayHostIP.empty() ? m_clientAddr : relayHostIP); - - if (m_protocols & P_WEB) - { - bool auth_check = false; - // make sure we unescape this so we cope with some weird clients - utf8 password = urlUtils::unescapeString(mapGet(m_httpRequestInfo.m_QueryParameters, "pass", (utf8)"").hideAsString()); - if (password.empty()) - { - // as we need the password for some of the public pages - // we'll convert any 'authorization' headers into their - // 'pass' parameter equivalent and then do all checking - // based on the password which will be cleaner overall. - const utf8 &auth = mapGet(m_httpRequestInfo.m_HTTPHeaders, "authorization", (utf8)""); - const vector<utf8> &vauth = tokenizer(auth, (utf8::value_type)' '); - // format " Basic xxxxxxxxx" - const vector<__uint8> va = base64::decode((vauth.size() < 2 ? "" : vauth[1]).hideAsString().c_str()); - password.insert(password.end(), va.begin(), va.end()); - auth_check = true; - } - else - { - // we also support base64 encoded passwords - // so we need to check for them and decode - // before passing on to be fully checked. - if (password.find(utf8("YWRtaW46")) == 0) - { - vector<__uint8> va = base64::decode(password.hideAsString().c_str()); - password.clear(); - password.insert(password.end(), va.begin(), va.end()); - auth_check = true; - } - } - - // look at the password and check for the multi-1.x style support, - // extracting as needed which is likely if using the same password - // parameters for the title update handling that should be sent - utf8 dj_name; // throw-away - int alt_sid = -1; - if (extractPassword(password, dj_name, alt_sid)) - { - if (alt_sid != -1) - { - realSID = sid = alt_sid; - } - - // if this is from a converted 'authorization' header then we - // need to ensure that the user is what we allow i.e. 'admin' - // changed b611 as Icecast sources send different values so - // for those cases we'll have to allow it through so it works - if (auth_check && !hasMount && !(dj_name == "admin")) - { - password.clear(); - } - } - - if (m_url == "admin.cgi") - { - // added in 2.4.8+ the ability to restrict access to the admin - // sections based on the IP / host reported by the connection. - // this is a user request as a means to help restrict access - // to these pages and (slightly) improve security (https would - // be better but for the time being, it's this and passwords). - if (isAdminAccessAllowed(addr, host) == false) - { - // try to redirect to something (if configured) - // before failing and provide a 403 response... - const utf8 redirectUrl = gOptions.getStreamRedirectURL((no_sid ? 0 : sid), false, false, !!m_compressed, true); - sendMessageAndClose((!redirectUrl.empty() ? redirectUrl : MSG_HTTP403)); - return; - } - - // we need a password for all of the admin.cgi methods - // so no point in creating it if we know it's missing - // and return WWW-Authenticate quicker than if we did - // the checks inside of protocol_admincgi like before. - if (!password.empty()) - { - const socketOps::tSOCKET s = m_socket; - m_socket = socketOps::cINVALID_SOCKET; - - const bool zero_sid = (((int)realSID == -1) ? true : (realSID == 0)); - threadedRunner::scheduleRunnable(new protocol_admincgi(s, sid, no_sid, zero_sid, m_clientLogString, - password, m_referer, m_hostIP, m_userAgent, - m_httpRequestInfo)); - m_result.done(); - } - else - { - sendMessageAndClose(MSG_AUTHFAILURE401 + utf8(!HEAD_REQUEST ? - "<html><head>Unauthorized<title>Shoutcast " - "Administrator</title></head></html>" : "")); - } - return; - } - else if (m_url == "index.html") - { - // if no sid is specified, attempt to match to the only stream (v1 like behaviour) - // before just attempting to provide the results for the default stream id (sid=1) - if (no_sid) - { - streamData::streamID_t lastSID = 0; - if (streamData::totalActiveStreams(lastSID) != (streamData::streamID_t)DEFAULT_CLIENT_STREAM_ID) - { - path_root_summary(XFF); - } - else - { - if (realSID == 0) - { - path_root_summary(XFF, true); - } - else - { - sendMessageAndClose(redirect("index.html?sid=" + tos(lastSID), !!m_compressed)); - } - } - } - else - { - path_root(sid, XFF); - } - return; - } - else if ((m_url == "7.html") || (m_url == "7")) - { - findBaseStream(no_sid, sid); - - bool adminOverride = false, hide = getHideState((no_sid ? 0 : sid)), passworded = false, - proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_7Cache[sid]; - if (getCachedResponse(item, m_7Lock)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - stats::statsData_t data; - stats::getStats(sid, data); - - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - // 7.html format is CURRENTLISTENERS STREAMSTATUS PEAKLISTENERS MAXLISTENERS UNIQUELISTENERS BITRATE SONGTITLE - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/html;charset=utf-8\r\n" - "Cache-Control:no-cache\r\nConnection:close\r\n", - body = "<html><body>" + tos(data.connectedListeners) + "," + - (extra.isConnected ? "1" : "0") + "," + tos(data.peakListeners) + - "," + (maxUsers > 0 ? tos(maxUsers) : "UNLIMITED") + "," + - tos(data.uniqueListeners) + "," + tos(info.m_streamBitrate) + - "," + aolxml::escapeXML(info.m_currentSong) + getfooterStr(); - - sendCachedResponse(item, m_7Cache, m_7Lock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - } - return; - } - else if (m_url == "stats") - { - findBaseStream(no_sid, sid); - - bool adminOverride = false, hide = getHideState((no_sid ? 0 : sid)), passworded = true, - proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - if (isAccessAllowed(sid, XFF) == true) - { - const bool json = mapGet(m_httpRequestInfo.m_QueryParameters, "json", (bool)false); - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_stats_json(sid, passworded, callback); - } - else - { - path_stats_xml(sid, passworded); - } - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - } - return; - } - else if (m_url == "statistics") - { - bool adminOverride = false, hide = getHideState((no_sid ? 0 : sid)), passworded = true, - proceed = isViewingAllowed(sid, password, true, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - if (isAccessAllowed(sid, XFF) == true) - { - const bool json = mapGet(m_httpRequestInfo.m_QueryParameters, "json", (bool)false); - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_statistics_json(sid, passworded, callback); - } - else - { - path_statistics_xml(sid, passworded); - } - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - } - return; - } - else if (m_url == "robots.txt") - { - utf8 header = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/plain\r\n" - "Connection:close\r\nContent-Length:24\r\n\r\n", - body = "User-agent:*\r\nDisallow:/"; - - if (gOptions.robotstxtFile() == "") - { - } - else - { - if (gOptions.m_robotsTxtBody.empty()) - { - body = loadLocalFile(fileUtil::getFullFilePath(gOptions.robotstxtFile())); - if (!body.empty()) - { - gOptions.m_robotsTxtBodyGZ = gOptions.m_robotsTxtBody = body; - gOptions.m_robotsTxtHeader = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/plain\r\n" - "Connection:close\r\n" - "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - - if (compressData(gOptions.m_robotsTxtBodyGZ)) - { - gOptions.m_robotsTxtHeaderGZ = "HTTP/1.0 200 OK\r\n" - "Content-Type:text/plain\r\n" - "Connection:close\r\n" - "Content-Length:" + tos(gOptions.m_robotsTxtBodyGZ.size()) + "\r\n" - "Content-Encoding:gzip\r\n\r\n"; - } - else - { - gOptions.m_robotsTxtBodyGZ.clear(); - } - } - else - { - body = MSG_HTTP404; - } - } - - if (!gOptions.m_robotsTxtBody.empty()) - { - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_robotsTxtBodyGZ.empty()) - { - body = gOptions.m_robotsTxtBodyGZ; - header = gOptions.m_robotsTxtHeaderGZ; - } - else - { - body = gOptions.m_robotsTxtBody; - header = gOptions.m_robotsTxtHeader; - } - } - } - - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } - else if (m_url == "crossdomain.xml") - { - path_crossdomain(); - return; - } - else if ((m_url == "played.html") || (m_url == "played")) - { - // if no sid is specified, attempt to match to the only stream (v1 like behaviour) - // before just attempting to provide the results for the default stream id (sid=1) - if (no_sid && findBaseStream(no_sid, sid)) - { - sendMessageAndClose(redirect((!gOptions.getSongHistorySize(sid) ? "index.html?sid=" : "played.html?sid=") + tos(sid), !!m_compressed)); - return; - } - else - { - if (!no_sid && !gOptions.getSongHistorySize(sid)) - { - sendMessageAndClose(redirect("index.html?sid=" + tos(sid), !!m_compressed)); - return; - } - } - - const bool json = (type == "json"), xml = (type == "xml"); - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool hide = (hideStats == "all") && !(hideStats == "none"), adminOverride = false, passworded = false, - proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - // only do a password check if we've got a hidden page - if ((hide == true) && !password.empty()) - { - if (proceed && !(json || xml)) - { - proceed = false; - } - } - - // if xml or json is requested then we see if we - // should provide it publically or use redirect - if (no_sid || ((hide == true) && (proceed == false))) - { - path_redirect_url(sid, no_sid, false); - } - else - { - if (!json && !xml) - { - path_played_html(sid, XFF); - } - else - { - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_played_json(sid, callback, proceed, XFF); - } - else - { - path_played_xml(sid, proceed, XFF); - } - } - } - return; - } - else if ((m_url == "home.html") || (m_url == "home")) - { - if (no_sid) - { - path_root_summary(XFF); - } - else - { - path_home(sid); - } - return; - } - else if ((m_url == "currentsong") || (m_url == "nextsong")) - { - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool adminOverride = false, hide = (hideStats == "all") && !(hideStats == "none"), - passworded = false, proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - path_track(sid, (m_url == "nextsong")); - } - return; - } - else if (m_url == "nextsongs") - { - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool adminOverride = false, hide = (hideStats == "all") && !(hideStats == "none"), - passworded = false, proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if ((hide == true) && (adminOverride == false) && (proceed == false)) - { - path_redirect_url(sid, no_sid, true); - } - else - { - const bool json = mapGet(m_httpRequestInfo.m_QueryParameters, "json", (bool)false); - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_tracks_json(sid, callback); - } - else - { - path_tracks_xml(sid); - } - } - return; - } - else if (m_url == "currentmetadata") - { - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool adminOverride = false, hide = (hideStats == "all") && !(hideStats == "none"), - passworded = false, proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if (no_sid || ((hide == true) && (adminOverride == false) && (proceed == false))) - { - path_redirect_url(sid, no_sid, true); - } - else - { - const bool json = mapGet(m_httpRequestInfo.m_QueryParameters, "json", (bool)false); - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - path_current_metadata_json(sid, callback); - } - else - { - path_current_metadata_xml(sid); - } - } - return; - } - else if ((m_url == "streamart") || (m_url == "playingart")) - { - const utf8 &hideStats = gOptions.getStreamHideStats((no_sid ? 0 : sid)); - bool adminOverride = false, hide = (hideStats == "all") && !(hideStats == "none"), - passworded = false, proceed = isViewingAllowed(sid, password, false, adminOverride, hide, passworded); - - if (no_sid || ((hide == true) && (adminOverride == false) && (proceed == false))) - { - path_redirect_url(sid, no_sid, true); - } - else - { - path_art(sid, (m_url == "playingart")); - } - return; - } - else if ((m_url == "listen.pls") || (m_url == "listen")) - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_PLSCache[sid]; - if (getCachedResponse(item, m_PLSLock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - int index = 1; - utf8 backupServer = ""; - if (!info.m_backupServer.empty()) - { - ++index; - backupServer = "File"+tos(index)+"=" + info.m_backupServer + - (!info.m_streamName.empty() ? "\nTitle"+tos(index)+"=" + info.m_streamName : "") + - "\nLength"+tos(index)+"=-1\n"; - - if (!info.m_backupServersList.empty()) - { - for (vector<utf8>::const_iterator b = info.m_backupServersList.begin(); b != info.m_backupServersList.end(); ++b) - { - ++index; - backupServer += "File"+tos(index)+"=" + (*b) + - (!info.m_streamName.empty() ? "\nTitle"+tos(index)+"=" + info.m_streamName : "") + - "\nLength"+tos(index)+"=-1\n"; - } - } - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:audio/x-scpls\r\nConnection:close\r\n", - body = "[playlist]\nNumberOfEntries=" + tos(index) + - "\nFile1=http://" + getClientIP(info.m_streamPublic, info.m_publicIP) + ":" + - tos(g_portForClients) + getStreamPath(sid, true) + - ((streamData::getStreamContentType(sid) == "video/nsv") ? ";stream.nsv\n" : "\n") + - (!info.m_streamName.empty() ? "Title1=" + info.m_streamName + "\n" : "") + "Length1=-1\n" + - backupServer + "Version=2"; - - sendCachedResponse(item, m_PLSCache, m_PLSLock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "listen.m3u") - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_M3UCache[sid]; - if (getCachedResponse(item, m_M3ULock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 backupServer = ""; - if (!info.m_backupServer.empty()) - { - backupServer = "\n#EXTINF:-1," + info.m_streamName + "\n" + info.m_backupServer; - if (!info.m_backupServersList.empty()) - { - for (vector<utf8>::const_iterator b = info.m_backupServersList.begin(); b != info.m_backupServersList.end(); ++b) - { - backupServer += "\n#EXTINF:-1," + info.m_streamName + "\n" + (*b); - } - } - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:audio/x-mpegurl\r\nConnection:close\r\n", - body = "#EXTM3U\n" - "#EXTINF:-1," + info.m_streamName + "\n" - "http://" + getClientIP(info.m_streamPublic, info.m_publicIP) + - ":" + tos(g_portForClients) + getStreamPath(sid, true) + - (streamData::getStreamContentType(sid) == "video/nsv" ? ";stream.nsv" : "") + - backupServer; - - sendCachedResponse(item, m_M3UCache, m_M3ULock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "listen.asx") - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_ASXCache[sid]; - if (getCachedResponse(item, m_ASXLock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 backupServer = ""; - if (!info.m_backupServer.empty()) - { - backupServer = "\n<entry>\n" + - (!info.m_streamName.empty() ? "<title>" + aolxml::escapeXML(info.m_streamName) + "</title>\n" : "") + - "<ref href=\"" + info.m_backupServer + "\"/>\n</entry>"; - if (!info.m_backupServersList.empty()) - { - for (vector<utf8>::const_iterator b = info.m_backupServersList.begin(); b != info.m_backupServersList.end(); ++b) - { - backupServer += "\n<entry>\n" + - (!info.m_streamName.empty() ? "<title>" + aolxml::escapeXML(info.m_streamName) + "</title>\n" : "") + - "<ref href=\"" + (*b) + "\"/>\n</entry>"; - } - } - backupServer += "\n"; - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:video/x-ms-asf\r\nConnection:close\r\n", - body = "<asx version=\"3.0\">\n" + - (!info.m_streamName.empty() ? "<title>" + aolxml::escapeXML(info.m_streamName) + "</title>\n" : "") + - "<entry>\n" + - (!info.m_streamName.empty() ? "<title>" + aolxml::escapeXML(info.m_streamName) + "</title>\n" : "") + - "<ref href=\"http://" + getClientIP(info.m_streamPublic, info.m_publicIP) + - ":" + tos(g_portForClients) + getStreamPath(sid, true) + - (streamData::getStreamContentType(sid) == "video/nsv" ? ";stream.nsv" : "") + - "\"/>\n</entry>" + backupServer + "</asx>"; - - sendCachedResponse(item, m_ASXCache, m_ASXLock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "listen.qtl") - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_QTLCache[sid]; - if (getCachedResponse(item, m_QTLLock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/x-quicktimeplayer\r\nConnection:close\r\n", - body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" - "<?quicktime type=\"application/x-quicktime-media-link\"?>" - "<embed autoplay=\"true\" controller=\"true\" quitwhendone=\"false\" loop=\"false\" " + - (!info.m_streamName.empty() ? "moviename=\"" + aolxml::escapeXML(info.m_streamName) + "\" " : "") + - "src=\"http://" + getClientIP(info.m_streamPublic, info.m_publicIP) + ":" + - tos(g_portForClients) + "/listen.pls?sid=" + tos(sid) + "\"/>"; - - sendCachedResponse(item, m_QTLCache, m_QTLLock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "listen.xspf") - { - if (isAccessAllowed(sid, XFF) == true) - { - cacheItem *item = m_XSPFCache[sid]; - if (getCachedResponse(item, m_XSPFLock, 5)) - { - return; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 backupServer = ""; - if (!info.m_backupServer.empty()) - { - backupServer = "\n<track><location>" + info.m_backupServer + "</location>\n" + - (!info.m_streamName.empty() ? "<title>" + aolxml::escapeXML(info.m_streamName) + "</title>\n" : "") + - "</track>"; - if (!info.m_backupServersList.empty()) - { - for (vector<utf8>::const_iterator b = info.m_backupServersList.begin(); b != info.m_backupServersList.end(); ++b) - { - backupServer += "\n<track><location>" + (*b) + "</location>\n" + - (!info.m_streamName.empty() ? "<title>" + aolxml::escapeXML(info.m_streamName) + "</title>\n" : "") + - "</track>"; - } - } - backupServer += "\n"; - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/xspf+xml\r\nConnection:close\r\n", - body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" - "<playlist version=\"1\" xmlns=\"http://xspf.org/ns/0/\">" + - (!info.m_streamName.empty() ? "<title>" + aolxml::escapeXML(info.m_streamName) + "</title>" : "") + - "<info>" + aolxml::escapeXML(info.m_streamURL) + "</info>" - "<trackList>" - "<track><location>http://" + getClientIP(info.m_streamPublic, info.m_publicIP) + - ":" + tos(g_portForClients) + getStreamPath(sid, true) + - (streamData::getStreamContentType(sid) == "video/nsv" ? ";stream.nsv" : "") + - "</location>" + - (!info.m_streamName.empty() ? "<title>" + aolxml::escapeXML(info.m_streamName) + "</title>" : "") + - "</track>" + backupServer + "</trackList></playlist>"; - - sendCachedResponse(item, m_XSPFCache, m_XSPFLock, header, body, sid); - } - else - { - sendMessageAndClose(MSG_HTTP403); - } - return; - } - else if (m_url == "shoutcast.swf") - { - path_shoutcastswf(); - return; - } -#ifdef CONFIG_BUILDER - else if ((m_url == "builder") || (m_url == "setup")) -#else - else if (m_url == "setup") -#endif - { - sendMessageAndClose(redirect("index.html", !!m_compressed)); - return; - } - } - else if (webSetupAllowed) - { - if ((m_url == "runserver") && (m_httpRequestInfo.m_request == HTTP_POST)) - { - sendMessageAndClose("HTTP/1.0 200 OK\r\nContent-Length:0\r\n\r\n"); - setkill(2); - return; - } - else if ((m_url == "exit") && (m_httpRequestInfo.m_request == HTTP_POST)) - { - sendMessageAndClose("HTTP/1.0 200 OK\r\nContent-Length:0\r\n\r\n"); - setkill(1); - return; - } - else if ((m_url == "config") && (m_httpRequestInfo.m_request == HTTP_POST)) - { - utf8 conf_file = gStartupDirectory + "sc_serv.conf"; - ILOG("[SETUP] Saving settings to `" + conf_file + "'"); - - config setupOptions; - setupOptions.load(conf_file, false); - - const vector<string> queryTokens = tokenizer(m_httpRequestInfo.m_PostLine.toANSI(true),'&'); - for (vector<string>::const_iterator i = queryTokens.begin(); i != queryTokens.end(); ++i) - { - const utf8 entry = urlUtils::unescapeString(*i); - const string::size_type pos = entry.find(utf8("=")); - if (pos == string::npos) - { - setupOptions.setOption(entry, (utf8)""); - } - else - { - const utf8 name = entry.substr(0, pos); - const utf8 value = entry.substr(pos + 1); - setupOptions.setOption(name, value); - } - } - - if (setupOptions.rewriteConfigurationFile(true, false, true)) - { - ILOG("[SETUP] Saved settings to `" + conf_file + "'"); - } - else - { - ILOG("[SETUP] Unable to save settings to `" + conf_file + "'. Please resolve the error(s) above."); - } - - sendMessageAndClose("HTTP/1.0 200 OK\r\nContent-Length:0\r\n\r\n"); - return; - } - else if (m_url == "configs") - { - const utf8 &query = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "query", (utf8)"")); - utf8 fn = "sc_serv.conf"; - utf8 body = ""; - - const vector<string> queryTokens = tokenizer(query.toANSI(true),'&'); - for (vector<string>::const_iterator i = queryTokens.begin(); i != queryTokens.end(); ++i) - { - const utf8 entry = urlUtils::unescapeString(*i); - const string::size_type pos = entry.find(utf8("=")); - if (pos != string::npos) - { - const utf8 name = entry.substr(0,pos); - const utf8 value = entry.substr(pos+1); - if (name == "fn") - { - fn = value; - } - else if (name == "body") - { - body = value; - } - } - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/plain\r\n" - "Content-Disposition:attachment;filename=\""+fn+"\"\r\n"; - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } -#ifdef CONFIG_BUILDER - else if (m_url == "collapse.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0D\x08\x06\x00\x00\x00\x72\xEB\xE4" - "\x7C\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0B\x13\x00\x00\x0B" - "\x13\x01\x00\x9A\x9C\x18\x00\x00\x00\xA3\x49\x44\x41\x54\x28\xCF" - "\xA5\x92\x3D\x0A\xC4\x20\x10\x46\x73\xA1\xDC\x2A\x37\xF3\x20\x2E" - "\xD8\xD8\x69\x65\x3A\x71\x2B\x1B\x1B\x4B\x21\x32\xEB\x27\xC9\xE0" - "\xA6\x48\xF6\x47\x78\x22\xE3\xFB\x06\x15\xA7\x65\x59\xE6\xC6\xA3" - "\xB1\x35\xE8\x82\x6D\xF7\xE6\xA9\x4D\x4A\x4A\x49\xB5\x56\xBA\x1A" - "\xD8\x87\x07\x1F\xA1\x67\x4A\x89\x3E\x19\xF0\xE0\xFF\x1E\x8A\x31" - "\x52\x29\xE5\x0D\xDC\xE3\x5C\x83\xC7\xA1\x10\x02\xE5\x9C\x99\xF1" - "\x01\xC6\x3A\x3C\x0E\xAD\xEB\xDA\xBB\xEC\x9D\x3A\xE7\x35\x80\xC7" - "\x21\x63\x0C\x79\xEF\x59\xC2\xFA\x60\xAC\xC1\xE3\x90\xD6\x9A\x9C" - "\x73\xB7\xC0\xE3\x90\x52\x8A\xAC\xB5\xB7\xC0\xFB\x2B\xA4\x84\x10" - "\xFD\xBC\x57\x01\xEC\xC3\x3B\x7E\xC4\xD7\x7F\xEF\x05\xFC\x4E\x08" - "\xFC\x0F\xA9\x38\xAE\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60" - "\x82", 241); - getPNGImage(png); - return; - } - else if (m_url == "expand.png") - { - const utf8 png ("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52" - "\x00\x00\x00\x0D\x00\x00\x00\x0D\x08\x06\x00\x00\x00\x72\xEB\xE4" - "\x7C\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0B\x13\x00\x00\x0B" - "\x13\x01\x00\x9A\x9C\x18\x00\x00\x00\xCC\x49\x44\x41\x54\x28\xCF" - "\x95\x92\x41\x0A\x83\x30\x10\x45\xBD\x90\xB7\xF2\x66\xDE\xC2\x55" - "\x21\x1B\xC1\x85\x6E\xD4\x85\xA0\xA6\x0D\xBA\x51\x50\x77\x42\x65" - "\x9A\x1F\x3A\x31\x6D\x51\x6A\xE0\xC9\x38\xF9\x2F\x31\x12\x2F\x08" - "\x02\x5F\x73\xD3\x3C\x35\x74\xC2\xF3\x9D\xF3\x3D\xFD\x10\x61\x18" - "\xD2\x3C\xCF\xB4\x6D\x1B\x1D\x8D\x65\x59\x08\x39\xE4\x21\x49\xA5" - "\x14\xFD\x33\x86\x61\x80\x24\x8D\x84\x97\xAB\xD2\xBD\xEF\x7B\x9A" - "\xA6\xE9\x83\x75\x5D\x7F\x7A\x5D\xD7\x59\xE9\xD1\xB6\x2D\x8D\xE3" - "\x68\x0F\x8D\x9A\x71\x7B\x4D\xD3\xEC\x52\x59\x96\x84\xDD\x00\x87" - "\xBE\x6B\x80\x9C\x95\xD2\x34\xA5\xBA\xAE\x49\x4A\x69\x70\x7F\x35" - "\xF7\x30\x9F\x65\xD9\x2E\xC5\x71\x4C\x45\x51\x18\xAA\xAA\x32\x40" - "\xE0\x9A\xE7\x92\x24\xB1\x92\x12\x42\x98\x55\x98\x3C\xCF\x2D\x6E" - "\x1F\x8B\x1F\x4A\x47\xB8\x92\x88\xA2\x88\x70\xAE\x33\xF0\x99\xC8" - "\xF1\x8D\xB8\x7C\xF7\x5E\x5E\xA8\x08\x66\xFF\x94\x63\xFE\x00\x00" - "\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82", 282); - getPNGImage(png); - return; - } - else if (m_url == "builder") - { - uniFile::filenameType fn = gStartupDirectory + "config_builder/config_builder.html"; - size_t fileSize = uniFile::fileSize(fn); - uniFile::filenameType fn_js = gStartupDirectory + "config_builder/config_builder.js"; - size_t fileSizeJS = uniFile::fileSize(fn_js); - - utf8 header = MSG_NO_CLOSE_200, - body = "<!DOCTYPE html><html><head>" - "<meta charset=\"utf-8\">" - "<meta name=viewport content=\"width=device-width, initial-scale=1\">"\ - "<title>Shoutcast Configuration Builder</title>" - "<link href=\"index.css\" rel=\"stylesheet\" type=\"text/css\">" - "<link href=\"images/favicon.ico\" rel=\"shortcut icon\" type=\"" + gOptions.faviconFileMimeType() + "\">" - "<link href=\"config_builder.css\" rel=\"stylesheet\" type=\"text/css\">" - // skip config_builder.js if the main setup.html cannot be found to load - + (fileSize > 0 ? utf8("<script type=\"text/javascript\" src=\"config_builder.js\"></script>") : "") + - "</head>" - "<body style=\"margin:0;\">" - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>" - "<td><div class=\"logo\">Shoutcast Configuration Builder</div></td></tr><tr>" - "<td style=\"text-align:right;vertical-align:bottom;padding-right:0.1em;\">" - "<a target=\"_blank\" title=\"Built: "__DATE__"\" href=\"http://www.shoutcast.com\">Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "</a>" - "</td></tr><tr><td class=\"thr\" align=\"left\"><table width=\"100%\" " - "border=\"0\" cellpadding=\"5\" cellspacing=\"0\"><tr class=\"tnl\">" - "<td> <a target=\"_blank\" href=\"http://forums.shoutcast.com/forumdisplay.php?f=140\">Help</a> | " - " <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_Broadcaster\">Documentation</a></td></tr></table></td></tr></table><br>"; - - // only process if the html and js files can be found - if (fileSize && fileSizeJS) - { - body += loadLocalFile(fn); - } - else - { - body += "<br><table cellpadding=\"5\" cellspacing=\"0\" border=\"0\" width=\"100%\">" - "<tr><td align=\"center\" id=\"counter\">" - "<br>There was an error finding the files required for running the configuration builder.<br>" - "Check that there is a 'config_builder' folder in the same folder as the server.<br><br>" - "<a href=\"/setup\">Click here</a> to try loading the configuration builder files again. If this message<br>" - "remains, you will need to seek assistance via the <a target=\"_blank\" " - "href=\"http://forums.shoutcast.com/forumdisplay.php?f=140\">help forum</a>.<br><br>" - "<input type=\"button\" value=\"Exit\" onclick=\"exit()\" class=\"submit\"></td></tr></table></tr></table></td></tr></table>" - - "<script type=\"text/javascript\">" - "function $(id){return document.getElementById(id);}" - "function exit(){" - "$('counter').innerHTML = \"<span><b>Server Stopped</b></span><br><br>The server has now been stopped." - "<br>Please fix the issue shown on the prior page and retry running setup if required.\";" - "if(window.XMLHttpRequest){" - "xmlhttp=new XMLHttpRequest();" - "}else{" - "xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");" - "}" - "xmlhttp.open(\"POST\",\"exit\",true);" - "xmlhttp.setRequestHeader(\"Content-length\",4);" - "xmlhttp.send(\"exit\");" - "}</script>" + getfooterStr(); - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } -#endif - else if (m_url == "setup") - { - uniFile::filenameType fn = gStartupDirectory + "setup/setup.html"; - size_t fileSize = uniFile::fileSize(fn); - uniFile::filenameType fn_js = gStartupDirectory + "setup/setup.js"; - size_t fileSizeJS = uniFile::fileSize(fn_js); - - utf8 header = MSG_NO_CLOSE_200, - body = "<!DOCTYPE html><html><head>" - "<meta charset=\"utf-8\">" - "<meta name=viewport content=\"width=device-width, initial-scale=1\">"\ - "<title>Shoutcast DNAS Setup</title>" - "<link href=\"../index.css\" rel=\"stylesheet\" type=\"text/css\">" - "<link href=\"../images/favicon.ico\" rel=\"shortcut icon\" type=\"" + gOptions.faviconFileMimeType() + "\">" - // skip setup.js if the main setup.html cannot be found to load - + (fileSize > 0 ? utf8("<script type=\"text/javascript\" src=\"setup.js\"></script>") : "") + - "</head><body style=\"margin:0;\">" - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>" - "<td><div class=\"logo\">Shoutcast DNAS Setup</div></td>" - "<td style=\"text-align:right;vertical-align:bottom;padding-right:0.1em;\">" - "<a target=\"_blank\" title=\"Built: " __DATE__ "\" " - "href=\"http://www.shoutcast.com\">Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "</a>" - "</td></tr><tr><td class=\"thr\" align=\"left\" colspan=\"2\">" - "<table width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">" - "<tr class=\"tnl\"><td> <a target=\"_blank\" " - "href=\"http://forums.shoutcast.com/forumdisplay.php?f=140\">Help</a> | " - " <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_Broadcaster\">Documentation</a></td></tr></table></td></tr></table>"; - - // only process if the html and js files can be found - if (fileSize && fileSizeJS) - { - body += loadLocalFile(fn); - } - else - { - body += "<br><table cellpadding=\"5\" cellspacing=\"0\" border=\"0\" width=\"100%\">" - "<tr><td align=\"center\" id=\"counter\">" - "<br>There was an error finding the files required for running setup.<br>" - "Check there is a 'setup' folder in the same folder as the server.<br><br>" - "<a href=\"/setup\">Click here</a> to try loading the setup files again. If this message<br>" - "remains, you will need to seek assistance via the <a target=\"_blank\" " - "href=\"http://forums.shoutcast.com/forumdisplay.php?f=140\">help forum</a>.<br><br>" - "<input type=\"button\" value=\"Exit\" onclick=\"exit()\" class=\"submit\"></td></tr></table></tr></table></td></tr></table>" - - "<script type=\"text/javascript\">" - "function $(id){return document.getElementById(id);}" - "function exit(){" - "$('counter').innerHTML = \"<span><b>Server Stopped</b></span><br><br>The server has now been stopped." - "<br>Please fix the issue shown on the prior page and retry running setup if required.\";" - "if(window.XMLHttpRequest){" - "xmlhttp=new XMLHttpRequest();" - "}else{" - "xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");" - "}" - "xmlhttp.open(\"POST\",\"exit\",true);" - "xmlhttp.setRequestHeader(\"Content-length\",4);" - "xmlhttp.send(\"exit\");" - "}</script>" + getfooterStr(); - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } - else - { - utf8::size_type pos; - if (((pos = m_referer.rfind(utf8("setup"))) != utf8::npos) || (m_url == "setup.txt")) - { - uniFile::filenameType fn = gStartupDirectory + "setup" + m_httpRequestInfo.m_url; - utf8 header = "HTTP/1.0 200 OK\r\n" - "Cache-Control:no-cache\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Connection:close\r\n", - body = loadLocalFile(fn); - - if (!body.empty()) - { - utf8 mime = "text/plain"; - if ((pos = m_httpRequestInfo.m_url.rfind(utf8(".js"))) != utf8::npos) - { - mime = "text/javascript"; - } - header += "Content-Type:" + mime + "\r\n"; - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } -#ifdef CONFIG_BUILDER - else if (((pos = m_referer.rfind(utf8("/builder"))) != utf8::npos) || (m_url == "/config_builder.txt")) - { - uniFile::filenameType fn = gStartupDirectory + "config_builder" + m_httpRequestInfo.m_url; - utf8 header = "HTTP/1.0 200 OK\r\n" - "Cache-Control:no-cache\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Connection:close\r\n", - body = loadLocalFile(fn); - - if (!body.empty()) - { - utf8 mime = "text/plain"; - if ((pos = m_url.rfind(utf8(".js"))) != utf8::npos) - { - mime = "text/javascript"; - } - if ((pos = m_url.rfind(utf8(".css"))) != utf8::npos) - { - mime = "text/css"; - } - if ((pos = m_url.rfind(utf8(".png"))) != utf8::npos) - { - mime = "image/png"; - } - header += "Content-Type:" + mime + "\r\n"; - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - return; - } -#endif - } - } - - // if we've gotten to here, try to look for the request coming from a browser - // and provide the related html page or fallback to serving up stream content - if ((m_httpRequestInfo.m_url == "/") && - // added in 2.4.8+ so we can force through based on the 'type' parameter - // which allows for url/?type=.flv to work correctly whilst we also allow - // for setting url/?type=html to force showing of the html pages provided - (type.empty() || (type == "html")) && - ((m_userAgentLowered.find(utf8("mozilla")) != utf8::npos) || - (m_userAgentLowered.find(utf8("opera")) != utf8::npos))) - { - if (webSetupAllowed) - { - // if in setup mode then force everything to the /setup page - sendMessageAndClose(redirect("setup", !!m_compressed)); - } - else - { - // if enabled then we need to block access to this page as it's not allowed to be public - path_redirect_url(sid, no_sid, false); - } - return; - } - - - // check here if we're ok to try to provide the stream to the client or not - // i.e. it's not a banned or not in the reserved ip list when that is enabled - bool htmlPage = false; - const streamData::streamID_t found_sid = streamData::getStreamIdFromPath(m_httpRequestInfo.m_url, htmlPage); - if (found_sid > 0) - { - sid = found_sid; - } - if (m_ssl) - { - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo (sid, info, extra)) - { - if (info.m_allowSSL == 0) - { - sendMessageAndClose(MSG_HTTP403); - return; - } - } - } - - - // bit convoluted but it allows us to check 'icy-host' and then the - // client's address since it came up in testing the CDN mode that - // it didn't allow through connections which were configured by IP - // only instead of DNS - was a bug in a few builds where this checked - // for the 'host' value instead of the actual client address (oops) - // 2.4.8+ - this also looks that 'XFF' header value if provided - const bool validXFF = !metrics::metrics_verifyDestIP(gOptions, true, XFF).empty(); - if (!validXFF || (isAccessAllowed(sid, XFF) == false)) - { - if (isAccessAllowed(sid, addr) == false) - { - if (isAccessAllowed(sid, host, true) == false) - { - sendMessageAndClose(MSG_HTTP403); - return; - } - } - } - - // now process things and redirect to the relevant page found - // though if it's the direct url and it's from the SC/YP tester - // then we really need to let it through as true stream access - - // changed in 2.4.8+ to follow the 'type' parameter so it will - // be able to force a specific usage type as required be that - // sc1, sc2, flv, http, m4a or just figure it out from headers - const bool uvox_agent = ((m_userAgentLowered.find(utf8("ultravox/2.1")) != utf8::npos) && - !(!type.empty() && ((type == ".flv") || (type == "flv") || (type == ".fla") || - (type == "fla") || (type == "http") || (type == "sc1")))) || - (!type.empty() && (type == "sc2")); - const bool officialAgent = isUserAgentOfficial(m_userAgentLowered); - if ((htmlPage && !officialAgent && !uvox_agent) || (!type.empty() && (type == "html"))) - { - sendMessageAndClose(redirect("index.html?sid=" + tos(found_sid), !!m_compressed)); - return; - } - - // try to redirect directly to the appropriate page based on the number of active streams - streamData::streamID_t lastSID = 0; - if (!found_sid && (streamData::totalActiveStreams(lastSID) == (streamData::streamID_t)DEFAULT_CLIENT_STREAM_ID)) - { - sid = lastSID; - } - - protocol_shoutcastClient *client = 0; - - // Force v1 connection for Winamp 5.5x clients which ident with ultravox/2.1 as they do not support title updates - if ((m_protocols & P_SHOUTCAST2CLIENT) && uvox_agent && - (m_userAgentLowered.find(utf8("winampmpeg/5.5")) == utf8::npos)) - { // go for Ultravox 2.1 - client = new protocol_shoutcast2Client (*this, sid, host, addr, XFF, mapGet(m_httpRequestInfo.m_HTTPHeaders, "cdn-slave", false)); - } - - if (!client && (m_protocols & P_SHOUTCAST1CLIENT)) - { - if (!type.empty() && ((type == ".flv") || (type == "flv") || (type == ".fla") || (type == "fla"))) - { - client = new protocol_flvClient (*this, sid, host, addr, XFF); // flv - } - /*else if ((type == ".m4a") || (type == ".mp4")) - { - client = new protocol_m4aClient(s, sid, host, addr, m_clientPort, m_userAgent, XFF, m_referer, HEAD_REQUEST); // m4a - }*/ - else - { - // from 2.4.8+, we now treat 1.x listener connections differently based on the - // requirement to send 1.x-style metadata or not, which if not we can go for a - // stipped down handler which will better frame-sync the output for reliabilty - // which is trickier to do with the metadata handling, hence the split handler - const bool sendMetadata = mapGet(m_httpRequestInfo.m_HTTPHeaders, "icy-metadata", false); - - // and this is used to look for what is essentially a Shoutcast player request - // and if we see icy=http then we force providing the HTTP listener client and - // not the SC 1.x listener client as we know the player won't use that data... - const utf8 &http = toLower(stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "icy", (utf8)""))); - const bool forceHTTP = ((!http.empty() && (http == "http")) || (!type.empty() && (type == "http"))); - - if ((gOptions.getBackupLoop(sid) == 1 ? false : (!forceHTTP ? sendMetadata : false)) || - (!type.empty() && (type == "sc1"))) - { - client = new protocol_shoutcast1Client (*this, sid, host, addr, XFF); // shoutcast 1 with metadata - } - else - { - client = new protocol_HTTPClient (*this, sid, host, addr, XFF); // http (equivalent of shoutcast 1 without metadata) - } - } - } - - if (client) - { - client->m_queryParams = encodeVariables (m_httpRequestInfo.m_QueryParameters); - // to prevent some of the stats / logs getting skewed - // then we filter out the SHOUTcast site 'test' users - // and we only action for GET requests, not HEAD, etc - if (!officialAgent && (m_httpRequestInfo.m_request == HTTP_GET) && - // changed in #668 to skip doing auth on local clients - // as it will never provide an applicable advert group - // unless we're detecting a remote XFF value to use... - (isRemoteAddress(addr) || isRemoteAddress(XFF))) - { - DEBUG_LOG(m_clientLogString + "Starting client via auth."); - client->authForStream(); - } - else - { - DEBUG_LOG(m_clientLogString + "Starting client directly."); - threadedRunner::scheduleRunnable(client); - } - } - - m_result.done(); -} - -void protocol_HTTPStyle::state_GetLine() throw(exception) -{ - if (getHTTPStyleHeaderLine(DEFAULT_CLIENT_STREAM_ID, m_lineBuffer, m_clientLogString, m_postRequest == 2 ? m_postRequestLength : 0)) - { - m_state = m_nextState; - } -} - -// parse header line into key/value components and load into table -void protocol_HTTPStyle::state_AnalyzeHTTPHeaders() throw(exception) -{ - m_lastActivityTime = ::time(NULL); - - if ((int)m_httpRequestInfo.m_HTTPHeaders.size() >= gOptions.maxHeaderLineCount()) - { - ELOG(m_clientLogString + "Max HTTP header lines exceeded"); - sendMessageAndClose(MSG_HTTP400); - return; - } - - // since a POST will get a null line, we need to check and handle it as appropriate when stripping whitespace - if (!m_lineBuffer.empty() && ((m_postRequest == 0) || - ((m_postRequest == 1) && (m_lineBuffer[0] != '\n') && (m_lineBuffer[0] != '\r')))) - { - m_lineBuffer = stripWhitespace(m_lineBuffer); - } - - if (m_lineBuffer.empty()) - { - m_state = &protocol_HTTPStyle::state_DetermineAction; - m_result.run(); - } - else if ((m_postRequest == 1) && ((m_lineBuffer[0] == '\n') || (m_lineBuffer[0] == '\r'))) - { - m_postRequest = 2; - m_nextState = &protocol_HTTPStyle::state_AnalyzeHTTPHeaders; - m_state = &protocol_HTTPStyle::state_GetLine; - m_result.read(); - m_result.timeoutSID(); - m_lineBuffer.clear(); - } - else - { - // find the colon that divides header lines into key/value fields - const utf8::size_type pos = m_lineBuffer.find(utf8(":")); - // however in some cases (mainly found in the fire builds), the http headers may be split - // in a manner not expected so we have to look at the last key and append if there is one - // recorded which appears to be safe to do from testing vs killing the connection as was. - bool appended = false; - if ((pos == utf8::npos) && !m_postRequest) - { - if (!m_lastKey.empty()) - { - utf8 oldValue = m_httpRequestInfo.m_HTTPHeaders[m_lastKey]; - m_httpRequestInfo.m_HTTPHeaders[m_lastKey] = oldValue + stripWhitespace(m_lineBuffer.substr(pos+1)); - DEBUG_LOG(m_clientLogString + "Appending HTTP header string to previous key [" + m_lineBuffer + "]"); - appended = true; - } - else - { - DEBUG_LOG(m_clientLogString + "Bad HTTP header string [" + m_lineBuffer + "]"); - } - } - - if (m_postRequest < 2) - { - // make sure not to re-add if we're doing a header append (see above) - if (appended == false) - { - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0,pos))); - m_lastKey = key; - // allow empty values. (for urls and what-not) - if (key.empty()) - { - ELOG(m_clientLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]"); - sendMessageAndClose(MSG_HTTP400); - return; - } - utf8 val = stripWhitespace(m_lineBuffer.substr(pos+1)); - m_httpRequestInfo.m_HTTPHeaders[key] = val; - if (toLower(key) == "content-length") - { - m_postRequestLength = atoi ((char*)&val[0]); - if (m_postRequestLength < 0 || m_postRequestLength > 5000000) - { - ELOG(m_clientLogString + "Connection rejected. Content length too large [" + m_lineBuffer + "]"); - sendMessageAndClose(MSG_HTTP400); - return; - } - } - } - } - else - { - m_state = &protocol_HTTPStyle::state_DetermineAction; - m_result.run(); - // copy the POST response - m_httpRequestInfo.m_PostLine = m_lineBuffer; - m_lineBuffer.clear(); - return; - } - - m_nextState = &protocol_HTTPStyle::state_AnalyzeHTTPHeaders; - m_state = &protocol_HTTPStyle::state_GetLine; - m_result.schedule(); - m_result.timeoutSID(); - m_lineBuffer.clear(); - } -} - -void protocol_HTTPStyle::state_Close() throw(exception) -{ - m_result.done(); -} - -// send buffer text -void protocol_HTTPStyle::state_Send() throw(exception) -{ - if (sendDataBuffer(DEFAULT_CLIENT_STREAM_ID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - m_state = m_nextState; - } -} - -void protocol_HTTPStyle::sendMessageAndClose(const utf8 &msg) throw() -{ - m_outMsg = msg; - m_outBuffer = m_outMsg.c_str(); - bandWidth::updateAmount(bandWidth::PUBLIC_WEB, (m_outBufferSize = (int)m_outMsg.size())); - m_state = &protocol_HTTPStyle::state_Send; - m_nextState = &protocol_HTTPStyle::state_Close; - m_result.write(); - m_result.run(); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////// - -utf8 protocol_HTTPStyle::getPlayedBody(const streamData::streamID_t sid) -{ - utf8 body = "<table border=\"0\" cellpadding=\"2\" cellspacing=\"2\">" - "<tr><td><b>Played @</b></td><td><b>Song Title</b></td></tr>"; - - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - if (songHistory.empty()) - { - body += "<tr><td>No Songs Played</td></tr>"; - } - else - { - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - char buf[1024] = {0}; - struct tm lt; - time_t t = (*i).m_when; - ::localtime_s(<, &t); - snprintf(buf, sizeof(buf) - 1, "%02d:%02d:%02d", lt.tm_hour, lt.tm_min, lt.tm_sec); - body += "<tr><td>" + utf8(buf) + "</td><td>" + getCurrentSong((*i).m_title) + "</td>" + - (i == songHistory.begin() ? (streamData::isSourceConnected(sid) ? - "<td style=\"padding: 0 1em;\"><b>Current Song</b></td>" : "") : "") + "</tr>"; - } - } - - body += "</table>"; - return body; -} - -// played history page -void protocol_HTTPStyle::path_played_html(const streamData::streamID_t sid, const utf8 &XFF) throw() -{ - cacheItem *item = m_htmlPlayedCache[sid]; - if (getCachedResponse(item, m_htmlPlayedLock)) - { - return; - } - - utf8 header = MSG_NO_CLOSE_200, - body = getStreamHeader(sid, "Stream History"); - - if (gOptions.getSongHistorySize(sid)) - { - body += getStreamMiddlePlayingHeader(sid); - } - - if (isAccessAllowed(sid, XFF) == true) - { - body += getStreamMiddleListenHeader(sid); - } - - body += getStreamEndHeader(sid) + getPlayedBody(sid) + getIEFlexFix() + getfooterStr(); - - sendCachedResponse(item, m_htmlPlayedCache, m_htmlPlayedLock, header, body, sid); -} - -utf8 protocol_HTTPStyle::getPlayedJSON(const streamData::streamID_t sid, utf8 &header, - const utf8 &callback, const bool allowed) throw() -{ - const bool jsonp = !callback.empty(); - header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n"; - utf8 body = (jsonp ? callback + "(" : "") + "["; - - if (allowed) - { - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - bool first = true; - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - body += (!first ? utf8(",") : "") + "{\"playedat\":" + - tos((*i).m_when) + "," "\"title\":\"" + escapeJSON((*i).m_title) + "\"" - ",\"metadata\":" + getCurrentJSONMetadataBody((*i).m_metadata) + "}"; - first = false; - } - } - - return (body + "]" + (jsonp ? utf8(")") : "")); -} - -void protocol_HTTPStyle::path_played_json(const streamData::streamID_t sid, const utf8 &callback, - const bool password, const utf8 &XFF) throw() -{ - cacheItem *item = m_jsonPlayedCache[sid]; - if (getCachedResponse(item, m_jsonPlayedLock)) - { - return; - } - - const bool jsonp = !callback.empty(); - utf8 header, body = getPlayedJSON(sid, header, callback, (password || (isAccessAllowed(sid, XFF) == true))); - sendCachedResponse(item, m_jsonPlayedCache, m_jsonPlayedLock, header, body, sid, jsonp); -} - -utf8 protocol_HTTPStyle::getPlayedXML(const streamData::streamID_t sid, utf8 &header, const bool allowed) throw() -{ - header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n"; - utf8 body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" - "<SHOUTCASTSERVER><SONGHISTORY>"; - - if (allowed) - { - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - body += "<SONG><PLAYEDAT>" + tos((*i).m_when) + "</PLAYEDAT>" - "<TITLE>" + aolxml::escapeXML((*i).m_title) + "</TITLE>" + - getCurrentXMLMetadataBody(true, (*i).m_metadata) + "</SONG>"; - } - } - - return (body + "</SONGHISTORY></SHOUTCASTSERVER>"); -} - -void protocol_HTTPStyle::path_played_xml(const streamData::streamID_t sid, - const bool password, const utf8 &XFF) throw() -{ - cacheItem *item = m_xmlPlayedCache[sid]; - if (getCachedResponse(item, m_xmlPlayedLock)) - { - return; - } - - utf8 header, body = getPlayedXML(sid, header, (password || (isAccessAllowed(sid, XFF) == true))); - sendCachedResponse(item, m_xmlPlayedCache, m_xmlPlayedLock, header, body, sid); -} - -// flash x-domain file -void protocol_HTTPStyle::path_crossdomain() throw() -{ - cacheItem *item = m_crossdomainCache[0]; - if (getCachedResponse(item, m_crossdomainLock, 86400)) // 1 day - { - return; - } - - // return either the current song or the next song to be played (if known) - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/x-cross-domain-policy\r\n", - body = gOptions.getCrossDomainFile(!!m_compressed); - - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_crossdomainStrGZ.empty()) - { - header += "Content-Encoding:gzip\r\n"; - body = gOptions.m_crossdomainStrGZ; - } - - sendCachedResponse(item, m_crossdomainCache, m_crossdomainLock, header, body); -} - -// flash swf file (assumes shoutcast.swf for ease of implementation / consistency) -void protocol_HTTPStyle::path_shoutcastswf() throw() -{ - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/x-shockwave-flash\r\n", - body = gOptions.getShoutcastSWF(!!m_compressed); - - // make sure there is a gzipped version available to send if signalled as supported - if (m_compressed && !gOptions.m_shoutcastSWFStrGZ.empty()) - { - header += "Content-Encoding:gzip\r\n"; - body = gOptions.m_crossdomainStrGZ; - } - - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_HTTPStyle::path_redirect_url(const streamData::streamID_t sid, const bool no_sid, const bool isStats) throw() -{ - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - const utf8 redirectUrl = gOptions.getStreamRedirectURL((no_sid ? 0 : sid), isStats, !info.m_streamURL.empty(), !!m_compressed); - if (redirectUrl.empty()) - { - // try to redirect directly to the appropriate page based on the number of active streams - streamData::streamID_t lastSID = 0; - if (streamData::totalActiveStreams(lastSID) == (streamData::streamID_t)DEFAULT_CLIENT_STREAM_ID) - { - sendMessageAndClose(redirect("index.html?sid=" + tos(lastSID), !!m_compressed)); - } - else - { - sendMessageAndClose(redirect("index.html", !!m_compressed)); - } - } - else - { - sendMessageAndClose(redirectUrl); - } -} - -void protocol_HTTPStyle::path_root_summary(const utf8 &XFF, const bool force) throw() -{ - // if enabled then we need to block access to this page as it's not allowed to be public - if (gOptions.getStreamHideStats(0) == "all") - { - path_redirect_url(0, true, false); - } - else - { - utf8 header = MSG_NO_CLOSE_200, - body = "<!DOCTYPE html><html><head>" - "<meta charset=\"utf-8\">" - "<meta name=viewport content=\"width=device-width, initial-scale=1\">"\ - "<title>Shoutcast Server</title>" - "<link href=\"index.css\" rel=\"stylesheet\" type=\"text/css\">" - "<link href=\"images/favicon.ico\" rel=\"shortcut icon\" type=\"" + gOptions.faviconFileMimeType() + "\">" - "</head><body style=\"margin:0;\">" - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>" - "<td><div class=\"logo\">Shoutcast Streams Status</div></td>" - "<td style=\"text-align:right;vertical-align:bottom;padding-right:0.1em;\">" - "<a target=\"_blank\" title=\"Built: " __DATE__ "\" " - "href=\"http://www.shoutcast.com\">Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "</a>" - "</td></tr><tr><td class=\"thr\" align=\"center\" colspan=\"2\">" - "<table width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\"><tr class=\"tnl\">" - "<td align=\"left\"> <a target=\"_blank\" href=\"http://forums.shoutcast.com/forumdisplay.php?f=140\">Help</a> | " - " <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_Broadcaster\">Documentation</a></td>" - "<td align=\"right\"><a href=\"admin.cgi\">Server Login " - "<img border=\"0\" title=\"Server Login\nPassword Required\" alt=\"Server Login\nPassword Required" - "\" style=\"vertical-align:middle\" src=\"images/lock.png\">" - "</a> </td></tr></table></td></tr></table>"; - - utf8 streamBody = ""; - size_t total = 0, known = streamData::totalStreams(); - - if (known > 0) - { - --known; // just makes it easier to know when to insert the <hr> element - - size_t inc = 0; - streamData::streamID_t sid = 0; - do - { - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo((sid = streamData::enumStreams(inc)), info, extra)) - { - // increment our stream total now that we know we have one - ++total; - - utf8 tooltip = streamData::getContentType(info) + " @ " + - (info.m_streamBitrate > 0 ? tos(info.m_streamBitrate) : - "unknown") + " kbps" + (info.m_vbr ? " (VBR)" : "") + - ", " + sampleRateStr(info.m_streamSampleRate); - - streamBody += "<tr><td class=\"tnl\">" - "<a href=\"index.html?sid=" + tos(sid) + "\" title=\"" + tooltip + "\">Stream #" + tos(sid) + "</a> " - "<a href=\"admin.cgi?sid=" + tos(sid) + "\">(Stream Login)</a>"; - - if (isAccessAllowed(sid, XFF) == true) - { - streamBody += " <a href=\"listen.pls?sid=" + tos(sid) + "\">" - "<img border=\"0\" title=\"Listen to Stream\" alt=\"Listen to Stream" - "\" style=\"vertical-align:middle\" src=\"images/listen.png\"></a>"; - - streamBody += " <a href=\"played.html?sid=" + tos(sid) + "\">" - "<img border=\"0\" title=\"History\" alt=\"History" - "\" style=\"vertical-align:middle\" src=\"images/history.png\"></a>"; - } - - streamBody += "</td></tr><tr><td>" + (info.m_streamPublic && extra.ypConnected ? - "<a target=\"_blank\" href=\"http://directory.shoutcast.com/Search?query=" + - urlUtils::escapeURI_RFC3986(info.m_streamName) + - "\">" + aolxml::escapeXML(info.m_streamName) + "</a>" : - (info.m_streamURL.empty() ? aolxml::escapeXML(info.m_streamName) : - urlLink(info.m_streamURL, info.m_streamName))) + "</td></tr>" - "<tr><td>" + tooltip + "</td></tr>"; - - if (!getHideState(sid)) - { - stats::statsData_t data; - stats::getStats(sid, data); - - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - streamBody += "<tr valign=\"top\"><td>" + tos(data.connectedListeners) + - (maxUsers > 0 ? " of " + tos(maxUsers) : "") + " listeners" + - (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? - (" (" + tos(data.uniqueListeners) + " unique)") : "") + "</td></tr>"; - } - - if (!info.m_currentSong.empty()) - { - streamBody += "<tr valign=\"top\"><td>Playing Now: " - "<b><a href=\"currentsong?sid=" + tos(sid) + "\">" + - getCurrentSong(info.m_currentSong) + "</a></b></td></tr>"; - - // only show if we have a valid current song - if (!info.m_comingSoon.empty()) - { - streamBody += "<tr valign=\"top\"><td>Playing Next: <b><a href=\"nextsong?sid=" + - tos(sid) + "\">" + aolxml::escapeXML(info.m_comingSoon) + "</a></b></td></tr>"; - } - } - - if (!info.m_contentType.empty() && (info.m_uvoxDataType == MP3_DATA)) - { - streamBody += streamData::getHTML5Player(sid); - } - - if (inc < known) - { - // this allows us to only add between - // blocks and not below the very last - streamBody += "<tr><td><hr></td></tr>"; - } - } - ++inc; - } - while (sid); - } - - // if only 1 stream is active then behave like a v1 DNAS and show that stream's summary page - if (total == 1 && !force) - { - sendMessageAndClose(redirect("index.html", !!m_compressed)); - } - else - { - body += "<table cellpadding=\"5\" cellspacing=\"0\" border=\"0\" width=\"100%\">" - "<tr><td class=\"tsp\" align=\"center\">" - "Available Streams: " + tos(total) + "</td></tr></table><br>" + - getNewVersionMessage() + - "<table cellpadding=\"5\" cellspacing=\"0\" border=\"0\" " - "width=\"100%\" style=\"padding:0 1em;\" align=\"center\">" - // if there are any streams then we can add them in now we have the real total and finish off the page - "<tbody align=\"center\">" + streamBody + "</tbody></table>" + - getHTML5Remover() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - } -} - -// main admin page -void protocol_HTTPStyle::path_root(const streamData::streamID_t sid, const utf8 &XFF) throw() -{ - // if enabled then we need to block access to this page as it's not allowed to be public - if (gOptions.getStreamHideStats(sid) == "all") - { - path_redirect_url(sid, false, false); - } - else - { - utf8 header = MSG_NO_CLOSE_200, - body = getStreamHeader(sid, "Stream Status"); - - if (gOptions.getSongHistorySize(sid)) - { - body += getStreamMiddlePlayingHeader(sid); - } - - if (isAccessAllowed(sid, XFF) == true) - { - body += getStreamMiddleListenHeader(sid); - } - - body += getStreamEndHeader(sid) + "<table cellpadding=\"5\" " - "cellspacing=\"0\" border=\"0\" width=\"100%\"><tr>" - "<td class=\"tsp\" align=\"center\">Current Stream " - "Information</td></tr></table><br>" + getNewVersionMessage(); - - stats::statsData_t data; - stats::getStats(sid, data); - - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo(sid, info, extra)) - { - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - const bool isListable = streamData::isAllowedType(info.m_uvoxDataType); - body += "<table cellpadding=\"2\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"padding-left:1em;\"><tr valign=\"top\">" - "<td>Listing Status: </td>" - "<td><b>Stream is currently up " + - (info.m_streamPublic && isListable ? (!extra.ypConnected ? "" : utf8("and public")) : utf8("and private (not listed)")) + - (info.m_streamPublic && isListable ? (!extra.ypConnected ? - (extra.ypErrorCode == -1 ? "but unable to access the Directory.<br>Listeners are allowed and the stream will act like it is private until resolved." : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "but received a Directory maintenance notification.<br>Listeners are allowed to connect and the stream will act like it is private." : - (!info.m_authHash.empty() ? - (extra.ypErrorCode != YP_NOT_VISIBLE ? "but is waiting on a Directory response." : "but is not visible on the internet " - "(YP error code: <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2#YP_Server_Errors\">" + - tos(extra.ypErrorCode) + "</a>).<br>Listeners are allowed and the stream will act like it is private until resolved.<br><br>" - "Resolving this issue will allow the stream to be listed in the Shoutcast Directory.") : - "but requires <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">registration</a> in the Shoutcast Directory.<br>" - "Listeners are allowed and the stream will act like it is private until resolved."))) : "") : "") + "</b></td></tr>" - "<tr valign=\"top\"><td>Stream Status: </td>" - "<td><b>Stream is up (" + streamData::getContentType(info) + " @ " + - (info.m_streamBitrate > 0 ? tos(info.m_streamBitrate) : "unknown") + - " kbps" + (info.m_vbr ? " (VBR)" : "") + ", " + - sampleRateStr(info.m_streamSampleRate) + ") with " + - tos(data.connectedListeners) + (maxUsers > 0 ? " of " + - tos(maxUsers) : "") + " listeners" + (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? (" (" + - tos(data.uniqueListeners) + " unique)") : "") + "</b></td></tr>"; - - if (data.peakListeners > 0) - { - body += "<tr valign=\"top\"><td>Listener Peak: </td><td><b>" + - tos(data.peakListeners) + "</b></td></tr>"; - } - - const utf8 avgTime = timeString(data.avgUserListenTime); - if (!avgTime.empty()) - { - body += "<tr valign=\"top\"><td>Avg. Play Time: </td>" - "<td><b>" + avgTime + "</b></td></tr>"; - } - - body += "<tr valign=\"top\"><td>Stream Name: </td><td><b>" + - (info.m_streamPublic && extra.ypConnected ? - "<a target=\"_blank\" href=\"http://directory.shoutcast.com/Search?query=" + - urlUtils::escapeURI_RFC3986(info.m_streamName) + "\">" + - aolxml::escapeXML(info.m_streamName) + "</a>" : - aolxml::escapeXML(info.m_streamName)) + "</b></td></tr>"; - - if (!info.m_streamGenre[0].empty()) - { - body += "<tr valign=\"top\"><td>Stream Genre(s): </td>" - "<td><b>" + (info.m_streamPublic && extra.ypConnected ? - "<a target=\"_blank\" href=\"http://directory.shoutcast.com/Genre?name=" + - urlUtils::escapeURI_RFC3986(info.m_streamGenre[0]) + "\">" + - aolxml::escapeXML(info.m_streamGenre[0]) + "</a>" : - aolxml::escapeXML(info.m_streamGenre[0])) + "</b>"; - - for (int i = 1; i < 5; i++) - { - if (!info.m_streamGenre[i].empty()) - { - body += " , <b>" + (info.m_streamPublic && extra.ypConnected ? "<a target=\"_blank\" href=\"http://directory.shoutcast.com/Genre?name=" + - urlUtils::escapeURI_RFC3986(info.m_streamGenre[i]) + "\">" + aolxml::escapeXML(info.m_streamGenre[i]) + "</a>" : - aolxml::escapeXML(info.m_streamGenre[i])) + "</b>"; - } - } - - body += "</td></tr>"; - } - - if (!info.m_streamURL.empty()) - { - body += "<tr valign=\"top\"><td>Stream Website: </td>" - "<td><b>" + urlLink(info.m_streamURL) + "</b></td></tr>"; - } - - if (!info.m_currentSong.empty()) - { - body += "<tr valign=\"top\"><td>Playing Now: </td>" - "<td><b><a href=\"currentsong?sid=" + tos(sid) + "\">" + - getCurrentSong(info.m_currentSong) + "</a></b></td></tr>"; - - // only show if we have a valid current song - if (!info.m_comingSoon.empty()) - { - body += "<tr valign=\"top\"><td>Playing Next: </td>" - "<td><b><a href=\"nextsong?sid=" + tos(sid) + "\">" + - aolxml::escapeXML(info.m_comingSoon) + "</a></b></td></tr>"; - } - } - - if (!info.m_contentType.empty() && (info.m_uvoxDataType == MP3_DATA)) - { - body += streamData::getHTML5Player(sid); - } - - body += "</table>"; - } - else - { - body += "<table cellpadding=\"2\" cellspacing=\"0\" border=\"0\" " - "align=\"center\"><tr valign=\"top\"><td>Stream Status: </td><td><b>"; - const utf8 movedUrl = gOptions.stream_movedUrl(sid); - if (movedUrl.empty()) - { - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - body += "Stream is currently down" + (data.connectedListeners > 0 ? - " with " + tos(data.connectedListeners) + (maxUsers > 0 ? " of " + - tos(maxUsers) : "") + " listeners" + (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? (" (" + - tos(data.uniqueListeners) + " unique)") : "") : ".") + "<br>There is no " - "source connected or no stream is configured for stream #" + tos(sid); - } - else - { - body += "Stream has been moved to " + urlLink(movedUrl); - } - body += "</b></td></tr>"; - - if (data.peakListeners > 0) - { - body += "<tr valign=\"top\"><td>Listener Peak: </td><td><b>" + - tos(data.peakListeners) + "</b></td></tr>"; - } - - const utf8 avgTime = timeString(data.avgUserListenTime); - if (!avgTime.empty()) - { - body += "<tr valign=\"top\"><td>Avg. Play Time: </td>" - "<td><b>" + avgTime + "</b></td></tr>"; - } - - body += "</table>"; - } - - body += getIEFlexFix() + getHTML5Remover() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } -} - -// redirect to stream URL -void protocol_HTTPStyle::path_home(const streamData::streamID_t sid) throw() -{ - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - utf8 streamUrl = (!info.m_streamURL.empty() ? - ((info.m_streamURL.find(utf8("://")) == utf8::npos ? "http://" : "") + - info.m_streamURL) : "http://www.shoutcast.com"); - - sendMessageAndClose(redirect(streamUrl, !!m_compressed)); -} - -void protocol_HTTPStyle::path_track(const streamData::streamID_t sid, const int mode) throw() -{ - // this is a non-compressed response as most normal titles aren't - // long enough or contain enough data sans gzip header and footer - // to make it worth trying to create a gzipped response for this. - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/plain;charset=utf-8\r\n", currentSong, comingSoon; - std::vector<uniString::utf8> nextSongs; - if (streamData::getStreamNextSongs(sid, currentSong, comingSoon, nextSongs)) - { - // return either the current song or the next song to be played (if known) - utf8 body = (!mode ? (currentSong.empty() ? "" : currentSong) : - (!currentSong.empty() ? comingSoon : "")); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - else - { - sendMessageAndClose(header + "\r\n"); - } -} - -void protocol_HTTPStyle::path_tracks_json(const streamData::streamID_t sid, const utf8 &callback) throw() -{ - cacheItem *item = m_jsonTracksCache[sid]; - if (getCachedResponse(item, m_jsonTracksLock)) - { - return; - } - - const bool jsonp = !callback.empty(); - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + "[", currentSong, comingSoon; - std::vector<uniString::utf8> nextSongs; - if (streamData::getStreamNextSongs(sid, currentSong, comingSoon, nextSongs)) - { - int index = 1; - for (std::vector<uniString::utf8>::const_iterator i = nextSongs.begin(); i != nextSongs.end(); ++i, index++) - { - body += (i != nextSongs.begin() ? utf8(",") : "") + - "{\"title\":\"" + escapeJSON((*i).empty() ? "" : (*i)) + "\"}"; - } - } - - body += utf8("]") + (jsonp ? ")" : ""); - - sendCachedResponse(item, m_jsonTracksCache, m_jsonTracksLock, header, body, sid, jsonp); -} - -void protocol_HTTPStyle::path_tracks_xml(const streamData::streamID_t sid) throw() -{ - cacheItem *item = m_xmlTracksCache[sid]; - if (getCachedResponse(item, m_xmlTracksLock)) - { - return; - } - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n", - body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" - "<SHOUTCASTSERVER><NEXTSONGS>", currentSong, comingSoon; - std::vector<uniString::utf8> nextSongs; - if (streamData::getStreamNextSongs(sid, currentSong, comingSoon, nextSongs)) - { - int index = 1; - for (std::vector<uniString::utf8>::const_iterator i = nextSongs.begin(); i != nextSongs.end(); ++i, index++) - { - body += "<TITLE seq=\"" + tos(index) + "\">" + aolxml::escapeXML(*i) + "</TITLE>"; - } - } - - body += "</NEXTSONGS></SHOUTCASTSERVER>"; - - sendCachedResponse(item, m_xmlTracksCache, m_xmlTracksLock, header, body, sid); -} - -uniString::utf8 protocol_HTTPStyle::getCurrentXMLMetadataBody(const bool mode, const utf8 &metadata) -{ - utf8 body = (!mode ? "<SONGMETADATA>" : "<METADATA>"); - - if (!metadata.empty()) - { - // strip out the metadata between the <metadata /> part - // so it'll instead go in our own <songmetadata /> part - const utf8::size_type pos1 = metadata.find(METADATA), // 10 chars - pos2 = metadata.find(E_METADATA); // 11 chars - if ((pos1 != utf8::npos) && (pos2 != utf8::npos)) - { - body += stripWhitespace(metadata.substr(pos1 + 10, pos2 - pos1 - 10)); - } - } - - return (body + (!mode ? "</SONGMETADATA>" : "</METADATA>")); -} - -void protocol_HTTPStyle::path_current_metadata_xml(const streamData::streamID_t sid) throw() -{ - cacheItem *item = m_xmlMetadataCache[sid]; - if (getCachedResponse(item, m_xmlMetadataLock)) - { - return; - } - - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n", - body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" - "<SHOUTCASTSERVER>" + getCurrentXMLMetadataBody(false, - (!songHistory.empty() ? songHistory[0].m_metadata : "")) + - "</SHOUTCASTSERVER>"; - - sendCachedResponse(item, m_xmlMetadataCache, m_xmlMetadataLock, header, body, sid); -} - -uniString::utf8 protocol_HTTPStyle::getCurrentJSONMetadataBody(const utf8 &metadata) -{ - utf8 body = "{"; - - if (!metadata.empty()) - { - // strip out the metadata between the <metadata /> part - // so it'll instead go in our own <songmetadata /> part - const utf8::size_type pos1 = metadata.find(METADATA), // 10 chars - pos2 = metadata.find(E_METADATA); // 11 chars - if ((pos1 != utf8::npos) && (pos2 != utf8::npos)) - { - // take the xml metadata, create a new xml block from it - const utf8 meta = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><meta>" + - stripWhitespace(metadata.substr(pos1 + 10, pos2 - pos1 - 10)) + "</meta>"; - - // then split down into node+text to be able to output - aolxml::node *n = 0; - try - { - n = aolxml::node::parse(meta); - if (n) - { - for (aolxml::node::const_childIterator_t i = n->childrenBegin(); i != n->childrenEnd(); ++i) - { - const utf8 node = toLower((*i)->name()); - body += (i != n->childrenBegin() ? utf8(",") : "") + - "\"" + escapeJSON(node) + - "\":" + ((*i)->childrenEmpty() ? "\"" + escapeJSON((*i)->pcdata()) + "\"" : ""); - // if we've got a child block it should be <extension/> and so parse out - if (!(*i)->childrenEmpty()) - { - body += "["; - for (aolxml::node::const_childIterator_t c = (*i)->childrenBegin(); c != (*i)->childrenEnd(); ++c) - { - const utf8 nodec = toLower((*c)->name()) + (*c)->findAttributeString("seq"); - body += (c != (*i)->childrenBegin() ? utf8(",") : "") + - "{\"" + escapeJSON(nodec) + - "\":" + ((*c)->childrenEmpty() ? "\"" + escapeJSON((*c)->pcdata()) + "\"" : "") + "}"; - } - body += "]"; - } - } - } - } - catch(const exception &) - { - } - forget(n); - } - } - - return (body + "}"); -} - -void protocol_HTTPStyle::path_current_metadata_json(const streamData::streamID_t sid, const utf8 &callback) throw() -{ - cacheItem *item = m_jsonMetadataCache[sid]; - if (getCachedResponse(item, m_jsonMetadataLock)) - { - return; - } - - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - const bool jsonp = !callback.empty(); - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + - getCurrentJSONMetadataBody((!songHistory.empty() ? songHistory[0].m_metadata : "")) + - (jsonp ? ")" : ""); - - sendCachedResponse(item, m_jsonMetadataCache, m_jsonMetadataLock, header, body, sid, jsonp); -} - -utf8 protocol_HTTPStyle::getStatsXMLBody(const streamData::streamID_t sid, const bool single, - const bool proceed, const socketOps::tSOCKET m_socket, - stats::statsData_t& data, const bool no_copy) -{ - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - if (!no_copy) - { - stats::getStats(sid, data); - } - - size_t maxUsers = gOptions.maxUser(); - - config::streamConfig stream; - if (gOptions.getStreamConfig(stream, sid)) - { - maxUsers = ((stream.m_maxStreamUser > 0) && (stream.m_maxStreamUser < gOptions.maxUser()) ? stream.m_maxStreamUser : gOptions.maxUser()); - } - - utf8 body = "<CURRENTLISTENERS>" + tos(data.connectedListeners) + "</CURRENTLISTENERS>" - "<PEAKLISTENERS>" + tos(data.peakListeners) + "</PEAKLISTENERS>" - "<MAXLISTENERS>" + (maxUsers > 0 ? tos(maxUsers) : "UNLIMITED") + "</MAXLISTENERS>" - "<UNIQUELISTENERS>" + tos(data.uniqueListeners) + "</UNIQUELISTENERS>" - "<AVERAGETIME>" + tos(data.avgUserListenTime) + "</AVERAGETIME>"; - - for (int n = 0; n < 5; n++) - { - const utf8 num = (n ? tos(n + 1) : ""); - body += "<SERVERGENRE" + num + ">" + aolxml::escapeXML(info.m_streamGenre[n]) + "</SERVERGENRE" + num + ">"; - } - - body += "<SERVERURL>" + aolxml::escapeXML(info.m_streamURL) + "</SERVERURL>" - "<SERVERTITLE>" + aolxml::escapeXML(info.m_streamName) + "</SERVERTITLE>" - "<SONGTITLE>" + aolxml::escapeXML(info.m_currentSong.empty() ? "" : info.m_currentSong) + "</SONGTITLE>"; - - if (!info.m_comingSoon.empty()) - { - body += "<NEXTTITLE>" + aolxml::escapeXML(info.m_comingSoon) + "</NEXTTITLE>"; - } - - if (!info.m_streamUser.empty()) - { - body += "<DJ>" + aolxml::escapeXML(info.m_streamUser) + "</DJ>"; - } - - if (!info.m_currentURL.empty()) - { - body += "<SONGURL>" + aolxml::escapeXML(info.m_currentURL) + "</SONGURL>"; - } - - body += "<STREAMHITS>" + tos(data.totalStreamHits) + "</STREAMHITS>" - "<STREAMSTATUS>" + (extra.isConnected ? "1" : "0") + "</STREAMSTATUS>" - "<BACKUPSTATUS>" + (extra.isBackup ? "1" : "0") + "</BACKUPSTATUS>" - "<STREAMLISTED>" + (extra.ypConnected ? "1" : "0") + "</STREAMLISTED>"; - if (!extra.ypConnected) - { - body += "<STREAMLISTEDERROR>" + tos(extra.ypErrorCode) + "</STREAMLISTEDERROR>"; - } - - // if a source is connected and we have a valid password then output this - if (proceed && extra.isConnected) - { - // strip down the source address for display output to an appropriate output based on settings - utf8 srcAddr = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)); - if (gOptions.nameLookups()) - { - if (!extra.isBackup && !extra.isRelay) - { - u_short port = 0; - string addr, hostName; - socketOps::getpeername(m_socket, addr, port); - - string src = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)).hideAsString(); - hostName = src; - if (!socketOps::addressToHostName(addr, port, hostName)) - { - srcAddr = hostName + " (" + (src) + ")"; - } - } - } - - body += "<STREAMSOURCE>" + aolxml::escapeXML(srcAddr) + "</STREAMSOURCE>"; - - if (!info.m_backupURL.empty()) - { - body += "<STREAMBACKUP>" + aolxml::escapeXML(info.m_backupURL) + "</STREAMBACKUP>"; - } - } - - body += "<STREAMPATH>" + aolxml::escapeXML(getStreamPath(sid)) + "</STREAMPATH>" + - (extra.isConnected ? ("<STREAMUPTIME>" + tos(::time(NULL) - streamData::getStreamUptime(sid)) + "</STREAMUPTIME>") : "") + - "<BITRATE>" + tos(info.m_streamBitrate) + "</BITRATE>" - "<SAMPLERATE>" + tos(info.m_streamSampleRate) + "</SAMPLERATE>" + - (info.m_vbr ? "<VBR>1</VBR>" : "") + - "<CONTENT>" + aolxml::escapeXML(info.m_contentType) + "</CONTENT>"; - - if (single) - { - body += "<VERSION>" + aolxml::escapeXML(gOptions.getVersionBuildStrings()) + " (" SERV_OSNAME ")</VERSION>"; - } - - return body; -} - -void protocol_HTTPStyle::path_stats_xml(streamData::streamID_t sid, bool proceed) throw() -{ - cacheItem *item = m_xmlStatsCache[sid]; - if (getCachedResponse(item, m_xmlStatsLock)) - { - return; - } - - stats::statsData_t data; - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n", - body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" - "<SHOUTCASTSERVER>" + getStatsXMLBody(sid, true, proceed, m_socket, data) + "</SHOUTCASTSERVER>"; - - sendCachedResponse(item, m_xmlStatsCache, m_xmlStatsLock, header, body, sid); -} - -void protocol_HTTPStyle::path_statistics_xml(streamData::streamID_t sid, bool proceed) throw() -{ - cacheItem *item = m_xmlStatisticsCache[sid]; - if (getCachedResponse(item, m_xmlStatisticsLock)) - { - return; - } - - // this will generate a DNAS wide statistics report making it clearer on what is / isn't going on (requested by WaveStreaming) - size_t totalConnectedListeners = 0, - totalPeakListeners = 0, - totalMoved = 0; - time_t totalAvgUserListenTime = 0; - - streamData::streamIDs_t streamIds = streamData::getStreamIds(2); - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if ((*i).second.m_streamID) - { - streamIds.insert((*i).second.m_streamID); - } - } - - utf8 block = ""; - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - const utf8 movedUrl = gOptions.stream_movedUrl((*i)); - if (movedUrl.empty()) - { - stats::statsData_t data; - stats::getStats((*i), data); - - // increment the system wide totals - totalConnectedListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - totalAvgUserListenTime += data.avgUserListenTime; - - block += "<STREAM id=\"" + tos((*i)) + "\">" + getStatsXMLBody((*i), false, proceed, m_socket, data, true) + "</STREAM>"; - } - else - { - ++totalMoved; - } - } - - const int maxUsers = gOptions.maxUser(); - streamData::streamID_t lastSID = 0; - const utf8 main = "<STREAMSTATS>" - "<TOTALSTREAMS>" + tos(streamIds.size() - totalMoved) + "</TOTALSTREAMS>" - "<ACTIVESTREAMS>" + tos(streamData::totalActiveStreams(lastSID)) + "</ACTIVESTREAMS>" - "<CURRENTLISTENERS>" + tos(totalConnectedListeners) + "</CURRENTLISTENERS>" - "<PEAKLISTENERS>" + tos(totalPeakListeners) + "</PEAKLISTENERS>" - "<MAXLISTENERS>" + (maxUsers > 0 ? tos(maxUsers) : "UNLIMITED") + "</MAXLISTENERS>" - "<UNIQUELISTENERS>" + tos(stats::getTotalUniqueListeners()) + "</UNIQUELISTENERS>" - "<AVERAGETIME>" + tos(totalConnectedListeners > 0 ? - (totalAvgUserListenTime / totalConnectedListeners) : 0) + "</AVERAGETIME>" - "<VERSION>" + aolxml::escapeXML(gOptions.getVersionBuildStrings()) + " (" SERV_OSNAME ")</VERSION>"; - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:text/xml\r\n", - body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" - "<SHOUTCASTSERVER>" + main + block + "</STREAMSTATS></SHOUTCASTSERVER>"; - - sendCachedResponse(item, m_xmlStatisticsCache, m_xmlStatisticsLock, header, body, sid); -} - -utf8 protocol_HTTPStyle::getStatsJSONBody(const streamData::streamID_t sid, const bool single, - const bool proceed, const socketOps::tSOCKET m_socket, - stats::statsData_t& data, const bool no_copy) -{ - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - if (!no_copy) - { - stats::getStats(sid, data); - } - - size_t maxUsers = gOptions.maxUser(); - - config::streamConfig stream; - if (gOptions.getStreamConfig(stream, sid)) - { - maxUsers = ((stream.m_maxStreamUser > 0) && (stream.m_maxStreamUser < gOptions.maxUser()) ? stream.m_maxStreamUser : gOptions.maxUser()); - } - - utf8 body = (!single ? "\"id\":" + tos(sid) + "," : "") + - "\"currentlisteners\":" + tos(data.connectedListeners) + "," - "\"peaklisteners\":" + tos(data.peakListeners) + "," - "\"maxlisteners\":" + (maxUsers > 0 ? tos(maxUsers) : "\"unlimited\"") + "," - "\"uniquelisteners\":" + tos(data.uniqueListeners) + "," - "\"averagetime\":" + tos(data.avgUserListenTime) + ","; - - for (int n = 0; n < 5; n++) - { - const utf8 num = (n ? tos(n + 1) : ""); - body += "\"servergenre" + num + "\":\"" + aolxml::escapeXML(info.m_streamGenre[n]) + "\","; - } - - body += "\"serverurl\":\"" + escapeJSON(info.m_streamURL) + "\"," - "\"servertitle\":\"" + escapeJSON(info.m_streamName) + "\"," - "\"songtitle\":\"" + escapeJSON(info.m_currentSong.empty() ? "" : info.m_currentSong) + "\","; - - if (!info.m_comingSoon.empty()) - { - body += "\"nexttitle\":\"" + escapeJSON(info.m_comingSoon.empty() ? "" : info.m_comingSoon) + "\","; - } - - if (!info.m_streamUser.empty()) - { - body += "\"dj\":\"" + escapeJSON(info.m_streamUser) + "\","; - } - - if (!info.m_streamUser.empty()) - { - body += "\"songurl\":\"" + escapeJSON(info.m_currentURL) + "\","; - } - - body += "\"streamhits\":" + tos(data.totalStreamHits) + "," - "\"streamstatus\":" + (extra.isConnected ? "1" : "0") + "," - "\"backupstatus\":" + (extra.isBackup ? "1" : "0") + "," - "\"streamlisted\":" + (extra.ypConnected ? "1" : "0") + ","; - if (!extra.ypConnected) - { - body += "\"streamlistederror\":" + tos(extra.ypErrorCode) + ","; - } - - // if a source is connected and we have a valid password then output this - if (proceed && extra.isConnected) - { - // strip down the source address for display output to an appropriate output based on settings - utf8 srcAddr = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)); - if (gOptions.nameLookups()) - { - if (!extra.isBackup && !extra.isRelay) - { - u_short port = 0; - string addr, hostName; - socketOps::getpeername(m_socket, addr, port); - - string src = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)).hideAsString(); - hostName = src; - if (!socketOps::addressToHostName(addr, port, hostName)) - { - srcAddr = hostName + " (" + (src) + ")"; - } - } - } - - body += "\"streamsource\":\"" + escapeJSON(srcAddr) + "\","; - - if (!info.m_backupURL.empty()) - { - body += "\"streambackup\":\"" + escapeJSON(info.m_backupURL) + "\","; - } - } - - body += "\"streampath\":\"" + escapeJSON(getStreamPath(sid)) + "\"," + - (extra.isConnected ? ("\"streamuptime\":" + tos(::time(NULL) - streamData::getStreamUptime(sid)) + ",") : "") + - "\"bitrate\":\"" + tos(info.m_streamBitrate) + "\"," - "\"samplerate\":\"" + tos(info.m_streamSampleRate) + "\"," + - (info.m_vbr ? "\"vbr\":\"1\"," : "") + - "\"content\":\"" + escapeJSON(info.m_contentType) + "\""; - - if (single) - { - body += ",\"version\":\"" + escapeJSON(gOptions.getVersionBuildStrings()) + " (" SERV_OSNAME ")\""; - } - - return body; -} - -void protocol_HTTPStyle::path_stats_json(const streamData::streamID_t sid, const bool proceed, const utf8 &callback) throw() -{ - const bool jsonp = !callback.empty(); - cacheItem *item = m_jsonStatsCache[sid]; - if (getCachedResponse(item, m_jsonStatsLock)) - { - return; - } - - stats::statsData_t data; - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + "{" + - getStatsJSONBody(sid, true, proceed, m_socket, data) + - "}" + (jsonp ? ")" : ""); - - sendCachedResponse(item, m_jsonStatsCache, m_jsonStatsLock, header, body, sid, jsonp); -} - -void protocol_HTTPStyle::path_statistics_json(const streamData::streamID_t sid, const bool proceed, const utf8 &callback) throw() -{ - const bool jsonp = !callback.empty(); - cacheItem *item = m_jsonStatisticsCache[sid]; - if (getCachedResponse(item, m_jsonStatisticsLock)) - { - return; - } - - // this will generate a DNAS wide statistics report making it clearer on what is / isn't going on (requested by WaveStreaming) - size_t totalConnectedListeners = 0, - totalPeakListeners = 0, - totalMoved = 0; - time_t totalAvgUserListenTime = 0; - - streamData::streamIDs_t streamIds = streamData::getStreamIds(2); - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if ((*i).second.m_streamID) - { - streamIds.insert((*i).second.m_streamID); - } - } - - utf8 block = ""; - bool read = false; - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - const utf8 movedUrl = gOptions.stream_movedUrl((*i)); - if (movedUrl.empty()) - { - stats::statsData_t data; - stats::getStats((*i), data); - - // increment the system wide totals - totalConnectedListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - totalAvgUserListenTime += data.avgUserListenTime; - - block += (read ? utf8(",") : "") + "{" + getStatsJSONBody((*i), false, proceed, m_socket, data, true) + + "}"; - read = true; - } - else - { - ++totalMoved; - } - } - - streamData::streamID_t lastSID = 0; - const size_t total = streamIds.size() - totalMoved, - activeTotal = streamData::totalActiveStreams(lastSID), - maxUser = gOptions.maxUser(); - const utf8 main = "\"totalstreams\":" + tos(total) + "," - "\"activestreams\":" + tos(activeTotal) + "," - "\"currentlisteners\":" + tos(totalConnectedListeners) + "," - "\"peaklisteners\":" + tos(totalPeakListeners) + "," - "\"maxlisteners\":" + (maxUser > 0 ? tos(maxUser) : "\"unlimited\"") + "," - "\"uniquelisteners\":" + tos(stats::getTotalUniqueListeners()) + "," - "\"averagetime\":" + tos(totalConnectedListeners > 0 ? (totalAvgUserListenTime / totalConnectedListeners) : 0) + "," - "\"version\":\"" + escapeJSON(gOptions.getVersionBuildStrings()) + " (" SERV_OSNAME ")\"" + - (total > 0 ? ",\"streams\":[" : ""); - - utf8 header = "HTTP/1.0 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + - "{" + main + block + (total > 0 ? "]" : "") + "}" + - (jsonp ? ")" : ""); - - sendCachedResponse(item, m_jsonStatisticsCache, m_jsonStatisticsLock, header, body, sid, jsonp); -} - -void protocol_HTTPStyle::path_art(const streamData::streamID_t sid, int mode) throw() -{ - cacheItem *item = (!mode ? m_streamArtCache[sid] : m_playingArtCache[sid]); - if (getCachedResponse(item, (!mode ? m_streamArtLock : m_playingArtLock))) - { - return; - } - - utf8 header = "HTTP/1.0 200 OK\r\n", body; - streamData *sd = streamData::accessStream(sid); - if (sd) - { - vector<__uint8> sc21_albumart = (mode == 0 ? sd->streamAlbumArt() : sd->streamPlayingAlbumArt()); - if (!sc21_albumart.empty()) - { - utf8 mimeType[] = { - "image/jpeg", - "image/png", - "image/bmp", - "image/gif" - }; - const size_t mime = (mode == 0 ? sd->streamAlbumArtMime() : sd->streamPlayingAlbumArtMime()); - // if not in the valid range then don't report the mime type in the generated response - if (mime < 4) - { - header += "Content-Type:" + mimeType[mime] + "\r\n"; - } - body += utf8(&sc21_albumart[0],sc21_albumart.size()); - } - sd->releaseStream(); - } - - sendCachedResponse(item, (!mode ? m_streamArtCache : m_playingArtCache), - (!mode ? m_streamArtLock : m_playingArtLock), header, - body, sid, false, false); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h b/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h deleted file mode 100644 index 88d04660..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_HTTPStyle.h +++ /dev/null @@ -1,152 +0,0 @@ -#pragma once -#ifndef protocol_HTTPStyle_H_ -#define protocol_HTTPStyle_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include "cache.h" -#include "stats.h" -#include <map> - -/* - Runnable object that handles protocols which use the HTTP style - negotiation. Depending on the details this object will hand off - to others (actually HTTP get or maybe audio streaming) -*/ - -class protocol_HTTPStyle : public runnable -{ -friend class protocol_shoutcastClient; - -public: - enum { - ACCEPT_PLAIN = 0, - ACCEPT_GZIP = 1, - ACCEPT_DEFLATE = 2 - }; - - enum { - HTTP_UNKNOWN = -1, - HTTP_GET = 0, - HTTP_POST = 1, - HTTP_HEAD = 2 - }; - - struct HTTPRequestInfo - { - int m_request; // HTTP_GET, HTTP_POST, etc - int m_AcceptEncoding; // the received 'Accept-Encoding' values - uniString::utf8 m_url; // url portion of request, unescaped - ////////////////////////////// - httpHeaderMap_t m_QueryParameters; // unescaped - httpHeaderMap_t m_HTTPHeaders; // the received HTTP headers - uniString::utf8 m_PostLine; // received POST line - - HTTPRequestInfo() : m_request(HTTP_UNKNOWN), m_AcceptEncoding(ACCEPT_PLAIN) {} - }; - - const u_short m_clientPort; - const uniString::utf8 m_clientHostName; - const uniString::utf8 m_clientAddr; - const uniString::utf8 m_clientLogString; - -private: - microServer::AllowableProtocols_t m_protocols; - HTTPRequestInfo m_httpRequestInfo; - uniString::utf8 m_userAgent; - uniString::utf8 m_userAgentLowered; - uniString::utf8 m_referer; - uniString::utf8 m_hostIP; - uniString::utf8 m_url; - - uniString::utf8 m_outMsg; - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - int m_postRequestLength; - - short m_postRequest; - short m_compressed; - - uniString::utf8 m_lastKey; // received HTTP header line key (used to cope with some weird line splits) - uniString::utf8 m_lineBuffer; // received HTTP header line - - typedef void (protocol_HTTPStyle::*state_t)(); - - state_t m_state; - state_t m_nextState; - - const bool getCachedResponse(cacheItem *item, AOL_namespace::mutex &lock, const int limit = 1); - void sendCachedResponse(cacheItem *item, CacheMap_t &cache, AOL_namespace::mutex &lock, - uniString::utf8 &header, uniString::utf8 &body, - const streamData::streamID_t sid = 0, - const bool jsonp = false, const bool noCompress = false); - - void sendMessageAndClose(const uniString::utf8 &msg) throw(); - - void state_GetLine() throw(std::exception); - void state_AnalyzeHTTPHeaders() throw(std::exception); - void state_DetermineAction() throw(std::exception); - void state_Close() throw(std::exception); - void state_Send() throw(std::exception); - - void path_redirect_url(const streamData::streamID_t sid, const bool no_sid, const bool isStats) throw(); - void path_root_summary(const uniString::utf8 &XFF, const bool force = false) throw(); - void path_root(const streamData::streamID_t sid, const uniString::utf8 &XFF) throw(); - void path_played_html(const streamData::streamID_t sid, const uniString::utf8 &XFF) throw(); - void path_played_json(const streamData::streamID_t sid, const uniString::utf8 &callback, - const bool password = true, const uniString::utf8 &XFF = "") throw(); - void path_played_xml(const streamData::streamID_t sid, const bool password = true, - const uniString::utf8 &XFF = "") throw(); - void path_home(const streamData::streamID_t sid) throw(); - void path_track(const streamData::streamID_t sid, int mode) throw(); - void path_tracks_json(const streamData::streamID_t sid, const uniString::utf8 &callback) throw(); - void path_tracks_xml(const streamData::streamID_t sid) throw(); - void path_current_metadata_xml(const streamData::streamID_t sid) throw(); - void path_current_metadata_json(const streamData::streamID_t sid, const uniString::utf8 &callback) throw(); - void path_crossdomain() throw(); - void path_shoutcastswf() throw(); - void path_stats_xml(const streamData::streamID_t sid, const bool proceed) throw(); - void path_statistics_xml(const streamData::streamID_t sid, const bool proceed) throw(); - void path_stats_json(const streamData::streamID_t sid, const bool proceed, const uniString::utf8 &callback) throw(); - void path_statistics_json(const streamData::streamID_t sid, const bool proceed, const uniString::utf8 &callback) throw(); - void path_art(const streamData::streamID_t sid, const int mode) throw(); - - const bool isViewingAllowed(const streamData::streamID_t sid, const uniString::utf8 &password, const bool no_stream, - bool &adminOverride, const bool hide, bool &passworded) throw(); - const bool isAccessAllowed(const streamData::streamID_t sid, const uniString::utf8 &hostAddr, const bool showOutput) throw(); - const bool isAdminAccessAllowed(const uniString::utf8 &hostIP, const uniString::utf8 &hostName) throw(); - const bool findBaseStream(bool& no_sid, streamData::streamID_t& sid); - const uniString::utf8 getClientIP(const bool streamPublic, const uniString::utf8 &publicIP) throw(); - void getPNGImage(const uniString::utf8 &png) throw(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_HTTPStyle"; } - -public: - protocol_HTTPStyle (microConnection &mc, const string &firstLine) throw(std::exception); - - protocol_HTTPStyle(const socketOps::tSOCKET s, const uniString::utf8 &hostName, - const uniString::utf8 &addr, const u_short port, const string &firstLine, - const microServer::AllowableProtocols_t protocols) throw(std::exception); - virtual ~protocol_HTTPStyle() throw(); - - static uniString::utf8 getStatsXMLBody(const streamData::streamID_t sid, const bool single, - const bool proceed, const socketOps::tSOCKET m_socket, - stats::statsData_t& data, const bool no_copy = false); - static uniString::utf8 getStatsJSONBody(const streamData::streamID_t sid, const bool single, - const bool proceed, const socketOps::tSOCKET m_socket, - stats::statsData_t& data, const bool no_copy = false); - static uniString::utf8 getPlayedBody(const streamData::streamID_t sid); - - static uniString::utf8 getCurrentXMLMetadataBody(const bool mode, const uniString::utf8 &metadata); - static uniString::utf8 getCurrentJSONMetadataBody(const uniString::utf8 &metadata); - - static uniString::utf8 getPlayedJSON(const streamData::streamID_t sid, uniString::utf8 &header, - const uniString::utf8 &callback, const bool allowed) throw(); - static uniString::utf8 getPlayedXML(const streamData::streamID_t sid, uniString::utf8 &header, const bool allowed) throw(); -}; - -const uniString::utf8 getNewVersionMessage(const uniString::utf8& ending = "<br><div align=\"center\"><hr style=\"width:99%\"></div><br>"); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.cpp deleted file mode 100644 index b0c5e136..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.cpp +++ /dev/null @@ -1,1681 +0,0 @@ -#if 0 -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "protocol_RTMPClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "amf.h" -#include "w3cLog.h" -#include "log.h" -#include "global.h" -#include <iomanip> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define C1_S1_C2_S2_PACKET_SIZE 1536 -#define DEFAULT_CHUNK_SIZE 128 - -#define RTMP_MSG__SET_CHUNK_SIZE 1 -#define RTMP_MSG__ABORT 2 -#define RTMP_MSG__ACKNOWLEDGEMENT 3 -#define RTMP_MSG__USER_CONTROL_MESSAGE 4 -#define RTMP_MSG__WINDOW_ACKNOWLEDGEMENT_SIZE 5 -#define RTMP_MSG__SET_PEER_BANDWIDTH 6 -#define RTMP_MSG__AUDIO_DATA 8 -#define RTMP_MSG__VIDEO_DATA 9 -#define RTMP_MSG__DATA_AMF3 15 -#define RTMP_MSG__COMMAND_AMF3 17 -#define RTMP_MSG__DATA_AMF0 18 -#define RTMP_MSG__COMMAND_AMF0 20 - -// user control messages -#define RTMP_UCM_STREAM_BEGIN 0 -#define RTMP_UCM_STREAM_EOF 1 -#define RTMP_UCM_STREAM_DRY 2 -#define RTMP_UCM_SET_BUFFER 3 -#define RTMP_UCM_STREAM_IS_RECORDED 4 -#define RTMP_UCM_PING_REQUEST 6 -#define RTMP_UCM_PING_RESPONSE 7 -///////////////////////// - -#define RTMP_PEER_BANDWIDTH_HARD 0 -#define RTMP_PEER_BANDWIDTH_SOFT 1 -#define RTMP_PEER_BANDWIDTH_DYNAMIC 2 - -#define DEFAULT_SERVER_WINDOW 0x2625a0 //(16 * 1024) - -#define DEBUG_LOG(x) { if (gOptions.RTMPClientDebug()) DLOG((x)); } - -#ifdef _WIN32 -#define TIMEFUNC ::timeGetTime -#else -#include <sys/time.h> -static unsigned long TIMEFUNC() throw() -{ - struct timeval tp; - ::gettimeofday(&tp,NULL); - return (tp.tv_sec * 1000) + (tp.tv_usec / 1000); -} -#endif - -static void createRTMPMsg(__uint8 msgType,long timestamp,int outboundChunkSize,const __uint8 *payload,size_t payloadSize,vector<__uint8> &result, - int chunkStreamID = 2,int msgStreamID = 0); -static void createRTMPMsg(const protocol_RTMPClient::message &msg,long timestamp,int outboundChunkSize,vector<__uint8> &result); - -//void getRTMPMsgInfo(const vector<__uint8> &msg,__uint8 &msgType,int &payloadLength,long ×tamp,int &streamID,int &payloadOffset); -static size_t decode4ByteValue(const __uint8 *data,size_t offset = 0) throw(); - -static utf8 prettyPrintMessage(const protocol_RTMPClient::message &msg) throw() -{ - utf8 EOL(eol()); - - utf8 result(EOL); - result += "msg type=" + tos((int)msg.m_messageType) + EOL; - - try - { - switch(msg.m_messageType) - { - case RTMP_MSG__SET_CHUNK_SIZE: - result += "chunk size=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - break; - - case RTMP_MSG__ABORT: - result += "chunk stream id=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - break; - - case RTMP_MSG__ACKNOWLEDGEMENT: - result += "sequence number=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - break; - - case RTMP_MSG__USER_CONTROL_MESSAGE: - break; - - case RTMP_MSG__WINDOW_ACKNOWLEDGEMENT_SIZE: - result += "acknowledgement window size=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - break; - - case RTMP_MSG__SET_PEER_BANDWIDTH: - result += "acknowledgement window size=" + tos(decode4ByteValue(&(msg.m_messageData[0]))) + EOL; - result += "limit type=" + tos(msg.m_messageData[4]) + EOL; - break; - - case RTMP_MSG__DATA_AMF0: - case RTMP_MSG__COMMAND_AMF0: - { - AMFEncoding amf0; - amf0.loadFromBitstream((const char *)&(msg.m_messageData[0]),(int)msg.m_messageData.size(),""); - result += amf0.prettyPrint(); - } - break; - - case RTMP_MSG__DATA_AMF3: - case RTMP_MSG__COMMAND_AMF3: - { - AMFEncoding amf3(3); - amf3.loadFromBitstream((const char *)&(msg.m_messageData[0]),(int)msg.m_messageData.size(),""); - result += amf3.prettyPrint(); - } - break; - } - } - catch(const exception &ex) - { - result += string("Exception: ") + ex.what() + EOL; - DEBUG_LOG(msg.packetDump()); - } - catch(...) - { - result += "Exception: <unknown>" + EOL; - DEBUG_LOG(msg.packetDump()); - } - - return result; -} - -#define TEST_FILE "C:\\Documents and Settings\\nradisch\\My Documents\\programming\\shoutcast\\current\\sc_serv2\\test.aac" -FILE *fff = 0; - -utf8 protocol_RTMPClient::message::packetDump() const throw() -{ - ostringstream o; - - int x = 0; - for(std::vector<__uint8>::const_iterator i = m_messageData.begin(); i != m_messageData.end(); ++i) - { - if ((x++) % 16 == 0) o << stringUtil::eol(); - o << setw(2) << hex << (int)(*i) << " "; - } - return o.str(); -} - -protocol_RTMPClient::protocol_RTMPClient(socketOps::tSOCKET s,const utf8 &hostName,const utf8 &addr,int port,__uint8 C0)throw(exception) - :m_socket(s),m_clientHostName(hostName),m_clientAddr(addr),m_clientPort(port),m_clientLogString(dstAddrLogString(hostName,port)), - m_C0(C0), - m_S0(3), - m_inDataBuffer(0), - m_lastActivityTime(::time(0)),m_startTime(::time(0)), - m_lastInboundMessageStreamID(-1), - m_lastInboundMessageLength(-1), - m_lastInboundMessageTypeID(-1), - m_lastInboundTimestamp(-1), - m_windowSizeFromClient(-1), - m_bufferSizeFromClient(-1), - m_lastTitleTime(::time(0)), - m_bytesSentForCurrentTitle(0), - m_totalBytesSent(0), - m_objectEncodingMode(0), - m_removeClientFromStats(false), - //m_state(&protocol_RTMPClient::state_AttachToStream), - m_state(&protocol_RTMPClient::state_SendS0), - m_streamData(0) -{ -#ifdef TEST_FILE - if (fff) ::fclose(fff); - fff = 0; - fff = ::fopen(TEST_FILE,"rb"); -#endif - - DEBUG_LOG(__FUNCTION__); - - m_inDataBufferMax = 16 * 1024; - m_inDataBuffer = new __uint8[m_inDataBufferMax]; - m_inDataBufferAmt = 0; - - // intialize s1 to all zeros - m_S1orS2.resize(C1_S1_C2_S2_PACKET_SIZE,0); - memset(&(m_S1orS2[0]),0,m_S1orS2.size()); - - // set base time - m_serverBaseTime = TIMEFUNC(); - __uint32 sbt = htonl(m_serverBaseTime); - memcpy(&(m_S1orS2[0]),&sbt,4); - - // initialize from 10 bytes of random section to random stuff. Faster than - // doing entire 1528 byte block and still valid - for(int x = 0; x < 10; ++x) - { - m_S1orS2[8+x] = rand(); - } - m_outDataPtr = &m_S0; - m_outDataSize = 1; - m_inboundChunkSize = DEFAULT_CHUNK_SIZE; - m_outboundChunkSize = DEFAULT_CHUNK_SIZE; -} - -protocol_RTMPClient::~protocol_RTMPClient() throw() -{ -#ifdef TEST_FILE - if (fff) ::fclose(fff); - fff = 0; -#endif - DEBUG_LOG(__FUNCTION__); - - try - { - /*ILOG(m_clientLogString + " SHOUTcast 1 client connection closed (" + - tos(::time(0) - m_startTime).c_str() + " seconds). " + - mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8("")) + - " [Bytes: " + tos(m_totalBytesSent).c_str() + "]");*/ - - if (m_removeClientFromStats) - stats::removeClient(m_streamID,this); - if (m_streamData) - { - m_streamData->abandonRTMPLimitTrigger(&m_limitTrigger); - streamData::streamClientLost(m_streamData); - m_streamData = 0; - - logW3C(); - } - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - - delete [] m_inDataBuffer; - m_streamData = 0; - socketOps::forgetTCPSocket(m_socket); -} - -runnable::timeSliceResult protocol_RTMPClient::timeSlice() throw(exception) -{ - size_t listenerTime = gOptions.stream_listenerTime(DEFAULT_SHOUTCAST_SOURCE_STREAM); - if(!gOptions.read_stream_listenerTime(DEFAULT_SHOUTCAST_SOURCE_STREAM)) - { - listenerTime = gOptions.listenerTime(); - } - - listenerTime *= 60; // convert to seconds - bool timesUp = (listenerTime && ((::time(0) - m_startTime) > (int)listenerTime)); - - if (m_kickNextRound || timesUp || (m_streamData && m_streamData->isDead())) - { - if (timesUp) - { ILOG(m_clientLogString + " listener time exceeded.");} - else if (m_kickNextRound) - { ILOG(m_clientLogString + " kicked");} - timeSliceResult result; - result.m_done = true; - return result; - } - - return (this->*m_state)(); -} - -////////////////////////////////////////////////////////////////////////////////// -///////////////////// Initial Handshake States ////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////// - -runnable::timeSliceResult protocol_RTMPClient::state_Send() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - timeSliceResult result; - - long to = sendDataBuffer(m_socket,m_outDataPtr,m_outDataSize,m_lastActivityTime,m_clientLogString); - if (to == 0) - { // done - m_state = m_nextState; - result.m_runImmediately = true; - } - else - { // some more - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = to; - } - return result; -} - -runnable::timeSliceResult protocol_RTMPClient::state_RecvFixedAmt() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - timeSliceResult result; - - assert(m_inDataRequested <= m_inDataBufferMax); - - size_t amt_left = m_inDataRequested - m_inDataBufferAmt; - size_t amt_left2 = amt_left; - - long to = getSocketData(m_socket,m_inDataBuffer,m_inDataBufferAmt,amt_left,m_lastActivityTime,m_clientLogString); - m_inDataBufferAmt += (amt_left2 - amt_left); - - if (to == 0) - { // got data - m_state = m_nextState; - result.m_runImmediately = true; - } - else - { // wait some more - result.m_readSet.insert(m_socket); - result.m_timeout.tv_sec = to; - } - return result; -} - -runnable::timeSliceResult protocol_RTMPClient::state_RecvMsg() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - timeSliceResult result; - - m_inMsg.clear(); - - long to = getMsg(m_inMsg); - - if (to == 0) - { - m_state = m_nextState; - result.m_runImmediately = true; - DEBUG_LOG(string(__FUNCTION__) + " received msg" + prettyPrintMessage(m_inMsg)); - } - else - { - result.m_readSet.insert(m_socket); - result.m_timeout.tv_sec = to; - } - - return result; -} - -#define NEXT_STATE timeSliceResult result; result.m_runImmediately = true; return result; - -runnable::timeSliceResult protocol_RTMPClient::state_SendS0() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_outDataPtr = &m_S0; - m_outDataSize = 1; - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_SendS1; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendS1() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_outDataPtr = &m_S1orS2[0]; - m_outDataSize = m_S1orS2.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_WaitForC1; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_WaitForC1() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_inDataBufferAmt = 0; - m_inDataRequested = C1_S1_C2_S2_PACKET_SIZE; - m_state = &protocol_RTMPClient::state_RecvFixedAmt; - m_nextState = &protocol_RTMPClient::state_GotC1; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_GotC1() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_C1ReadTime = TIMEFUNC() - m_serverBaseTime; - m_C1.clear(); - m_C1.insert(m_C1.end(),m_inDataBuffer,m_inDataBuffer + C1_S1_C2_S2_PACKET_SIZE); - m_state = &protocol_RTMPClient::state_SendS2; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendS2() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_S1orS2 = m_C1; - __uint32 t = htonl(m_C1ReadTime); - memcpy(&(m_S1orS2[4]),&t,4); - m_outDataPtr = &m_S1orS2[0]; - m_outDataSize = m_S1orS2.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_WaitForC2; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_WaitForC2() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_inDataBufferAmt = 0; - m_inDataRequested = C1_S1_C2_S2_PACKET_SIZE; - m_state = &protocol_RTMPClient::state_RecvFixedAmt; - m_nextState = &protocol_RTMPClient::state_GotC2; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_GotC2() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_C2.clear(); - m_C2.insert(m_C2.end(),m_inDataBuffer,m_inDataBuffer + C1_S1_C2_S2_PACKET_SIZE); - m_state = &protocol_RTMPClient::state_WaitForMessage; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_WaitForMessage() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_inDataBufferAmt = 0; - m_state = &protocol_RTMPClient::state_RecvMsg; - m_nextState = &protocol_RTMPClient::state_GotMessage; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_GotMessage() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - switch(m_inMsg.m_messageType) - { - case RTMP_MSG__USER_CONTROL_MESSAGE: - return handle_USER_CONTROL_message(); - - case RTMP_MSG__WINDOW_ACKNOWLEDGEMENT_SIZE: - { - if (m_inMsg.m_messageData.size() != 4) - throwEx<runtime_error>(m_clientLogString + " Bad payload size for Window Acknowledgement message, got " + tos(m_inMsg.m_messageData.size()) + " expected 4."); - m_windowSizeFromClient = decode4ByteValue(&(m_inMsg.m_messageData[0]),0); - - DEBUG_LOG(m_clientLogString + " WAS from client is " + tos(m_windowSizeFromClient)); - m_state = &protocol_RTMPClient::state_WaitForMessage; - NEXT_STATE - } - break; - - case RTMP_MSG__COMMAND_AMF0: - return handle_AMF0_message(); - - default: - throwEx<runtime_error>(m_clientLogString + " " + __FUNCTION__ + " cannot dispatch message type " + tos((int)m_inMsg.m_messageType)); - } - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_USER_CONTROL_message() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - if (m_inMsg.m_messageData.size() < 2) - throwEx<runtime_error>(m_clientLogString + " User control message has insufficient data."); - - __uint16 t = ntohs(*(const __uint16 *)(&m_inMsg.m_messageData[0])); - switch(t) - { - case RTMP_UCM_SET_BUFFER: - { - if (m_inMsg.m_messageData.size() < 10) - throwEx<runtime_error>(m_clientLogString + " Set Buffer user control message has insufficient data."); - m_bufferSizeFromClient = ntohl(*(const __uint32*)&(m_inMsg.m_messageData[6])); - DEBUG_LOG(m_clientLogString + " Buffer size from client is " + tos(m_bufferSizeFromClient) + " milliseconds."); - m_state = &protocol_RTMPClient::state_WaitForMessage; - NEXT_STATE - } - break; - - case RTMP_UCM_STREAM_BEGIN: - //return handle_UCM_StreamBegin(); - break; - } - - throwEx<runtime_error>(m_clientLogString + " User control message type " + tos(t) + " is not supported."); - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_UCM_StreamBegin() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_AMF0_message() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - AMFEncoding amf; - amf.loadFromBitstream((const char *)&(m_inMsg.m_messageData[0]),(int)m_inMsg.m_messageData.size(),m_clientLogString); - const AMFVal &v0 = amf.getValue(0); - if (v0.getString() == "connect") - return handle_AMF0_connect(amf); - if (v0.getString() == "createStream") - return handle_AMF0_createStream(amf); - if (v0.getString() == "play") - return handle_AMF0_play(amf); - - throwEx<runtime_error>(m_clientLogString + " " + __FUNCTION__ + " Unknown AMF0 message " + v0.getString()); - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_AMF0_connect(const AMFEncoding &amf) throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - -// const AMFVal &v0 = amf.getValue(0); - const AMFVal &v1 = amf.getValue(1); - const AMFVal &v2 = amf.getValue(2); - - if (v1.getNumber() != 1) - throwEx<runtime_error>(m_clientLogString + " Unexpected transaction number. Wanted 1, got " + tos(v1.getNumber())); - const AMFObject &o = v2.getObject(); - - const AMFVal *pv = o.getProperty("tcUrl"); - if (!pv) throwEx<runtime_error>(m_clientLogString + " Connect command has no tcUrl value."); - utf8 url = pv->getString(); // use this value to create stream accessor - - pv = o.getProperty("objectEncoding"); - m_objectEncodingMode = (pv ? (int)pv->getNumber() : 0); - - m_state = &protocol_RTMPClient::state_SendConnectResponse; - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_AMF0_createStream(const AMFEncoding &amf) throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - -// const AMFVal &v0 = amf.getValue(0); - const AMFVal &v1 = amf.getValue(1); - - double transaction = v1.getNumber(); - - AMFEncoding amf0; - AMFObject obj; - amf0.appendValue(AMFVal(utf8("_result"))); // or "_error" - amf0.appendValue(AMFVal((double)transaction)); - amf0.appendValue(AMFVal()); - amf0.appendValue(AMFVal((double)1)); //1234)); /// stream ID for client - - vector<__uint8> resp; - amf0.serialize(resp,m_clientLogString); - message msg(m_inMsg); - msg.m_messageData = resp; - msg.m_messageType = RTMP_MSG__COMMAND_AMF0; - createRTMPMsg(msg,TIMEFUNC() - m_serverBaseTime,(int)m_outboundChunkSize,m_outDataBuffer); - //createRTMPMsg(RTMP_MSG__COMMAND_AMF0,m_outboundChunkSize,&(resp[0]),resp.size(),m_outDataBuffer); - - m_outDataPtr = &m_outDataBuffer[0]; - m_outDataSize = m_outDataBuffer.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_WaitForMessage; - - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::handle_AMF0_play(const AMFEncoding &amf) throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - AMFEncoding amf0; - amf0.appendValue(AMFVal(utf8("onStatus"))); // or "_error" - amf0.appendValue(AMFVal(utf8("NetStream.Play.Start"))); - - vector<__uint8> resp; - amf0.serialize(resp,m_clientLogString); - long ttt = TIMEFUNC(); - - createRTMPMsg(RTMP_MSG__COMMAND_AMF0,ttt - m_serverBaseTime,(int)m_outboundChunkSize,&(resp[0]),resp.size(),m_outDataBuffer,m_inMsg.m_chunkStreamID,m_inMsg.m_messageStreamID); - - amf0.clear(); - amf0.appendValue(AMFVal(utf8("onHeaderData"))); - AMFEMCAArray amfA; - amfA.addProperty("protocol",new AMFVal(utf8("ICY"))); - amfA.addProperty("content-type",new AMFVal(utf8("audio/aacp"))); - amf0.appendValue(AMFVal(amfA)); - resp.clear(); - amf0.serialize(resp,m_clientLogString); - createRTMPMsg(RTMP_MSG__DATA_AMF0,ttt - m_serverBaseTime,(int)m_outboundChunkSize,&(resp[0]),resp.size(),m_outDataBuffer,m_inMsg.m_chunkStreamID,m_inMsg.m_messageStreamID); - - m_outDataPtr = &m_outDataBuffer[0]; - m_outDataSize = m_outDataBuffer.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_SendAudio; - - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendConnectResponse() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - m_outDataBuffer.clear(); - - __uint8 data[5]; - - long ttt = TIMEFUNC(); - m_serverBaseTime = ttt; - - (*(__uint32*)data) = htonl(DEFAULT_SERVER_WINDOW); - createRTMPMsg(RTMP_MSG__WINDOW_ACKNOWLEDGEMENT_SIZE,ttt - m_serverBaseTime,(int)m_outboundChunkSize,data,4,m_outDataBuffer); - - data[4] = RTMP_PEER_BANDWIDTH_DYNAMIC; //_SOFT; - createRTMPMsg(RTMP_MSG__SET_PEER_BANDWIDTH,ttt - m_serverBaseTime,(int)m_outboundChunkSize,data,5,m_outDataBuffer); - - __uint8 streamBeginData[6] = {0,0,0,0,0,0}; - - createRTMPMsg(RTMP_MSG__USER_CONTROL_MESSAGE,ttt - m_serverBaseTime,(int)m_outboundChunkSize,streamBeginData,6,m_outDataBuffer); - - __int32 chunkSize = htonl((int)m_outboundChunkSize); - createRTMPMsg(RTMP_MSG__SET_CHUNK_SIZE,ttt - m_serverBaseTime,(int)m_outboundChunkSize,(const __uint8 *)&chunkSize,sizeof(chunkSize),m_outDataBuffer); - - AMFEncoding amf; //(m_objectEncodingMode > 1 ? 3 : 0); - AMFObject obj; - amf.appendValue(AMFVal(utf8("_result"))); // or "_error" - amf.appendValue(AMFVal((double)1.0)); - obj.addProperty("fmsVer",new AMFVal(utf8("FMS/3,5,3,824a"))); //new AMFVal(utf8("sc_serv " + version.first + " " + version.second))); - obj.addProperty("capabilities",new AMFVal((double)127)); //31)); // ???? - obj.addProperty("mode",new AMFVal((double)1)); - amf.appendValue(AMFVal(obj)); - obj.clearProperties(); - obj.addProperty("level",new AMFVal(utf8("status"))); - obj.addProperty("code",new AMFVal(utf8("NetConnection.Connect.Success"))); - obj.addProperty("description",new AMFVal(utf8("Connection succeeded."))); - obj.addProperty("clientid",new AMFVal((double)795525197.0)); - obj.addProperty("objectEncoding",new AMFVal((double)m_objectEncodingMode)); - AMFEMCAArray arry; - arry.addProperty("version",new AMFVal(utf8("FMS/3,5,3,824a"))); - obj.addProperty("data",new AMFVal(arry)); - - amf.appendValue(AMFVal(obj)); - vector<__uint8> resp; - amf.serialize(resp,m_clientLogString); - createRTMPMsg(RTMP_MSG__COMMAND_AMF0,ttt - m_serverBaseTime,(int)m_outboundChunkSize,&(resp[0]),resp.size(),m_outDataBuffer,m_inMsg.m_chunkStreamID,m_inMsg.m_messageStreamID); - - m_outDataPtr = &m_outDataBuffer[0]; - m_outDataSize = m_outDataBuffer.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_WaitForMessage; - //m_nextState = &protocol_RTMPClient::state_SendAudio; - - NEXT_STATE -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendAudio() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - -#ifdef TEST_FILE - __uint8 buffer[1024]; - buffer[0] = 0xaf; //FLV audio header - buffer[1] = 0x01; - - if (::fread(&(buffer[2]),1,1022,fff) != 1022) - throwEx<runtime_error>("Test done!"); - - m_outDataBuffer.clear(); - createRTMPMsg(RTMP_MSG__AUDIO_DATA,TIMEFUNC() - m_serverBaseTime,(int)m_outboundChunkSize,buffer,1024,m_outDataBuffer,m_inMsg.m_chunkStreamID,m_inMsg.m_messageStreamID); - - m_outDataPtr = &m_outDataBuffer[0]; - m_outDataSize = m_outDataBuffer.size(); - m_state = &protocol_RTMPClient::state_Send; - m_nextState = &protocol_RTMPClient::state_SendAudio; - -#endif - NEXT_STATE -} - -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// - -static void encode3ByteValue(long v,__uint8 *data) throw() -{ - data[0] = (v >> 16) & 0xff; - data[1] = (v >> 8) & 0xff; - data[2] = (v & 0xff); -} - -static void encode4ByteValue(long v,__uint8 *data) throw() -{ - data[0] = (v >> 24) & 0xff; - data[1] = (v >> 16) & 0xff; - data[2] = (v >> 8) & 0xff; - data[3] = (v & 0xff); -} - -static void chunkify(int chunkStreamID,int msgStreamID,__uint8 msgTypeID,long timestamp,int outboundChunkSize,const __uint8 *data,size_t dataSize,vector<__uint8> &result) -{ - assert(chunkStreamID >= 2); - - size_t chunkCount = 1; - if (dataSize > 0) - chunkCount = ((dataSize-1) / outboundChunkSize)+1; - assert(chunkCount); - - for(size_t c = 0; c < chunkCount; ++c) - { - __uint8 header[18]; // largest possible header - __uint8 *h = header; - - // size basic header - if (chunkStreamID >=2 && chunkStreamID <= 63) - { - *(h++) = chunkStreamID; - } - else if (chunkStreamID >= 64 && chunkStreamID <= 319) - { - *(h++) = 0; - *(h++) = (chunkStreamID - 64); - } - else - { - h[0] = 1; - h[2] = ((chunkStreamID - 64) / 256); - h[1] = (chunkStreamID - 64 - (h[2] * 256)); - h+= 3; - } - - // fill in format bits and header - if (c) - { - header[0] |= 0xc0; // type 3 - } - else - { - // type zero, full header - encode3ByteValue(timestamp < 0x00ffffff ? timestamp : 0x00ffffff,h); - h += 3; - encode3ByteValue((int)dataSize,h); - h += 3; - *(h++) = msgTypeID; - encode4ByteValue(msgStreamID,h); - h += 4; - if (timestamp >= 0x00ffffff) - { - encode4ByteValue(timestamp,h); - h += 4; - } - } - - // put header into result - result.insert(result.end(),header,h); - - size_t payload_amt = min(dataSize,(size_t)outboundChunkSize); - // put payload into result - result.insert(result.end(),data,data + payload_amt); - dataSize -= payload_amt; - data += payload_amt; - } - - assert(dataSize == 0); -} - -static void createRTMPMsg(__uint8 msgType,long timestamp,int outboundChunkSize,const __uint8 *payload,size_t payloadSize,vector<__uint8> &result, - int chunkStreamID,int msgStreamID) -{ - //chunkify(chunkStreamID,msgStreamID,msgType,TIMEFUNC(),outboundChunkSize,payload,payloadSize,result); - protocol_RTMPClient::message msg; - msg.m_chunkStreamID = chunkStreamID; - msg.m_messageStreamID = msgStreamID; - msg.m_messageType = msgType; - msg.m_messageData.clear(); - msg.m_messageData.insert(msg.m_messageData.end(),payload,payload + payloadSize); - createRTMPMsg(msg,timestamp,outboundChunkSize,result); - - #if 0 - // create a buffer with the message - long t = TIMEFUNC(); - - vector<__uint8> m; - m.resize(11 + payloadSize); - - __uint8 *p = &m[0]; - memset(p,0,11); - (*(__uint32*)p) = htonl(payloadSize); - p[0] = msgType; - (*(__uint32*)(&(p[4]))) = htonl(t); - memmove(&(p[11]),payload,payloadSize); - - // chunkify - chunkify(2 /* chunk stream id */,0 /* msg stream ID */ ,msgType,t,outboundChunkSize,p,11 + payloadSize,result); - #endif -} - -static void createRTMPMsg(const protocol_RTMPClient::message &msg,long timestamp,int outboundChunkSize,vector<__uint8> &result) -{ - utf8 s = prettyPrintMessage(msg); - DEBUG_LOG(" send " + eol() + - "CSID=" + tos(msg.m_chunkStreamID) + eol() + - "MSID=" + tos(msg.m_messageStreamID) + eol() + - "Time=" + tos(timestamp) + eol() + - "MTYPE=" + tos((int)msg.m_messageType) + eol() + - "MLEN=" + tos(msg.m_messageData.size()) + eol() + - s); - chunkify(msg.m_chunkStreamID,msg.m_messageStreamID,msg.m_messageType,timestamp,outboundChunkSize,&(msg.m_messageData[0]),msg.m_messageData.size(),result); -} - -///////////////////////////////////////////////////// -///////////////////////////////////////////////////// - -static int decode3ByteValue(const __uint8 *data,size_t offset = 0) throw() -{ - int result = 0; - result += data[offset]; - result <<= 8; - result += data[offset + 1]; - result <<= 8; - result += data[offset + 2]; - return result; -} - -static size_t decode4ByteValue(const __uint8 *data,size_t offset) throw() -{ - size_t result = 0; - result += data[offset]; - result <<= 8; - result += data[offset + 1]; - result <<= 8; - result += data[offset + 2]; - result <<= 8; - result += data[offset + 3]; - return result; -} - -#if 0 -void getRTMPMsgInfo(const vector<__uint8> &msg,__uint8 &msgType,int &payloadLength,long ×tamp,int &streamID,int &payloadOffset) -{ - assert(msg.size() >= 11); - const __uint8 *p = &msg[0]; - msgType = *(p++); - payloadLength = decode3ByteValue(p); - p+=3; - timestamp = decode4ByteValue(p); - p += 4; - streamID = decode3ByteValue(p); - p += 3; - payloadOffset = 11; -} -#endif - -// get chunk type from first byte in basic header -static int chunkType(const __uint8 *basicHeader) throw() -{ - return (((*basicHeader) & 0xc0) >> 6); -} - -static int calculateBasicChunkHeaderSize(const __uint8 *basicHeader) throw() -{ - int b = ((*basicHeader) & 0x3f); - switch(b) - { - case 0: return 2; - case 1: return 3; - } - return 1; -} - -// look at complete basic header and determine how many bytes to expect in -// the chunk header -static int calculateChunkMsgHeaderSize(const __uint8 *basicHeader) throw() -{ - switch(chunkType(basicHeader)) - { - case 0: return 11; - case 1: return 7; - case 2: return 3; - } - return 0; -} - -// calculate the complete size of a chunk header -static int calculateCompleteChunkHeaderSize(const __uint8 *basicHeader) throw() -{ - return calculateChunkMsgHeaderSize(basicHeader) + calculateBasicChunkHeaderSize(basicHeader); -} - -// look at a complete chunk header (basic and msg header) and see if we need to get -// an extended timestamp for the chunk -static bool chunkNeedsExtendedTimestamp(const __uint8 *basicHeader) throw() -{ - int f = chunkType(basicHeader); - if (f == 3) return false; - int s = calculateBasicChunkHeaderSize(basicHeader); - // timestamp is always just after the basic header - return ((basicHeader[s] == 0xff) && (basicHeader[s+1] == 0xff) && (basicHeader[s+2] == 0xff)); -} - -// get chunkstream ID from the basic header -static int getChunkStreamIDFromBasicHeader(const __uint8 *basicHeader) throw() -{ - int b = ((*basicHeader) & 0x3f); - switch(b) - { - case 0: return (basicHeader[1] + 64); - case 1: return (basicHeader[2] * 256 + basicHeader[1] + 64); - } - return b; -} - -static int calculateMessageSize(const __uint8 *basicHeader) throw() -{ - if (chunkType(basicHeader) <= 1) - { - int s = calculateBasicChunkHeaderSize(basicHeader); - return decode3ByteValue(basicHeader + s + 3); - } - return -1; -} - -static int calculateMessageTypeID(const __uint8 *basicHeader) throw() -{ - if (chunkType(basicHeader) <= 1) - { - int s = calculateBasicChunkHeaderSize(basicHeader); - return basicHeader[s + 6]; - } - return -1; -} - -static int calculateMessageStreamID(const __uint8 *basicHeader) throw() -{ - if (chunkType(basicHeader) == 0) - { - int s = calculateBasicChunkHeaderSize(basicHeader); - return decode3ByteValue(basicHeader + s + 7); - } - return -1; -} - -static long calculateTimestamp(const __uint8 *basicHeader) throw() -{ - return (chunkType(basicHeader) < 3 ? decode3ByteValue(basicHeader + calculateBasicChunkHeaderSize(basicHeader)) : 0); -} - -// looks in inBuffer for a complete message. If it finds one it fills in msg and returns true. -// whether true or false, data from head of inBuffer should be removed based on amtToRemoveFromInBuffer -bool protocol_RTMPClient::chunkSequenceComplete(const __uint8 *inBuffer,size_t amtInBuffer,size_t &amtToRemoveFromInBuffer,size_t expectedChunkSize, - vector<__uint8> &msg,__uint8 &msgType,int &chunkStreamID,int &messageStreamID,const uniString::utf8 &logMsgPrefix) throw(std::exception) -{ - bool result = false; - msg.clear(); - amtToRemoveFromInBuffer = 0; - - // walk through chunks - const __uint8 *pBegin = inBuffer; - const __uint8 *pEnd = inBuffer + amtInBuffer; - const __uint8 *p = inBuffer; - - chunkStreamID = -1; - messageStreamID = -1; - int messageLength = -1; - int messageTypeID = -1; - int payloadDataSeen = 0; - int chunksConsolidated = 0; // for debugging - while(p != pEnd) - { - chunksConsolidated += 1; - - // do all calculations necessary to see if we have a complete chunk - int tmp; - - int hs = calculateCompleteChunkHeaderSize(p); - if ((p + hs) > pEnd) break; // not enough data - if (chunkNeedsExtendedTimestamp(p)) - hs += 4; - if ((p + hs) > pEnd) break; // not enough data - - // calculate timestamp - long tt = calculateTimestamp(p); - switch(chunkType(p)) - { - case 0: - m_lastInboundTimestamp = tt; - break; - - case 1: case 2: - m_lastInboundTimestamp += tt; - break; - } - - // gather and confirm chunk stream id - tmp = getChunkStreamIDFromBasicHeader(p); - if (chunkStreamID == -1) - chunkStreamID = tmp; - else if (chunkStreamID != tmp) - throwEx<runtime_error>(logMsgPrefix + " expected chunk stream ID " + tos(chunkStreamID) + " but got " + tos(tmp) + " instead."); - - // gather and confirm message length for this chunk sequence - tmp = calculateMessageSize(p); - if ((tmp == -1) && (m_lastInboundMessageLength == -1)) throwEx<runtime_error>(logMsgPrefix + " No message length for chunk with chunk stream ID " + tos(chunkStreamID)); - if ((tmp != -1) && (messageLength != -1) && (tmp != messageLength)) throwEx<runtime_error>(logMsgPrefix + " mismatch message length for chunk with chunk stream ID " + tos(chunkStreamID) + " initially got " + tos(messageLength) + " then received " + tos(tmp)); - if (tmp != -1) - m_lastInboundMessageLength = messageLength = tmp; - - tmp = calculateMessageTypeID(p); - if ((tmp == -1) && (m_lastInboundMessageTypeID == -1)) throwEx<runtime_error>(logMsgPrefix + " No message type ID for chunk with chunk stream ID " + tos(chunkStreamID)); - if ((tmp != -1) && (messageTypeID != -1) && (tmp != messageTypeID)) throwEx<runtime_error>(logMsgPrefix + " mismatch message type ID for chunk with chunk stream ID " + tos(chunkStreamID) + " initially got " + tos(messageTypeID) + " then received " + tos(tmp)); - if (tmp != -1) - m_lastInboundMessageTypeID = messageTypeID = tmp; - - tmp = calculateMessageStreamID(p); - if ((tmp == -1) && (m_lastInboundMessageStreamID == -1)) throwEx<runtime_error>(logMsgPrefix + " No message stream ID for chunk with chunk stream ID " + tos(chunkStreamID)); - if ((tmp != -1) && (messageStreamID != -1) && (tmp != messageStreamID)) throwEx<runtime_error>(logMsgPrefix + " mismatch message stream ID for chunk with stream ID " + tos(chunkStreamID) + " initially got " + tos(messageStreamID) + " then received " + tos(tmp)); - if (tmp != -1) - m_lastInboundMessageStreamID = messageStreamID = tmp; - - // calculate data that should be in this chunk - tmp = m_lastInboundMessageLength - payloadDataSeen; - tmp = min(tmp,(int)expectedChunkSize); - - // see if we have enough - if ((p + hs + tmp) > pEnd) - break; // nope - - // yeah we do. Copy out data - msg.insert(msg.end(),p+hs,p+hs+tmp); - payloadDataSeen += tmp; - p = p + hs + tmp; - - // are we all done? - if (payloadDataSeen == m_lastInboundMessageLength) - { - // yes - amtToRemoveFromInBuffer = p - pBegin; - DEBUG_LOG(logMsgPrefix + " recv" + stringUtil::eol() + - " CSID=" + tos(chunkStreamID) + stringUtil::eol() + - " MSID=" + tos(m_lastInboundMessageStreamID) + stringUtil::eol() + - " Time=" + tos(m_lastInboundTimestamp) + stringUtil::eol() + - " MTYPE=" + tos(m_lastInboundMessageTypeID) + stringUtil::eol() + - " LEN=" + tos(m_lastInboundMessageLength) + stringUtil::eol() + - " REMOVED=" + tos(amtToRemoveFromInBuffer)); - - msgType = m_lastInboundMessageTypeID; - messageStreamID = m_lastInboundMessageStreamID; - return true; - } - } - - return result; -} - -// return zero if get a msg, otherwise return timeout for read -long protocol_RTMPClient::getMsg(message &msg) throw(exception) -{ - size_t amt_left = m_inDataBufferMax - m_inDataBufferAmt; - size_t amt_left2 = amt_left; - - long to = getSocketData(m_socket,m_inDataBuffer,m_inDataBufferAmt,amt_left,m_lastActivityTime,m_clientLogString); - m_inDataBufferAmt += (amt_left2 - amt_left); - - size_t amtToRemoveFromInBuffer = 0; - - bool seqComplete = chunkSequenceComplete(m_inDataBuffer,m_inDataBufferAmt,amtToRemoveFromInBuffer,m_inboundChunkSize,msg.m_messageData,msg.m_messageType,msg.m_chunkStreamID,msg.m_messageStreamID,m_clientLogString); - if (amtToRemoveFromInBuffer) - { - assert(m_inDataBufferAmt >= amtToRemoveFromInBuffer); - if (m_inDataBufferAmt == amtToRemoveFromInBuffer) - { - m_inDataBufferAmt = 0; - #ifndef NDEBUG - memset(m_inDataBuffer,0,m_inDataBufferMax); - #endif - } - else - { - memmove(m_inDataBuffer,m_inDataBuffer + amtToRemoveFromInBuffer,m_inDataBufferAmt - amtToRemoveFromInBuffer); - m_inDataBufferAmt -= amtToRemoveFromInBuffer; - #ifndef NDEBUG - memset(m_inDataBuffer + m_inDataBufferAmt,0,m_inDataBufferMax - m_inDataBufferAmt); - #endif - } - } - if (seqComplete) - { - to = 0; - } - else - { - if (m_inDataBufferAmt == m_inDataBufferMax) - throwEx<runtime_error>(m_clientLogString + " inbound data buffer exceeded"); - assert(to != 0); // ??? not sure - if (to == 0) - to = 1; - } - - return to; -} - -///////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// - -runnable::timeSliceResult protocol_RTMPClient::state_Close() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - timeSliceResult result; - result.m_done = true; - return result; -} - -void protocol_RTMPClient::logW3C() throw() -{ -} - -#if 0 -///////////////////////////////////// W3C Logging ////////////////////////////////////////////// - -static utf8 titleFromMetadata(const utf8 &md) throw() -{ - utf8 title; - - utf8::size_type p1 = utf8::npos; - utf8::size_type p2 = utf8::npos; - - p1 = md.find(utf8("itle='")); - if (p1 != utf8::npos) - { - p1 += 6; - p2 = md.find(utf8("';"),p1); - if (p2 != utf8::npos) - { - title = md.substr(p1,p2-p1); - } - } - return title; -} - -// create W3C entry. Entries describe the duration a client has listened to a specific title. -// the entry is generated on a title change, or when the client disconnects -void protocol_RTMPClient::logW3C() throw() -{ - if (gOptions.w3cEnable()) - { - time_t t(::time(0)); - time_t durationOfTitle = t - m_lastTitleTime; - int bitrateOfTitle = (int)(durationOfTitle ? (8 * m_bytesSentForCurrentTitle) / durationOfTitle : 0); - utf8 title = titleFromMetadata(m_lastSentMetadata); - - w3cLog::log(m_clientAddr, - m_clientHostName, - m_streamID, - title, - mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8("")), - m_bytesSentForCurrentTitle, - durationOfTitle, - bitrateOfTitle); - - setW3CState(); - } -} - -// setup tracking variables for W3C log -void protocol_RTMPClient::setW3CState() throw() -{ - m_lastTitleTime = ::time(0); - m_bytesSentForCurrentTitle = 0; -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_RTMPClient::aquireIntroFile() throw() -{ - m_streamData->getIntroFile().getSc1Data(m_introFile); - m_introFileOffset = 0; -} - -void protocol_RTMPClient::aquireBackupFile() throw() -{ - m_streamData->getBackupFile().getSc1Data(m_backupFile); - m_backupFileOffset = 0; -} - -runnable::timeSliceResult protocol_RTMPClient::state_SendText() throw(exception) -{ - //DLOG(__FUNCTION__); - - timeSliceResult result; - long to = sendHTTPStyleText(m_socket,m_outBuffer,m_outBufferSize,m_lastActivityTime,m_clientLogString); - if (to == 0) - { // sent - m_state = m_nextState; - result.m_runImmediately = true; - } - else - { // try again - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = to; - } - return result; -} - -runnable::timeSliceResult protocol_RTMPClient::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - timeSliceResult result; - - assert(!m_streamData); - - m_streamID = DEFAULT_CLIENT_STREAM_ID; - utf8::size_type pos = m_HTTPRequestInfo.m_url.find(utf8("/stream/")); - if (pos != utf8::npos) - m_streamID = atoi((const char *)m_HTTPRequestInfo.m_url.substr(pos + 8).c_str()); - - map<int,config::streamConfig> stream_configs = gOptions.getStreamConfigs(); - for(map<int,config::streamConfig>::const_iterator i = stream_configs.begin(); i != stream_configs.end(); ++i) - { - if ((*i).second.m_urlPath == m_HTTPRequestInfo.m_url) - { - m_streamID = (*i).first; - break; - } - - pos = m_HTTPRequestInfo.m_url.find((*i).second.m_urlPath); - if (pos != utf8::npos && pos == 0) - { - utf8 params = m_HTTPRequestInfo.m_url.substr(pos + (*i).second.m_urlPath.size()); - if(params.find(utf8(";")) == 0 || params.find(utf8("/")) == 0 || params.find(utf8("/;")) == 0) - { - m_streamID = (*i).first; - break; - } - } - } - - m_clientLogString = dstAddrLogString(m_clientHostName,m_clientPort,m_streamID); - - utf8 user_agent = toLower(mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - - bool isSourceActive = false; - m_streamData = streamData::accessStream(m_streamID,isSourceActive); - if (!m_streamData || !isSourceActive) - { - utf8 msg_icy401 = MSG_ICY401; - msg_icy401.replace(msg_icy401.find(utf8("^")),1,gOptions.getVersionBuildStrings()); - m_outBuffer = msg_icy401.c_str(); - m_outBufferSize = strlen(m_outBuffer); - - m_state = &protocol_RTMPClient::state_SendText; - m_nextState = &protocol_RTMPClient::state_Close; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = gOptions.getAutoDumpSourceTime(); - ELOG(m_clientLogString + " SHOUTcast 1 client connection rejected. Stream not available. " + mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - } - else - { - // construct the response text - if (!stats::addClient(m_streamID,this,m_clientAddr,m_clientPort,mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8("")),g_ripList.find(m_clientAddr))) - { - utf8 backup_server = m_streamData->streamBackupServer(); - if (backup_server.empty()) - { - utf8 msg_icy503 = MSG_ICY503; - msg_icy503.replace(msg_icy503.find(utf8("^")),1,gOptions.getVersionBuildStrings()); - m_outBuffer = msg_icy503.c_str(); - m_outBufferSize = strlen(m_outBuffer); - - ELOG(m_clientLogString + " SHOUTcast 1 client connection rejected. Max users reached. " + mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - } - else - { - m_redirectResponse = http302(backup_server); - m_outBuffer = m_redirectResponse.c_str(); - m_outBufferSize = m_redirectResponse.size(); - WLOG(m_clientLogString + " SHOUTcast 1 client connection rejected. Max users reached. Redirecting to " + backup_server + ". " + mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - } - m_state = &protocol_RTMPClient::state_SendText; - m_nextState = &protocol_RTMPClient::state_Close; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = gOptions.getAutoDumpSourceTime(); - } - else - { - m_removeClientFromStats = true; - m_sendMetadata = mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"icy-metadata",false); - - m_metaInterval = gOptions.metaInterval(); - if (m_metaInterval < 256) m_metaInterval = 256; // clamp - - m_ICYOKResponse = MSG_ICY200; - m_ICYOKResponse += "icy-name:" + m_streamData->streamName() + "\r\n"; - m_ICYOKResponse += "icy-genre:" + m_streamData->streamGenre() + "\r\n"; - m_ICYOKResponse += "icy-url:" + m_streamData->streamURL() + "\r\n"; - m_ICYOKResponse += "content-type:" + m_streamData->streamContentType() + "\r\n"; - - if (isUserAgentRelay(user_agent) && (!m_streamData->allowPublicRelay())) - m_ICYOKResponse += "icy-pub:0\r\n"; - else - m_ICYOKResponse += "icy-pub:" + tos(m_streamData->streamPublic()) + "\r\n"; - if (m_sendMetadata) - m_ICYOKResponse += "icy-metaint:" + tos(m_metaInterval) + "\r\n"; - m_ICYOKResponse += "icy-br:" + m_streamData->streamName() + "\r\n"; - m_ICYOKResponse += "\r\n"; - - DEBUG_LOG(m_clientLogString + " sending [" + m_ICYOKResponse + "]"); - m_outBuffer = m_ICYOKResponse.c_str(); - m_outBufferSize = strlen(m_outBuffer); - m_state = &protocol_RTMPClient::state_SendText; - m_nextState = &protocol_RTMPClient::state_InitiateStream; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = gOptions.getAutoDumpSourceTime(); - ILOG(m_clientLogString + " SHOUTcast 1 client connection accepted. " + mapGet(m_HTTPRequestInfo.m_HTTPHeaders,"user-agent",utf8(""))); - } - } - - return result; - } - -// set read pointer to a nice distance from the write pointer. Return that distance -streamData::ringBufferAccess_t protocol_RTMPClient::resetReadPtr() throw() -{ - m_readPtr = m_streamData->getSc1ClientStartPosition(); - return m_streamData->getSc1RingBuffer().m_writePtr - m_readPtr; -} - -runnable::timeSliceResult protocol_RTMPClient::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(__FUNCTION__); - - assert(m_streamData); - - m_metaIntervalCounter = 0; - resetReadPtr(); - - m_underruns = 0; - - // if we have an intro file send it, otherwise start streaming - aquireIntroFile(); - - m_state = (m_introFile.empty() ? &protocol_RTMPClient::state_Stream : &protocol_RTMPClient::state_SendIntroFile); - - setW3CState(); - - timeSliceResult result; - result.m_runImmediately = true; - return result; -} - -// construct the necessary metadata information and load into outbound buffers. -void protocol_RTMPClient::sendICYMetadata(const utf8 &md) throw() -{ - m_ICYMetadata.clear(); - m_ICYMetadata.push_back(1); // placeholder - if (md != m_lastSentMetadata) // don't sent duplicates - { - m_ICYMetadata.insert(m_ICYMetadata.end(),md.begin(),md.end()); - if (!m_lastSentMetadata.empty()) - logW3C(); - m_lastSentMetadata = md; - } - unsigned int dlen = m_ICYMetadata.size(); - if (dlen == 1) dlen = 0; - unsigned int l1=((dlen+15)&~15); - m_ICYMetadata[0] = l1/16; - unsigned int send_len = l1+1; - m_ICYMetadata.insert(m_ICYMetadata.end(),send_len - m_ICYMetadata.size(),0); - assert(m_ICYMetadata.size() == ((m_ICYMetadata[0] * 16)+1)); - m_metaIntervalCounter = 0; - - m_outBuffer = &m_ICYMetadata[0]; - m_outBufferSize = m_ICYMetadata.size(); - m_state = &protocol_RTMPClient::state_SendText; -} - -// handle state where we are sending intro files -runnable::timeSliceResult protocol_RTMPClient::state_SendIntroFile() throw(exception) -{ - assert(m_streamData); - assert(!m_introFile.empty()); - - timeSliceResult result; - - int autoDumpTime = gOptions.getAutoDumpSourceTime(); // don't want this value to change during this call - - m_limitTrigger.clear(); - - size_t amt = m_introFile.size() - m_introFileOffset; - - if (amt == 0) - { - // we're done with the intro file - m_introFile.clear(); - m_state = &protocol_RTMPClient::state_Stream; - resetReadPtr(); - result.m_runImmediately = true; - } - else if ((m_metaIntervalCounter == m_metaInterval) && m_sendMetadata) // check to see if we have to send the metadata - { - sendICYMetadata("StreamTitle='';"); - - m_nextState = &protocol_RTMPClient::state_SendIntroFile; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - else - { - // clamp amount to send if we are supporting metadata - if (m_sendMetadata) - { - amt = min(amt,(m_metaInterval - m_metaIntervalCounter)); - } - - // send - time_t cur_time = ::time(0); - if (autoDumpTime > 0 && (cur_time - m_lastActivityTime) >= autoDumpTime) - throwEx<runtime_error>(m_clientLogString + " Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + tos(cur_time - m_lastActivityTime) + "] )"); - - if (!amt) - { - // nothing in the source - result.m_runImmediately = true; - } - else - { - int rval = ::send(m_socket,(const char *)&(m_introFile[m_introFileOffset]),amt,0); - if (rval == 0) - { - throwEx<runtime_error>(m_clientLogString + " Remote socket closed while sending data."); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - throwEx<runtime_error>((( - #ifdef _WIN32 - rval == WSAECONNABORTED || rval == WSAECONNRESET - #else - rval == ECONNABORTED || rval == ECONNRESET || rval == EPIPE - #endif - ) ? uniString::utf8("") : m_clientLogString + "Socket error while waiting to send data. " + socketErrString(rval))); - result.m_timeout.tv_sec = (long)(autoDumpTime - (cur_time - m_lastActivityTime)); - result.m_writeSet.insert(m_socket); - } - else - { - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - m_introFileOffset += rval; - assert((!m_sendMetadata) || (m_metaIntervalCounter <= m_metaInterval)); - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - } - } - return result; -} - -// handle state where we are sending backup files -runnable::timeSliceResult protocol_RTMPClient::state_SendBackupFile() throw(exception) -{ - assert(m_streamData); - assert(!m_backupFile.empty()); - - timeSliceResult result; - - int autoDumpTime = gOptions.getAutoDumpSourceTime(); // don't want this value to change during this call - - m_limitTrigger.clear(); - - size_t amt = m_backupFile.size() - m_backupFileOffset; - - if (streamData::isSourceConnected(m_streamData)) - { - // we're done with the backup file - m_backupFile.clear(); - resetReadPtr(); - m_state = &protocol_RTMPClient::state_Stream; - - result.m_runImmediately = true; - } - else if (amt == 0) - { - // we're done with the backup file. get more data - aquireBackupFile(); - if (m_backupFile.empty()) - { // it got cleared out from under us? Try and stream - resetReadPtr(); - m_state = &protocol_RTMPClient::state_Stream; - } - - result.m_runImmediately = true; - } - else if ((m_metaIntervalCounter == m_metaInterval) && m_sendMetadata) // check to see if we have to send the metadata - { - sendICYMetadata("StreamTitle='';"); - - m_nextState = &protocol_RTMPClient::state_SendBackupFile; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - else - { - // clamp amount to send if we are supporting metadata - if (m_sendMetadata) - { - amt = min(amt,(m_metaInterval - m_metaIntervalCounter)); - } - - // send - time_t cur_time = ::time(0); - if (autoDumpTime > 0 && (cur_time - m_lastActivityTime) >= autoDumpTime) - throwEx<runtime_error>(m_clientLogString + " Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + tos(cur_time - m_lastActivityTime) + "] )"); - - if (!amt) - { - // nothing in the source - result.m_runImmediately = true; - } - else - { - int rval = ::send(m_socket,(const char *)&(m_backupFile[m_backupFileOffset]),amt,0); - if (rval == 0) - { - throwEx<runtime_error>(m_clientLogString + " Remote socket closed while sending data."); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - throwEx<runtime_error>((( - #ifdef _WIN32 - rval == WSAECONNABORTED || rval == WSAECONNRESET - #else - rval == ECONNABORTED || rval == ECONNRESET || rval == EPIPE - #endif - ) ? uniString::utf8("") : m_clientLogString + "Socket error while waiting to send data. " + socketErrString(rval))); - result.m_timeout.tv_sec = (long)(autoDumpTime - (cur_time - m_lastActivityTime)); - result.m_writeSet.insert(m_socket); - } - else - { - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - m_backupFileOffset += rval; - assert((!m_sendMetadata) || (m_metaIntervalCounter <= m_metaInterval)); - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - } - } - return result; -} - -runnable::timeSliceResult protocol_RTMPClient::state_Stream() throw(exception) -{ - assert(m_streamData); - - timeSliceResult result; - - int autoDumpTime = gOptions.getAutoDumpSourceTime(); // don't want this value to change during this call - - m_limitTrigger.clear(); - - // check to see if we have to send the metadata - if ((m_metaIntervalCounter == m_metaInterval) && m_sendMetadata) - { - // send metadata - sendICYMetadata(m_streamData->getSc1Metadata(m_readPtr).m_songTitle); - - m_nextState = &protocol_RTMPClient::state_Stream; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - else - { - streamData::ringBuffer_t rb = m_streamData->getSc1RingBuffer(); - - streamData::ringBufferAccess_t amt = rb.m_writePtr - m_readPtr; - if (amt > rb.m_bufferSize) - { - // the pointers are too far apart. Underrun - m_underruns += 1; - amt = resetReadPtr(); - } - - // clamp amount to send if we are supporting metadata - if (m_sendMetadata) - { - amt = min(amt,(streamData::ringBufferAccess_t)(m_metaInterval - m_metaIntervalCounter)); - } - - streamData::ringBufferAccess_t offset = m_readPtr & rb.m_ptrMask; - // clamp again so we don't read passed end of buffer - amt = min(amt,rb.m_bufferSize - offset); - - // send - time_t cur_time = ::time(0); - if (autoDumpTime > 0 && (cur_time - m_lastActivityTime) >= autoDumpTime) - throwEx<runtime_error>(m_clientLogString + " Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + tos(cur_time - m_lastActivityTime) + "] )"); - - if (!amt) - { - // nothing in the source - // If the source has gone away, and we have a backup file, send it. - bool sendBackupFile = false; - - if (!streamData::isSourceConnected(m_streamData)) - { - aquireBackupFile(); - sendBackupFile = !m_backupFile.empty(); - } - if (sendBackupFile) - { - m_state = &protocol_RTMPClient::state_SendBackupFile; - result.m_runImmediately = true; - } - else - { - result.m_timeout.tv_sec = (long)(autoDumpTime - (cur_time - m_lastActivityTime)); - m_limitTrigger.clear(); - result.m_readSet.insert(m_limitTrigger.test()); - m_streamData->scheduleSc1LimitTrigger(&m_limitTrigger,m_readPtr); - } - } - else - { - int rval = ::send(m_socket,(const char *)&(rb.m_data[offset]),amt,0); - if (rval == 0) - { - throwEx<runtime_error>(m_clientLogString + " Remote socket closed while sending data."); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - throwEx<runtime_error>((( - #ifdef _WIN32 - rval == WSAECONNABORTED || rval == WSAECONNRESET - #else - rval == ECONNABORTED || rval == ECONNRESET || rval == EPIPE - #endif - ) ? uniString::utf8("") : m_clientLogString + "Socket error while waiting to send data. " + socketErrString(rval))); - result.m_timeout.tv_sec = (long)(autoDumpTime - (cur_time - m_lastActivityTime)); - result.m_writeSet.insert(m_socket); - } - else - { - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - assert((!m_sendMetadata) || (m_metaIntervalCounter <= m_metaInterval)); - m_readPtr += rval; - result.m_writeSet.insert(m_socket); - result.m_timeout.tv_sec = autoDumpTime; - } - } - } - return result; -} - -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.h b/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.h deleted file mode 100644 index 457bab95..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_RTMPClient.h +++ /dev/null @@ -1,170 +0,0 @@ -#pragma once -#if 0 -#ifndef protocol_RTMPClient_H_ -#define protocol_RTMPClient_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include <map> -#include <vector> - -class streamData; - -class AMFEncoding; - -class protocol_RTMPClient: public runnable, public clientProtocol -{ -public: - class message - { - public: - int m_chunkStreamID; - int m_messageStreamID; - __uint8 m_messageType; - std::vector<__uint8> m_messageData; - - void clear() throw() { m_messageData.clear(); } - uniString::utf8 packetDump() const throw(); - }; - -private: - // the limit trigger is used when the client readPtr butts up against the write ptr. - // In this case we can't select against the socket, because it will always be ready and we'll - // end up in a CPU intenstive spin loop. Instead, we create a signal and give it to the streamData - // object with the value of our readPtr. The streamData object will signal the trigger when there - // is data available - pipeDrivenSignal<AOL_namespace::mutex> m_limitTrigger; - - socketOps::tSOCKET m_socket; - const uniString::utf8 m_clientHostName; - const uniString::utf8 m_clientAddr; - const int m_clientPort; - uniString::utf8 m_clientLogString; - const __uint8 m_C0; // C0 packet sent from client. Has version number - const __uint8 m_S0; // my response - std::vector<__uint8> m_C1; // C1 packet from client - std::vector<__uint8> m_C2; // C2 packet from client - std::vector<__uint8> m_S1orS2; // S1 or S2 packet from me - - __uint8 *m_inDataBuffer; - size_t m_inDataBufferMax; // max allocated - size_t m_inDataBufferAmt; // amt in buffer - size_t m_inDataRequested; // amt we want to read for a fixed read (C1 or C2) - message m_inMsg; - - const __uint8 *m_outDataPtr; // for outgoing text lines - size_t m_outDataSize; - std::vector<__uint8> m_outDataBuffer; - - __uint32 m_serverBaseTime; // for RTMP protocol - __uint32 m_C1ReadTime; - - time_t m_lastActivityTime; - - time_t m_startTime; // when connection started, used to implement listenerTime - - // inbound state - size_t m_inboundChunkSize; - int m_lastInboundMessageStreamID; - int m_lastInboundMessageLength; - int m_lastInboundMessageTypeID; - long m_lastInboundTimestamp; - size_t m_windowSizeFromClient; - int m_bufferSizeFromClient; - - // outbound state - size_t m_outboundChunkSize; - - long getMsg(message &msg) throw(std::exception); - - //// stats for w3c logs - time_t m_lastTitleTime; // time of last title update used for w3c logs - __uint64 m_bytesSentForCurrentTitle; // bytes sent since last title change. used for w3c logs - __uint64 m_totalBytesSent; // total bytes sent whilst the connection is open - uniString::utf8 m_lastSentMetadata; // no need to send duplicates. Also used for w3C tracking - - int m_objectEncodingMode; - /////////////////////////// - - ////////// HTTP message buffer for 302 redirect -// uniString::utf8 m_redirectResponse; - ////////////////////////////////////////// - -// const protocol_HTTPStyle::HTTPRequestInfo m_HTTPRequestInfo; // the received request and headers -// uniString::utf8 m_ICYOKResponse; -// std::vector<__uint8> m_ICYMetadata; // metadata buffer - - streamData::streamID_t m_streamID; // stream ID for this connection - - streamData::ringBufferAccess_t m_readPtr; // pointer into ring buffer - int m_underruns; // client too slow - bool m_removeClientFromStats; // do we have to do a stats::removeClient - - bool m_sendMetadata; - size_t m_metaInterval; - size_t m_metaIntervalCounter; // counter for metadata updates - - std::vector<__uint8> m_introFile; - size_t m_introFileOffset; - std::vector<__uint8> m_backupFile; - size_t m_backupFileOffset; - - void aquireIntroFile() throw(); - void aquireBackupFile() throw(); - - streamData::ringBufferAccess_t resetReadPtr() throw(); // return distance between read and write pointer - void sendICYMetadata(const uniString::utf8 &md) throw(); - - void logW3C() throw(); - void setW3CState() throw(); - - typedef runnable::timeSliceResult (protocol_RTMPClient::*state_t)(); // throw(std::exception); - - state_t m_state; - state_t m_nextState; - - streamData *m_streamData; - - bool chunkSequenceComplete(const __uint8 *inBuffer,size_t amtInBuffer,size_t &amtToRemoveFromInBuffer,size_t expectedChunkSize, - std::vector<__uint8> &msg,__uint8 &msgType,int &chunkStreamID,int &messageStreamID,const uniString::utf8 &logMsgPrefix) throw(std::exception); - - runnable::timeSliceResult state_Send() throw(std::exception); - runnable::timeSliceResult state_RecvFixedAmt() throw(std::exception); - runnable::timeSliceResult state_RecvMsg() throw(std::exception); - - runnable::timeSliceResult state_WaitForC1() throw(std::exception); - runnable::timeSliceResult state_GotC1() throw(std::exception); - runnable::timeSliceResult state_WaitForC2() throw(std::exception); - runnable::timeSliceResult state_GotC2() throw(std::exception); - runnable::timeSliceResult state_SendS0() throw(std::exception); - runnable::timeSliceResult state_SendS1() throw(std::exception); - runnable::timeSliceResult state_SendS2() throw(std::exception); - - runnable::timeSliceResult state_WaitForMessage() throw(std::exception); - runnable::timeSliceResult state_GotMessage() throw(std::exception); - - runnable::timeSliceResult state_SendAudio() throw(std::exception); - - runnable::timeSliceResult handle_AMF0_message() throw(std::exception); - runnable::timeSliceResult handle_AMF0_connect(const AMFEncoding &amf) throw(std::exception); - runnable::timeSliceResult handle_AMF0_createStream(const AMFEncoding &amf) throw(std::exception); - runnable::timeSliceResult handle_AMF0_play(const AMFEncoding &amf) throw(std::exception); - - runnable::timeSliceResult handle_USER_CONTROL_message() throw(std::exception); - runnable::timeSliceResult handle_UCM_StreamBegin() throw(std::exception); - - runnable::timeSliceResult state_SendConnectResponse() throw(std::exception); - - runnable::timeSliceResult state_Close() throw(std::exception); - - virtual runnable::timeSliceResult timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_RTMPClient"; } - -public: - protocol_RTMPClient(socketOps::tSOCKET s,const uniString::utf8 &hostName,const uniString::utf8 &addr,int port, - __uint8 C0 /* initial client packet */) throw(std::exception); - virtual ~protocol_RTMPClient() throw(); -}; - -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_admincgi.cpp b/Src/Plugins/DSP/sc_serv3/protocol_admincgi.cpp deleted file mode 100644 index 8b4b9070..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_admincgi.cpp +++ /dev/null @@ -1,6390 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "protocol_shoutcastClient.h" -#include "protocol_admincgi.h" -#include "protocol_HTTPStyle.h" -#include "protocol_relay.h" -#include "base64.h" -#include "banList.h" -#include "ripList.h" -#include "adminList.h" -#include "agentList.h" -#include "uvox2Common.h" -#include "w3cLog.h" -#include "yp2.h" -#include "updater.h" -#include "aolxml/aolxml.h" -#include "webNet/urlUtils.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include "bandwidth.h" -#include "cpucount.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -time_t last_update_check = 0; -utf8 logId, logTailId, listenerId; - -#define DEBUG_LOG(...) do { if (gOptions.httpStyleDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOG_NAME "ADMINCGI" -#define LOGNAME "[" LOG_NAME "] " - -#define HEAD_REQUEST (m_httpRequestInfo.m_request == protocol_HTTPStyle::HTTP_HEAD) -#define SHRINK (m_httpRequestInfo.m_AcceptEncoding & protocol_HTTPStyle::ACCEPT_GZIP) -#define COMPRESS(header, body) if (SHRINK && compressData(body)) header += "Content-Encoding:gzip\r\n" - -static bool sortUniqueClientDataByTime(const stats::uniqueClientData_t &a, const stats::uniqueClientData_t &b) -{ - return (a.m_connectTime < b.m_connectTime); -} - -utf8 getStreamAdminHeader(const streamData::streamID_t sid, const utf8& headerTitle, - const int refreshRequired = 0, const bool style = false) -{ - return "<!DOCTYPE html><html><head>" - "<meta charset=\"utf-8\">" - "<meta name=viewport content=\"width=device-width, initial-scale=1\">" - "<title>Shoutcast Administrator</title>" - "<link href=\"index.css\" rel=\"stylesheet\" type=\"text/css\">" - "<link href=\"images/favicon.ico\" rel=\"shortcut icon\" type=\"" + - gOptions.faviconFileMimeType() + "\">" + (abs(refreshRequired) > 0 ? - "<meta http-equiv=\"refresh\"content=\"3; url=admin.cgi?sid=" + tos(sid) + "\">" : "") + - - (style ? "<style type=\"text/css\">" - "li img{vertical-align:bottom;}li{padding-bottom:0.5em;}" - "</style>" : (utf8)"") + - - "</head><body style=\"margin:0;\">" - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>" - "<td><div class=\"logo\">Shoutcast " + headerTitle + "</div></td>" - "<td style=\"text-align:right;vertical-align:bottom;padding-right:0.1em;\">" - "<div id=\"up\"></div><a target=\"_blank\" title=\"Built: " __DATE__"\" " - "href=\"http://www.shoutcast.com\">Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "</a></td>" - "</tr><tr><td class=\"thr\" align=\"center\" colspan=\"3\"><table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" - "<tr><td class=\"thr\" align=\"center\"><div id=\"hdrbox\" class=\"tnl\" " - "style=\"justify-content:space-around;display:flex;flex-flow:row wrap;\">" - "<div class=\"thr\"><a href=\"admin.cgi?sid=" + tos(sid) + "\">Status & Listeners</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?sid=" + tos(sid) + "&mode=history\">History " - "<img border=\"0\" title=\"History\" alt=\"History\" style=\"vertical-align:middle\" src=\"images/history.png\"></a></div>" - "<div class=\"thr\"> | </div>" - + (!(gOptions.read_stream_adminPassword(sid) && !gOptions.stream_adminPassword(sid).empty()) ? - "<div class=\"thr\"><a href=\"admin.cgi?sid=" + tos(sid) + "&mode=viewlog\">Log</a> " - "(<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=viewlog&viewlog=tail\">Tailing</a>" - " | <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=viewlog&viewlog=save\">Save</a>)</div>" - "<div class=\"thr\"> | </div>" : "") + - /*+ utf8(info.m_radionomyID.empty() ? warningImage(false) + " <b>Please Register Your Authhash</b><br><br>" : "") +*/ - "<div class=\"thr\"><a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Authhash</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?sid=" + tos(sid) + "&mode=viewban\">Ban List</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?sid=" + tos(sid) + "&mode=viewrip\">Reserved List</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?sid=" + tos(sid) + "&mode=viewagent\">User Agent List</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"index.html?sid=" + tos(sid) + "\">Stream Logout</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi\">Server Login " - "<img border=\"0\" title=\"Server Login\nPassword Required\" alt=\"Server Login\nPassword Required" - "\" style=\"vertical-align:middle\" src=\"images/lock.png\"></a></div>" - "</div></td></tr></table></td></tr></table>"; -} - -utf8 getServerAdminHeader(const utf8& headerTitle, const int refreshRequired = 0, - const utf8& childPage = "", const int style = 0) -{ - return "<!DOCTYPE html><html><head>" - "<meta charset=\"utf-8\">" - "<meta name=viewport content=\"width=device-width, initial-scale=1\">" - "<title>Shoutcast Server Administrator</title>" - "<link href=\"index.css\" rel=\"stylesheet\" type=\"text/css\">" - "<link href=\"images/favicon.ico\" rel=\"shortcut icon\" type=\"" + - gOptions.faviconFileMimeType() + "\">" + - - (abs(refreshRequired) > 0 ? "<meta http-equiv=\"refresh\"content=\"" + - tos(abs(refreshRequired)) + "; url=admin.cgi?sid=0" + childPage + "\">" : "") + - - (style ? "<style type=\"text/css\">" + - (style == 1 ? ".s,.t,.st{border-style:solid;border-color:#CCCCCC;padding:0.2em 1em;text-align:center;}" - ".s,.t,.st{border-width:1px;}" - /* this fixes a FF quirk with some of the edges being hidden*/ - ".infh{position:static;}" : - (style == 2 ? "li img{vertical-align:bottom;}li{padding-bottom:0.5em;}" : (utf8)"")) + "</style>" : (utf8)"") + - - "</head><body style=\"margin:0;\">" - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>" - "<td><div class=\"logo\">Shoutcast " + headerTitle + "</div></td>" - "<td style=\"text-align:right;vertical-align:bottom;padding-right:0.1em;\">" - "<div id=\"up\"></div><a target=\"_blank\" title=\"Built: " __DATE__"\" " - "href=\"http://www.shoutcast.com\">Shoutcast Server v" + - addWBR(gOptions.getVersionBuildStrings() + "/" SERV_OSNAME) + "</a></td></tr>" - "<tr><td class=\"thr\" align=\"center\" colspan=\"3\">" - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" - "<tr><td class=\"thr\" align=\"center\"><div id=\"hdrbox\" class=\"tnl\" " - "style=\"justify-content:space-around;display:flex;flex-flow:row wrap;\">" - "<div class=\"thr\"><a href=\"admin.cgi?mode=help\">Help & Documentation</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?mode=bandwidth\">Bandwidth Usage</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?mode=viewlog&server=" + randomId(logId) + "\">Log</a> " - "(<a href=\"admin.cgi?mode=viewlog&server=" + logId + "&viewlog=tail\">Tailing</a> | " - "<a href=\"admin.cgi?mode=viewlog&server=" + logId + "&viewlog=save\">Save</a>)</div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi\">Summary</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?mode=viewban\">Ban List</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?mode=viewrip\">Reserved List</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"admin.cgi?mode=viewagent\">User Agent List</a></div>" - "<div class=\"thr\"> | </div>" - "<div class=\"thr\"><a href=\"index.html\">Server Logout </a></div>" - "</div></td></tr></table></td></tr></table>"; -} - -static utf8 formatSizeString(const __uint64 size) -{ - utf8::value_type buf[128] = {0}; - if (size < 1024) - { - snprintf((char *)buf, sizeof(buf), "%llu B", size); - } - else if(size < 1048576) - { - snprintf((char *)buf, sizeof(buf), "%.02f KiB", size/1024.0f); - } - else if(size < 1073741824) - { - snprintf((char *)buf, sizeof(buf), "%.02f MiB", size/1048576.0f); - } - else if(size < 1099511627776LL) - { - snprintf((char *)buf, sizeof(buf), "%.02f GiB", size/1073741824.0f); - } - else - { - snprintf((char *)buf, sizeof(buf), "%.02f TiB", size/1099511627776.0f); - } - return buf; -} - -utf8 getCheckedDuration(const size_t time) -{ - if (time >= 60) - { - if (time < 3600) - { - size_t min = (time / 60); - return (tos(min) + " minute" + (min != 1 ? "s" : "") + " ago"); - } - else if (time < 86400) - { - size_t hour = (time / 3600); - return (tos(hour) + " hour" + (hour != 1 ? "s" : "") + " ago"); - } - else - { - size_t week = (time / 86400); - return (tos(week) + " week" + (week != 1 ? "s" : "") + " ago"); - } - } - return "less than a minute ago"; -} - -utf8 niceURL(utf8 srcAddr) -{ - if (!srcAddr.empty()) - { - utf8::size_type pos = srcAddr.find(utf8("://")); - if (pos != utf8::npos && ((pos == 4) || (pos == 5))) - { - srcAddr = srcAddr.substr(pos + 3); - } - srcAddr = aolxml::escapeXML(srcAddr); - - // look for a /stream/x/ path and strip off the end / so the - // link goes to the admin page instead of playing the stream - if (!srcAddr.empty()) - { - utf8::size_type pos2 = srcAddr.find(utf8("/stream/")), - pos3 = srcAddr.rfind(utf8("/")); - if ((pos2 != utf8::npos) && - ((pos3 != utf8::npos) && (pos3 > pos2) && - (pos3 == srcAddr.size()-1))) - { - srcAddr = srcAddr.substr(0, pos3); - } - } - } - return srcAddr; -} - -void restartRelay(const config::streamConfig &info) throw() -{ - bool noEntry = false; - const int relayActive = (streamData::isRelayActive(info.m_streamID, noEntry) & 12); - if (!relayActive || !noEntry) - { - threadedRunner::scheduleRunnable(new protocol_relay(info)); - } -} - -void checkVersion(const time_t t) -{ - utf8 tempId; - httpHeaderMap_t queryParameters; - queryParameters["id"] = randomId(tempId); - - yp2::runAuthHashAction(tempId, yp2::VER_CHECK, "/yp2", queryParameters, - "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ - "<yp version=\"2\"><cmd op=\"version\" seq=\"1\">"\ - "<dnas>" + gOptions.getVersionBuildStrings() + "/" SERV_OSNAME "</dnas></cmd></yp>"); - - last_update_check = t; -} - -utf8 getUptimeScript(const bool base = false, const bool stream = false, const time_t streamUptime = 0) -{ - // TODO need to consider improving this to better deal with leap years, etc - // used to increment the uptime value on the server admin page - return (!base ? "<script type=\"text/javascript\">" - "function $(id){return document.getElementById(id);}" EL : (utf8)"") + - "function pad(num){return(num<10?'0':'')+num;}" EL - "var i=" + tos((::time(NULL) - g_upTime)) + ";" EL - - "function time(t,slim){" EL - "var min=parseInt(t/60);" EL - "var sec=t-parseInt(min*60);" EL - "var hours=parseInt(min/60);" EL - "min-=parseInt(hours*60);" EL - - "var r=\"\";" EL - "var days=parseInt(hours/24);" EL - "hours-=parseInt(days*24);" EL - "var weeks=parseInt(days/7);" EL - "days-=parseInt(weeks*7);" EL - "var years=parseInt(weeks/52);" EL - "weeks-=parseInt(years*52);" EL - "if(years)r+=years+\" year\"+(years!=1?\"s\":\"\")+\" \";" EL - "if(weeks)r+=weeks+\" week\"+(weeks!=1?\"s\":\"\")+\" \";" EL - "if(days)r+=days+\" day\"+(days!=1?\"s\":\"\")+\" \";" EL - "if(slim){" EL - "r+=pad(hours)+\":\"+pad(min)+\":\"+pad(sec);" EL - "}else{" EL - "if(hours)r+=hours+\" hour\"+(hours!=1?\"s\":\"\")+\" \";" EL - "if(min)r+=min+\" minute\"+(min!=1?\"s\":\"\")+\" \";" EL - "if(sec)r+=sec+\" second\"+(sec!=1?\"s\":\"\");" EL - "}" EL - "return r;" EL - "}" EL - - "function count(){i++;$('up').innerHTML=\"" + (sDaemon ? -#ifdef _WIN32 - "Service" -#else - "Daemon" -#endif - : "") + " Uptime: \"+(!i?\"Starting…\":time(i,1));}" EL - "count();setInterval(count,1000);" EL + - - // used to increment the uptime value on the stream admin pages - (stream ? - "var is=" + tos(streamUptime) + ";" EL - "function counts(){is++;$('up2').innerHTML=\"<b>\"+(!is?\"Starting…\":time(is,0))+\"<\\/b>\";}" EL - "counts();setInterval(counts,1000);" EL : "") + - - (!base ? "</script>" : ""); -} - -const bool reloadConfig(const int force) -{ - bool m_reloadRefresh = false; - - ILOG(gOptions.logSectionName() + "Starting stream config reload from `" + fileUtil::getFullFilePath(gOptions.confFile()) + "'"); - config newOptions; - newOptions.load(gOptions.confFile()); - vector<config::streamConfig> relays; - - // to ease testing, especially on remote systems, will - // allow toggling of the debugging options for v2.1+ - ILOG(gOptions.logSectionName() + "Processing global configuration settings..."); - - if (newOptions.cdn() != gOptions.cdn()) - { - ILOG(gOptions.logSectionName() + "Changing CDN mode from " + (!gOptions.cdn().empty() ? gOptions.cdn() : "off") + - " to " + (!newOptions.cdn().empty() ? newOptions.cdn() : "off")); - try - { - gOptions.setOption(utf8("cdn"),utf8(newOptions.cdn())); - } - catch(const exception &) - { - } - } - - if (newOptions.maxUser() != gOptions.maxUser()) - { - const int old_maxUser = gOptions.maxUser(), - new_maxUser = newOptions.maxUser(); - ILOG(gOptions.logSectionName() + "Changing server maxuser from " + - (old_maxUser > 0 ? tos(old_maxUser) : "unlimited") + " to " + - (new_maxUser > 0 ? tos(new_maxUser) : "unlimited")); - gOptions.setOption(utf8("maxuser"),utf8(tos(newOptions.maxUser()))); - } - - if (newOptions.maxBitrate() != gOptions.maxBitrate()) - { - ILOG(gOptions.logSectionName() + "Changing server maxbitrate from " + - (gOptions.maxBitrate() > 0 ? tos(gOptions.maxBitrate()) + "bps" : "unlimited") + " to " + - (newOptions.maxBitrate() > 0 ? tos(newOptions.maxBitrate()) + "bps" : "unlimited")); - gOptions.setOption(utf8("maxbitrate"),utf8(tos(newOptions.maxBitrate()))); - } - - if (newOptions.minBitrate() != gOptions.minBitrate()) - { - ILOG(gOptions.logSectionName() + "Changing server minbitrate from " + - (gOptions.minBitrate() > 0 ? tos(gOptions.minBitrate()) + "bps" : "unlimited") + " to " + - (newOptions.minBitrate() > 0 ? tos(newOptions.minBitrate()) + "bps" : "unlimited")); - gOptions.setOption(utf8("minbitrate"),utf8(tos(newOptions.minBitrate()))); - } - - bool publicChanged = false; - if (newOptions.publicServer() != gOptions.publicServer()) - { - ILOG(gOptions.logSectionName() + "Changing state of publicserver - killing sources as applicable"); - gOptions.setOption(utf8("publicserver"),newOptions.publicServer()); - publicChanged = true; - } - - // update the server-wide hiding and redirection options - if (newOptions.hideStats() != gOptions.hideStats()) - { - ILOG(gOptions.logSectionName() + "Changing 'hidestats'"); - gOptions.setOption(utf8("hidestats"),utf8(newOptions.hideStats())); - } - - if (newOptions.redirectUrl() != gOptions.redirectUrl()) - { - ILOG(gOptions.logSectionName() + "Changing 'redirecturl'"); - gOptions.setOption(utf8("redirecturl"),utf8(newOptions.redirectUrl())); - } - - if (newOptions.ripOnly() != gOptions.ripOnly()) - { - ILOG(gOptions.logSectionName() + "Changing 'riponly'"); - gOptions.setOption(utf8("riponly"),utf8(tos(newOptions.ripOnly()))); - } - - if (newOptions.blockEmptyUserAgent() != gOptions.blockEmptyUserAgent()) - { - ILOG(gOptions.logSectionName() + "Changing 'blockemptyuseragent'"); - gOptions.setOption(utf8("blockemptyuseragent"),utf8(tos(newOptions.blockEmptyUserAgent()))); - } - - if (newOptions.metricsMaxQueue() != gOptions.metricsMaxQueue()) - { - ILOG(gOptions.logSectionName() + "Changing 'metricsmaxqueue'"); - gOptions.setOption(utf8("metricsmaxqueue"),utf8(tos(newOptions.metricsMaxQueue()))); - } - - metrics::metrics_apply(newOptions); - - if (newOptions.relayReconnectTime() != gOptions.relayReconnectTime()) - { - ILOG(gOptions.logSectionName() + "Changing 'relayreconnecttime'"); - gOptions.setOption(utf8("relayreconnecttime"),utf8(tos(newOptions.relayReconnectTime()))); - } - - if (newOptions.relayConnectRetries() != gOptions.relayConnectRetries()) - { - ILOG(gOptions.logSectionName() + "Changing 'relayconnectretries'"); - gOptions.setOption(utf8("relayconnectretries"),utf8(tos(newOptions.relayConnectRetries()))); - } - - if (newOptions.backupLoop() != gOptions.backupLoop()) - { - ILOG(gOptions.logSectionName() + "Changing 'backuploop'"); - gOptions.setOption(utf8("backuploop"),utf8(tos(newOptions.backupLoop()))); - } - - if (newOptions.songHistory() != gOptions.songHistory()) - { - ILOG(gOptions.logSectionName() + "Changing 'songhistory'"); - gOptions.setOption(utf8("songhistory"),utf8(tos(newOptions.songHistory()))); - } - - if (newOptions.adminFile() != gOptions.adminFile()) - { - ILOG(gOptions.logSectionName() + "Changing 'adminfile'"); - gOptions.setOption(utf8("adminfile"),newOptions.adminFile()); - } - - if (newOptions.clacks() != gOptions.clacks()) - { - ILOG(gOptions.logSectionName() + "Changing 'clacks'"); - gOptions.setOption(utf8("clacks"),utf8(tos(newOptions.clacks()))); - } - - if (newOptions.startInactive() != gOptions.startInactive()) - { - ILOG(gOptions.logSectionName() + "Changing 'startinactive'"); - gOptions.setOption(utf8("startinactive"),utf8(tos(newOptions.startInactive()))); - } - - if (newOptions.rateLimit() != gOptions.rateLimit()) - { - ILOG(gOptions.logSectionName() + "Changing 'rateLimit'"); - gOptions.setOption(utf8("ratelimit"),utf8(tos(newOptions.rateLimit()))); - } - - if (newOptions.adTestFile() != gOptions.adTestFile()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfile'"); - gOptions.setOption(utf8("adtestfile"),utf8(newOptions.adTestFile())); - } - - if (newOptions.adTestFile2() != gOptions.adTestFile2()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfile2'"); - gOptions.setOption(utf8("adtestfile2"),utf8(newOptions.adTestFile2())); - } - - if (newOptions.adTestFile3() != gOptions.adTestFile3()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfile3'"); - gOptions.setOption(utf8("adtestfile3"),utf8(newOptions.adTestFile3())); - } - - if (newOptions.adTestFile4() != gOptions.adTestFile4()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfile4'"); - gOptions.setOption(utf8("adtestfile4"),utf8(newOptions.adTestFile4())); - } - - if (newOptions.adTestFileLoop() != gOptions.adTestFileLoop()) - { - ILOG(gOptions.logSectionName() + "Changing 'adtestfileloop'"); - gOptions.setOption(utf8("adtestfileloop"),utf8(tos(newOptions.adTestFileLoop()))); - } - - if (newOptions.metaInterval() != gOptions.metaInterval()) - { - ILOG(gOptions.logSectionName() + "Changing 'metainterval'"); - gOptions.setOption(utf8("metainterval"),utf8(tos(newOptions.metaInterval()))); - } - - if (newOptions.useXFF() != gOptions.useXFF()) - { - ILOG(gOptions.logSectionName() + "Changing 'usexff'"); - gOptions.setOption(utf8("usexff"),utf8(tos(newOptions.useXFF()))); - } - - if (newOptions.forceShortSends() != gOptions.forceShortSends()) - { - ILOG(gOptions.logSectionName() + "Changing 'forceshortsends'"); - gOptions.setOption(utf8("forceshortsends"),utf8(tos(newOptions.forceShortSends()))); - } - - if (newOptions.adminNoWrap() != gOptions.adminNoWrap()) - { - ILOG(gOptions.logSectionName() + "Changing 'adminnowrap'"); - gOptions.setOption(utf8("adminnowrap"),utf8(tos(newOptions.adminNoWrap()))); - } - - if (newOptions.adminCSSFile() != gOptions.adminCSSFile()) - { - ILOG(gOptions.logSectionName() + "Changing 'admincssfile'"); - gOptions.setOption(utf8("admincssfile"),utf8(newOptions.adminCSSFile())); - gOptions.m_styleCustomStr.clear(); - gOptions.m_styleCustomStrGZ.clear(); - gOptions.m_styleCustomHeaderTime = 0; - } - - if (newOptions.destIP() != gOptions.destIP()) - { - utf8 destBindAddr = metrics::metrics_verifyDestIP(newOptions, false); - ILOG(gOptions.logSectionName() + "Changing 'destip'"); - gOptions.setOption(utf8("destip"), destBindAddr); - - // if we're updating then attempt to behave like it was a new load - g_IPAddressForClients = destBindAddr; - - if (g_IPAddressForClients.empty()) - { - char s[MAXHOSTNAMELEN] = {0}; - if (!::gethostname(s,MAXHOSTNAMELEN - 1)) - { - g_IPAddressForClients = socketOps::hostNameToAddress(s,g_portForClients); - } - } - } - - if (newOptions.publicIP() != gOptions.publicIP()) - { - utf8 publicAddr = stripWhitespace(newOptions.publicIP()); - publicAddr = stripHTTPprefix(publicAddr); - ILOG(gOptions.logSectionName() + "Changing 'publicip'"); - gOptions.setOption(utf8("publicip"),publicAddr); - } - - if (newOptions.autoDumpTime() != gOptions.autoDumpTime()) - { - ILOG(gOptions.logSectionName() + "Changing 'autodumptime'"); - gOptions.setOption(utf8("autodumptime"),utf8(tos(newOptions.autoDumpTime()))); - } - - if (newOptions.nameLookups() != gOptions.nameLookups()) - { - ILOG(gOptions.logSectionName() + "Changing 'namelookups'"); - gOptions.setOption(utf8("namelookups"),utf8(tos(newOptions.nameLookups()))); - } - - // update the YP details (can do on fly without any actual updates) - bool ypChanged = false; - bool https = ((gOptions.ypAddr() == DEFAULT_YP_ADDRESS) && uniFile::fileExists(gOptions.m_certPath)); - utf8 oldYP = (https ? "https://" : "http://") + gOptions.ypAddr() + ":" + tos(gOptions.ypPort()) + gOptions.ypPath(); - if (newOptions.ypAddr() != gOptions.ypAddr()) - { - ypChanged = true; - gOptions.setOption(utf8("ypaddr"),utf8(newOptions.ypAddr())); - } - if (newOptions.ypPort() != gOptions.ypPort()) - { - ypChanged = true; - gOptions.setOption(utf8("ypport"),utf8(tos(newOptions.ypPort()))); - } - if (newOptions.ypPath() != gOptions.ypPath()) - { - ypChanged = true; - gOptions.setOption(utf8("yppath"),utf8(newOptions.ypPath())); - } - - if (ypChanged) - { - bool https = ((newOptions.ypAddr() == DEFAULT_YP_ADDRESS) && uniFile::fileExists(gOptions.m_certPath)); - utf8 newYP = (https ? "https://" : "http://") + newOptions.ypAddr() + ":" + tos(newOptions.ypPort()) + newOptions.ypPath(); - ILOG(gOptions.logSectionName() + "Changing YP details from " + oldYP + " to " + newYP); - } - - gOptions.setOption(utf8("yp2debug"),utf8(newOptions.yp2Debug()?"1":"0")); - gOptions.setOption(utf8("shoutcastsourcedebug"),utf8(newOptions.shoutcastSourceDebug()?"1":"0")); - gOptions.setOption(utf8("uvox2sourcedebug"),utf8(newOptions.uvox2SourceDebug()?"1":"0")); - gOptions.setOption(utf8("httpsourcedebug"),utf8(newOptions.HTTPSourceDebug()?"1":"0")); - gOptions.setOption(utf8("shoutcast1clientdebug"),utf8(newOptions.shoutcast1ClientDebug()?"1":"0")); - gOptions.setOption(utf8("shoutcast2clientdebug"),utf8(newOptions.shoutcast2ClientDebug()?"1":"0")); - gOptions.setOption(utf8("httpclientdebug"),utf8(newOptions.HTTPClientDebug()?"1":"0")); - gOptions.setOption(utf8("flvclientdebug"),utf8(newOptions.flvClientDebug()?"1":"0")); - gOptions.setOption(utf8("m4aclientdebug"),utf8(newOptions.m4aClientDebug()?"1":"0")); - gOptions.setOption(utf8("relayshoutcastdebug"),utf8(newOptions.relayShoutcastDebug()?"1":"0")); - gOptions.setOption(utf8("relayuvoxdebug"),utf8(newOptions.relayUvoxDebug()?"1":"0")); - gOptions.setOption(utf8("relaydebug"),utf8(newOptions.relayDebug()?"1":"0")); - gOptions.setOption(utf8("streamdatadebug"),utf8(newOptions.streamDataDebug()?"1":"0")); - gOptions.setOption(utf8("httpstyledebug"),utf8(newOptions.httpStyleDebug()?"1":"0")); - gOptions.setOption(utf8("statsdebug"),utf8(newOptions.statsDebug()?"1":"0")); - gOptions.setOption(utf8("microserverdebug"),utf8(newOptions.microServerDebug()?"1":"0")); - gOptions.setOption(utf8("threadrunnerdebug"),utf8(newOptions.threadRunnerDebug()?"1":"0")); - gOptions.setOption(utf8("admetricsdebug"),utf8(newOptions.adMetricsDebug()?"1":"0")); - gOptions.setOption(utf8("authdebug"),utf8(newOptions.authDebug()?"1":"0")); - - ILOG(gOptions.logSectionName() + "Processed global configuration settings."); - - // test for the source password having changed this will be - // applied in general though per stream changes are likely - // to have been set in the earlier checks before we got here - if (newOptions.password() != gOptions.password()) - { - gOptions.setOption(utf8("password"),newOptions.password()); - streamData *sd = streamData::accessStream(DEFAULT_SOURCE_STREAM); - if (sd) - { - ILOG(gOptions.logSectionName() + "Killing all stream sources due to change of relay options."); - sd->killAllSources(); - m_reloadRefresh = true; - sd->releaseStream(); - } - } - - config::streams_t new_streams, old_streams; - newOptions.getStreamConfigs(new_streams, false); - gOptions.getStreamConfigs(old_streams, false); - - config::streams_t::const_iterator iNSC = new_streams.begin(), iOSC = old_streams.begin(); - - // if no configurations found then we can just remove everything - if (new_streams.empty()) - { - // kick the source and clients as required on a removal - for (; iOSC != old_streams.end(); ++iOSC) - { - size_t streamID = (*iOSC).second.m_streamID; - streamData *sd = streamData::accessStream(streamID); - if (sd) - { - sd->killSource(streamID, sd); - m_reloadRefresh = true; - } - gOptions.removeStreamConfig((*iOSC).second); - } - } - - // otherwise if the same or more then we can update / add as required - else if (new_streams.size() >= old_streams.size()) - { - // if no configs specified and we're starting to add new stream configs - // then we really need to kick any existing sources otherwise it'll stay - // with the current details which will prevent a YP connection with extra - // checks in build 21+ to make sure it only works if there was a change. - if ((new_streams.size() != old_streams.size()) && - (old_streams.size() == DEFAULT_SOURCE_STREAM)) - { - // kick the source and clients as required on a complete addition - // (wouldn't have a valid config via authhash, etc so is sensible) - streamData *sd = streamData::accessStream(DEFAULT_SOURCE_STREAM); - if (sd) - { - ILOG(gOptions.logSectionName() + "Forcing stream source disconnect due to addition of stream config(s)."); - sd->killAllSources(); - m_reloadRefresh = true; - sd->releaseStream(); - } - } - - for (; iNSC != new_streams.end(); ++iNSC) - { - config::streams_t::const_iterator iOSC2 = old_streams.find((*iNSC).first); - if (iOSC2 != old_streams.end()) - { - // update required - __uint64 updated = gOptions.updateStreamConfig(newOptions, (*iNSC).second); - size_t streamID = (*iNSC).second.m_streamID; - streamData *sd = streamData::accessStream(streamID); - if (sd) - { - // otherwise do an in-place update as long as it is applicable - bool isRelay = sd->isRelayStream(streamID); - if (publicChanged || force || - (!force && (updated & RELAY_URL || updated & SOURCE_PWD || - updated & PUBLIC_SRV || (updated & ALLOW_RELAY && isRelay) || - (updated & ALLOW_PUBLIC_RELAY && isRelay) || updated & CIPHER_KEY || - updated & INTRO_FILE || updated & BACKUP_FILE || - updated & BACKUP_URL || updated & MOVED_URL))) - { - sd->killSource(streamID); - m_reloadRefresh = true; - - if (!(*iNSC).second.m_relayUrl.url().empty() && - !sd->isSourceConnected(streamID) && - gOptions.stream_movedUrl(streamID).empty()) - { - relays.push_back((*iNSC).second); - } - } - // otherwise do an in-place update as long as it is applicable - else - { - sd->streamUpdate(streamID, (*iNSC).second.m_authHash, (*iNSC).second.m_maxStreamUser, - (*iNSC).second.m_maxStreamBitrate, (*iNSC).second.m_minStreamBitrate); - } - - // refresh the played history size as needed - if (updated & SONG_HIST) - { - sd->updateSongHistorySize(); - } - - if (updated & ARTWORK_FILE) - { - if (gOptions.read_stream_artworkFile(streamID)) - { - gOptions.m_artworkBody[streamID] = loadLocalFile(fileUtil::getFullFilePath(gOptions.stream_artworkFile(streamID)), LOGNAME, 523872/*32 x (16384 - 6 - 6 - 1)*/); - } - else - { - gOptions.m_artworkBody[streamID].clear(); - sd->clearCachedArtwork(0); - } - } - sd->releaseStream(); - } - // otherwise if no proper update or a relay was added / is known and not connected then bump it - else - { - // force flag a source relay kick if this is called - bool noEntry = false; - if ((streamData::isRelayActive(streamID, noEntry) & 12)) - { - // if there is a relay attempt and no new one - // then we need to signal it to abort trying - if ((*iNSC).second.m_relayUrl.url().empty()) - { - streamData::setRelayActiveFlags (streamID, noEntry, 2); - } - // otherwise we need update the relay url - // which the attempt is trying to join to - // which is done by the relay handling. - } - - if (((*iOSC2).second.m_relayUrl.url() != (*iNSC).second.m_relayUrl.url() || - (updated & MOVED_URL)) && !(*iNSC).second.m_relayUrl.url().empty()) - { - relays.push_back((*iNSC).second); - m_reloadRefresh = true; - } - } - } - else - { - // addition required - // no need to do anything else as there shouldn't be anything connected on this at the time - gOptions.addStreamConfig(newOptions, (*iNSC).second); - m_reloadRefresh = true; - - // only attempt to start a relay url if added and a relay url exists - if (!(*iNSC).second.m_relayUrl.url().empty()) - { - relays.push_back((*iNSC).second); - } - } - } - } - - // otherwise if there are fewer stream configurations then we can update / remove as required - else - { - for (; iOSC != old_streams.end(); ++iOSC) - { - config::streams_t::const_iterator iOSC2 = new_streams.find((*iOSC).first); - if (iOSC2 != new_streams.end()) - { - // update required - __uint64 updated = gOptions.updateStreamConfig(newOptions, (*iOSC2).second); - size_t streamID = (*iOSC2).second.m_streamID; - streamData *sd = streamData::accessStream(streamID); - if (sd) - { - // check what has been updated and kick the source as applicable - bool isRelay = sd->isRelayStream(streamID); - if (publicChanged || force || - (!force && (updated & RELAY_URL || updated & SOURCE_PWD || - updated & PUBLIC_SRV || (updated & ALLOW_RELAY && isRelay) || - (updated & ALLOW_PUBLIC_RELAY && isRelay) || updated & CIPHER_KEY || - updated & INTRO_FILE || updated & BACKUP_FILE || - updated & BACKUP_URL || updated & MOVED_URL))) - { - sd->killSource(streamID); - m_reloadRefresh = true; - - if (!(*iOSC2).second.m_relayUrl.url().empty() && - !sd->isSourceConnected(streamID) && - gOptions.stream_movedUrl(streamID).empty()) - { - relays.push_back((*iOSC2).second); - } - } - // otherwise do an in-place update as long as it is applicable - else - { - sd->streamUpdate(streamID, (*iOSC2).second.m_authHash, (*iOSC2).second.m_maxStreamUser, - (*iOSC2).second.m_maxStreamBitrate, (*iOSC2).second.m_minStreamBitrate); - } - - // refresh the played history size as needed - if (updated & SONG_HIST) - { - sd->updateSongHistorySize(); - } - - if (updated & ARTWORK_FILE) - { - if (gOptions.read_stream_artworkFile(streamID)) - { - gOptions.m_artworkBody[streamID] = loadLocalFile(fileUtil::getFullFilePath(gOptions.stream_artworkFile(streamID)), LOGNAME, 523872/*32 x (16384 - 6 - 6 - 1)*/); - } - else - { - gOptions.m_artworkBody[streamID].clear(); - sd->clearCachedArtwork(0); - } - } - sd->releaseStream(); - } - } - else - { - // kick the source and clients as required on a removal - size_t streamID = (*iOSC).second.m_streamID; - streamData *sd = streamData::accessStream(streamID); - if (sd) - { - sd->killSource(streamID, sd); - m_reloadRefresh = true; - } - // removal required - gOptions.removeStreamConfig((*iOSC).second); - } - } - } - - // test for the require stream configs having changed - // only need to kick streams not known if enabled - if (newOptions.requireStreamConfigs() != gOptions.requireStreamConfigs()) - { - gOptions.setOption(utf8("requirestreamconfigs"),utf8(newOptions.requireStreamConfigs()?"1":"0")); - if (newOptions.requireStreamConfigs()) - { - size_t inc = 0; - size_t sid; - do - { - sid = streamData::enumStreams(inc); - config::streams_t streams; - gOptions.getStreamConfigs(streams, false); - - config::streams_t::const_iterator ics = streams.find(sid); - if (ics == streams.end()) - { - streamData *sd = streamData::accessStream(sid); - if (sd) - { - ILOG(gOptions.logSectionName() + "Killing source for stream #" + tos(sid) + " as it is not in the known stream config(s).", LOG_NAME, sid); - sd->killSource(sid, sd); - m_reloadRefresh = true; - } - } - ++inc; - } - while (sid); - } - } - - // finally we refresh the passwords so they're correct after any changes - config::streams_t streams; - gOptions.getStreamConfigs(streams, false); - gOptions.setupPasswords(streams); - - // if a force was done then we really need to restart any relays - if (force) - { - // schedule relays - vector<config::streamConfig> relayList(gOptions.getRelayList()); - if (!relayList.empty()) - { - for_each(relayList.begin(),relayList.end(),restartRelay); - } - } - // otherwise only attempt to restart any which were added, changed, etc - else - { - if (!relays.empty()) - { - for_each(relays.begin(),relays.end(),restartRelay); - } - } - - ILOG(gOptions.logSectionName() + "Completed stream config reload from `" + fileUtil::getFullFilePath(gOptions.confFile())); - return m_reloadRefresh; -} - -void reloadBanLists() -{ - // load up ban file - int loaded = g_banList.load(gOptions.banFile(),0), - count = loaded; - - // per-stream options - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // load up ban file - if (gOptions.read_stream_banFile((*i).first)) - { - ++count; - if (g_banList.load(gOptions.stream_banFile((*i).first),(*i).first)) - { - ++loaded; - } - } - } - - if (!count) - { - ILOG("[BAN] No banned lists reloaded."); - } - else - { - if (count == loaded) - { - ILOG("[BAN] Reloaded all banned list(s)."); - } - else - { - ILOG("[BAN] Partially reloaded banned list(s) - check error messages above."); - } - } -} - -void reloadRipLists() -{ - // load up rip file - int loaded = g_ripList.load(gOptions.ripFile(),0), - count = loaded; - - // per-stream options - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // load up rip file - if (gOptions.read_stream_ripFile((*i).first)) - { - ++count; - if (g_ripList.load(gOptions.stream_ripFile((*i).first),(*i).first)) - { - ++loaded; - } - } - } - - if (!count) - { - ILOG("[RIP] No reserved lists reloaded."); - } - else - { - if (count == loaded) - { - ILOG("[RIP] Reloaded all reserved list(s)."); - } - else - { - ILOG("[RIP] Partially reloaded reserved list(s) - check error messages above."); - } - } -} - -void reloadAdminAccessList() -{ - // load up admin access file - g_adminList.load(gOptions.adminFile()); - ILOG("[ADMINCGI] Reloaded admin access list."); -} - -void reloadAgentLists() -{ - // load up agent file - int loaded = g_agentList.load(gOptions.agentFile(),0), - count = loaded; - - // per-stream options - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // load up agent file - if (gOptions.read_stream_agentFile((*i).first)) - { - ++count; - if (g_agentList.load(gOptions.stream_agentFile((*i).first),(*i).first)) - { - ++loaded; - } - } - } - - if (!count) - { - ILOG("[AGENT] No user agent lists reloaded."); - } - else - { - if (count == loaded) - { - ILOG("[AGENT] Reloaded all user agent list(s)."); - } - else - { - ILOG("[AGENT] Partially reloaded user agent list(s) - check error messages above."); - } - } -} - -void printUpdateMessage() -{ - // display update message where applicable - updater::verInfo ver; - if (updater::getNewVersion(ver)) - { - ULOG(string(YP2_LOGNAME) + "A new DNAS version is now available: " + ver.ver); - ULOG(string(YP2_LOGNAME) + "The suggested download for your setup is: " + ver.url); - ULOG(string(YP2_LOGNAME) + "See " + ver.log + " for more information about this update and alternative download links"); - } -} - -utf8 warningImage(const bool right = true) -{ - return utf8(right ? " " : "") + "<img border=\"0\" src=\"images/warn.png\" style=\"float:" + - utf8(right ? "right" : "left") + "\" " - "alt=\"" + (right ? "Possible Stream Ripper" : "Please Register Your Authhash") + - "\" title=\"" + (right ? "Possible Stream Ripper" : "Please Register Your Authhash") + "\">"; -} - -utf8 baseImage(const utf8& image, const utf8& title, const bool left = false, const bool prefix = true) -{ - return (prefix ? " " : (utf8)"") + "<img border=\"0\" src=\"images/" + - (!image.empty() ? (image + ".png") : "favicon.ico") + "\" " + - (left ? "style=\"float:left\" " : "") + "alt=\"" + title + "\" title=\"" + title + "\">"; -} - -#define xffImage() baseImage("xff", "XFF", true) -#define mplayerImage() baseImage("mplayer", "MPlayer Client") -#define psImage() baseImage("ps", "PlayStation Client") -#define radioToolboxImage() baseImage("rtb", "Radio Toolbox Monitor / Player") -#define v1Image() baseImage("v1", "v1 Client") -#define v2Image() baseImage("v2", "v2 Client") -#define relayImage() baseImage("relay", "Relay Connection", false, false) -#define html5Image() baseImage("html5", "HTTP / HTML5 Client") -#define flashImage() baseImage("flash", "Flash Client") -#define icecastImage() baseImage("icecast", "Icecast Client / Relay") -#define vlcImage() baseImage("vlc", "VLC Client") -#define waImage() baseImage("wa", "Winamp Client") -#define scImage() baseImage("", "Shoutcast Client / Relay") -#define iOSImage() baseImage("", "iOS Client") -#define curlImage() baseImage("curl", "cURL / libcurl Based Client") -#define radionomyImage() baseImage("radionomy", "Radionomy Stats Collector") -#define fb2kImage() baseImage("fb2k", "Foobar2000 Client") -#define rokuImage() baseImage("roku", "Roku Streaming Player") -#define WiiMCImage() baseImage("v1", "Wii Media Centre Player") -#define synologyImage() baseImage("synology", "Audio Station (Synology) Player") -#define appleImage() baseImage("apple", "Apple Device / OS / Client") -#define iTunesImage() baseImage("itunes", "iTunes Client") -#define wmpImage() baseImage("wmp", "Windows Media Player Client") -#define chromeImage() baseImage("chrome", "Chrome Web Browser") -#define safariImage() baseImage("safari", "Safari Web Browser") -#define ieImage() baseImage("ie", "Internet Explorer Web Browser") -#define firefoxImage() baseImage("firefox", "Firefox Web Browser") - -utf8 advertImage(const streamData::streamID_t sid, const int group, const size_t count) -{ - if (streamData::knownAdvertGroup(sid, group)) - { - if (count > 0) - { - return baseImage("adplayed", (tos(count) + " Advert Breaks Have Been Played\nAdvert Group: " + tos(group)), false, false); - } - return baseImage("adavail", ("Waiting For First Advert Break To Play\nAdvert Group: " + tos(group)), false, false); - } - if (count > 0) - { - return baseImage("", (tos(count) + " Advert Breaks Have Been Played\nNo Applicable " - "Adverts Currently Available\nAdvert Group: " + tos(group)), false, false); - } - - return baseImage("noadavail", ("No Applicable Adverts Available\nAdvert Group: " + tos(group)), false, false); -} - -utf8 getClientImage(const streamData::source_t type) -{ - return ((type & streamData::RADIONOMY) ? radionomyImage() : - ((type & streamData::FLV) ? flashImage() : - ((type & streamData::CURL_TOOL) ? curlImage() : - ((type & streamData::HTTP) ? html5Image() : - //((type & streamData::M4A) ? m4aImage() : - ((type & streamData::SHOUTCAST2) ? ((type & streamData::RELAY) ? scImage() : waImage()) : - ((type & streamData::ICECAST) ? icecastImage() : - ((type & streamData::VLC) ? vlcImage() : - ((type & streamData::WINAMP) ? waImage() : - ((type & streamData::APPLE) ? appleImage() : - ((type & streamData::ITUNES) ? iTunesImage() : - ((type & streamData::WMP) ? wmpImage() : - ((type & streamData::ROKU) ? rokuImage() : - ((type & streamData::WIIMC) ? WiiMCImage() : - ((type & streamData::SYNOLOGY) ? synologyImage() : - ((type & streamData::CHROME) ? chromeImage() : - ((type & streamData::SAFARI) ? safariImage() : - ((type & streamData::IE) ? ieImage() : - ((type & streamData::FIREFOX) ? firefoxImage() : - ((type & streamData::MPLAYER) ? mplayerImage() : - ((type & streamData::PS) ? psImage() : - ((type & streamData::RADIO_TOOLBOX) ? radioToolboxImage() : - ((type & streamData::HTML5) ? html5Image() : - ((type & streamData::WARNING) ? warningImage() : - ((type & streamData::SC_IRADIO) ? iOSImage() : - ((type & streamData::FB2K) ? fb2kImage() : v1Image() - ))))))))))))))))))))))))) + - ((type & streamData::RELAY) ? relayImage() : ""); -} - -/* - Handles all HTTP requests to admin.cgi -*/ - -protocol_admincgi::protocol_admincgi(const socketOps::tSOCKET s, const streamData::streamID_t sid, const bool no_sid, - const bool zero_sid, const utf8 &clientLogString, - const uniString::utf8 &password, const uniString::utf8 &referer, - const uniString::utf8 &hostIP, const uniString::utf8 &userAgent, - const protocol_HTTPStyle::HTTPRequestInfo &httpRequestInfo) throw(std::exception) - : runnable(s), m_noSID(no_sid), m_zeroSID(zero_sid), - m_saveLogFile(0), m_clientLogString(clientLogString), - m_httpRequestInfo(httpRequestInfo), m_password(password), - m_referer(referer), m_hostIP(hostIP), m_userAgent(userAgent), - m_sid(sid), m_state(&protocol_admincgi::state_ConfirmPassword), - m_nextState(0), m_outBuffer(0), m_outBufferSize(0), - m_tailLogFile(false), lastChar(-1), inMsg(false), - first(false), m_logFile(0) -{ - memset(&m_stream, 0, sizeof(m_stream)); - - // check for updates weekly from the last update - // so we're taking into account manual checks... - if ((m_lastActivityTime - last_update_check) > 604800) - { - checkVersion(m_lastActivityTime); - } - - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); -} - -protocol_admincgi::~protocol_admincgi() throw() -{ - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); - - socketOps::forgetTCPSocket(m_socket); - if (m_logFile) - { - ::fclose(m_logFile); - m_logFile = 0; - } -} - -void protocol_admincgi::timeSlice() throw(exception) -{ - (this->*m_state)(); -} - -void protocol_admincgi::state_Close() throw(exception) -{ - m_result.done(); -} - -// send buffer text -void protocol_admincgi::state_Send() throw(exception) -{ - if (sendDataBuffer(DEFAULT_CLIENT_STREAM_ID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - m_state = m_nextState; - } -} - -void protocol_admincgi::sendMessageAndClose(const utf8 &msg) throw() -{ - m_outMsg = msg; - m_outBuffer = m_outMsg.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)m_outMsg.size())); - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_Close; - m_result.write(); - m_result.run(); -} - -/// update the metatdata in the shoutcast ring buffer -void protocol_admincgi::state_UpdateMetadata() throw(exception) -{ - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(m_sid, info, extra); - - utf8 titleMsg, urlMsg, djMsg, nextMsg; - - if (!m_updinfoSong.empty()) - { - // use this as a way to try to ensure we've got a utf-8 - // encoded title to improve legacy source title support - if (!m_updinfoSong.isValid()) - { - m_updinfoSong = asciiToUtf8(m_updinfoSong.toANSI(true)); - } - - if (streamData::validateTitle(m_updinfoSong)) - { - titleMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Title updated [" + m_updinfoSong + "]"); - } - else - { - WLOG("Title update rejected - value not allowed: " + m_updinfoSong, LOG_NAME, m_sid); - m_updinfoSong = info.m_currentSong; - } - } - else - { - if (!info.m_currentSong.empty()) - { - titleMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Title cleared"); - } - } - - if (!m_updinfoURL.empty()) - { - urlMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Song url updated [" + m_updinfoURL + "]"); - } - else - { - if (!info.m_currentURL.empty()) - { - // TODO if there's a custom image then indicate using it or do not show this - urlMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Song url cleared"); - } - } - - if (!m_updinfoDJ.empty()) - { - djMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] DJ name updated [" + m_updinfoDJ + "]"); - } - else - { - if (!info.m_streamUser.empty()) - { - djMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] DJ name cleared"); - } - } - - if (!m_updinfoNext.empty()) - { - // use this as a way to try to ensure we've got a utf-8 - // encoded title to improve legacy source title support - if (!m_updinfoNext.isValid()) - { - m_updinfoNext = asciiToUtf8(m_updinfoNext.toANSI(true)); - } - - if (streamData::validateTitle(m_updinfoNext)) - { - titleMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Next title updated [" + m_updinfoNext + "]"); - } - else - { - WLOG("[ADMINCGI sid=" + tos(m_sid) + "] Next title update rejected - value not allowed: " + m_updinfoNext); - m_updinfoNext = info.m_comingSoon; - } - } - else - { - if (!info.m_comingSoon.empty()) - { - nextMsg = ("[ADMINCGI sid=" + tos(m_sid) + "] Next title cleared"); - } - } - - streamData *sd = streamData::accessStream(m_sid); - if (sd) - { - utf8 sourceIdent = (!m_userAgent.empty() ? m_userAgent : utf8("Legacy / Unknown")); - sd->updateSourceIdent(sourceIdent, sd->isRelayStream(m_sid)); - sd->addSc1MetadataAtCurrentPosition(LOGNAME, m_updinfoSong, m_updinfoURL, m_updinfoNext); - sd->updateStreamUser(m_updinfoDJ); - // this will call streamData::releaseStream(..) - streamData::streamClientLost(LOGNAME, sd, m_sid); - - // we'll output any earlier generated messages now that we've sent - // the details to be used as otherwise they were being reported as - // ok which if there was an issue (e.g. bad sid#) was confusing - if (!titleMsg.empty()) - { - ILOG(titleMsg, LOG_NAME, m_sid); - } - if (!nextMsg.empty()) - { - ILOG(nextMsg, LOG_NAME, m_sid); - } - if (!urlMsg.empty()) - { - ILOG(urlMsg, LOG_NAME, m_sid); - } - if (!djMsg.empty()) - { - ILOG(djMsg, LOG_NAME, m_sid); - } - } - else - { - WLOG("[ADMINCGI sid=" + tos(m_sid) + "] Metadata update rejected as the stream does not exist", LOG_NAME, m_sid); - } - - m_updinfoSong.clear(); - m_updinfoURL.clear(); - m_updinfoDJ.clear(); - - sendMessageAndClose(MSG_200); -} - -/// update the metatdata in the shoutcast ring buffer -void protocol_admincgi::state_UpdateXMLMetadata() throw(exception) -{ - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); - - if (!m_updinfoSong.empty()) - { - ILOG("XML title update [" + m_updinfoSong + "]", LOG_NAME, m_sid); - streamData *sd = streamData::accessStream(m_sid); - if (sd) - { - vector<__uint8> assembledData; - assembledData.insert(assembledData.end(), m_updinfoSong.begin(), m_updinfoSong.end()); - utf8 sourceIdent = (!m_userAgent.empty() ? m_userAgent : utf8("Legacy / Unknown")); - sd->updateSourceIdent(sourceIdent); - sd->addUvoxMetadataAtCurrentPosition(MSG_METADATA_XML_NEW, assembledData); - // this will call streamData::releaseStream(..) - streamData::streamClientLost(LOGNAME, sd, m_sid); - } - else - { - WLOG("XML title update rejected as stream #" + tos(m_sid) + " does not exist", LOG_NAME, m_sid); - } - m_updinfoSong.clear(); - m_updinfoURL.clear(); - } - - sendMessageAndClose(MSG_200); -} - -void protocol_admincgi::state_ConfirmPassword() throw(std::exception) -{ - DEBUG_LOG(utf8(LOGNAME) + __FUNCTION__); - - // this will see if we've been refered from the base admin.cgi and will allow through - // if the password / auth matches with the key admin account so the page is useable. - utf8::size_type pos; - if ((pos = m_referer.rfind(utf8("admin.cgi"))) != utf8::npos) - { - m_referer = m_referer.substr(pos); - } - - const utf8& mode = mapGet(m_httpRequestInfo.m_QueryParameters, "mode", (utf8)""); - const bool updinfo = (mode == "updinfo"); - const bool viewxml = (mode == "viewxml"); - const bool viewjson = (mode == "viewjson"); - const bool _register = (mode == "register"); - - // on the root admin summary page we can only allow referer admin through if looking at the stats - const bool adminRefer = (m_referer.find(utf8("admin.cgi")) == 0 || m_referer.find(utf8("admin.cgi?sid=0")) == 0); - int okReferer = (adminRefer && (viewxml || viewjson || _register)); - - // on the root admin summary page we can check if it's an authhash action and allow - // through if things match up + also allow updinfo (not ideal but maintains legacy) - if ((!okReferer && ((mode == "manualauthhash") || _register)) || updinfo) - { - if (!m_referer.empty()) - { - okReferer = (m_referer.find(utf8("admin.cgi?sid=" + tos(m_sid) + "&mode=")) != utf8::npos); - } - } - - DEBUG_LOG(LOGNAME "Referrer status: " + tos(okReferer)); - - // fixed in Build 18 to revert to the master passwords if there's nothing for the stream - utf8 streamPassword = gOptions.stream_password(m_sid); - if (!gOptions.read_stream_password(m_sid) && streamPassword.empty()) - { - streamPassword = gOptions.password(); - } - - utf8 streamAdminPassword = gOptions.stream_adminPassword(m_sid); - if (!gOptions.read_stream_adminPassword(m_sid) && streamAdminPassword.empty()) - { - streamAdminPassword = gOptions.adminPassword(); - } - - // this is so we can allow source password connections access to the - // mode=viewxml&page=1 (/stats) and mode=viewxml&page=4 (/played) so - // we maintain compatibility with 1.x DNAS which only had these ones - int page = 0; - bool compat_mode = false; - if (viewxml || viewjson) - { - page = mapGet(m_httpRequestInfo.m_QueryParameters, "page", (int)page); - // this will act like /stats or / played (or both - // if page=0)so as to better emulate the 1.x DNAS - if ((page == 0) || (page == 1) || (page == 4)) - { - compat_mode = true; - } - } - - bool proceed = (((!streamPassword.empty() && (updinfo || compat_mode) && (m_password == streamPassword)) || - (!streamAdminPassword.empty() && (m_password == streamAdminPassword)) || - (!gOptions.adminPassword().empty() && (m_password == gOptions.adminPassword())))); - - DEBUG_LOG(LOGNAME "Password status: " + tos(proceed)); - - if (proceed) - { - const streamData::streamID_t this_sid = (m_zeroSID || m_noSID ? 0 : m_sid); - const utf8& p1 = mapGet(m_httpRequestInfo.m_QueryParameters, mode, (utf8)""); - DEBUG_LOG(LOGNAME "Requested mode: " + (!mode.empty() ? mode : "Not Specified")); - if (updinfo) - { - m_updinfoSong = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "song", (utf8)"")); - m_updinfoURL = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "url", (utf8)"")); - m_updinfoDJ = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "dj", (utf8)"")); - m_updinfoNext = stripWhitespace(mapGet(m_httpRequestInfo.m_QueryParameters, "next", (utf8)"")); - m_state = ((m_updinfoSong.find(utf8("<?xml ")) != utf8::npos) ? &protocol_admincgi::state_UpdateXMLMetadata : &protocol_admincgi::state_UpdateMetadata); - m_result.run(); - } - else if (viewxml) - { - if (m_noSID) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - const bool iponly = mapGet(m_httpRequestInfo.m_QueryParameters, "iponly", (bool)false); - const bool ipcount = mapGet(m_httpRequestInfo.m_QueryParameters, "ipcount", (bool)false); - mode_viewxml(m_sid, page, iponly, ipcount); - } - } - else if (viewjson) - { - if (m_noSID) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - const bool iponly = mapGet(m_httpRequestInfo.m_QueryParameters, "iponly", (bool)false); - const bool ipcount = mapGet(m_httpRequestInfo.m_QueryParameters, "ipcount", (bool)false); - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - mode_viewjson(m_sid, page, iponly, ipcount, callback); - } - } - else if (_register) - { - if (m_noSID) - { - // do a sanity check so that we're only accessing this with the true adminpassword - if (m_zeroSID) - { - mode_summary(0); - } - // not matching the master password so show the simple summary - else - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - } - else - { - // see if connected otherwise block any access to the pages - bool connected = false; - if (p1 == "clear") - { - bool handled = false, idHandled = false; - // if we get a clear then just remove from the config and reload the page - if (gOptions.editConfigFileEntry(m_sid, gOptions.confFile(), "", "", - true, handled, idHandled, true) == false) - { - handled = false; - } - // now attempt to update internal states as appropriate if all went ok - if (handled == true) - { - gOptions.setOption(utf8("streamauthhash_" + tos(m_sid)), (utf8)""); - streamData *sd = streamData::accessStream(m_sid); - if (sd) - { - sd->streamUpdate(m_sid, (utf8)"", sd->streamMaxUser(), - sd->streamMaxBitrate(), sd->streamMinBitrate()); - sd->releaseStream(); - } - } - } - else - { - connected = true; - - // sanity checks to ensure that we're not re-adding when there is one, etc - streamData::streamInfo info; - streamData::extraInfo extra; - if (!streamData::getStreamInfo(m_sid, info, extra)) - { - info.m_authHash = gOptions.stream_authHash(m_sid); - } - - if (connected == true || extra.isRelay) - { - mode_register(m_sid, info); - } - } - - if (connected == false) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(this_sid), SHRINK)); - } - } - } - else if (mode == "listeners") - { - mode_listeners(this_sid); - } - else if (mode == "kicksrc") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - // kick source off system - streamData::killStreamSource(m_sid); - - if (!m_referer.empty()) - { - utf8 check = ("admin.cgi?sid=" + tos(m_sid)); - // if the referer is the server summary page then we need to go back to it - sendMessageAndClose(redirect((m_referer == check ? check : "admin.cgi?sid=0"), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else if (mode == "kickdst" && (!p1.empty())) - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - mode_kickdst(m_sid, p1); - } - } - else if (mode == "viewban") - { - mode_viewban(this_sid); - } - else if (mode == "bandst" && (!p1.empty())) - { - const int mask = mapGet(m_httpRequestInfo.m_QueryParameters, "banmsk", (int)255); - mode_ban(this_sid, p1, mask); - } - else if (mode == "banip") - { - const utf8 &ip1 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip1", (utf8)""), - &ip2 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip2", (utf8)""), - &ip3 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip3", (utf8)""), - &ip4 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip4", (utf8)""), - &mask = mapGet(m_httpRequestInfo.m_QueryParameters, "banmsk", (utf8)""); - if (ip1.empty() || ip2.empty() || ip3.empty() || ip4.empty() || mask.empty()) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(this_sid) + "&mode=viewban")) && - (m_referer != utf8("admin.cgi?mode=viewban"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "<html><head>" - "<title>Shoutcast Server</title></head><body>" - "Invalid resource</body></html>" : "")); - } - else - { - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(this_sid) + "&mode=viewban", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else - { - mode_ban(this_sid, (ip1 + "." + ip2 + "." + ip3 + "." + ip4), strtol((const char *)mask.c_str(),0,10)); - } - } - else if (mode == "unbandst") - { - const utf8 &ip = mapGet(m_httpRequestInfo.m_QueryParameters, "bandst", (utf8)""), - &mask = mapGet(m_httpRequestInfo.m_QueryParameters, "banmsk", (utf8)""); - if (ip.empty() || mask.empty()) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(this_sid) + "&mode=viewban")) && - (m_referer != utf8("admin.cgi?mode=viewban"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "<html><head>" - "<title>Shoutcast Server</title></head><body>" - "Invalid resource</body></html>" : "")); - } - else - { - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(this_sid) + "&mode=viewban", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else - { - mode_unban(this_sid, ip, strtol((const char *)mask.c_str(), 0, 10)); - } - } - else if (mode == "viewrip") - { - mode_viewrip(this_sid); - } - else if (mode == "ripip") - { - const utf8 &ip1 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip1", (utf8)""), - &ip2 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip2", (utf8)""), - &ip3 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip3", (utf8)""), - &ip4 = mapGet(m_httpRequestInfo.m_QueryParameters, "ip4", (utf8)""); - if (ip1.empty() || ip2.empty() || ip3.empty() || ip4.empty()) - { - // see if we've got a host add attempt and handle as appropriately - if (m_hostIP.empty()) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(m_sid) + "&mode=viewrip")) && - (m_referer != utf8("admin.cgi?mode=viewrip"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "<html><head>" - "<title>Shoutcast Server</title></head><body>" - "Invalid resource</body></html>" : "")); - } - else - { - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(m_sid) + "&mode=viewrip", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else - { - const utf8 &raw = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdstraw", (utf8)""); - mode_rip(this_sid, m_hostIP, raw); - } - } - else - { - const utf8 &raw = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdstraw", (utf8)""); - mode_rip(this_sid, (ip1 + "." + ip2 + "." + ip3 + "." + ip4), raw); - } - } - else if (mode == "unripdst") - { - const utf8 &ip = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdst", (utf8)""), - &raw = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdstraw", (utf8)""); - if (!isAddress(ip)) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(m_sid) + "&mode=viewrip")) && - (m_referer != utf8("admin.cgi?mode=viewrip"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "<html><head>" - "<title>Shoutcast Server</title></head><body>" - "Invalid resource</body></html>" : "")); - } - else - { - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(m_sid) + "&mode=viewrip", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else - { - mode_unrip(this_sid, ip, raw); - } - } - else if (mode == "ripdst" && (!p1.empty())) - { - const utf8 &raw = mapGet(m_httpRequestInfo.m_QueryParameters, "ripdstraw", (utf8)""); - mode_rip(this_sid, p1, raw); - } - else if (mode == "viewagent") - { - mode_viewagent(this_sid); - } - else if (mode == "unagent") - { - const utf8 &agent = mapGet(m_httpRequestInfo.m_QueryParameters, "agent", (utf8)""); - if (agent.empty()) - { - if ((m_referer != utf8("admin.cgi?sid=" + tos(m_sid) + "&mode=viewagent")) && - (m_referer != utf8("admin.cgi?mode=viewagent"))) - { - sendMessageAndClose(MSG_STD200 + utf8(!HEAD_REQUEST ? "<html><head>" - "<title>Shoutcast Server</title></head><body>" - "Invalid resource</body></html>" : "")); - } - else - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(m_sid) + "&mode=viewagent", SHRINK)); - } - } - else - { - mode_unagent(this_sid, agent); - } - } - else if (mode == "agent") - { - const utf8 &agent = mapGet(m_httpRequestInfo.m_QueryParameters, "agent", (utf8)""); - mode_agent(this_sid, agent); - } - else if (mode == "resetxml") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - stats::resetStats(m_sid); - if (!m_referer.empty()) - { - sendMessageAndClose(redirect("admin.cgi?sid=" + tos(m_sid), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else if (mode == "clearcache") - { - // TODO consider clearing out the intro / backup files as ell as part of this... - - // clear out all cached resource copies - gOptions.m_crossdomainStr.clear(); - gOptions.m_crossdomainStrGZ.clear(); - gOptions.m_shoutcastSWFStr.clear(); - gOptions.m_shoutcastSWFStrGZ.clear(); - gOptions.m_robotsTxtBody.clear(); - gOptions.m_robotsTxtBodyGZ.clear(); - - gOptions.m_faviconBody.clear(); - gOptions.m_faviconBodyGZ.clear(); - gOptions.m_favIconTime = 0; - - gOptions.m_styleCustomStr.clear(); - gOptions.m_styleCustomStrGZ.clear(); - gOptions.m_styleCustomHeaderTime = 0; - - DeleteAllCaches(); - - last_update_check = 0; - - ILOG(LOGNAME "Cleared resource cache(s)."); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "bannedlist") - { - reloadBanLists(); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "reservelist") - { - reloadRipLists(); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "adminlist") - { - reloadAdminAccessList(); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "useragentlist") - { - reloadAgentLists(); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "reload") - { - const int force = mapGet(m_httpRequestInfo.m_QueryParameters, "force", (int)0); - if (adminRefer) - { - sendMessageAndClose(redirect((reloadConfig(force) == true ? "admin.cgi?sid=0&refresh=3" : "admin.cgi?sid=0"), SHRINK)); - } - else - { - reloadConfig(force); - sendMessageAndClose(MSG_200); - } - } - else if (mode == "viewlog") - { - if (m_noSID) - { - const utf8 &server = mapGet(m_httpRequestInfo.m_QueryParameters, "server", (utf8)""); - if (!server.empty() && ((server == logId) || (server == logTailId))) - { - mode_viewlog(m_sid, (p1 == "tail"), (p1 == "save"), true); - } - else - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - } - else - { - mode_viewlog(m_sid, (p1 == "tail"), (p1 == "save"), false); - } - } - else if (mode == "history") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - const utf8 &type = mapGet(m_httpRequestInfo.m_QueryParameters, "type", (utf8)""); - const bool json = (type == "json"), xml = (type == "xml"); - if (!json && !xml) - { - mode_history(m_sid); - } - else - { - utf8 header, body; - if (json) - { - const utf8& callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - body = protocol_HTTPStyle::getPlayedJSON(m_sid, header, callback, true); - } - else - { - body = protocol_HTTPStyle::getPlayedXML(m_sid, header, true); - } - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - } - } - else if (mode == "art") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - mode_art(m_sid, (p1 == "playing")); - } - } - else if (mode == "manualauthhash") - { - bool handled = false; - const utf8 &authhash = mapGet(m_httpRequestInfo.m_QueryParameters, "authhash", (utf8)""); - // make sure that we're only allow valid values - if (authhash.empty() || yp2::isValidAuthhash(authhash)) - { - bool idHandled = false; - if (gOptions.editConfigFileEntry(m_sid, gOptions.confFile(), authhash, "", - true, handled, idHandled, true) == false) - { - handled = false; - } - - // changed in b69 to force the change through even if there is a config saving issue - // as there are cases where the authhash is gone but only updating on success would - // end up in the inability to start things over again e.g. with CentroCast v3 quirks - gOptions.setOption(utf8("streamauthhash_" + tos(m_sid)), authhash); - } - - streamData *sd = streamData::accessStream(m_sid); - if (sd) - { - if (sd->isSourceConnected(m_sid)) - { - utf8 oldAuthhash = sd->streamAuthhash(); - sd->streamUpdate(m_sid, authhash, sd->streamMaxUser(), - sd->streamMaxBitrate(), sd->streamMinBitrate()); - - ILOG(gOptions.logSectionName() + "Changed authhash for stream #" + - tos(m_sid) + " to " + (authhash.empty() ? "empty" : authhash) + - " [was " + (oldAuthhash.empty() ? "empty" : oldAuthhash) + "]"); - } - sd->releaseStream(); - } - - // now attempt to update internal states as appropriate if all went ok - if (handled == true) - { - sendMessageAndClose("HTTP/1.1 200 OK\r\n" - "Content-Type:text/plain\r\n" - "Content-Length:5\r\n" - "Cache-Control:no-cache\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Connection:close\r\n\r\n200\r\n"); - } - else - { - utf8 message = "Error saving changes to the configuration file.<br>" - "Check that you have write access and the<br>" - "specified configuration file still exists.<br><br>" - "The requested authhash change was applied."; - utf8 header = "HTTP/1.1 667\r\n" - "Content-Type:text/plain\r\n" - "Access-Control-Allow-Origin:*\r\n" - "Connection:close\r\n"; - COMPRESS(header, message); - header += "Content-Length:" + tos(message.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? message : "")); - } - } - else if (mode == "rotate") - { - const utf8 &files = mapGet(m_httpRequestInfo.m_QueryParameters, "files", (utf8)""), - &rotateType = (!(files == "log" || files == "w3c") ? "all " : (files == "log" ? "": "W3C ")); - ILOG(LOGNAME "Rotating " + rotateType + "log file(s)"); - - if ((files == "log") || (files == "")) - { - ROTATE; - printUpdateMessage(); - if (m_logFile) - { - ::fclose(m_logFile); - m_logFile = 0; - } - } - - // and now rotate the w3c logs (going upto the configured number of old copies to be like the log rotate) - rotatew3cFiles(files); - - ILOG(LOGNAME "Rotated " + rotateType + "log file(s) [PID: " + tos(getpid()) + "]"); - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "startrelay") - { - if (m_noSID) - { - if (adminRefer) - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - // only attempt a source relay connection if it is not signaled - // as active or pending to prevent multiple attempts being run. - bool noEntry = false, active = (streamData::isRelayActive(m_sid, noEntry) == 1); - if (!active) - { - config::streamConfig stream; - if (gOptions.getStreamConfig(stream, m_sid)) - { - restartRelay(stream); - } - } - - if (!m_referer.empty()) - { - utf8 check = ("admin.cgi?sid=" + tos(m_sid)); - // if the referer is the server summary page then we need to go back to it - sendMessageAndClose(redirect((m_referer == check ? check : "admin.cgi?sid=0") + - (!active ? "&refresh=3" : ""), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - } - else if (mode == "startrelays") - { - bool refresh = false; - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if (!(*i).second.m_relayUrl.url().empty() && !streamData::isSourceConnected((*i).first)) - { - // only attempt a source relay connection if it is not signaled - // as active or pending to prevent multiple attempts being run. - bool noEntry = false, active = (streamData::isRelayActive((*i).first, noEntry) == 1); - if (!active) - { - ILOG(gOptions.logSectionName() + "Starting source for stream #" + tos((*i).first) + "."); - restartRelay((*i).second); - refresh = true; - } - } - } - - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi?sid=0" + (refresh ? "&refresh=3" : (utf8)""), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if (mode == "kicksources") - { - bool refresh = false; - streamData::streamIDs_t streamIds = streamData::getStreamIds(true); - if (!streamIds.empty()) - { - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - // kick source off system - streamData::killStreamSource((*i)); - refresh = true; - } - } - - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi?sid=0" + (refresh ? "&refresh=1" : (utf8)""), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else if(mode == "bandwidth") - { - const utf8 &type = mapGet(m_httpRequestInfo.m_QueryParameters, "type", (utf8)""); - const bool json = (type == "json"), xml = (type == "xml"); - - if (!json && !xml) - { - const int refresh = mapGet(m_httpRequestInfo.m_QueryParameters, "refresh", 0); - mode_bandwidth_html(refresh); - } - else - { - if (json) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - mode_bandwidth_json(callback); - } - else - { - mode_bandwidth_xml(); - } - } - } - else if (mode == "ypstatus") - { - const utf8 &type = mapGet(m_httpRequestInfo.m_QueryParameters, "type", (utf8)""); - if ((type == "json")) - { - const utf8 &callback = mapGet(m_httpRequestInfo.m_QueryParameters, "callback", (utf8)""); - mode_ypstatus_json(callback); - } - else - { - mode_ypstatus_xml(); - } - } - else if (mode == "sources") - { - mode_sources(m_hostIP); - } - else if (mode == "adgroups") - { - mode_adgroups(); - } - else if (mode == "debug") - { - const utf8 &option = mapGet(m_httpRequestInfo.m_QueryParameters, "option", (utf8)""); - if (!option.empty() && !adminRefer) - { - // prevent direct access to being able to edit this - // and force a redirection to the non-param version - sendMessageAndClose(redirect("admin.cgi?mode=debug", SHRINK)); - return; - } - - const utf8 &on_off = mapGet(m_httpRequestInfo.m_QueryParameters, "on", (utf8)""); - mode_debug(option, (on_off == "true"), adminRefer); - } - else if (mode == "help") - { - mode_help(); - } - else if (mode == "config") - { - mode_config(); - } -#if 0 - else if (mode == "logs") - { - mode_logs(result); - } -#endif - else if (mode == "version") - { - // only allow from the admin page to avoid possible spamming sttempts - if (adminRefer) - { - checkVersion(m_lastActivityTime); - sendMessageAndClose(redirect("admin.cgi?sid=0&refresh=-3", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } - else - { - if (m_noSID) - { - // do a sanity check so that we're only accessing this with the true adminpassword - if (m_zeroSID) - { - mode_summary(mapGet(m_httpRequestInfo.m_QueryParameters, "refresh", 0)); - } - // not matching the master password so show the simple summary - else - { - sendMessageAndClose(redirect("index.html", SHRINK)); - } - } - else - { - const int refresh = mapGet(m_httpRequestInfo.m_QueryParameters, "refresh", 0); - mode_none(m_sid, refresh); - } - } - } - else - { - sendMessageAndClose(MSG_AUTHFAILURE401 + utf8(!HEAD_REQUEST ? - "<html><head>Unauthorized<title>Shoutcast " - "Administrator</title></head></html>" : "")); - } -} - -void protocol_admincgi::state_SendFileHeader() throw(std::exception) -{ - if ((!m_saveLogFile && SHRINK) && - compressDataStart(m_logFileBodyPrefix, &m_stream, (Bytef*)"sc_serv.log\0", false)) - { - m_logFileHeader += "Content-Encoding:gzip\r\n"; - } - m_logFileHeader += "\r\n"; - - m_outMsg = m_logFileHeader + (!m_saveLogFile ? tohex(m_logFileBodyPrefix.size()) + "\r\n" + m_logFileBodyPrefix + "\r\n" : ""); - m_outBuffer = m_outMsg.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)m_outMsg.size())); - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_SendFileContents; - m_result.write(); - - if (m_tailLogFile) - { - m_result.read(fileno(m_logFile)); - } -} - -void protocol_admincgi::state_SendFileFooter() throw(std::exception) -{ - if (SHRINK) - { - compressDataCont(m_logFileBodyFooter, &m_stream); - } - m_logFileBodyFooter = tohex(m_logFileBodyFooter.size()) + "\r\n" + m_logFileBodyFooter + "\r\n"; - m_outBuffer = m_logFileBodyFooter.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)m_logFileBodyFooter.size())); - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_SendFileEnd; - m_result.write(); -} - -void protocol_admincgi::state_SendFileEnd() throw(std::exception) -{ - strncpy((char*)&(m_logFileBuffer[0]), "0\r\n\r\n", 1024); - m_outBuffer = &(m_logFileBuffer[0]); - m_outBufferSize = 5; - m_nextState = &protocol_admincgi::state_Close; - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, m_outBufferSize); - compressDataEnd(&m_stream); - - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_Close; - m_result.write(); -} - -// this will only be receiving an already converted -// string so no need to do the commented part again -utf8 protocol_admincgi::escapeText(const std::vector<uniString::utf8::value_type> &s) throw() -{ - utf8 result; - result.resize(0); - bool inHead = false; - int headCount = 0; - const size_t amt = s.size(); - - for (size_t x = 0; x < amt; ++x) - { - if ((s[x] == '*') && (((x + 1) < amt) && (s[x + 1] == '*'))) - { - inHead = true; - } - else if (s[x] == '\n') - { - if (!inHead) - { - if ((((x + 1) < amt) && isdigit(s[x + 1]))) - { - if (inMsg) - { - result += "</b>"; - } - result += "\n"; - inMsg = false; - } - else - { - if (((x + 1) == amt)) - { - if (inMsg) - { - result += "</b>"; - } - result += "\n"; - inMsg = false; - } - else - { - result += "\n\t\t\t"; - } - } - } - else - { - ++headCount; - } - } - else if ((s[x] == 'D') && - (((x > 0) && (s[x - 1] == '\t')) || - (!x && (lastChar == '\t')))) - { - result += "<b class=\"d\">D"; - inMsg = true; - } - else if ((s[x] == 'E') && - (((x > 0) && (s[x - 1] == '\t')) || - (!x && (lastChar == '\t')))) - { - result += "<b class=\"e\">E"; - inMsg = true; - } - else if ((s[x] == 'W') && - (((x > 0) && (s[x - 1] == '\t')) || - (!x && (lastChar == '\t')))) - { - result += "<b class=\"w\">W"; - inMsg = true; - } - else if ((s[x] == 'U') && - (((x > 0) && (s[x-1] == '\t')) || - (!x && (lastChar == '\t')))) - { - result += "<b class=\"u\">U"; - inMsg = true; - } - else if ((s[x] == 'I') && - (((x > 0) && (s[x-1] == '\t')) || - (!x && (lastChar == '\t')))) - { - if (!inHead) - { - result += "<b class=\"i\">I"; - inMsg = true; - } - } - else - { - if (!inHead) - { - if (s[x] == '<') - { - result += "<"; - } - else if (s[x] == '>') - { - result += ">"; - } - else if (s[x] == '&') - { - result += "&"; - } - else if (s[x] == '\'') - { - result += "'"; - } - else if (s[x] == '"') - { - result += """; - } - else - { - result += s[x]; - } - } - else - { - if (inHead && (headCount > 3) && (s[x] == '\t')) - { - inHead = false; - headCount = 0; - x += 5; - } - } - } - if (!s[x]) - { - break; - } - } - - lastChar = s[amt - 1]; - return result; -} - -void protocol_admincgi::state_SendFileContents() throw(std::exception) -{ - m_logFileBuffer.clear(); - m_logFileBuffer.resize(SEND_SIZE); - const size_t amt = fread(&(m_logFileBuffer[0]), 1, (SEND_SIZE - 1), m_logFile); - if (amt > 0) - { - static utf8 out; - out.clear(); - - if (!m_saveLogFile) - { - m_logFileBuffer.resize(amt); - out = escapeText(m_logFileBuffer); - } - else - { - out = utf8(&(m_logFileBuffer[0]), amt); - } - - if (!out.empty()) - { - if (m_saveLogFile || (SHRINK)) - { - if (m_saveLogFile == 1) - { - if (compressDataStart(out, &m_stream, (Bytef*)m_logFileName.c_str())) - { - m_saveLogFile = 2; - } - } - else - { - compressDataCont(out, &m_stream); - } - } - out = tohex(out.size()) + "\r\n" + out + "\r\n"; - m_outBuffer = out.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)out.size())); - m_nextState = &protocol_admincgi::state_SendFileContents; - } - else - { - m_nextState = (m_saveLogFile ? &protocol_admincgi::state_SendFileEnd : &protocol_admincgi::state_SendFileFooter); - } - - m_state = &protocol_admincgi::state_Send; - m_result.write(); - - if (m_tailLogFile) - { - m_result.timeout(1); - m_result.read(fileno(m_logFile)); - } - } - else if (ferror(m_logFile) || !m_logFile) - { - m_state = &protocol_admincgi::state_Close; - m_result.run(); - } - else if (feof(m_logFile) && (!m_tailLogFile)) - { - if (m_saveLogFile) - { - static utf8 out; - out.clear(); - compressDataFinish(out, &m_stream); - out = tohex(out.size()) + "\r\n" + out + "\r\n"; - m_outBuffer = out.c_str(); - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, (m_outBufferSize = (int)out.size())); - - m_state = &protocol_admincgi::state_Send; - m_nextState = &protocol_admincgi::state_SendFileEnd; - } - else - { - m_state = &protocol_admincgi::state_SendFileFooter; - } - - m_result.write(); - m_result.run(); - } - else - { - m_result.timeout(10); - } -} - -// display log -void protocol_admincgi::mode_viewlog(const streamData::streamID_t sid, const bool tail, const bool save, const bool server) throw() -{ - if (!save) - { - utf8 headerTitle = utf8(utf8("Server Log") + (tail ? " (Tailing)":"")); - m_logFileHeader = MSG_NO_CLOSE_200; - - m_logFileBodyPrefix += (server ? getServerAdminHeader(headerTitle) : - getStreamAdminHeader(sid, headerTitle)) + getUptimeScript() + - (tail ? "<div style=\"padding:1em;\"><b>Showing log output from the current log " - "position and onwards. Click <a href=\"admin.cgi?mode=viewlog&server=" + - randomId(logTailId) + "\">here</a> to view the complete log output or <a " - "href=\"admin.cgi?mode=viewlog&server=" + logId + "&viewlog=save\">here</a> " - "to save the complete log output. When tailing the log output, there may be " - "a delay before any new log output will appear and it may also stop updating if " - "there is no log activity depending on configured timeouts. Reload the page if this " - "should happens.</b></div>" : "") + getIEFlexFix() + - "<pre id=\"log\" style=\"tab-size:16;-moz-tab-size:16;-o-tab-size:16;\"><font class=\"t\">"; - - // doing to just make sure that the end of the output should be correct - m_logFileBodyFooter = "</font>\n</pre>" + getfooterStr(); - m_tailLogFile = tail; - - if (server || !(gOptions.read_stream_adminPassword(sid) && !gOptions.stream_adminPassword(sid).empty())) - { - const utf8 &file = mapGet(m_httpRequestInfo.m_QueryParameters, "file", gOptions.realLogFile()); - - m_logFile = uniFile::fopen(file, "r"); - if (m_logFile) - { - m_logFileName = fileUtil::stripPath(file); - m_logFileName.push_back('\0'); - - if (m_tailLogFile) - { - ::fseek(m_logFile, 0, SEEK_END); - } - } - } - else - { - utf8 body = m_logFileBodyPrefix + "Viewing Not Allowed With Current Permissions</pre>" + m_logFileBodyFooter; - COMPRESS(m_logFileHeader, body); - m_logFileHeader += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(m_logFileHeader + (!HEAD_REQUEST ? body : "")); - return; - } - - if (!m_logFile) - { - utf8 body = m_logFileBodyPrefix + "Log File Not Found (" + - stripWhitespace(errMessage()) + ")</pre>" + - m_logFileBodyFooter; - COMPRESS(m_logFileHeader, body); - m_logFileHeader += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(m_logFileHeader + (!HEAD_REQUEST ? body : "")); - } - else - { - m_logFileHeader += "Transfer-Encoding:chunked\r\n"; - m_state = &protocol_admincgi::state_SendFileHeader; - m_result.run(); - } - } - else - { - if (server || !(gOptions.read_stream_adminPassword(sid) && !gOptions.stream_adminPassword(sid).empty())) - { - const utf8 &file = mapGet(m_httpRequestInfo.m_QueryParameters, "file", gOptions.realLogFile()); - - m_logFile = uniFile::fopen(file, "r"); - if (m_logFile) - { - m_logFileName = fileUtil::stripPath(file); - m_logFileHeader = "HTTP/1.1 200 OK\r\n" - "Content-Type:application/x-gzip-compressed\r\n" - "Content-Disposition:attachment;filename=\"" + - m_logFileName + ".gz\"\r\n"; - m_saveLogFile = true; - } - } - else - { - sendMessageAndClose(MSG_HTTP403); - return; - } - - if (!m_logFile) - { - sendMessageAndClose(MSG_HTTP404); - } - else - { - m_logFileHeader += "Transfer-Encoding:chunked\r\n"; - m_state = &protocol_admincgi::state_SendFileHeader; - m_result.run(); - } - } -} - -// shown played history (as is also shown on the public pages if enabled) -void protocol_admincgi::mode_history(const streamData::streamID_t sid) throw() -{ - utf8 header = MSG_NO_CLOSE_200, - body = getStreamAdminHeader(sid, "Stream History") + - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" " - "cellspacing=\"0\"><tr valign=\"top\"><td>" + - protocol_HTTPStyle::getPlayedBody(sid) + "</table>" + - getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -// remove an IP from the rip list -void protocol_admincgi::mode_unrip(const streamData::streamID_t sid, const utf8 &ripAddr, const utf8 &rawIpAddr) throw() -{ - utf8 msg; - try - { - size_t stream_ID = ((gOptions.read_stream_ripFile(sid) && !gOptions.stream_ripFile(sid).empty()) ? sid : 0); - if (isAddress(ripAddr)) - { - bool ret = g_ripList.remove(ripAddr,stream_ID,false), usingRaw = false; - if (!ret && !rawIpAddr.empty()) - { - ret = g_ripList.remove(rawIpAddr,stream_ID,false); - if (ret) usingRaw = true; - } - if (ret) - { - ILOG("[RIP] Removed `" + (!usingRaw ? ripAddr : rawIpAddr) + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - - if (gOptions.saveRipListOnExit()) - { - if (stream_ID && gOptions.read_stream_ripFile(stream_ID) && !gOptions.stream_ripFile(stream_ID).empty()) - { - g_ripList.save(gOptions.stream_ripFile(stream_ID),stream_ID); - } - else - { - g_ripList.save(gOptions.ripFile(),0); - } - } - - stats::updateRipClients(stream_ID, (!usingRaw ? ripAddr : rawIpAddr), false); - } - else - { - ILOG("[RIP] Unable to remove `" + ripAddr + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - } - } - else - { - ILOG("[RIP] `" + ripAddr + "' is not a valid value. Skipping removing from the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewrip"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewrip") ? "" : "&mode=viewrip"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// add an IP / hostname to the rip list -void protocol_admincgi::mode_rip(const streamData::streamID_t sid, const utf8 &ripAddr, const utf8 &rawIpAddr) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_ripFile(sid) && !gOptions.stream_ripFile(sid).empty()) ? sid : 0); - if (isAddress(ripAddr)) - { - if (!g_ripList.find(ripAddr,stream_ID)) - { - bool added = g_ripList.add(ripAddr,stream_ID, true), usingRaw = false; - if (!added && !rawIpAddr.empty()) - { - if (g_ripList.add(rawIpAddr,stream_ID, false)) - { - usingRaw = true; - } - } - - ILOG("[RIP] Added `" + (!usingRaw ? ripAddr : rawIpAddr) + "' to " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - - if (gOptions.saveRipListOnExit()) - { - if (stream_ID && gOptions.read_stream_ripFile(stream_ID) && !gOptions.stream_ripFile(stream_ID).empty()) - { - g_ripList.save(gOptions.stream_ripFile(stream_ID),stream_ID); - } - else - { - g_ripList.save(gOptions.ripFile(),0); - } - } - stats::updateRipClients(stream_ID, (!usingRaw ? ripAddr : rawIpAddr), true); - } - else - { - ILOG("[RIP] `" + ripAddr + "' already in the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - } - } - else - { - ILOG("[RIP] `" + ripAddr + "' is not a valid value. Skipping adding to the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewrip"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewrip") ? "" : "&mode=viewrip"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// show rip list -void protocol_admincgi::mode_viewrip(const streamData::streamID_t sid) throw() -{ - vector<ripList::rip_t> rip_list; - g_ripList.get(rip_list,((gOptions.read_stream_ripFile(sid) && !gOptions.stream_ripFile(sid).empty()) ? sid : 0)); - - utf8 header = MSG_NO_CLOSE_200, - headerTitle = (!sid ? "Server Reserved List" : "Stream Reserved List"), - body = (!sid ? getServerAdminHeader(headerTitle) : getStreamAdminHeader(sid, headerTitle)) + - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr valign=\"top\"><td>"; - - if (rip_list.empty()) - { - body += "<b> No Reserved Entries</b><br>"; - } - else - { - body += "<b> Reserved Entry List:</b><ol>"; - for (vector<ripList::rip_t>::const_iterator i = rip_list.begin(); i != rip_list.end(); ++i) - { - body += "<li><b>" + aolxml::escapeXML((*i).m_numericIP) + "</b>" + - (!(*i).m_hostIP.empty() ? " (" + aolxml::escapeXML((*i).m_hostIP) + ")" : "") + - " - <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=unripdst&ripdst=" + - urlUtils::escapeURI_RFC3986((*i).m_numericIP) + "\">remove</a>"; - } - body += "</ol>"; - } - - body += - "</td><td style=\"padding:0 1em 0 1em;\"><br>" - "<table class=\"ent\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" align=\"right\">" - "<tr class=\"ent\">" - "<td class=\"inp\" align=\"center\">Reserve Connection Slot by IP</td>" - "</tr>" - "<form method=\"url\" action=\"admin.cgi\">" - "<tr>" - "<td><table cellspacing=\"0\" cellpadding=\"3\" border=\"0\">" - "<tr>" - "<td align=\"center\">Enter the IP address:<br><i>(example: 127.0.0.1)</i></td>" - "</tr>" - "<tr>" - "<td align=\"center\">" - "<input name=\"mode\" value=\"ripip\" type=\"hidden\">" - "<input name=\"sid\" value=\"" + tos(sid) + "\" type=\"hidden\">" - "<input name=\"ip1\" size=\"3\" maxlength=\"3\">." - "<input name=\"ip2\" size=\"3\" maxlength=\"3\">." - "<input name=\"ip3\" size=\"3\" maxlength=\"3\">." - "<input name=\"ip4\" size=\"3\" maxlength=\"3\">" - "</td>" - "</tr>" - "<tr>" - "<td colspan=\"2\" align=\"center\"><input class=\"submit\" type=\"submit\" value=\"Reserve IP\">" - " <input class=\"submit\" value=\"Clear\" type=\"Reset\"></td>" - "</tr>" - "</table>" - "</td>" - "</tr>" - "</table>" - "</td>" - "<td style=\"padding: 0 1em 0 0;\"><br>" - "<table class=\"ent\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" align=\"left\">" - "<tr class=\"ent\">" - "<td class=\"inp\" align=\"center\">Reserve Connection Slot by Host</td>" - "</tr>" - "<form method=\"url\" action=\"admin.cgi\">" - "<tr>" - "<td><table cellspacing=\"0\" cellpadding=\"3\" border=\"0\">" - "<tr>" - "<td align=\"center\">Enter the hostname:<br><i>(example: my.example.com)</i></td>" - "</tr>" - "<tr>" - "<td align=\"center\">" - "<input name=\"mode\" value=\"ripip\" type=\"hidden\">" - "<input name=\"sid\" value=\"" + tos(sid) + "\" type=\"hidden\">" - "<input name=\"ripdstraw\" size=\"30\" maxlength=\"256\">" - "</td>" - "</tr>" - "<tr>" - "<td colspan=\"2\" align=\"center\"><input class=\"submit\" type=\"submit\" value=\"Reserve Host\">" - " <input class=\"submit\" value=\"Clear\" type=\"Reset\"></td>" - "</tr>" - "</table>" - "</td>" - "</tr>" - "</table>" - "</td>" - "</tr>" - "</form>" - "</table>" + - getUptimeScript() + - getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -// show ban lists -void protocol_admincgi::mode_viewban(const streamData::streamID_t sid) throw() -{ - vector<banList::ban_t> ban_list; - g_banList.get(ban_list,((gOptions.read_stream_banFile(sid) && !gOptions.stream_banFile(sid).empty()) ? sid : 0)); - - utf8 header = MSG_NO_CLOSE_200, - headerTitle = (!sid ? "Server Ban List" : "Stream Ban List"), - body = (!sid ? getServerAdminHeader(headerTitle) : getStreamAdminHeader(sid, headerTitle)) + - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr valign=\"top\"><td>"; - - if (ban_list.empty()) - { - body += "<b> No Banned Entries</b><br>"; - } - else - { - body += "<b> Ban Entry List:</b><ol>"; - for (vector<banList::ban_t>::const_iterator i = ban_list.begin(); i != ban_list.end(); ++i) - { - body += "<li><b>" + aolxml::escapeXML((*i).m_numericIP) + "</b>" + - (!(*i).m_comment.empty() ? " : <b>" + aolxml::escapeXML((*i).m_comment) + "</b>" : "") + - " - " + ((*i).m_mask == 255 ? "Single IP" : "Subnet") + " ban - " - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=unbandst&bandst=" + - urlUtils::escapeURI_RFC3986((*i).m_numericIP) + "&banmsk=" + tos((*i).m_mask) + "\">remove</a>"; - } - body += "</ol>"; - } - - body += - "</td><td style=\"padding:0 1em 0 1em;\"><br>" - "<table class=\"ent\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" align=\"right\">" - "<tr class=\"ent\">" - "<td class=\"inp\" align=\"center\">Ban a Single IP</td>" - "</tr>" - "<form method=\"url\" action=\"admin.cgi\">" - "<tr>" - "<td><table cellspacing=\"0\" cellpadding=\"3\" border=\"0\">" - "<tr>" - "<td align=\"center\">Enter the IP address:<br><i>(example: 127.0.0.1)</i></td>" - "</tr>" - "<tr>" - "<td align=\"center\">" - "<input name=\"mode\" value=\"banip\" type=\"hidden\">" - "<input name=\"sid\" value=\"" + tos(sid) + "\" type=\"hidden\">" - "<input name=\"ip1\" size=\"3\" maxlength=\"3\">." - "<input name=\"ip2\" size=\"3\" maxlength=\"3\">." - "<input name=\"ip3\" size=\"3\" maxlength=\"3\">." - "<input name=\"ip4\" size=\"3\" maxlength=\"3\">" - "<input type=\"hidden\" name=\"banmsk\" value=\"255\"></td>" - "</tr>" - "<tr>" - "<td colspan=\"2\" align=\"center\"><input class=\"submit\" type=\"submit\" value=\"Ban Single IP\">" - " <input class=\"submit\" value=\"Clear\" type=\"Reset\"></td>" - "</tr>" - "</table>" - "</td>" - "</tr>" - "</form>" - "</table>" - "</td>" - "<td style=\"padding: 0 1em 0 0;\"><br>" - "<table class=\"ent\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" align=\"left\">" - "<tr class=\"ent\">" - "<td class=\"inp\" align=\"center\">Ban an Entire Subnet</td>" - "</tr>" - "<form method=\"url\" action=\"admin.cgi\">" - "<tr>" - "<td><table cellspacing=\"0\" cellpadding=\"3\" border=\"0\">" - "<tr>" - "<td align=\"center\">Enter the Subnet address:<br><i>(example: 255.255.255)</i></td>" - "</tr>" - "<tr>" - "<td align=\"center\">" - "<input name=\"mode\" value=\"banip\" type=\"hidden\">" - "<input name=\"sid\" value=\"" + tos(sid) + "\" type=\"hidden\">" - "<input name=\"ip1\" size=\"1\" maxlength=\"3\">." - "<input name=\"ip2\" size=\"1\" maxlength=\"3\">." - "<input name=\"ip3\" size=\"1\" maxlength=\"3\">.0-255" - "<input name=\"ip4\" value=\"0\" type=\"hidden\">" - "<input type=\"hidden\" name=\"banmsk\" value=\"0\"></td>" - "</tr>" - "<tr>" - "<td colspan=\"2\" align=\"center\"><input class=\"submit\" type=\"submit\" value=\"Ban Whole Subnet\">" - " <input class=\"submit\" value=\"Clear\" type=\"Reset\"></td>" - "</tr>" - "</table>" - "</td>" - "</tr>" - "</table>" - "</td>" - "</tr>" - "</form>" - "</table>" + - getUptimeScript() + - getIEFlexFix() + - getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -// remove an IP and mask from the ban list -void protocol_admincgi::mode_unban(const streamData::streamID_t sid, const utf8 &banAddr, const int banMask) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_banFile(sid) && !gOptions.stream_banFile(sid).empty()) ? sid : 0); - if (isAddress(banAddr)) - { - if (g_banList.remove(banAddr,banMask,stream_ID,false)) - { - ILOG("[BAN] Removed `" + banAddr + "/" + tos(banMask) + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - - if (gOptions.saveBanListOnExit()) - { - if (stream_ID && gOptions.read_stream_banFile(stream_ID) && !gOptions.stream_banFile(stream_ID).empty()) - { - g_banList.save(gOptions.stream_banFile(stream_ID),stream_ID); - } - else - { - g_banList.save(gOptions.banFile(),0); - } - } - } - else - { - ILOG("[BAN] Unable to remove `" + banAddr + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - } - } - else - { - ILOG("[BAN] `" + banAddr + "' is not a valid value. Skipping removing from the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewban"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewban") ? "" : "&mode=viewban"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// add an IP and mask to the ban list -void protocol_admincgi::mode_ban(const streamData::streamID_t sid, const utf8 &banAddrs, const int banMask) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_banFile(sid) && !gOptions.stream_banFile(sid).empty()) ? sid : 0); - if (!g_banList.find(banAddrs,banMask,stream_ID)) - { - g_banList.add(banAddrs,banMask,"",stream_ID); - ILOG("[BAN] Added `" + banAddrs + "/" + tos(banMask) + "' to " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - - if (gOptions.saveBanListOnExit()) - { - if (stream_ID && gOptions.read_stream_banFile(stream_ID) && !gOptions.stream_banFile(stream_ID).empty()) - { - g_banList.save(gOptions.stream_banFile(stream_ID),stream_ID); - } - else - { - g_banList.save(gOptions.banFile(),0); - } - } - } - else - { - ILOG("[BAN] `" + banAddrs + "' already in the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " ban list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewban"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewban") ? "" : "&mode=viewban"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - // additionally when a ban happens then we attempt to kick the client(s) at the same time - const utf8 &p1 = mapGet(m_httpRequestInfo.m_QueryParameters, "kickdst", (utf8)""); - if (!p1.empty()) - { - // split out multiple clients to kick (split by a ,) - std::vector<uniString::utf8> addrs = tokenizer(p1, ','); - for (vector<uniString::utf8>::const_iterator i = addrs.begin(); i != addrs.end(); ++i) - { - if ((*i).find(utf8(".")) == utf8::npos) - { - stats::kickClient(sid, atoi((*i).hideAsString().c_str())); - } - else - { - stats::kickClient(sid, (*i)); - } - } - } - - sendMessageAndClose(msg); -} - -// remove an agent from the agent list -void protocol_admincgi::mode_unagent(const streamData::streamID_t sid, const utf8 &agent) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_agentFile(sid) && !gOptions.stream_agentFile(sid).empty()) ? sid : 0); - bool ret = g_agentList.remove(agent,stream_ID,false); - if (!ret && !agent.empty()) - { - ret = g_agentList.remove(agent,stream_ID,false); - } - if (ret) - { - ILOG("[AGENT] Removed `" + agent + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list"); - - if (gOptions.saveAgentListOnExit()) - { - if (stream_ID && gOptions.read_stream_agentFile(stream_ID) && !gOptions.stream_agentFile(stream_ID).empty()) - { - g_agentList.save(gOptions.stream_agentFile(stream_ID),stream_ID); - } - else - { - g_agentList.save(gOptions.agentFile(),0); - } - } - } - else - { - ILOG("[AGENT] Unable to remove `" + agent + "' from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list"); - } - - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewagent"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewagent") ? "" : "&mode=viewagent"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// add an IP / hostname to the user agent list -void protocol_admincgi::mode_agent(const streamData::streamID_t sid, const utf8 &agent) throw() -{ - utf8 msg; - try - { - const size_t stream_ID = ((gOptions.read_stream_agentFile(sid) && !gOptions.stream_agentFile(sid).empty()) ? sid : 0); - if (!g_agentList.find(agent,stream_ID)) - { - if (g_agentList.add(agent, stream_ID, true)) - { - ILOG("[AGENT] Added `" + agent + "' to " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list"); - } - - stats::kickClientList_t kick_data; - stats::getClientDataForKicking(stream_ID, kick_data); - for (stats::kickClientList_t::const_iterator i = kick_data.begin(); i != kick_data.end(); ++i) - { - if (!(*i)->m_kicked && ((*i)->m_userAgent == agent)) - { - stats::kickClient(sid, (*i)->m_unique); - } - delete (*i); - } - - if (gOptions.saveAgentListOnExit()) - { - if (stream_ID && gOptions.read_stream_agentFile(stream_ID) && !gOptions.stream_agentFile(stream_ID).empty()) - { - g_agentList.save(gOptions.stream_agentFile(stream_ID),stream_ID); - } - else - { - g_agentList.save(gOptions.agentFile(),0); - } - } - } - else - { - ILOG("[AGENT] `" + agent + "' already in the " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " user agent list"); - } - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer == "admin.cgi?sid=" + tos(sid) ? "" : "&mode=viewagent"), SHRINK) : MSG_200); - } - catch(const exception &ex) - { - msg = (!m_referer.empty() ? redirect("admin.cgi?sid=" + tos(sid) + (m_referer != utf8("admin.cgi?sid=" + tos(sid) + "&mode=viewagent") ? "" : "&mode=viewagent"), SHRINK) : MSG_200); - ELOG(ex.what()); - } - - sendMessageAndClose(msg); -} - -// show agent list -void protocol_admincgi::mode_viewagent(const streamData::streamID_t sid) throw() -{ - vector<agentList::agent_t> agent_list; - g_agentList.get(agent_list,((gOptions.read_stream_agentFile(sid) && !gOptions.stream_agentFile(sid).empty()) ? sid : 0)); - - utf8 header = MSG_NO_CLOSE_200, - headerTitle = (!sid ? "Server Blocked User Agent List" : - "Stream Blocked User Agent List"), - body = (!sid ? getServerAdminHeader(headerTitle, 0, "", 2) : getStreamAdminHeader(sid, headerTitle, 0, true)) + - "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr valign=\"top\"><td>"; - - if (agent_list.empty()) - { - body += "<b> No Blocked User Agents</b><br>"; - } - else - { - body += "<b> Blocked User Agent List:</b><ol>"; - for (vector<agentList::agent_t>::const_iterator i = agent_list.begin(); i != agent_list.end(); ++i) - { - const streamData::source_t clientType = ((streamData::source_t)streamData::UNKNOWN); - body += "<li>" + getClientImage(streamData::getClientType(clientType, stringUtil::toLower((*i).m_agent))) + - " <b>" + aolxml::escapeXML((*i).m_agent) + "</b> - <a href=\"admin.cgi?sid=" + tos(sid) + - "&mode=unagent&agent=" + urlUtils::escapeURI_RFC3986((*i).m_agent) + "\">remove</a>"; - } - body += "</ol>"; - } - - body += - "</td>" - "<td style=\"padding: 0 1em 0 0;\"><br>" - "<table class=\"ent\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" align=\"left\">" - "<tr class=\"ent\">" - "<td class=\"inp\" align=\"center\">Block User Agent</td>" - "</tr>" - "<form method=\"url\" action=\"admin.cgi\">" - "<tr>" - "<td><table cellspacing=\"0\" cellpadding=\"3\" border=\"0\">" - "<tr>" - "<td align=\"center\">Enter the user agent:<br><i>(example: streamripper)</i></td>" - "</tr>" - "<tr>" - "<td align=\"center\">" - "<input name=\"mode\" value=\"agent\" type=\"hidden\">" - "<input name=\"sid\" value=\"" + tos(sid) + "\" type=\"hidden\">" - "<input name=\"agent\" size=\"30\" maxlength=\"256\">" - "</td>" - "</tr>" - "<tr>" - "<td colspan=\"2\" align=\"center\"><input class=\"submit\" type=\"submit\" value=\"Block User Agent\">" - " <input class=\"submit\" value=\"Clear\" type=\"Reset\"></td>" - "</tr>" - "</table>" - "</td>" - "</tr>" - "</table>" - "</td>" - "</tr>" - "</form>" - "</table>" + - getUptimeScript() + - getIEFlexFix() + - getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -// kick client(s) -void protocol_admincgi::mode_kickdst(const streamData::streamID_t sid, const utf8 &kickAddrs) throw() -{ - bool refresh = false; - if (kickAddrs == "all") - { - // check if this is set to kick all - refresh = stats::kickAllClients(sid); - } - else if (kickAddrs == "duplicates") - { - // check if this is set to kick all - // duplicates (doing oldest first). - refresh = stats::kickDuplicateClients(sid); - } - else - { - // split out multiple clients to kick (split by a ,) - std::vector<uniString::utf8> addrs = tokenizer(kickAddrs,','); - for (vector<uniString::utf8>::const_iterator i = addrs.begin(); i != addrs.end(); ++i) - { - if ((*i).find(utf8(".")) == utf8::npos) - { - stats::kickClient(sid, atoi((*i).hideAsString().c_str())); - } - else - { - stats::kickClient(sid,(*i)); - } - } - } - - if (!m_referer.empty()) - { - const utf8 check = ("admin.cgi?sid=" + tos(sid)); - // if the referer is the server summary page then we need to go back to it - sendMessageAndClose(redirect((m_referer == check ? check : "admin.cgi?sid=0") + (refresh ? "&refresh=1" : ""), SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } -} - -void protocol_admincgi::mode_art(const streamData::streamID_t sid, const int mode) throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\n", body; - streamData *sd = streamData::accessStream(sid); - if (sd) - { - vector<__uint8> sc21_albumart = (mode == 0 ? sd->streamAlbumArt() : sd->streamPlayingAlbumArt()); - if (!sc21_albumart.empty()) - { - utf8 mimeType[] = { - "image/jpeg", - "image/png", - "image/bmp", - "image/gif" - }; - const size_t mime = (mode == 0 ? sd->streamAlbumArtMime() : sd->streamPlayingAlbumArtMime()); - // if not in the valid range then don't report the mime type in the generated response - if (mime < 4) - { - header += "Content-Type:" + mimeType[mime] + "\r\n"; - } - body += utf8(&sc21_albumart[0],sc21_albumart.size()); - } - sd->releaseStream(); - } - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_register(const streamData::streamID_t sid, const streamData::streamInfo &info) throw() -{ - // construct a temp id for this action - utf8 tempId = ""; - randomId(tempId); - - bool loaded = false; - streamData *sd = streamData::accessStream(sid); - if (sd) - { - int addFailIgnore = 0, errorCode = 0; - loaded = sd->YP2_addSuccessful(addFailIgnore, errorCode); - sd->releaseStream(); - } - - utf8 header = "HTTP/1.1 200 OK\r\n" - "Content-Type:text/html;charset=utf-8\r\n" - "Cache-Control:no-cache\r\n", - authhash = (!info.m_authHash.empty() ? info.m_authHash.substr(0, 36) : (utf8)""), - body = getStreamAdminHeader(sid, "Stream Authhash") + "<br>" - "<form id=\"processing\" method=\"GET\" autocomplete=\"off\" onsubmit=\"return validateForm();\">" - - "<div style=\"display:table;width:100%;\">" - - "<div style=\"padding:0 1em;display:inline-block;float:left;max-width:15em;\">" - "<table class=\"ent\" cellpadding=\"15px\"><tr><td valign=\"top\">" - "<div align=\"center\" class=\"infh\"><b>Information</b></div><div id=\"info\">" - "This page allows you to enter or amend the authhash to be used for this stream." - "<br><br><hr><br>Authhash information is now managed online. " - "<a target=\"blank\" href=\"https://radiomanager.shoutcast.com\"><b>Login</b></a> " - "to create an authhash or update the details of an existing authhash." - - "<br><br><hr><br>The same authhash should be used for all stream instances of a station " - "(e.g. 128kbps MP3 and 64kbps AAC streams for 'Super Awesome Radio').<br><br>This also includes all DNAS " - "providing the stream(s) for a station to ensure the correct listing of all stream instances." - - // TODO need to have a link to the account page... - "<br><br><hr><br>If you remove an authhash by mistake then you can either recover it from your " - "<a href=\"https://radiomanager.shoutcast.com\" target=\"_blank\"><b>Shoutcast account</b></a> or you will need " - "to contact <a href=\"mailto:support@shoutcast.com?subject=Shoutcast%20Support\"><b>support</b></a> directly for " - "assistance.</div></td></tr></table><br></div>" - - // TODO need to consider customising some of this ?? or just above ?? - "<div align=\"left\" id=\"page_info\" style=\"display:inline-block;max-width:25em;padding:0 1em;\">" - "<div align=\"left\" id=\"header\"></div>" - "<table id=\"details\" style=\"width:100%;\" align=\"left\" border=\"0\">" - - "<tr id=\"hide\" valign=\"top\"><td colspan=\"2\">" + utf8(!authhash.empty() && - loaded && (info.m_streamSampleRate > 0) && info.m_radionomyID.empty() ? - warningImage(false) + " <b>Please Register Your Authhash</b><br><br>" : "") + - - "<div style=\"float:right;padding:0 1em;\">" - "<input style=\"white-space:normal;width:6em;\" id=\"register\" class=\"submit\" type=\"button\" " - "onclick=\"window.open('https://radiomanager.shoutcast.com','_blank','')\" value=\"" + - - (!authhash.empty() ? "Manage Authhash\"></div>" - "The authhash currently configured for this stream is <b>" + authhash + "</b><br><br><br>" - "To change the authhash, enter it below and click 'Save'." : - "Create Authhash\"></div>" - "An authhash needs to be created for this stream.<br><br><br>" - "If you have just created an authhash via your " - "<a target=\"blank\" href=\"https://radiomanager.shoutcast.com\"><b>account</b></a> " - "or have an existing one for the stream, please enter it below and click 'Save'.") + - - "<br><br></td></tr>" - "<tr id=\"hide\">" - "<td style=\"width:25%;\" align=\"right\">Authhash:</td>" - "<td colspan=\"2\"><input type=\"text\" style=\"width:15em;\" name=\"authhash\" id=\"authhash\" maxlength=\"36\" value=\"" + authhash + "\"></td>" - "</tr>" - "<tr>" - "<td id=\"status\" align=\"center\" colspan=\"3\"><br>" - "<input id=\"submit\" class=\"submit\" type=\"submit\" value=\"Save\"> " - "<input id=\"clear\" class=\"submit\" value=\"Clear\" type=\"button\" " - "onclick=\"if(confirm('Clear the authhash and save the change now?" - "\\n\\nChoose Cancel to just clear the field.')){window.location='admin.cgi?sid=" + tos(sid) + - "&mode=register&register=clear';}else{$('authhash').value = '';authhashChange();}\"> " - "<input class=\"submit\" value=\"Cancel\" type=\"button\" onclick=\"window.location='admin.cgi?sid=" + tos(sid) + "';\"></td>" - "</tr>" - "</table>" - "</div>" - "</div>" - "</form>" - - "<script type=\"text/javascript\">" - "var original = \"" + /*(((mode == 3) && (auth_enabled != 1)) ?*/ info.m_authHash.substr(0, 36) /*: (utf8)"")*/ + "\";" EL - - "var timeout, response;" EL - "function $(id){return document.getElementById(id);}" EL - "function trimString(str){return str.replace(/^\\s+|\\s+$/g,'');}" EL - + utf8(!authhash.empty() ? - "function changeExisting(){" EL - "if($('existing').value != \"select\"){" EL - "$('authhash').value = $('existing').value;" EL - "}" EL - "authhashChange();" EL - "}" EL - : "") - + - - "function getHTTP(){" EL - "if(window.XDomainRequest){" EL - "return new XDomainRequest();" EL - "}else if(window.XMLHttpRequest){" EL - "return new XMLHttpRequest();" EL - "}else{" EL - "return new ActiveXObject(\"Microsoft.XMLHTTP\");" EL - "}" EL - "}" EL - - "function isValidAuthhash(str){" EL - "var regexp = /^[-a-fA-F\\d]+$/;" EL - "if(str != ''){" EL - "return regexp.test(str);" EL - "}" EL - "return true;" EL - "}" EL - - "function authhashChange(){" EL - "var str = trimString($('authhash').value);" EL - "var valid = isValidAuthhash(str);" EL - "$('authhash').style.borderColor = (!(str.length == 0 || str.length > 36 && valid)?\"red\":\"\");" EL - "$('submit').disabled = (!((str.length == 0 || str.length == 36) && (original != $('authhash').value) && valid));" EL - "}" EL - - "function validateForm(){" EL - "while($('hide') != null){" EL - "$('hide').style.display = \"none\";" EL - "$('hide').removeAttribute(\"id\");" EL - "}" EL - "$('status').setAttribute(\"colspan\",\"3\");" EL - "$('status').setAttribute(\"align\",\"left\");" EL - "$('status').setAttribute(\"valign\",\"middle\");" EL - "$('status').innerHTML = \"</td><td><b>Processing</b><br><br>This may take a while.</td>\";" EL - - "var f = $('processing');" EL - "var params=\"\";" EL - "for(var i = 0; i < f.elements.length; i++ ){" EL - "if(f.elements[i].name != \"\"){" EL - "if(f.elements[i].name != \"private\" || (f.elements[i].name == \"private\" && f.elements[i].value == \"1\")){" EL - "params += (i != 0 ? \"&\" : \"\") + f.elements[i].name + \"=\" + encodeURIComponent(f.elements[i].value);" EL - "}" EL - "}" EL - "}" EL - "if(params==\"\"){" EL - "$('status').setAttribute(\"colspan\",\"3\");" EL - "$('status').setAttribute(\"align\",\"center\");" EL - "$('status').setAttribute(\"valign\",\"middle\");" EL - "$('status').innerHTML=\"Critical error in processing request." - "<br><br><b><a href=\\\"admin.cgi?sid=" + tos(sid) + "\\\">Click here to return to the Server Summary.</a></b>\";" - "return false;" - "}" EL - - "var xmlhttp = getHTTP();" EL - "xmlhttp.open(\"GET\",\"admin.cgi?sid=" + tos(sid) + "&pass=" + gOptions.adminPassword() + - "&mode=manualauthhash&tempid=" + tempId + "&\"+params,true);" EL - "if(window.XDomainRequest){" EL - "xmlhttp.onerror=xmlhttp.onload=function(){" EL - "var code = parseInt((xmlhttp.responseText!=\"\"?xmlhttp.responseText:\"200\"));" EL - - "if(code!=200){" EL - "clearInterval(timeout);" EL - "$('status').setAttribute(\"align\",\"center\");" EL - "$('status').setAttribute(\"colspan\",\"2\");" EL - "if(code==0){" EL - "$('status').innerHTML = \"</td><td>" - "<b><br>Error Code: \"+code+\".<br>Check the DNAS is running and there is a working network connection.<br>" - "<br><a href=\\\"admin.cgi?sid=" + tos(sid) + "\\\">Click here to return to the Server Summary.</a></b>" - "</td>\";" EL - "}else{" EL - "$('status').innerHTML = \"</td><td>" - "<b><br>Error Code: \"+code+\".<br>\"+xmlhttp.responseText.substring(5,xmlhttp.responseText.length)+\"<br>" - "<br><a href=\\\"admin.cgi?sid=" + tos(sid) + "\\\">Click here to return to the Server Summary.</a></b>" - "</td>\";" EL - "}" EL - "}else{" EL - "clearInterval(timeout);" EL - "$('status').setAttribute(\"align\",\"center\");" EL - "$('status').innerHTML = \"</td><td>" - "Authhash was changed and saved to the configuration file. The stream will now be updated with the change.<br>" - "<br><a href=\\\"admin.cgi?sid=" + tos(sid) + "\\\"><b>Click here to return to the stream summary.</b></a></td>\";" EL - "}" EL - - "};" EL - "}else{" EL - "xmlhttp.onreadystatechange=function(){" EL - "if(xmlhttp.readyState==4){" EL - "var code = parseInt((xmlhttp.responseText!=\"\"?xmlhttp.responseText:\"200\"));" EL - "if(code!=200){" EL - "clearInterval(timeout);" EL - "$('status').setAttribute(\"align\",\"center\");" EL - "$('status').setAttribute(\"colspan\",\"2\");" EL - "if(code==0){" EL - "$('status').innerHTML = \"</td><td>" - "<b><br>Error Code: \"+code+\".<br>Check the DNAS is running and there is a working network connection.<br>" - "<br><a href=\\\"admin.cgi?sid=" + tos(sid) + "\\\">Click here to return to the Server Summary.</a></b>" - "</td>\";" EL - "}else{" EL - "$('status').innerHTML = \"</td><td>" - "<b><br>Error Code: \"+code+\".<br>\"+xmlhttp.responseText.substring(5,xmlhttp.responseText.length)+\"<br>" - "<br><a href=\\\"admin.cgi?sid=" + tos(sid) + "\\\">Click here to return to the Server Summary.</a></b>" - "</td>\";" EL - "}" EL - "}" EL - "}else{" EL - "clearInterval(timeout);" EL - "$('status').setAttribute(\"align\",\"center\");" EL - "$('status').innerHTML = \"</td><td>" - "Authhash was changed and saved to the configuration file. The stream will now be updated with the change.<br>" - "<br><a href=\\\"admin.cgi?sid=" + tos(sid) + "\\\"><b>Click here to return to the stream summary.</b></a></td>\";" EL - "}" EL - "};" EL - "}" EL - "xmlhttp.send(null);" EL - "timeout = setInterval(countDown,250);" EL - "return false;" EL - "}" EL - - "var counter=0;" EL - "function countDown(){" EL - "counter++;" EL - "if(counter>=5){" EL - "counter=0;" EL - "}" EL - "if(counter<5){" EL - "$('status').setAttribute(\"colspan\",\"3\");" EL - "$('status').setAttribute(\"align\",\"left\");" EL - "$('status').setAttribute(\"valign\",\"middle\");" EL - "$('status').innerHTML = \"<b>Processing\"+Array(counter).join(\".\")+\"</b><br><br>This may take a while.\";" EL - "}" EL - "}" EL - - "function runUrlGetError(){" EL - "}" EL - - "function runUrlGet(urlString,callback){" EL - "var xmlhttp = getHTTP();" EL - "try{" EL - "xmlhttp.open(\"GET\",(urlString==document.location?urlString:\"http://" + - gOptions.ypAddr() + ":" + tos(gOptions.ypPort()) + - ((gOptions.ypPath() != utf8("/yp2")) ? "/yp" : "") + - "/\"+urlString),true);" EL - "if(window.XDomainRequest){" EL - "xmlhttp.onload=callback;" EL - "xmlhttp.onerror=runUrlGetError;" EL - "}else{" EL - "xmlhttp.onreadystatechange=callback;" EL - "}" EL - "response=xmlhttp;" EL - "xmlhttp.send(null);" EL - "}" EL - "catch(e){" EL - "}" EL - "}" EL - - "function getAuthInfo(){" EL - "if(response.readyState == null || response.readyState==4 && response.status==200){" EL - "$('header').innerHTML = response.responseText;" EL - "}" EL - "}" EL - - "var registerOnWindowLoad = function(callback){" EL - "if(window.addEventListener){" EL - "window.addEventListener('load',callback,false);" EL - "}else{" EL - "window.attachEvent('onload',callback);" EL - "}" EL - "}" EL - - "registerOnWindowLoad(function(){" EL - "runUrlGet(\"authinfo_" + (authhash.empty() ? "create" : "update") + - "?v=" + urlUtils::escapeURI_RFC3986(gOptions.getVersionBuildStrings()) + - "&os=" + urlUtils::escapeURI_RFC3986(SERV_OSNAME) + "\",getAuthInfo);" EL - "if($('existing')!=null){" EL - "$('existing').onkeyup=changeExisting;" EL - "$('existing').onchange=changeExisting;" EL - "}" EL - "if($('authhash')!=null){" EL - "$('authhash').onkeyup=authhashChange;" EL - "$('authhash').onchange=authhashChange;" EL - "}" EL - "authhashChange();" EL - "});" EL - "</script>" + - getUptimeScript() + - getIEFlexFix() + - getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_listeners(const streamData::streamID_t sid) throw() -{ - utf8 header = MSG_NO_CLOSE_200, body; - // just to make sure we came from an appropriate page - const utf8 &server = mapGet(m_httpRequestInfo.m_QueryParameters, "server", (utf8)""), - &check = ("admin.cgi?sid=" + tos(sid)); - const bool nowrap = mapGet(m_httpRequestInfo.m_QueryParameters, "nw", (bool)gOptions.adminNoWrap()); - const int fh = mapGet(m_httpRequestInfo.m_QueryParameters, "fh", (int)0); - if ((sid > 0) && (m_referer.find(check) == 0) && !server.empty() && (listenerId == server)) - { - stats::currentClientList_t client_data; - stats::getClientDataForStream(sid, client_data); - if (!client_data.empty()) - { - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - stats::statsData_t data; - stats::getStats(sid, data); - - utf8 clientsBody = "<div style=\"overflow:auto;" + (!fh ? "max-height:500px;" : (utf8)"") + "\">" - "<table class=\"ls\" style=\"border:0;text-align:center;" + - (nowrap ? "white-space:nowrap;" : "") + "\" " - "cellpadding=\"5\" cellspacing=\"0\" width=\"100%\" align=\"center\">" - "<col width=\"15%\"><col width=\"50%\"><col width=\"20%\">" - "<tr><td colspan=\"10\" class=\"inp\">Current Listeners</td></tr>" - "<tr class=\"tll\"><td>Listener Address<br>(Host Address)</td>" - "<td>User Agent</td><td>Connected<br>Duration</td>" + utf8(!info.m_radionomyID.empty() ? - "<td>" + baseImage("adavail", "Advert Status", false, false) + "</td>" : "") + - (data.connectedListeners != data.uniqueListeners ? "<td>Kick<br>Client</td>" : (utf8)"") + - "<td>Kick<br>IP</td><td>Ban<br>IP</td><td>Ban<br>Subnet</td>" - "<td>Reserve<br>Listener</td><td>Block<br>User Agent</td></tr>"; - - const time_t t = ::time(NULL); - size_t rowCount = 0; - // if we have non-unique clients then we need to process the list differently so as to group - // them together and then re-sort the output by client listener duration on the first match - // otherwise we revert the code back to the original un-grouped method to not waste resources - if (data.connectedListeners != data.uniqueListeners) - { - map<utf8,stats::uniqueClientData_t> unique_clients; - for (stats::currentClientList_t::const_iterator i = client_data.begin(); i != client_data.end(); ++i) - { - // if set to kicked then no need to show those (since they may re-appear if in-progress) - if (!(*i)->m_kicked) - { - stats::uniqueClientData_t client; - const bool localhost = ((*i)->m_ipAddr.find(utf8("127.")) == 0); - - // look for existing instances and append the new details to the existing details - const map<utf8,stats::uniqueClientData_t>::const_iterator im = unique_clients.find((*i)->m_ipAddr); - if (im != unique_clients.end()) - { - client = (*im).second; - client.m_userAgent += "</tr><tr" + ((*i)->m_ripClient || localhost ? utf8(" style=\"font-style:italic;\"") : "") + ">"; - client.m_unique += ","; - ++client.m_total; - } - else - { - client.m_connectTime = (*i)->m_startTime; - client.m_ipAddr = (*i)->m_ipAddr; - client.m_hostName = (*i)->m_hostName; - client.m_XFF = (*i)->m_XFF; - client.m_total = 1; - } - - const int slave = ((*i)->m_clientType & streamData::SC_CDN_SLAVE); - client.m_userAgent += "<td " + (!client.m_XFF.empty() ? "title=\"XFF: " + aolxml::escapeXML(client.m_XFF) + - "\" " : "") + "style=\"" + (!nowrap ? "" : "white-space:nowrap;") + "\"" + - utf8(slave ? " class=\"thr\"" : "") + ">" + (((*i)->m_clientType & streamData::RADIONOMY) ? - "Radionomy Stats Collector" : (!nowrap ? addWBR((*i)->m_userAgent) : "<div style=\"float:left;\">" + - aolxml::escapeXML((*i)->m_userAgent)) + "</div>") + " <div style=\"float:right;\">" + - getClientImage((*i)->m_clientType) + "</div></td>"; - if ((*i)->m_ripClient) - { - client.m_ripAddr = true; - } - - const time_t connected = (t - (*i)->m_startTime); - utf8 timer = timeString(connected, true), timerTip; - if (timer.empty()) - { - timer = "Starting..."; - } - else - { - timerTip = timeString(connected); - } - - client.m_userAgent += "<td" + utf8(slave ? " class=\"thr\"" : "") + " title=\"" + - timerTip + "\">" + aolxml::escapeXML(timer) + "</td>"; - client.m_unique = (*i)->m_ipAddr; - if (!info.m_radionomyID.empty()) - { - client.m_userAgent += "<td" + utf8(slave ? " class=\"thr\"" : "") + ">" + (((*i)->m_group > 0) || - (*i)->m_triggers ? advertImage(sid, (*i)->m_group, (*i)->m_triggers) : - "<div title=\"Not Recognised For Adverts\">N/A</div>") + "</td>"; - } - client.m_userAgent += "<td^" + utf8(slave ? " class=\"thr\"" : "") + "><a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=kickdst&kickdst=" + tos((*i)->m_unique) + "\">Kick</a>" + - (client.m_total == 1 ? "</td^>" : "</td>") + "<td" + utf8(slave ? " class=\"thr\"" : "") + - ">" + ((*i)->m_userAgent.empty() || ((*i)->m_userAgent == EMPTY_AGENT) ? "N/A" : - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=agent&agent=" + - urlUtils::escapeURI_RFC3986((*i)->m_userAgent) + "\">Block</a>") + "</td>"; - - unique_clients[(*i)->m_ipAddr] = client; - } - - delete (*i); - } - - // take the map and convert to a vector so we can then re-sort the list back into longest to least duration - vector<stats::uniqueClientData_t> clients; - for (map<utf8,stats::uniqueClientData_t>::const_iterator i = unique_clients.begin(); i != unique_clients.end(); ++i) - { - clients.push_back((*i).second); - } - - std::sort(clients.begin(), clients.end(), sortUniqueClientDataByTime); - - // and now we dump the generated list - for (vector<stats::uniqueClientData_t>::const_iterator i = clients.begin(); i != clients.end(); ++i) - { - const utf8 host = ((*i).m_hostName != (*i).m_ipAddr ? aolxml::escapeXML((*i).m_hostName) + " (" + (*i).m_ipAddr + ")" : (*i).m_ipAddr); - const bool localhost = ((*i).m_ipAddr.find(utf8("127.")) == 0); - - // if we have a multiple client block then re-process so the relevant parts can - // be listed individually with adjustment of some of the visual styles as needed - utf8 multiBlock = (*i).m_userAgent; - uniString::utf8::size_type tpos = multiBlock.find(utf8("<td^")); - if (tpos != uniString::utf8::npos) - { - while (tpos != uniString::utf8::npos) - { - multiBlock.replace(tpos, 4, utf8(((*i).m_total > 1 ? "<td" : "<td colspan=\"2\""))); - tpos = multiBlock.find(utf8("<td^")); - } - } - - tpos = multiBlock.find(utf8("</td^>")); - if (tpos != uniString::utf8::npos) - { - const bool hasHostName = ((*i).m_hostName != (*i).m_ipAddr); - utf8 endBlock = "<td" + ((*i).m_total > 1 ? " rowspan=\"" + tos((*i).m_total) + "\"" : (utf8)"") + ">" + - (!localhost ? "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=bandst&bandst=" + - urlUtils::escapeURI_RFC3986((*i).m_ipAddr) + "&banmsk=255" + "&kickdst=" + - (*i).m_unique + "\">Ban</a>" : "N/A") + "</td><td" + ((*i).m_total > 1 ? " rowspan=\"" + - tos((*i).m_total) + "\"" : (utf8)"") + ">" + (!localhost ? "<a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=bandst&bandst=" + urlUtils::escapeURI_RFC3986((*i).m_ipAddr) + - "&banmsk=0" + "&kickdst=" + (*i).m_unique + "\">Ban </a>" : "N/A") + "</td>" - "<td" + ((*i).m_total > 1 ? " rowspan=\"" + tos((*i).m_total) + "\"" : (utf8)"") + ">" + - (!localhost ? "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=" + - ((*i).m_ripAddr ? "unripdst" : "ripdst") + "&ripdst=" + - urlUtils::escapeURI_RFC3986((hasHostName ? (*i).m_hostName : (*i).m_ipAddr)) + - (hasHostName ? "&ripdstraw=" + urlUtils::escapeURI_RFC3986((*i).m_ipAddr) : "") + - "\">" + ((*i).m_ripAddr ? "Remove" : "Add") + "</a>" : "N/A") + "</td>"; - - multiBlock.replace(tpos, 6, utf8(((*i).m_total > 1 ? - "</td><td rowspan=\"" + tos((*i).m_total) + - "\"><a href=\"admin.cgi?sid=" + tos(sid) + - "&mode=kickdst&kickdst=" + - (*i).m_unique + "\">Kick</a></td>" + - endBlock : "</td>" + endBlock))); - } - - rowCount += (*i).m_total; - clientsBody += "<tr" + ((*i).m_ripAddr || localhost ? utf8(" style=\"font-style:italic;\"") : "") + ">" - "<td" + ((*i).m_total > 1 ? " rowspan=\"" + tos((*i).m_total) + "\"" : "") + ">" + - (gOptions.useXFF() && !(*i).m_XFF.empty() ? xffImage() + " " : "") + host + "</td>" + multiBlock; - } - } - else - { - for (stats::currentClientList_t::const_iterator i = client_data.begin(); i != client_data.end(); ++i) - { - // if set to kicked then no need to show those (since they may re-appear if in-progress) - if (!(*i)->m_kicked) - { - const time_t connected = (::time(NULL) - (*i)->m_startTime); - utf8 timer = timeString(connected, true), timerTip; - if (timer.empty()) - { - timer = "Starting..."; - } - else - { - timerTip = timeString(connected); - } - - const utf8 host = ((*i)->m_hostName != (*i)->m_ipAddr ? aolxml::escapeXML((*i)->m_hostName) + - " (" + (*i)->m_ipAddr + ")" : (*i)->m_ipAddr); - const bool localhost = ((*i)->m_ipAddr.find(utf8("127.")) == 0); - const bool hasHostName = ((*i)->m_hostName != (*i)->m_ipAddr); - - ++rowCount; - const int slave = ((*i)->m_clientType & streamData::SC_CDN_SLAVE); - clientsBody += "<tr" + ((*i)->m_ripClient || localhost ? utf8(" style=\"font-style:italic;\"") : "") + ">" - "<td " + (gOptions.useXFF() && !(*i)->m_XFF.empty() ? "title=\"XFF: " + - aolxml::escapeXML((*i)->m_XFF) + "\">" + xffImage() + " " : ">") + host + "</td><td " + - (!(*i)->m_XFF.empty() ? "title=\"XFF: " + aolxml::escapeXML((*i)->m_XFF) + "\" " : "") + - "style=\"" + (!nowrap ? "" : "white-space:nowrap;") + "\"" + utf8(slave ? " class=\"thr\"" : - "") + ">" + (((*i)->m_clientType & streamData::RADIONOMY) ? "Radionomy Stats Collector" : - (!nowrap ? addWBR((*i)->m_userAgent) : "<div style=\"float:left;\">" + - aolxml::escapeXML((*i)->m_userAgent)) + "</div>") + " <div style=\"float:right;\">" + - getClientImage((*i)->m_clientType) + "</div>" + "</td><td" + utf8(slave ? " class=\"thr\"" : "") + - " title=\"" + timerTip + "\">" + aolxml::escapeXML(timer) + "</td>"; - - if (!info.m_radionomyID.empty()) - { - clientsBody += "<td" + utf8(slave ? " class=\"thr\"" : "") + ">" + (((*i)->m_group > 0) || - (*i)->m_triggers ? advertImage(sid, (*i)->m_group, (*i)->m_triggers) : - "<div title=\"Not Recognised For Adverts\">N/A</div>") + "</td>"; - } - - const utf8 unique = tos((*i)->m_unique); - clientsBody += "<td" + utf8(slave ? " class=\"thr\"" : "") + "><a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=kickdst&kickdst=" + unique + "\">Kick</a></td><td>" + - (!localhost ? "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=bandst&bandst=" + - urlUtils::escapeURI_RFC3986((*i)->m_ipAddr) + "&banmsk=255" + "&kickdst=" + unique + - "\">Ban</a>" : "N/A") + "</td><td>" + (!localhost ? "<a href=\"admin.cgi?sid=" + tos(sid) + - "&mode=bandst&bandst=" + urlUtils::escapeURI_RFC3986((*i)->m_ipAddr) + "&banmsk=0" - "&kickdst=" + unique + "\">Ban </a>" : "N/A") + "</td><td>" + (!localhost ? - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=" + ((*i)->m_ripClient ? - "unripdst" : "ripdst") + "&ripdst=" + urlUtils::escapeURI_RFC3986((hasHostName ? - (*i)->m_hostName : (*i)->m_ipAddr)) + (hasHostName ? "&ripdstraw=" + - urlUtils::escapeURI_RFC3986((*i)->m_ipAddr) : "") + "\">" + ((*i)->m_ripClient ? - "Remove" : "Add") + "</a>" : "N/A") + "</td><td" + utf8(slave ? " class=\"thr\"" : "") + - ">" + ((*i)->m_userAgent.empty() || ((*i)->m_userAgent == EMPTY_AGENT) ? "N/A" : - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=agent&agent=" + - urlUtils::escapeURI_RFC3986((*i)->m_userAgent) + "\">Block</a>") + "</td></tr>"; - } - - delete (*i); - } - } - - if (rowCount > 0) - { - if (rowCount > 1) - { - clientsBody += "<tr><td style=\"border:0;\"></td><td style=\"padding:0;\"><a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=kickdst&kickdst=duplicates\" title=\"Kick all duplicate " - "listeners (based on oldest first by user-agent for the same address)\"><b>Kick Duplicates</b>" - "</a></td><td>" + timeString(data.avgUserListenTime, true) + "</td><td style=\"padding:0;\" " - "colspan=\"" + utf8(data.connectedListeners != data.uniqueListeners ? "4" : "3") + - "\"><a href=\"admin.cgi?sid=" + tos(sid) + "&mode=kickdst&kickdst=all\" " - "title=\"Kick all currently connected listeners\"><b>Kick All</b></a></td></tr>"; - } - - // only output the table if we actually had clients to show - body += clientsBody + "</table></div>"; - } - } - } - else - { - body = "<div style=\"padding:1em;text-align:center;\"><b><img " - "border=\"0\" src=\"images/warn.png\"> The current " - "listener list could not be loaded. <img border=\"0\" " - "src=\"images/warn.png\"><br><a href=\"admin.cgi?sid=" + - tos(sid) + "&nw=" + tos(nowrap) + "&fh=" + tos(fh) + - "\">Click here to reload this page</a>. If this issue " - "<br>persists, try logging out and back in again.</b></div>"; - } - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -const utf8 protocol_admincgi::getClientIP(const bool streamPublic, const utf8 &publicIP) throw() -{ - // test for potentially invalid IPs or ones that will cause the playlist link generation to fail - // attempting to use the server path provided by the YP if in public mode, otherwise uses 'host' - return (!streamPublic || publicIP.empty() ? - ((g_IPAddressForClients.find(utf8("0.")) == 0 || - // allow localhost / loopback connections through for admin access - ((!g_IPAddressForClients.empty() && g_IPAddressForClients.find(utf8("127.")) == 0)) || - g_IPAddressForClients.empty()) && !m_hostIP.empty() ? - m_hostIP : (!m_hostIP.empty() ? m_hostIP : g_IPAddressForClients)) : publicIP); -} - -void protocol_admincgi::mode_none(const streamData::streamID_t sid, const int refreshRequired) throw() -{ - utf8 header = MSG_NO_CLOSE_200, - body = getStreamAdminHeader(sid, "Stream Status & Listeners", refreshRequired); - - time_t streamUptime = 0; - bool hasListeners = false, isConnected = false; - - if (refreshRequired > 0) - { - body += "<br><table cellpadding=\"5\" cellspacing=\"0\" border=\"0\" width=\"100%\">" - "<tr><td align=\"center\" id=\"counter\">" - "<br>Waiting " + tos(refreshRequired) + " second" + ((refreshRequired > 1) ? "s" : (utf8)"") + - " for any configuration changes to take effect.<br>" - "If not automatically redirected or do not want to wait, " - "<a href=\"admin.cgi?sid="+tos(sid)+"\">click here.</a>" - "<br><br></td></tr></table></tr></table></td></tr></table>"; - } - else - { - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - - stats::statsData_t data; - stats::getStats(sid, data); - - isConnected = extra.isConnected; - hasListeners = (data.connectedListeners > 0); - - // this is a placeholder for the listener details which we grab asynchronously for speed since #615 - body += "<div id=\"listeners\">" + (data.connectedListeners > 0 ? - "<div style=\"padding:1em;text-align:center;\"><b>Loading current " - "listener list...</b></div>" : (utf8)"") + "</div><table cellpadding=\"5\" " - "cellspacing=\"0\" border=\"0\" width=\"100%\"><tr><td class=\"tsp\" " - "align=\"center\">Current Stream Information</td></tr></table>"; - - utf8 detailsBody = ""; - bool showing = false; - if (!(gOptions.read_stream_adminPassword(sid) && !gOptions.stream_adminPassword(sid).empty())) - { - utf8 log = gOptions.realLogFile(); - utf8::size_type pos = log.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - log = log.substr(pos + 1); - } - - utf8 conf = gOptions.confFile(); - pos = conf.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - conf = conf.substr(pos + 1); - } - - // trim down the file paths shown to make things less cluttered on hosted setups - // places the full path in the 'title' so it can still be found if required, etc - detailsBody += "Log file: <b title=\"" + - aolxml::escapeXML(fileUtil::getFullFilePath(gOptions.realLogFile())) + - "\">" + aolxml::escapeXML(fileUtil::stripPath(log)) + "</b><br>" - "Configuration file: <b title=\"" + - aolxml::escapeXML(fileUtil::getFullFilePath(gOptions.confFile())) + - "\">" + aolxml::escapeXML(fileUtil::stripPath(conf)) + "</b><br>"; - - showing = true; - } - - utf8 introFile = gOptions.stream_introFile(sid); - if (!gOptions.read_stream_introFile(sid)) - { - introFile = gOptions.introFile(); - } - - utf8 backupFile = gOptions.stream_backupFile(sid); - if (!gOptions.read_stream_backupFile(sid)) - { - backupFile = gOptions.backupFile(); - } - - utf8 backupTitle = gOptions.stream_backupTitle(sid); - if (!gOptions.read_stream_backupTitle(sid)) - { - backupTitle = gOptions.backupTitle(); - } - - streamData *sd = streamData::accessStream(sid); - detailsBody += utf8(showing ? "<br><hr><br>" : "") + "Intro file is <b title=\"" + - ((!introFile.empty() || (sd && sd->getIntroFile().gotData()) ? (!introFile.empty() ? - fileUtil::getFullFilePath(introFile) : (utf8)"") : (utf8)"") + "\">" + - aolxml::escapeXML((!introFile.empty() || (sd && sd->getIntroFile().gotData()) ? (!introFile.empty() ? - fileUtil::stripPath(introFile) : "from source") : "empty")) + "</b><br>Backup file is <b title=\"" + - ((!backupFile.empty() || (sd && sd->getBackupFile().gotData())) ? (!backupFile.empty() ? - fileUtil::getFullFilePath(backupFile) : (utf8)"") : (utf8)"") + "\">" + - aolxml::escapeXML((!backupFile.empty() || (sd && sd->getBackupFile().gotData())) ? - (!backupFile.empty() ? fileUtil::stripPath(backupFile) : "from source") : "empty")) + "</b><br>"; - - if (!backupTitle.empty() && !backupFile.empty() && !extra.isConnected) - { - detailsBody += "Backup title is: <b>" + aolxml::escapeXML(backupTitle) + "</b><br>"; - } - - detailsBody += "<br><hr><br>Idle timeouts are <b>" + tos(gOptions.getAutoDumpTime(sid)) + "s</b><br>"; - - if (extra.isConnected) - { - detailsBody += "<br><hr><br>Source connection type: <b>" + - utf8(info.m_sourceType == streamData::SHOUTCAST1 ? "v1" : - (info.m_sourceType == streamData::SHOUTCAST2 ? "v2" : "HTTP")) + - (extra.isRelay ? " relay" + (extra.isBackup ? utf8(" backup") : "") : - (extra.isBackup ? utf8(" backup") : "")) + "</b><br><div " - "style=\"max-width:15em;\">Source user agent: <b>" + - addWBR((!info.m_sourceIdent.empty() ? info.m_sourceIdent : - "Legacy / Unknown")) + "</b>""</div>"; - } - - if (sd) - { - detailsBody += (extra.isConnected ? "<br><hr><br>" : "<br>"); - - if (sd->streamAlbumArt().empty()) - { - detailsBody += "Stream artwork <b>not available</b>"; - } - else - { - detailsBody += "Stream artwork <b>available</b> [ <a href=\"/streamart?sid=" + tos(sid) + "\">view</a> ]</b>"; - } - - detailsBody += "<br>"; - - if (sd->streamPlayingAlbumArt().empty()) - { - detailsBody += "Playing artwork <b>not available</b>"; - } - else - { - detailsBody += "Playing artwork <b>available</b> [ <a href=\"/playingart?sid=" + tos(sid) + "\">view</a> ]</b>"; - } - - if (!info.m_currentURL.empty() && (info.m_currentURL.find(utf8("DNAS/")) == utf8::npos)) - { - detailsBody += "<br><br><hr><br>Song url from source [ <a href=\"" + - utf8((info.m_currentURL.find(utf8("://")) == utf8::npos) && - (info.m_currentURL.find(utf8("&")) != 0) ? "//" : "") + - info.m_currentURL + "\">view</a> ]<br>" - "<div style=\"max-width:15em;\"><b>Note:</b> " - "This may not be a valid url and is intended for internal use.</div>"; - } - - sd->releaseStream(); - } - - const utf8& message = streamData::getStreamMessage(sid); - if (!message.empty()) - { - detailsBody += "<tr><td style=\"border:0;padding:0;\"><br></td></tr>" - "<tr><td align=\"center\" valign=\"top\" " - "style=\"display:block;max-width:15em;padding-top:1px;\"><br>" - "<div align=\"center\" class=\"infh\">" - "<b>Official Message Received</b></div>" + message + "</td></tr>"; - } - - body += "<div style=\"padding:0 1em;\"><br></div>" - "<table width=\"100%\" align=\"center\"><tr valign=\"top\">"; - - const utf8 movedUrl = gOptions.stream_movedUrl(sid); - if (movedUrl.empty()) - { - body += "<td><table class=\"en\" cellpadding=\"15px\" " - "style=\"border:0;margin-left:1em;\"><tr>" - "<td valign=\"top\"><div align=\"center\" " - "class=\"infh\"><b>Stream Details</b></div>" + - detailsBody + "</td></tr></table></td>"; - } - - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - if (extra.isConnected) - { - const bool isListable = streamData::isAllowedType(info.m_uvoxDataType); - utf8 listenLink = "<a href=\"listen.pls?sid=" + tos(sid) + "\"><img border=\"0\" title=\"Listen to Stream\" " - "alt=\"Listen to Stream\" style=\"vertical-align:middle\" src=\"images/listen.png\"></a>" + - (sd && !sd->radionomyID().empty() && sd->streamAdvertMode() ? - "<img border=\"0\" title=\"Active DNAS+ Stream\nMonetisation Enabled\" " - "alt=\"Active DNAS+ Stream\nMonetisation Enabled\" style=\"vertical-align:middle\" " - "src=\"images/adavail.png\"> " : (utf8)""); - - body += "<td><table cellspacing=\"0\" cellpadding=\"2\" border=\"0\" style=\"padding-left:1em;\">" - "<tr valign=\"top\"><td colspan=\"2\">" + getNewVersionMessage() + "<td></tr>" - "<tr valign=\"top\"><td>Listing Status: </td><td><b>Stream is currently up " + - (info.m_streamPublic && isListable ? (extra.ypConnected != 1 ? "" : utf8("and public") + listenLink) : utf8("and private (not listed)") + listenLink) + - (info.m_streamPublic && isListable ? (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - string(info.m_authHash.empty() ? "but requires <a href=\"admin.cgi?sid=" + tos(sid) + - "&mode=register\">registration</a> in the Shoutcast Directory.<br>" : - "but not listed due to an invalid authhash.<br>") + - - (info.m_authHash.empty() ? "Listeners are allowed and the stream will act like it is private until resolved." - "<br><br>To create an authhash you will need to <a href=\"admin.cgi?sid=" + tos(sid) + - "&mode=register\">register</a> the stream with us.<br>If you already have an existing authhash " - "then you can enter it <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">here</a>.<br><br>" : - "Listeners are allowed and the stream will act like it is private until resolved.") : - (extra.ypErrorCode == 200 ? "waiting on a Directory response." : - (extra.ypErrorCode == YP_COMMS_FAILURE ? "unable to access the Directory.<br>Listeners are allowed and the stream will act like it is private until resolved." : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "received a Directory maintenance notification: <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2#YP_Server_Errors\">" + tos(extra.ypErrorCode) + - "</a><br>Listeners will be allowed though the stream will not be listed in the Directory." : - "received Directory error code: <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2#YP_Server_Errors\">" + tos(extra.ypErrorCode) + "</a><br>" + - (extra.ypConnected != 2 ? "" : - "during a listing update. The stream may no longer appear.") + - "<br>Check the server log and / or contact the server administrator.")))) : "") : "") + "</b></td></tr>" - "<tr valign=\"top\"><td>Stream Status: </td>" - "<td><b>Stream is up (" + streamData::getContentType(info) + " @ " + - (info.m_streamBitrate > 0 ? tos(info.m_streamBitrate) : "unknown") + - " kbps" + (info.m_vbr ? " (VBR)" : "") + ", " + - sampleRateStr(info.m_streamSampleRate) + ") with " + - tos(data.connectedListeners) + (maxUsers > 0 ? " of " + - tos(maxUsers) : "") + " listeners" + (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? (" (" + - tos(data.uniqueListeners) + " unique)") : "") + "</b></td></tr>"; - - if (data.peakListeners > 0) - { - body += "<tr valign=\"top\"><td>Listener Peak: </td><td><b>" + - tos(data.peakListeners) + "</b></td></tr>"; - } - - const utf8 avgTime = timeString(data.avgUserListenTime); - if (!avgTime.empty()) - { - body += "<tr valign=\"top\"><td>Avg. Play Time: </td>" - "<td><b>" + avgTime + "</b></td></tr>"; - } - - body += "<tr valign=\"top\"><td>Stream Name: </td><td><b>" + - (info.m_streamPublic && extra.ypConnected ? "<a target=\"_blank\" href=\"http://directory.shoutcast.com/Search?query=" + - urlUtils::escapeURI_RFC3986(info.m_streamName) + "\">" + aolxml::escapeXML(info.m_streamName) + "</a>" : - aolxml::escapeXML(info.m_streamName)) + "</b></td></tr>" + - - (info.m_streamPublic && extra.ypConnected ? "<tr valign=\"top\"><td alt=\"Shoutcast Directory ID\" " - "title=\"Shoutcast Directory ID\"><img border=\"0\" " - "src=\"images/favicon.ico\" style=\"vertical-align:bottom\">" - " ID: </td><td><b><a title=\"Shoutcast Directory ID\" href=\"http://" + - - gOptions.ypAddr().hideAsString() + ":" + tos(gOptions.ypPort()) + ((gOptions.ypPath() != utf8("/yp2")) ? "/yp" : "") + - - "/sbin/tunein-station.pls?id="+info.m_stationID+"\">"+info.m_stationID+"</a></b></td></tr>" : ""); - - if (!info.m_streamGenre[0].empty()) - { - body += "<tr valign=\"top\"><td>Stream Genre(s): </td>" - "<td><b>" + (info.m_streamPublic && extra.ypConnected ? - "<a target=\"_blank\" href=\"http://directory.shoutcast.com/Genre?name=" + - urlUtils::escapeURI_RFC3986(info.m_streamGenre[0]) + "\">" + - aolxml::escapeXML(info.m_streamGenre[0]) + "</a>" : - aolxml::escapeXML(info.m_streamGenre[0])) + "</b>"; - - for (int i = 1; i < 5; i++) - { - if (!info.m_streamGenre[i].empty()) - { - body += " , <b>" + (info.m_streamPublic && extra.ypConnected ? "<a target=\"_blank\" href=\"http://directory.shoutcast.com/Genre?name=" + - urlUtils::escapeURI_RFC3986(info.m_streamGenre[i]) + "\">" + aolxml::escapeXML(info.m_streamGenre[i]) + "</a>" : - aolxml::escapeXML(info.m_streamGenre[i])) + "</b>"; - } - } - - body += "</td></tr>"; - } - - if (!info.m_streamUser.empty()) - { - body += "<tr valign=\"top\"><td>Stream DJ: </td>" - "<td><b>" + aolxml::escapeXML(info.m_streamUser) + "</b></td></tr>"; - } - - if (!info.m_streamURL.empty()) - { - body += "<tr valign=\"top\"><td>Stream Website: </td>" - "<td><b>" + urlLink(info.m_streamURL) + "</b></td></tr>"; - } - - if (!info.m_currentSong.empty()) - { - body += "<tr valign=\"top\"><td>Playing Now: </td>" - "<td><b><a href=\"currentsong?sid=" + tos(sid) + "\">" + - getCurrentSong(info.m_currentSong) + "</a></b></td></tr>"; - - // only show if we have a valid current song - if (!info.m_comingSoon.empty()) - { - body += "<tr valign=\"top\"><td>Playing Next: </td>" - "<td><b><a href=\"nextsong?sid=" + tos(sid) + "\">" + - aolxml::escapeXML(info.m_comingSoon) + "</a></b></td></tr>"; - } - } - - // strip down the source address for display output to an appropriate output based on settings - utf8 srcAddr = niceURL(extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)); - if (gOptions.nameLookups()) - { - if (!extra.isBackup && !extra.isRelay) - { - u_short port = 0; - string addr, hostName; - socketOps::getpeername(m_socket, addr, port); - - string src = (extra.isBackup ? info.m_backupURL : (extra.isRelay ? info.m_relayURL : info.m_srcAddr)).hideAsString(); - hostName = src; - if (!socketOps::addressToHostName(addr,port,hostName)) - { - srcAddr = hostName + " (" + niceURL(src) + ")"; - } - } - } - - body += "<tr valign=\"top\"><td>Stream Source: </td>" - "<td><b>" + (extra.isRelay || extra.isBackup ? urlLink(srcAddr) : srcAddr) + " " + - (extra.isRelay ? "(relaying" + (extra.isBackup ? utf8(" backup") : "") + ") " : (extra.isBackup ? "(backup) " : "")) + "</b>" - "[ <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=kicksrc\">" + (extra.isRelay || extra.isBackup ? "stop" : "kick") + - "</a> ]</td></tr><tr valign=\"top\"><td>Stream Uptime: </td>" - "<td id=\"up2\"><b>" + timeString((streamUptime = ::time(NULL) - streamData::getStreamUptime(sid))) + "</b></td></tr>"; - - if (!info.m_contentType.empty() && (info.m_uvoxDataType == MP3_DATA)) - { - body += streamData::getHTML5Player(sid); - } - - body += "</table>"; - } - else - { - body += "<td" + (movedUrl.empty() ? (utf8)"" : " align=\"center\"") + ">" - "<table cellspacing=\"0\" cellpadding=\"2\" border=\"0\">" - "<tr valign=\"top\"><td colspan=\"2\">" + getNewVersionMessage("<br>") + "<td></tr>" - "<tr valign=\"top\"><td>Stream Status: </td><td><b>"; - - if (movedUrl.empty()) - { - body += "Stream is currently down" + (data.connectedListeners > 0 ? - " with " + tos(data.connectedListeners) + (maxUsers > 0 ? " of " + - tos(maxUsers) : "") + " listeners" + (!maxUsers ? " (unlimited)" : "") + - (data.connectedListeners != data.uniqueListeners ? (" (" + - tos(data.uniqueListeners) + " unique)") : "") : ".") + "<br>There is no " - "source connected or no stream is configured for stream #" + tos(sid) + "."; - } - else - { - body += "Stream has been moved to " + urlLink(movedUrl) + "<br>No source connections will be allowed for this stream."; - } - body += "</b></td></tr>"; - - if (data.peakListeners > 0) - { - body += "<tr valign=\"top\"><td>Listener Peak: </td><td><b>" + - tos(data.peakListeners) + "</b></td></tr>"; - } - - utf8 avgTime = timeString(data.avgUserListenTime); - if (!avgTime.empty()) - { - body += "<tr valign=\"top\"><td>Avg. Play Time: </td>" - "<td><b>" + avgTime + "</b></td></tr>"; - } - - // add in an option to restart a relay url... - if (!gOptions.stream_relayURL(sid).empty() && movedUrl.empty()) - { - // strip down the source address for display output - utf8 srcAddr = niceURL(gOptions.stream_relayURL(sid)); - - // make sure we're not exposing the option to try re-connecting to a pending source relay - bool noEntry = false; - if (!(streamData::isRelayActive(sid, noEntry) == 1)) - { - body += "<tr><td><br>Start Relay:</td><td><br><b>" + urlLink(srcAddr) + "</b> " - "[ <a href=\"admin.cgi?sid="+tos(sid)+"&mode=startrelay\">start relay</a> ]</td></tr>"; - } - else - { - body += "<tr><td><br>Starting Relay:</td><td><br><b>Connection pending to " + - urlLink(srcAddr) + "</b> [ <a href=\"admin.cgi?sid=" + tos(sid) + - "&mode=kicksrc\">abort</a> ]</td></tr>"; - } - } - - body += "</table>"; - } - - body += "</td></tr></table>"; - } - - // for a refresh, we'll show a countdown so it's obvious that something is happening - if (refreshRequired) - { - body += "<script type=\"text/javascript\">" - "function $(id){return document.getElementById(id);}" EL - "var c = " + tos(abs(refreshRequired)) + ";" EL - "function countDown(){" EL - "c--;" EL - "if(c > 0){" EL - "$('counter').innerHTML = \"<br>Waiting \"+c+\" second\" + (c > 1 ? \"s\" : \"\") + \" for any configuration changes to take effect.<br>" - "If not automatically redirected or do not want to wait, <a href=\\\"admin.cgi?sid="+tos(sid)+"\\\">click here.</a><br><br>\";" EL - "}" EL - "}" EL - "setInterval(countDown,1000);" EL - "</script>"; - } - - body += getUptimeScript(false, isConnected, streamUptime) + getIEFlexFix() + - getHTML5Remover() + (!refreshRequired && hasListeners ? - getStreamListeners(sid, mapGet(m_httpRequestInfo.m_QueryParameters, "nw", (bool)gOptions.adminNoWrap()), - mapGet(m_httpRequestInfo.m_QueryParameters, "fh", (int)0)) : "") + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -utf8 getCDNMessage(const bool master, const bool slave) -{ - if (slave && !master) - { - return "Configured as a CDN slave<br>Authhash inheritance enabled from master"; - } - else if (master && !slave) - { - return "Configured as a CDN master<br>Authhash inheritance enabled for slaves"; - } - return "Configured as a CDN intermediary<br>Authhash inheritance enabled both ways"; -} - -utf8 getBadAuthhashMessage(const streamData::streamID_t sid, const utf8 &authHash) -{ - return "<div class=\"en\" style=\"padding:1em;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\">" - "<b>Invalid Authhash Detected</b> <input class=\"submit\" type=\"button\" " - "onclick=\"alert('An incorrect authhash is entered for this stream: " + authHash + "\\n\\n" - "Use the [ Clear ] option and re-enter a valid authhash or\\nregister your stream to be " - "listed in the Shoutcast directory.\\n\\nIf you think this is a valid authhash then please " - "contact\\nsupport including the authhash at support@shoutcast.com.')\" value=\"?\"><br><br>" - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register&register=clear\">Clear Authhash</a>" - " | <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Manage Authhash</a></div>"; -} - -void protocol_admincgi::mode_summary(const int refreshRequired) throw() -{ - utf8 header = MSG_NO_CLOSE_200, - streams = "", - body = getServerAdminHeader("Server Summary", refreshRequired); - - size_t totalListeners = 0, - totalPeakListeners = 0, - streamTotal = 0, - movedTotal = 0; - map<size_t,uniString::utf8> streamBlocks; - - if (refreshRequired == 0) - { - size_t inc = 0, sid = DEFAULT_SOURCE_STREAM; - do - { - utf8 streamBody = ""; - sid = streamData::enumStreams(inc); - - // check if we have an active source and valid sid before attempting to add - if (sid >= DEFAULT_SOURCE_STREAM) - { - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo(sid, info, extra)) - { - stats::statsData_t data; - stats::getStats(sid, data); - - // increment our stream total now that we know we have one - totalListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - - utf8 streamBody2 = "<tr><td align=\"center\">"; - const bool slave = isCDNSlave(sid); - const bool master = isCDNMaster(sid); - if (master || slave) - { - streamBody2 += "<b><div class=\"en\" style=\"padding:1em;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\">" + - getCDNMessage(master, slave) + "</div></b><br><br>"; - } - - const bool isListable = streamData::isAllowedType(info.m_uvoxDataType); - if (!isListable) - { - streamBody2 += "<b><div class=\"en\" style=\"padding:1em;margin-bottom:1em;display:inline-block;border-radius:0.5em;\">" + - (info.m_uvoxDataType == OGG_DATA ? "OGG Vorbis based streams are not fully supported<br>and will not" : - utf8("NSV based streams are no longer able<br>to ")) + - " be listed in the Shoutcast Directory.</div></b><br>"; - } - /*else if (!info.m_streamPublic && gOptions.cdn().empty() && !slave && !master) - { - streamBody2 += "<b><div class=\"en\" style=\"padding:1em;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\">" - "An authhash is not required for private streams.</div></b><br><br>"; - }*/ - - if (isListable) - { - if (info.m_authHash.empty()) - { - streamBody2 += "<div class=\"en\" style=\"padding:1em;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\">" - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Create Authhash</a>" - " | <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Manage Authhash</a></div>"; - } - else - { - // check that the authhash is a valid length - if (!yp2::isValidAuthhash(info.m_authHash)) - { - streamBody2 += getBadAuthhashMessage(sid, info.m_authHash); - } - else - { - streamBody2 += "<div class=\"en\" style=\"padding:1em;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\">" - + utf8((master || slave || info.m_streamPublic) && (info.m_streamSampleRate > 0) && - info.m_radionomyID.empty() && ((extra.ypErrorCode != YP_NOT_VISIBLE) && - (extra.ypErrorCode != YP_AUTH_ISSUE_CODE) && (extra.ypErrorCode != -1)) ? - warningImage(false) + " <b>Please Register Your Authhash</b><br><br>" : "") + - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Update Authhash</a> | " - " <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Manage Authhash</a></div>"; - } - } - } - else - { - streamBody2 += "<div class=\"en\" style=\"padding:1em;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\">" - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Manage Authhash</a></div>"; - } - streamBody2 += "</td></tr>"; - - streamData *sd = streamData::accessStream(sid); - - streamBody += "<tr><td align=\"center\" class=\"tnl\">" + - (sd && !sd->radionomyID().empty() && sd->streamAdvertMode() ? - "<img border=\"0\" title=\"Active DNAS+ Stream\nMonetisation Enabled\" " - "alt=\"Active DNAS+ Stream\nMonetisation Enabled\" style=\"vertical-align:middle\" " - "src=\"images/adavail.png\"> " : (utf8)"") + - "<a href=\"index.html?sid=" + tos(sid) + "\">Stream #" + tos(sid) + "</a> " - "<a href=\"admin.cgi?sid=" + tos(sid) + "\">(Stream Login)</a>" + - " <a href=\"listen.pls?sid=" + tos(sid) + "\"><img border=\"0\" title=\"Listen to Stream\" " - "alt=\"Listen to Stream\" style=\"vertical-align:middle\" src=\"images/listen.png\"></a>" + - (sd && !sd->streamAlbumArt().empty() ? " <a href=\"/streamart?sid=" + tos(sid) + "\">" - "<img border=\"0\" title=\"View Stream Artwork\" alt=\"View Stream Artwork\" " - "style=\"vertical-align:middle;padding-left:0.5em;\" src=\"images/streamart.png\"></a>" : "") + - (sd && !sd->streamPlayingAlbumArt().empty() ? " <a href=\"/playingart?sid=" + tos(sid) + "\">" - "<img border=\"0\" title=\"View Playing Artwork\" alt=\"View Playing Artwork\" " - "style=\"vertical-align:middle;padding-left:0.5em;\" src=\"images/playingart.png\"></a>" : "") + - - "</td></tr>" + - (!info.m_contentType.empty() && (info.m_uvoxDataType == MP3_DATA) ? - streamData::getHTML5Player(sid) : "") + streamBody2; - - utf8 content = streamData::getContentType(info); - if (!info.m_streamUser.empty()) - { - content = info.m_streamUser + " - " + content; - } - - const int maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < gOptions.maxUser()) ? info.m_streamMaxUser : gOptions.maxUser()); - const utf8 listeners = (data.connectedListeners ? (tos(data.connectedListeners) + - (data.connectedListeners != data.uniqueListeners ? - (" (" + tos(data.uniqueListeners) + " unique)") : "")) : "0") + - (maxUsers > 0 ? " of " + tos(maxUsers) : " (unlimited)"); - - const utf8 listenLink = "<a href=\"listen.pls?sid=" + tos(sid) + "\"><img border=\"0\" title=\"Listen to Stream\" " - "alt=\"Listen to Stream\" style=\"vertical-align:middle\" src=\"images/listen.png\"></a>"; - - streamBody += "<tr><td align=\"center\">" + - (info.m_streamPublic && extra.ypConnected ? "<a target=\"_blank\" href=\"http://directory.shoutcast.com/Search?query=" + - urlUtils::escapeURI_RFC3986(info.m_streamName) + "\">" + aolxml::escapeXML(info.m_streamName) + "</a>" : - aolxml::escapeXML(info.m_streamName)) + " (" + content + " @ " + - (info.m_streamBitrate > 0 ? tos(info.m_streamBitrate) : "unknown") + - " kbps" + (info.m_vbr ? " (VBR)" : "") + ", " + - sampleRateStr(info.m_streamSampleRate) + ")</td></tr>" + - - (!info.m_currentSong.empty() ? "<tr><td align=\"center\" style=\"padding-bottom:0;\">Playing: <b>" - "<a href=\"currentsong?sid=" + tos(sid) + "\">" + - aolxml::escapeXML(info.m_currentSong) + "</a></b></td></tr>" + - (!info.m_comingSoon.empty() ? "<tr><td align=\"center\" style=\"padding-top:0;\">Coming: <b>" - "<a href=\"currentsong?sid=" + tos(sid) + "\">" + - aolxml::escapeXML(info.m_comingSoon) + "</a></b></td></tr>" : "") : "") + - - "<tr><td><table align=\"center\"><tr valign=\"top\"><td align=\"center\">" - "<div style=\"text-align:left;\">Listeners: <b>" + listeners + "</b>" + - (data.peakListeners > 0 ? "<br>Peak: <b>" + tos(data.peakListeners) + "</b>" : "") + - (data.connectedListeners > 0 ? " [ <a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=kickdst&kickdst=all\">kick all</a> ]" : "") + - "</div></td><td> </td><td align=\"center\">Status: <b>" + - string(info.m_streamPublic && isListable ? (extra.ypConnected != 1 ? "" : string("Public</b><br>" - - "<div title=\"Shoutcast Directory ID\" alt=\"Shoutcast Directory ID\">" - "<img border=\"0\" title=\"Shoutcast Directory ID\" alt=\"Shoutcast Directory ID\" style=\"vertical-align:bottom\" " - "src=\"images/favicon.ico\"> ID: <b><a title=\"Shoutcast Directory ID\" href=\"http://" + - gOptions.ypAddr().hideAsString() + ":" + tos(gOptions.ypPort()) + ((gOptions.ypPath() != utf8("/yp2")) ? "/yp" : "") + - "/sbin/tunein-station.pls?id=" + info.m_stationID.hideAsString() + "\">" + info.m_stationID.hideAsString() + "</a></b></div>")) + - - (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - " Not Listed - " + string(info.m_authHash.empty() ? "Empty" : "Invalid") + " Authhash" : - (extra.ypErrorCode == 200 ? " Waiting on a Directory response" : - (extra.ypErrorCode == -1 ? "Unable to access the Directory.<br>Check the server log for more details.<br>The stream will behave like it is private." : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "Directory is down for maintenance: <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2#YP_Server_Errors\">" + - tos(extra.ypErrorCode) + "</a><br>Listeners are allowed, stream will not be listed" : - (extra.ypErrorCode == YP_AUTH_ISSUE_CODE ? " Please contact support as there is an issue with the authhash" : " Directory returned error code: <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2#YP_Server_Errors\">" + tos(extra.ypErrorCode) + "</a><br>" + - (extra.ypConnected != 2 ? "" : "during a listing update. The stream may not<br>appear in the Directory due to the error. The<br> server will attempt to re-list the stream.")))))) : "") : - "Private") + "</td><td> </td>" - "<td title=\"Source User Agent: " + addWBR((!info.m_sourceIdent.empty() ? - info.m_sourceIdent : "Legacy / Unknown")) + "\">Source: <b>" + - utf8(info.m_sourceType == streamData::SHOUTCAST1 ? "v1" : - (info.m_sourceType == streamData::SHOUTCAST2 ? "v2" : "HTTP")) + - (extra.isRelay ? " relay" + (extra.isBackup ? utf8(" backup") : "") : - (extra.isBackup ? " backup" : "")) + "</b> [ <a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=kicksrc\">" + (extra.isRelay || extra.isBackup ? "stop" : "kick") + - "</a> ]</td></tr></table></td></tr>" - - "<tr><td align=\"center\">" - "<div style=\"padding:1em;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\" class=\"en\">" - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=viewxml\">Summary</a> | " - - "<div style=\"display:inline-block;\"><a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=viewxml&page=3\">Listeners</a> [ <a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=viewxml&page=3&ipcount=1\">Counts</a> ]</div> | " - - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=viewxml&page=4\">History</a> | " - "<a href=\"currentmetadata?sid=" + tos(sid) + "\">Metadata</a> | " - "<a href=\"stats?sid=" + tos(sid) + "\">Statistics</a> " - "<a href=\"7?sid=" + tos(sid) + "\">…</a></div></td></tr>"; - - if (sd) - { - sd->releaseStream(); - } - - const utf8& message = streamData::getStreamMessage(sid); - if (!message.empty()) - { - streamBody += "<tr><td align=\"center\" width=\"100%\"><table cellspacing=\"0\" cellpadding=\"15px;\" class=\"ent\" width=\"85%\">" - "<tr><td valign=\"top\" align=\"center\" style=\"border:1px;display:block;\"><br>" - "<div align=\"center\" class=\"infh\" style=\"margin-left:-15px;margin-right:-15px;margin-top:-14px;\">" - "<b>Official Message Received</b></div>" + message + "</td></tr></table></td></tr>"; - } - - streamBlocks[sid] = streamBody; - } - } - ++inc; - } - while (sid); - - // now we check through for any known but inactive relays and then get them listed as well - vector<config::streamConfig> relayList(gOptions.getRelayList()); - if (!relayList.empty()) - { - for (vector<config::streamConfig>::const_iterator i = relayList.begin(); i != relayList.end(); ++i) - { - sid = (*i).m_streamID; - const bool exists = !(*i).m_relayUrl.url().empty(); - if (exists && !streamData::isSourceConnected(sid)) - { - stats::statsData_t data; - stats::getStats(sid, data); - - // increment our stream total now that we know we have one - totalListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(sid, info, extra); - utf8 listeners, content, streamBody2, - streamBody = "<tr align=\"center\" class=\"tnl\"><td>" - "<a href=\"index.html?sid=" + tos(sid) + "\">Stream #" + tos(sid) + "</a> " - "<a href=\"admin.cgi?sid=" + tos(sid) + "\">(Stream Login)</a></td></tr>"; - - const utf8 movedUrl = gOptions.stream_movedUrl(sid); - if (movedUrl.empty()) - { - const bool slave = isCDNSlave(sid); - const bool master = isCDNMaster(sid); - if (master || slave) - { - streamBody2 = "<div class=\"en\" style=\"padding:1emx;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\">" + - getCDNMessage(master, slave) + "</div><br><br>"; - } - else - { - if ((*i).m_authHash.empty()) - { - streamBody2 += "<div class=\"en\" style=\"padding:1em;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\">" - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Create Authhash</a>" - " | <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Manage Authhash</a></div>"; - } - else - { - // check that the authhash is a valid length - if (!yp2::isValidAuthhash((*i).m_authHash)) - { - streamBody2 += getBadAuthhashMessage(sid, info.m_authHash); - } - else - { - streamBody2 += "<div class=\"en\" style=\"padding:1em;margin-bottom:0.5em;display:inline-block;border-radius:0.5em;\">" - + utf8((master || slave || info.m_streamPublic) && (info.m_streamSampleRate > 0) && - info.m_radionomyID.empty() && ((extra.ypErrorCode != YP_NOT_VISIBLE) && - (extra.ypErrorCode != YP_AUTH_ISSUE_CODE) && (extra.ypErrorCode != -1)) ? - warningImage(false) + " <b>Please Register Your Authhash</b><br><br>" : "") + - "<a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Update Authhash</a> | " - " <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=register\">Manage Authhash</a></div>"; - } - } - - if (!streamBody2.empty()) - { - streamBody2 += "<br>"; - } - } - } - else - { - streamBody2 = "<b>This stream is configured as having been moved or retired.<br>" - "No source connections will be allowed for this stream.<br><br>" - "All client connections received will be redirected to:<br>" + - urlLink(movedUrl) + "</b>"; - ++movedTotal; - } - - if (!streamBody2.empty()) - { - streamBody += "<tr><td align=\"center\">" + streamBody2 + "</td></tr>"; - } - - // strip down the source address for display output - const utf8 srcAddr = niceURL(gOptions.stream_relayURL(sid)); - if (movedUrl.empty()) - { - bool noEntry = false; - const bool isListable = streamData::isAllowedType(info.m_uvoxDataType); - streamBody += "<tr><td><table align=\"center\"><tr valign=\"top\">" - "<td" + (!extra.isConnected ? " rowspan=\"2\"" : (utf8)"") + - " align=\"right\">Status: <b>" + string(info.m_streamPublic && isListable ? (extra.ypConnected != 1 ? "" : string("Public")) + - (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - " Not Listed - " + string(info.m_authHash.empty() ? "Empty" : "Invalid") + " Authhash" : - (extra.ypErrorCode == 200 ? " Waiting on a Directory response" : - (extra.ypErrorCode == -1 ? "Unable to access the Directory.<br>Check the error server for more details.<br>The stream will behave like it is private." : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "Directory is down for maintenance: <a target=\"_blank\" " - "href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2#YP_Server_Errors\">" + - tos(extra.ypErrorCode) + "</a><br>Listeners are allowed, stream will not be listed" : - (extra.ypErrorCode == YP_AUTH_ISSUE_CODE ? " Please contact support as there is an issue with the authhash" : " Directory returned " - "error code: <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2#YP_Server_Errors\">" + tos(extra.ypErrorCode) + "</a><br>" + - (extra.ypConnected != 2 ? "" : "during a listing update. The stream may not<br>appear in the Directory due to the error. The<br> server will attempt to re-list the stream.")))))) : "") : - "Private") + "</b></td><td" + (!extra.isConnected ? " rowspan=\"2\"" : (utf8)"") + "> </td>" - "<td title=\"Source User Agent: " + addWBR((!info.m_sourceIdent.empty() ? info.m_sourceIdent : "Legacy / Unknown")) + "\">" - "Source: <b>" + (!(streamData::isRelayActive(sid, noEntry) == 1) ? - "Inactive relay</b> [ <a href=\"admin.cgi?sid=" + tos(sid) + - "&mode=startrelay\">start relay</a> ]<br>Using: <b>" + urlLink(srcAddr) + "</b>" : - "Connection pending to " + urlLink(srcAddr) + "</b>" - " [ <a href=\"admin.cgi?sid=" + tos(sid) + "&mode=kicksrc\">abort</a> ]") + - - // if it's an inactive stream then we also want to show any remaining connections - "</td></tr>" + (data.connectedListeners > 0 ? "<tr valign=\"top\">" - "<td align=\"center\"><div style=\"text-align:left;padding-top:0.5em;\">Listeners: <b>" + - tos(data.connectedListeners) + "</b>" + (data.peakListeners > 0 ? " | Peak: <b>" + - tos(data.peakListeners) + "</b>" : "") + " [ <a href=\"admin.cgi?sid=" + tos(sid) + - "&mode=kickdst&kickdst=all\">kick all</a> ]" + "</div></td></tr>" : "") + - "</table></td></tr>"; - } - streamBlocks[sid] = streamBody; - } - } - } - - // now we check through for any known but in-active sources & then get them listed as well - // new to build 70 but for fire builds makes it easier to see if a feed stream is inactive - config::streams_t stream_configs; - gOptions.getStreamConfigs(stream_configs); - if (!stream_configs.empty()) - { - for (config::streams_t::const_iterator i = stream_configs.begin(); i != stream_configs.end(); ++i) - { - if (streamBlocks.find((*i).first) == streamBlocks.end()) - { - stats::statsData_t data; - stats::getStats((*i).first, data); - - // increment our stream total now that we know we have one - totalListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - - utf8 streamBody = "<tr><td align=\"center\" class=\"tnl\">" - "<a href=\"index.html?sid=" + tos((*i).first) + "\">Stream #" + tos((*i).first) + "</a> " - "<a href=\"admin.cgi?sid=" + tos((*i).first) + "\">(Stream Login)</a></td></tr>", - streamBody2; - - const utf8 movedUrl = gOptions.stream_movedUrl((*i).first); - if (movedUrl.empty()) - { - utf8 authhash = (*i).second.m_authHash; - if (authhash.empty()) - { - authhash = gOptions.stream_authHash((*i).first); - } - - if (authhash.empty()) - { - streamBody2 += "<div class=\"en\" style=\"padding:1em;margin-bottom:1em;display:inline-block;border-radius:0.5em;\">" - "<a href=\"admin.cgi?sid=" + tos((*i).first) + "&mode=register\">Create Authhash</a>" - " | <a href=\"admin.cgi?sid=" + tos((*i).first) + "&mode=register\">Manage Authhash</a></div>"; - } - else - { - // check that the authhash is a valid length - if (!yp2::isValidAuthhash(authhash)) - { - streamBody2 += getBadAuthhashMessage((*i).first, authhash); - } - else - { - streamBody2 += "<div class=\"en\" style=\"padding:1em;margin-bottom:1em;display:inline-block;border-radius:0.5em;\">" - // TODO if the stream is not active then we don't know the admode - // status and so it's easier to not show the warning until - // we've got something that will allow us to check authhash. - //+ utf8(info.m_radionomyID.empty() ? warningImage(false) + " <b>Please Register Your Authhash</b><br><br>" : "") + - "<a href=\"admin.cgi?sid=" + tos((*i).first) + "&mode=register\">Update Authhash</a>" - " | <a href=\"admin.cgi?sid=" + tos((*i).first) + "&mode=register\">Manage Authhash</a></div>"; - } - } - - if (!streamBody2.empty()) - { - streamBody2 += "<br>"; - } - streamBody2 += "<b>This stream is configured but has no source connected.</b>" + - (data.connectedListeners > 0 ? "<div style=\"text-align:center;padding-top:0.5em;\">Listeners: " - "<b>" + tos(data.connectedListeners) + "</b>" + (data.peakListeners > 0 ? " | " - "Peak: <b>" + tos(data.peakListeners) + "</b>" : "") + " [ <a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=kickdst&kickdst=all\">kick all</a> ]" + "</div>" : ""); - } - else - { - streamBody2 += "<b>This stream is configured as having been moved or retired.<br>" - "No source connections will be allowed for this stream.<br><br>" - "All client connections received will be redirected to:<br>" + - urlLink(movedUrl) + "</b>"; - ++movedTotal; - } - - if (!streamBody2.empty()) - { - streamBody += "<tr><td align=\"center\">" + streamBody2 + "</td></tr>"; - } - - streamBlocks[(*i).first] = streamBody; - } - } - } - - // this will now do a final check for any listeners which are on - // an un-confiured stream but are being provided a 'backupfile'. - const streamData::streamIDs_t activeIds = stats::getActiveStreamIds(); - if (!activeIds.empty()) - { - for (streamData::streamIDs_t::const_iterator i = activeIds.begin(); i != activeIds.end(); ++i) - { - if (streamBlocks.find((*i)) == streamBlocks.end()) - { - stats::statsData_t data; - stats::getStats((*i), data); - - // increment our stream total now that we know we have one - totalListeners += data.connectedListeners; - totalPeakListeners += data.peakListeners; - - utf8 streamBody = "<tr><td align=\"center\" class=\"tnl\">" - "<a href=\"index.html?sid=" + tos((*i)) + "\">Stream #" + tos((*i)) + "</a> " - "<a href=\"admin.cgi?sid=" + tos((*i)) + "\">(Stream Login)</a></td></tr>", - streamBody2; - streamBody2 += "<b>This stream is not configured and has no source connected.</b>" + - (data.connectedListeners > 0 ? "<div style=\"text-align:center;padding-top:0.5em;\">Listeners: " - "<b>" + tos(data.connectedListeners) + "</b>" + (data.peakListeners > 0 ? " | " - "Peak: <b>" + tos(data.peakListeners) + "</b>" : "") + " [ <a href=\"admin.cgi?sid=" + - tos(sid) + "&mode=kickdst&kickdst=all\">kick all</a> ]" + "</div>" : ""); - - if (!streamBody2.empty()) - { - streamBody += "<tr><td align=\"center\">" + streamBody2 + "</td></tr>"; - } - - streamBlocks[(*i)] = streamBody; - } - } - } - - // now build up the output since if we've factored in inactive relay connections - // then we could otherwise be showing the streams in an out of order manner - for (map<size_t,uniString::utf8>::const_iterator i = streamBlocks.begin(); i != streamBlocks.end(); ++i) - { - if (!(*i).second.empty()) - { - if (streamTotal > 0) - { - streams += "<tr><td align=\"center\"><br><hr><br></td></tr>"; - } - streams += (*i).second; - ++streamTotal; - } - } - - // output a refresh option if there were no active streams found - if (!streamTotal) - { - if (isPostSetup() && isPostSetup() <= 2) - { - streams += "<tr><td align=\"center\">" - "<br><div align=\"center\" class=\"infh\" style=\"border-bottom:0;top:-19px;\">" - "Setup Successfully Completed</div></td></tr><tr><td align=\"center\">" - "No stream sources are currently connected.<br>" - "To find newly connected sources, <a href=\"admin.cgi?sid=0\">click here.</a></td></tr>"; - setPostSetup(isPostSetup() + 1); - } - else - { - streams += "<tr><td align=\"center\">No stream sources are currently connected.<br>" - "To find newly connected sources, <a href=\"admin.cgi?sid=0\">click here.</a><br><br></td></tr>"; - } - } - else - { - setPostSetup(0); - } - } - else if (refreshRequired > 0) - { - streams += "<tr><td align=\"center\" id=\"counter\">" - "Waiting " + tos(refreshRequired) + " second" + ((refreshRequired > 1) ? "s" : (utf8)"") + - " for any configuration changes to take effect.<br>" - "If not automatically redirected or do not want to wait, " - "<a href=\"admin.cgi?sid=0\">click here.</a><br><br></td></tr>"; - } - else if (refreshRequired < 0) - { - streams += "<tr><td align=\"center\" id=\"counter\">" - "Waiting " + tos(abs(refreshRequired)) + " second" + ((abs(refreshRequired) > 1) ? "s" : (utf8)"") + - " whilst checking for any DNAS updates.<br>If not automatically redirected or do not want to wait, " - "<a href=\"admin.cgi?sid=0\">click here.</a><br><br></td></tr>"; - } - - utf8 log = gOptions.realLogFile(); - utf8::size_type pos = log.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - log = log.substr(pos + 1); - } - - utf8 conf = gOptions.confFile(); - pos = conf.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - conf = conf.substr(pos + 1); - } - - const bool requires = gOptions.requireStreamConfigs(); - body += "<table cellpadding=\"5\" cellspacing=\"0\" border=\"0\" width=\"100%\">" - "<tr><td class=\"tsp\" align=\"center\">" - "Available Streams: " + tos(streamTotal - movedTotal) + - " | " - "Server Listeners: " + tos(totalListeners) + - " | " - "Peak Server Listeners: " + tos(totalPeakListeners) + - " | " - "Unique Listeners: " + tos(stats::getTotalUniqueListeners()) + - "</td></tr></table>" - - "<div style=\"padding:0 1em;\">" - "<br><table width=\"100%\" align=\"center\"><tr valign=\"top\"><td>" - - "<table class=\"en\" cellpadding=\"15px\" style=\"border:0;display:block;padding-right:1em;\"><tr>" - "<td valign=\"top\" style=\"max-width:20em;\">" - "<div align=\"center\" class=\"infh\"><b>Server Management</b></div>" - "Rotate Log File(s):" - " [ <a href=\"admin.cgi?mode=rotate\">All</a> ]" - " [ <a href=\"admin.cgi?mode=rotate&files=log\">Log</a> ]" - " [ <a href=\"admin.cgi?mode=rotate&files=w3c\">W3C</a> ]" - "<br><br>" - - // trim down the file paths shown to make things less cluttered on hosted setups - // places the full path in the 'title' so it can still be found if required, etc - "Log File: <b title=\"" + - aolxml::escapeXML(fileUtil::getFullFilePath(gOptions.realLogFile())) + - "\">" + aolxml::escapeXML(fileUtil::stripPath(log)) + "</b><br><br>" - "Configuration File: <b title=\"" + - aolxml::escapeXML(fileUtil::getFullFilePath(gOptions.confFile())) + - "\">" + aolxml::escapeXML(fileUtil::stripPath(conf)) + "</b><br>" - "[ <a href=\"admin.cgi?mode=config\">View</a> ]" - " [ <a href=\"admin.cgi?mode=reload\">Update</a> ]" - " [ <a href=\"admin.cgi?mode=reload&force=1\">Forced</a> ]" - - "<br><br><hr><br>Source Connection Details:" - " [ <a href=\"admin.cgi?mode=sources\">View</a> ]<br>" + - - (requires ? "<br><b>Note:</b> Only pre-configured streams are " - "allowed to connect / be run on this server.<br>" : "") + - - "<br>Advert Group Details:" - " [ <a href=\"admin.cgi?mode=adgroups\">View</a> ]<br>" - - "<br><hr><br>Stream Configuration(s):" - " [ <a href=\"admin.cgi?sid=1&mode=viewjson&page=6\">JSON</a> ]" - " [ <a href=\"admin.cgi?sid=1&mode=viewxml&page=6\">XML</a> ]<br>" - - "<br>View Stream Statistics:" - " [ <a href=\"statistics?json=1\">JSON</a> ]" - " [ <a href=\"statistics\">XML</a> ]<br>" - - "<br><hr><br>Manage Stream Source(s):<br>" - "[ <a href=\"admin.cgi?mode=startrelays\">Start Relays</a> ]" - " [ <a href=\"admin.cgi?mode=kicksources\">Kick / Stop All</a> ]<br>" - - "<br><hr><br>Reload Banned List(s):" - " [ <a href=\"admin.cgi?mode=bannedlist\">Update</a> ]<br>" - - "<br>Reload Reserved List(s):" - " [ <a href=\"admin.cgi?mode=reservelist\">Update</a> ]<br>" - - "<br>Reload User Agent List(s):" - " [ <a href=\"admin.cgi?mode=useragentlist\">Update</a> ]<br>" - - "<br>Reload Admin Access List:" - " [ <a href=\"admin.cgi?mode=adminlist\">Update</a> ]<br>" - - "<br>Clear Resource / Page Cache:" - " [ <a href=\"admin.cgi?mode=clearcache\">Clear</a> ]<br>" - - "<br><hr><br>Debugging Options:<br>" - "[ <a href=\"admin.cgi?mode=debug&option=all&on=true\">Enable All</a> ]" - " [ <a href=\"admin.cgi?mode=debug&option=all&on=false\">Disable All</a> ]" - " [ <a href=\"admin.cgi?mode=debug\">Edit</a> ]" - - "<br><br><hr><br>New DNAS Release: [ <a href=\"admin.cgi?mode=version\">Check</a> ]<br>" - "Last checked: <b>" + getCheckedDuration((size_t)(m_lastActivityTime - last_update_check)) + "</b>" - "</td></tr></table></td><td>"; - - // display update message where applicable - updater::verInfo ver; - utf8 update_msg; - if (updater::getNewVersion(ver)) - { - update_msg += "<tr><td align=\"center\" class=\"tnl\">" - "<table cellspacing=\"0\" cellpadding=\"5\"><tr><td align=\"center\" class=\"infb\">" - "<div align=\"center\" class=\"infh\"><b>New DNAS Version Available</b></div>A new version of the DNAS is now available:" - " <b>" + ver.ver + "</b><br><br>" + - (!ver.url.empty() ? - ((ver.downloaded && !ver.fn.empty()) ? "The new version has been automatically downloaded to:<br><br><b>" + aolxml::escapeXML(ver.fn) + "</b><br><br>" - "Please install this update as soon as possible, thank you.<br><br>" - "Specific changes for this version can be found <a href=\"" + aolxml::escapeXML(ver.info) + "\"><b>here</b></a>." - : - "Click <a href=\"" + aolxml::escapeXML(ver.url) + "\"><b>here</b></a> to download the new version of the DNAS.<br><br>" - "Please install this update as soon as possible, thank you.<br><br>" - "Specific changes for this version can be found <a href=\"" + aolxml::escapeXML(ver.info) + "\"><b>here</b></a>.") : "") + - (!ver.message.empty() ? "<br>" + ver.message : - (!ver.log.empty() ? "<br>For more details of the changes in this version see <a target=\"_blank\" href=\"" + aolxml::escapeXML(ver.log) + "\">" + - "<b>here</b></a>." : "")) + "</td></tr></table><br></td></tr>" - "<tr><td align=\"center\"><hr><br></td></tr>"; - } - - body += "<table cellspacing=\"0\" cellpadding=\"5\" border=\"0\">" + - update_msg + streams + "</table></td></tr></table></div>" + - "<script type=\"text/javascript\">" - "function $(id){return document.getElementById(id);}" EL; - - // for a refresh, we'll show a countdown so it's obvious that something is happening - if (refreshRequired > 0) - { - body += "var c = " + tos(refreshRequired) + ";" EL - "function counter(){" EL - "c--;" EL - "if(c>0){" EL - "$('counter').innerHTML=\"Waiting \"+c+\" second\" + (c > 1 ? \"s\" : \"\") + \" for any configuration changes to take effect.<br>" - "If not automatically redirected or do not want to wait, <a href=\\\"admin.cgi\\\">click here.</a><br><br>\";" EL - "}" EL - "}" EL - "setInterval(counter,1000);" EL; - } - else if (refreshRequired < 0) - { - body += "var c = " + tos(abs(refreshRequired)) + ";" EL - "function counter(){" EL - "c--;" EL - "if(c>0){" EL - "$('counter').innerHTML=\"Waiting \"+c+\" second\" + (c > 1 ? \"s\" : \"\") + \" whilst checking for any DNAS updates.<br>" - "If not automatically redirected or do not want to wait, <a href=\\\"admin.cgi\\\">click here.</a><br><br>\";" EL - "}" EL - "}" EL - "setInterval(counter,1000);" EL; - } - - body += getUptimeScript(true) + "</script>" + - getIEFlexFix() + getHTML5Remover() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_bandwidth_html(const int refreshRequired) throw() -{ - const __uint64 all = bandWidth::getAmount(bandWidth::ALL), - sent = bandWidth::getAmount(bandWidth::ALL_SENT), - recv = bandWidth::getAmount(bandWidth::ALL_RECV); - const time_t running = (::time(NULL) - g_upTime); - - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Bandwidth Usage", refreshRequired, "&mode=bandwidth&refresh=" + tos(abs(refreshRequired)), 1) + - "<table cellpadding=\"5\" cellspacing=\"0\" border=\"0\" width=\"100%\">" - "<tr><td class=\"tsp\" align=\"center\">" - "Total: <b>" + formatSizeString(all) + (all > 0 ? " (~" + formatSizeString((all / running) * 86400) + " / day)" : "") + "</b>" - " | " - "Sent: <b>" + formatSizeString(sent) + (sent > 0 ? " (~" + formatSizeString((sent / running) * 86400) + " / day)" : "") + "</b>" - " | " - "Received: <b>" + formatSizeString(recv) + (recv > 0 ? " (~" + formatSizeString((recv / running) * 86400) + " / day)" : "") + "</b>" - "</td></tr></table><div><br>" - - "<table align=\"center\" class=\"en\" cellspacing=\"0\" cellpadding=\"3\" style=\"border:0;\">" - - "<tr class=\"infh\"><td class=\"t\"> Total Client Data Sent</td>" - "<td class=\"st\"><b>" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_CLIENT_SENT)) + "</b></td></tr>" - "<tr class=\"t\"><td>v2 Client(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_V2_SENT)) + "</td></tr>" - "<tr class=\"t\"><td>v1 Client(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_V1_SENT)) + "</td></tr>" - "<tr class=\"t\"><td>HTTP Client(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_HTTP_SENT)) + "</td></tr>" - "<tr class=\"t\"><td>FLV Client(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_FLV_SENT)) + "</td></tr>" -#if 0 - "<tr class=\"t\"><td>M4A Client(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::CLIENT_M4A_SENT)) + "</td></tr>" -#endif - "<tr><td style=\"border:0;\"> </td></tr>" - - "<tr class=\"infh\"><td class=\"t\"> Total Source Data Received</td>" - "<td class=\"st\"><b>" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_SOURCE_RECV)) + "</b></td></tr>" - "<tr class=\"t\"><td>v2 Source(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::SOURCE_V2_RECV)) + "</td></tr>" - "<tr class=\"t\"><td>v1 Source(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::SOURCE_V1_RECV)) + "</td></tr>" - "<tr><td style=\"border:0;\"> </td></tr>" - - "<tr class=\"infh\"><td class=\"t\"> Total Source Data Sent</td>" - "<td class=\"st\"><b>" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_SOURCE_SENT)) + "</b></td></tr>" - "<tr class=\"t\"><td>v2 Source(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::SOURCE_V2_SENT)) + "</td></tr>" - "<tr class=\"t\"><td>v1 Source(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::SOURCE_V1_SENT)) + "</td></tr>" - "<tr><td style=\"border:0;\"> </td></tr>" - - "<tr class=\"infh\"><td class=\"t\"> Total Relay Data Received</td>" - "<td class=\"st\"><b>" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_RELAY_RECV)) + "</b></td></tr>" - "<tr class=\"t\"><td>Handshaking</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::RELAY_MISC_RECV)) + "</td></tr>" - "<tr class=\"t\"><td>v2 Relay(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::RELAY_V2_RECV)) + "</td></tr>" - "<tr class=\"t\"><td>v1 Relay(s)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::RELAY_V1_RECV)) + "</td></tr>" - "<tr><td style=\"border:0;\"> </td></tr>" - - "<tr class=\"infh\"><td class=\"t\"> Total Web Page, XML and Resoures </td>" - "<td class=\"st\"><b>" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_WEB)) + "</b></td></tr>" - "<tr class=\"t\"><td>Public (e.g. /stats or index.html)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::PUBLIC_WEB)) + "</td></tr>" - "<tr class=\"t\"><td>Private (e.g. /admin.cgi pages)</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::PRIVATE_WEB)) + "</td></tr>" - "<tr><td style=\"border:0;\"> </td></tr>" - - "<tr class=\"infh\"><td class=\"t\"> Total Other Data</td>" - "<td class=\"st\"><b>" + formatSizeString(bandWidth::getAmount(bandWidth::ALL_OTHER)) + "</b></td></tr>" - "<tr class=\"t\"><td>Flash Policy Server</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::FLASH_POLICY)) + "</td></tr>" - "<tr class=\"t\"><td>v2 Relay(s) Sent</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::RELAY_V2_SENT)) + "</td></tr>" - "<tr class=\"t\"><td>YP Sent</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::YP_SENT)) + "</td></tr>" - "<tr class=\"t\"><td>YP Received</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::YP_RECV)) + "</td></tr>" - "<tr class=\"t\"><td>Listener Authentication and Metrics</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::AUTH_AND_METRICS)) + "</td></tr>" - "<tr class=\"t\"><td>Advert Retrieval</td>" - "<td class=\"s\">" + formatSizeString(bandWidth::getAmount(bandWidth::ADVERTS)) + "</td></tr>" - - "</table></div>" + getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_bandwidth_xml() throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:text/xml\r\n", - body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" - "<SHOUTCASTSERVER>" - - "<TOTAL>" + tos(bandWidth::getAmount(bandWidth::ALL)) + "</TOTAL>" - "<SENT>" + tos(bandWidth::getAmount(bandWidth::ALL_SENT)) + "</SENT>" - "<RECV>" + tos(bandWidth::getAmount(bandWidth::ALL_RECV)) + "</RECV>" - "<TIME>" + tos((::time(NULL) - g_upTime)) + "</TIME>" - - "<CLIENTSENT>" - "<TOTAL>" + tos(bandWidth::getAmount(bandWidth::ALL_CLIENT_SENT)) + "</TOTAL>" - "<V2>" + tos(bandWidth::getAmount(bandWidth::CLIENT_V2_SENT)) + "</V2>" - "<V1>" + tos(bandWidth::getAmount(bandWidth::CLIENT_V1_SENT)) + "</V1>" - "<HTTP>" + tos(bandWidth::getAmount(bandWidth::CLIENT_HTTP_SENT)) + "</HTTP>" - "<FLV>" + tos(bandWidth::getAmount(bandWidth::CLIENT_FLV_SENT)) + "</FLV>" -#if 0 - "<M4A>" + tos(bandWidth::getAmount(bandWidth::CLIENT_M4A_SENT)) + "</M4A>" -#endif - "</CLIENTSENT>" - - "<SOURCERECV>" - "<TOTAL>" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_RECV)) + "</TOTAL>" - "<V2>" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_RECV)) + "</V2>" - "<V1>" + tos(bandWidth::getAmount(bandWidth::SOURCE_V1_RECV)) + "</V1>" - "</SOURCERECV>" - - "<SOURCESENT>" - "<TOTAL>" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_SENT)) + "</TOTAL>" - "<V2>" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_SENT)) + "</V2>" - "<V1>" + tos(bandWidth::getAmount(bandWidth::SOURCE_V1_SENT)) + "</V1>" - "</SOURCESENT>" - - "<RELAYRECV>" - "<TOTAL>" + tos(bandWidth::getAmount(bandWidth::ALL_RELAY_RECV)) + "</TOTAL>" - "<MISC>" + tos(bandWidth::getAmount(bandWidth::RELAY_MISC_RECV)) + "</MISC>" - "<V2>" + tos(bandWidth::getAmount(bandWidth::RELAY_V2_RECV)) + "</V2>" - "<V1>" + tos(bandWidth::getAmount(bandWidth::RELAY_V1_RECV)) + "</V1>" - "</RELAYRECV>" - - "<WEBPAGES>" - "<TOTAL>" + tos(bandWidth::getAmount(bandWidth::ALL_WEB)) + "</TOTAL>" - "<PUBLIC>" + tos(bandWidth::getAmount(bandWidth::PUBLIC_WEB)) + "</PUBLIC>" - "<PRIVATE>" + tos(bandWidth::getAmount(bandWidth::PRIVATE_WEB)) + "</PRIVATE>" - "</WEBPAGES>" - - "<OTHER>" - "<TOTAL>" + tos(bandWidth::getAmount(bandWidth::ALL_OTHER)) + "</TOTAL>" - "<FLASH>" + tos(bandWidth::getAmount(bandWidth::FLASH_POLICY)) + "</FLASH>" - "<RELAYSENTV2>" + tos(bandWidth::getAmount(bandWidth::RELAY_V2_SENT)) + "</RELAYSENTV2>" - "<YPSENT>" + tos(bandWidth::getAmount(bandWidth::YP_SENT)) + "</YPSENT>" - "<YPRECV>" + tos(bandWidth::getAmount(bandWidth::YP_RECV)) + "</YPRECV>" - "<AUTH_METRICS>" + tos(bandWidth::getAmount(bandWidth::AUTH_AND_METRICS)) + "</AUTH_METRICS>" - "<ADVERTS>" + tos(bandWidth::getAmount(bandWidth::ADVERTS)) + "</ADVERTS>" - "</OTHER>" - "</SHOUTCASTSERVER>"; - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_bandwidth_json(const uniString::utf8& callback) throw() -{ - const bool jsonp = !callback.empty(); - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + - "{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL)) + "," - "\"sent\":" + tos(bandWidth::getAmount(bandWidth::ALL_SENT)) + "," - "\"recv\":" + tos(bandWidth::getAmount(bandWidth::ALL_RECV)) + "," - "\"time\":" + tos((::time(NULL) - g_upTime)) + "," - "\"clientsent\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_CLIENT_SENT)) + "," - "\"v2\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_V2_SENT)) + "," - "\"v1\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_V1_SENT)) + "," - "\"http\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_HTTP_SENT)) + "," - "\"flv\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_FLV_SENT)) + -#if 0 - "," - "\"m4a\":" + tos(bandWidth::getAmount(bandWidth::CLIENT_M4A_SENT)) + -#endif - "},\"sourcerecv\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_RECV)) + "," - "\"v2\":" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_RECV)) + "," - "\"v1\":" + tos(bandWidth::getAmount(bandWidth::SOURCE_V1_RECV)) + - "},\"sourcesent\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_SENT)) + "," - "\"v2\":" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_SENT)) + "," - "\"v1\":" + tos(bandWidth::getAmount(bandWidth::SOURCE_V2_SENT)) + - "},\"relayrecv\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_SOURCE_RECV)) + "," - "\"misc\":" + tos(bandWidth::getAmount(bandWidth::RELAY_MISC_RECV)) + "," - "\"v2\":" + tos(bandWidth::getAmount(bandWidth::RELAY_V2_RECV)) + "," - "\"v1\":" + tos(bandWidth::getAmount(bandWidth::RELAY_V1_RECV)) + - "},\"webpages\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_WEB)) + "," - "\"public\":" + tos(bandWidth::getAmount(bandWidth::PUBLIC_WEB)) + "," - "\"private\":" + tos(bandWidth::getAmount(bandWidth::PRIVATE_WEB)) + - "},\"other\":{" - "\"total\":" + tos(bandWidth::getAmount(bandWidth::ALL_OTHER)) + "," - "\"flash\":" + tos(bandWidth::getAmount(bandWidth::FLASH_POLICY)) + "," - "\"relaysentv2\":" + tos(bandWidth::getAmount(bandWidth::RELAY_V2_SENT)) + "," - "\"ypsent\":" + tos(bandWidth::getAmount(bandWidth::YP_SENT)) + "," + - "\"yprecv\":" + tos(bandWidth::getAmount(bandWidth::YP_RECV)) + "," + - "\"auth_metrics\":" + tos(bandWidth::getAmount(bandWidth::AUTH_AND_METRICS)) + "," + - "\"adverts\":" + tos(bandWidth::getAmount(bandWidth::ADVERTS)) + - "}}" + (jsonp ? utf8(")") : ""); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_ypstatus_xml() throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:text/xml\r\n", - body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" - "<SHOUTCASTSERVER>"; - - streamData::streamIDs_t streamIds = streamData::getStreamIds(); - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if ((*i).second.m_streamID) - { - streamIds.insert((*i).second.m_streamID); - } - } - - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo((*i), info, extra); - - const utf8 movedUrl = gOptions.stream_movedUrl((*i)); - if (movedUrl.empty()) - { - body += "<STREAM id=\"" + tos((*i)) + "\">" + - (!extra.isConnected ? "<STATUS>NOSOURCE</STATUS>" : - (info.m_streamPublic ? (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - (info.m_authHash.empty() ? "<STATUS>EMPTY_AUTHHASH</STATUS>" : "<STATUS>INVALID_AUTHHASH</STATUS>") : - (extra.ypErrorCode == 200 ? "<STATUS>WAITING</STATUS>" : - (extra.ypErrorCode == YP_COMMS_FAILURE ? "<STATUS>YP_NOT_FOUND</STATUS>" : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "<STATUS>YP_MAINTENANCE</STATUS>" : - "<STATUS>ERROR</STATUS><CODE>" + tos(extra.ypErrorCode) + "</CODE>")))) : - "<STATUS>PUBLIC</STATUS><STNID>" + info.m_stationID + "</STNID>") : - "<STATUS>PRIVATE</STATUS>")) + "</STREAM>"; - } - else - { - body += "<STREAM id=\"" + tos((*i)) + "\"><STATUS>MOVED</STATUS></STREAM>"; - } - } - - body += "</SHOUTCASTSERVER>"; - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_ypstatus_json(const uniString::utf8& callback) throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n"; - - streamData::streamIDs_t streamIds = streamData::getStreamIds(); - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - if ((*i).second.m_streamID) - { - streamIds.insert((*i).second.m_streamID); - } - } - - const bool jsonp = !callback.empty(); - utf8 body = (jsonp ? callback + "(" : "") + "{" + - (!streamIds.empty() ? "\"streams\":[" : ""); - - bool read = false; - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo((*i), info, extra); - - const utf8 movedUrl = gOptions.stream_movedUrl((*i)); - if (movedUrl.empty()) - { - body += (read ? utf8(",") : "") + - "{" - "\"id\":" + tos((*i)) + "," + - (!extra.isConnected ? "\"status\":\"" + escapeJSON("nosource") + "\"" : - (info.m_streamPublic ? (extra.ypConnected != 1 ? (!yp2::isValidAuthhash(info.m_authHash) ? - (info.m_authHash.empty() ? "\"status\":\"" + escapeJSON("empty_authhash") + "\"" : - "\"status\":\"" + escapeJSON("invalid_authhash") + "\"") : - (extra.ypErrorCode == 200 ? "\"status\":\"" + escapeJSON("waiting") + "\"" : - (extra.ypErrorCode == YP_COMMS_FAILURE ? "\"status\":\"" + escapeJSON("yp_not_found") + "\"" : - (extra.ypErrorCode == YP_MAINTENANCE_CODE ? "\"status\":\"" + escapeJSON("yp_maintenance") + "\"" : - "\"status\":\"" + escapeJSON("error") + "\",\"code\":" + tos(extra.ypErrorCode))))) : - "\"status\":\"" + escapeJSON("public") + "\",\"stnid\":" + info.m_stationID) : - "\"status\":\"" + escapeJSON("private") + "\"")) + "}"; - } - else - { - body += (read ? utf8(",") : "") + "{\"id\":" + tos((*i)) + "," - "\"status\":\"" + escapeJSON("moved") + "\"}"; - } - read = true; - } - - body += (!streamIds.empty() ? utf8("]") : "") + "}" + (jsonp ? utf8(")") : ""); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_viewxml(const streamData::streamID_t sid, int page, - const bool iponly, const bool ipcount) throw() -{ - // abort as there's nothing generated for this now - if (page == 2) - { - sendMessageAndClose("HTTP/1.1 200 OK\r\nContent-Type:text/xml\r\n\r\n"); - return; - } - - if ((page > 6) || (page < 0)) - { - page = 0; - } - - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:text/xml\r\n", - body = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><SHOUTCASTSERVER>"; - - if (page < 2) - { - stats::statsData_t data; - body += protocol_HTTPStyle::getStatsXMLBody(sid, true, true, m_socket, data); - } - - if ((page == 0) || (page == 3)) - { - time_t t = ::time(NULL); - body += "<LISTENERS>"; - - stats::currentClientList_t client_data; - stats::getClientDataForStream(sid, client_data); - map<utf8, size_t> ip_counts; - for (stats::currentClientList_t::const_iterator i = client_data.begin(); i != client_data.end(); ++i) - { - const utf8& host = ((*i)->m_hostName != (*i)->m_ipAddr ? (*i)->m_hostName : (*i)->m_ipAddr); - - if (!ipcount) - { - if (!iponly) - { - body += "<LISTENER>" - "<HOSTNAME>" + aolxml::escapeXML(host) + "</HOSTNAME>" - "<USERAGENT>" + aolxml::escapeXML((*i)->m_userAgent) + "</USERAGENT>" - "<CONNECTTIME>" + tos(t - (*i)->m_startTime) + "</CONNECTTIME>" - "<UID>" + tos((*i)->m_unique) + "</UID>" - "<TYPE>" + tos((*i)->m_clientType) + "</TYPE>" - "<REFERER>" + aolxml::escapeXML((*i)->m_referer) + "</REFERER>" - "<XFF>" + aolxml::escapeXML((*i)->m_XFF) + "</XFF>" - "<GRID>" + tos((*i)->m_group) + "</GRID>" - "<TRIGGERS>" + tos((*i)->m_triggers) + "</TRIGGERS>" - "</LISTENER>"; - } - else - { - body += "<LISTENER>" - "<HOSTNAME>" + aolxml::escapeXML(host) + "</HOSTNAME>" - "</LISTENER>"; - } - } - else - { - ++ip_counts[host]; - } - - delete (*i); - } - - if (ipcount) - { - for (map<utf8, size_t>::const_iterator i = ip_counts.begin(); i != ip_counts.end(); ++i) - { - body += "<LISTENER>" - "<HOSTNAME>" + aolxml::escapeXML((*i).first) + "</HOSTNAME>" - "<TOTAL>" + tos((*i).second) + "</TOTAL>" - "</LISTENER>"; - } - } - - body += "</LISTENERS>"; - } - - if ((page == 0) || (page == 4) || (page == 5)) - { - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - // only provide this as an option feature so as not to bloat the main xml stats unnecessarily - if (!(page == 5)) - { - body += "<SONGHISTORY>"; - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - body += "<SONG><PLAYEDAT>" + tos((*i).m_when) + "</PLAYEDAT>" - "<TITLE>" + aolxml::escapeXML((*i).m_title) + "</TITLE>" + - protocol_HTTPStyle::getCurrentXMLMetadataBody(true, (*i).m_metadata) + "</SONG>"; - } - body += "</SONGHISTORY>"; - } - else - { - body += protocol_HTTPStyle::getCurrentXMLMetadataBody(false, (!songHistory.empty() ? songHistory[0].m_metadata : "")); - } - } - - if (page == 6) - { - const int maxUsers = gOptions.maxUser(); - body += "<STREAMCONFIGS>" - "<REQUIRECONFIGS>" + tos(gOptions.requireStreamConfigs()) + "</REQUIRECONFIGS>" - "<SERVERMAXLISTENERS>" + (maxUsers > 0 ? tos(maxUsers) : "UNLIMITED") + "</SERVERMAXLISTENERS>" - "<SERVERMINBITRATE>" + tos(gOptions.minBitrate()) + "</SERVERMINBITRATE>" - "<SERVERMAXBITRATE>" + tos(gOptions.maxBitrate()) + "</SERVERMAXBITRATE>" - "<TOTALCONFIGS>"; - - config::streams_t streams; - gOptions.getStreamConfigs(streams); - - utf8 block = ""; - size_t moved = 0; - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - const utf8 movedUrl = gOptions.stream_movedUrl((*i).second.m_streamID); - if (movedUrl.empty()) - { - utf8 streamTag = ((*i).second.m_streamID > 1 ? "/stream/" + tos((*i).second.m_streamID) + "/" : "/"); - if (!(*i).second.m_urlPath.empty()) - { - streamTag = (*i).second.m_urlPath; - } - - const utf8& authhash = (*i).second.m_authHash; - block += "<STREAMCONFIG id=\"" + tos((*i).second.m_streamID) + "\">" - "<STREAMAUTHHASH>" + aolxml::escapeXML(authhash.empty() ? "EMPTY" : !yp2::isValidAuthhash(authhash) ? "INVALID" : authhash) + "</STREAMAUTHHASH>" - "<STREAMPATH>" + aolxml::escapeXML(streamTag) + "</STREAMPATH>" - "<STREAMRELAYURL>" + aolxml::escapeXML((*i).second.m_relayUrl.url()) + "</STREAMRELAYURL>" - "<STREAMBACKUPURL>" + aolxml::escapeXML((*i).second.m_backupUrl.url()) + "</STREAMBACKUPURL>" - "<STREAMMAXLISTENERS>" + ((*i).second.m_maxStreamUser > 0 && (*i).second.m_maxStreamUser < gOptions.maxUser() ? tos((*i).second.m_maxStreamUser) : "SERVERMAXLISTENERS") + "</STREAMMAXLISTENERS>" - "<STREAMMINBITRATE>" + ((*i).second.m_minStreamBitrate > 0 ? tos((*i).second.m_minStreamBitrate) : "SERVERMINBITRATE") + "</STREAMMINBITRATE>" - "<STREAMMAXBITRATE>" + ((*i).second.m_maxStreamBitrate > 0 ? tos((*i).second.m_maxStreamBitrate) : "SERVERMAXBITRATE") + "</STREAMMAXBITRATE>" - "<STREAMPUBLIC>" + aolxml::escapeXML((*i).second.m_publicServer) + "</STREAMPUBLIC>" - "<STREAMALLOWRELAY>" + tos((*i).second.m_allowRelay) + "</STREAMALLOWRELAY>" - "<STREAMPUBLICRELAY>" + tos((*i).second.m_allowPublicRelay) + "</STREAMPUBLICRELAY>" - "</STREAMCONFIG>"; - } - else - { - ++moved; - } - } - - body += tos((streams.size() - moved)) + "</TOTALCONFIGS>" + block + "</STREAMCONFIGS>"; - } - - body += "</SHOUTCASTSERVER>"; - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_viewjson(const streamData::streamID_t sid, int page, - const bool iponly, const bool ipcount, - const uniString::utf8& callback) throw() -{ - // abort as there's nothing generated for this now - if (page == 2) - { - sendMessageAndClose("HTTP/1.1 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n\r\n"); - return; - } - - if (page > 6 || page < 0) - { - page = 0; - } - - const bool jsonp = !callback.empty(); - utf8 header = "HTTP/1.1 200 OK\r\nContent-Type:application/json;charset=utf-8\r\n", - body = (jsonp ? callback + "(" : "") + (page < 2 ? "{" : ""); - - if (page < 2) - { - stats::statsData_t data; - body += protocol_HTTPStyle::getStatsJSONBody(sid, true, true, m_socket, data); - } - - if ((page == 0) || (page == 3)) - { - time_t t = ::time(NULL); - body += (!page ? utf8(",\"listeners\":[") : "["); - - stats::currentClientList_t client_data; - stats::getClientDataForStream(sid, client_data); - map<utf8, size_t> ip_counts; - for (stats::currentClientList_t::const_iterator i = client_data.begin(); i != client_data.end(); ++i) - { - const utf8& host = ((*i)->m_hostName != (*i)->m_ipAddr ? (*i)->m_hostName : (*i)->m_ipAddr); - - if (!ipcount) - { - if (!iponly) - { - body += (i != client_data.begin() ? utf8(",") : "") + - "{" - "\"hostname\":\"" + escapeJSON(host) + "\"," - "\"useragent\":\"" + escapeJSON((*i)->m_userAgent) + "\"," - "\"connecttime\":" + tos(t - (*i)->m_startTime) + "," - "\"uid\":" + tos((*i)->m_unique) + "," - "\"type\":" + tos((*i)->m_clientType) + "," - "\"referer\":\"" + escapeJSON((*i)->m_referer) + "\"," - "\"xff\":\"" + escapeJSON((*i)->m_XFF) + "\"," - "\"grid\":" + tos((*i)->m_group) + "," - "\"triggers\":" + tos((*i)->m_triggers) + "" - "}"; - } - else - { - body += (i != client_data.begin() ? utf8(",") : "") + - "{" - "\"hostname\":\"" + escapeJSON(host) + "\"" - "}"; - } - } - else - { - ++ip_counts[host]; - } - - delete (*i); - } - - if (ipcount) - { - for (map<utf8, size_t>::const_iterator i = ip_counts.begin(); i != ip_counts.end(); ++i) - { - body += (i != ip_counts.begin() ? utf8(",") : "") + - "{" - "\"hostname\":\"" + escapeJSON((*i).first) + "\"," - "\"total\":" + tos((*i).second) + "" - "}"; - } - } - - body += "]"; - } - - if ((page == 0) || (page == 4) || (page == 5)) - { - streamData::streamHistory_t songHistory; - streamData::getStreamSongHistory(sid, songHistory); - - // only provide this as an option feature so as not to bloat the main xml stats unnecessarily - if (!(page == 5)) - { - bool first = true; - body += (!page ? utf8(",\"songs\":[") : "["); - for (streamData::streamHistory_t::const_iterator i = songHistory.begin(); i != songHistory.end(); ++i) - { - body += (!first ? utf8(",") : "") + "{\"playedat\":" + - tos((*i).m_when) + "," "\"title\":\"" + - escapeJSON((*i).m_title) + "\",\"metadata\":" + - protocol_HTTPStyle::getCurrentJSONMetadataBody((*i).m_metadata) + "}"; - first = false; - } - body += "]"; - } - else - { - body += protocol_HTTPStyle::getCurrentJSONMetadataBody((!songHistory.empty() ? songHistory[0].m_metadata : "")); - } - } - - if (page == 6) - { - const int maxUsers = gOptions.maxUser(); - body += "{" - "\"requireconfigs\":" + tos(gOptions.requireStreamConfigs()) + "," - "\"maxlisteners\":" + (maxUsers > 0 ? tos(maxUsers) : "\"unlimited\"") + "," - "\"minbitrate\":" + tos(gOptions.minBitrate()) + "," - "\"maxbitrate\":" + tos(gOptions.maxBitrate()) + ","; - - config::streams_t streams; - gOptions.getStreamConfigs(streams); - - bool read = false; - utf8 block = ""; - size_t moved = 0; - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - const utf8 movedUrl = gOptions.stream_movedUrl((*i).second.m_streamID); - if (movedUrl.empty()) - { - utf8 streamTag = ((*i).second.m_streamID > 1 ? "/stream/" + tos((*i).second.m_streamID) + "/" : "/"); - if (!(*i).second.m_urlPath.empty()) - { - streamTag = (*i).second.m_urlPath; - } - - utf8 authhash = (*i).second.m_authHash; - block += (read ? utf8(",") : "") + - "{" - "\"id\":" + tos((*i).second.m_streamID) + "," - "\"authhash\":\"" + escapeJSON(authhash.empty() ? "empty" : !yp2::isValidAuthhash(authhash) ? "invalid" : authhash) + "\"," - "\"path\":\"" + escapeJSON(streamTag) + "\"," - "\"relayurl\":\"" + escapeJSON((*i).second.m_relayUrl.url()) + "\"," - "\"backupurl\":\"" + escapeJSON((*i).second.m_backupUrl.url()) + "\"," - "\"maxlisteners\":\"" + escapeJSON(((*i).second.m_maxStreamUser > 0) && ((*i).second.m_maxStreamUser < gOptions.maxUser()) ? tos((*i).second.m_maxStreamUser) : escapeJSON("maxlisteners")) + "\"," - "\"minbitrate\":\"" + escapeJSON((*i).second.m_minStreamBitrate > 0 ? tos((*i).second.m_minStreamBitrate) : escapeJSON("minbitrate")) + "\"," - "\"maxbitrate\":\"" + escapeJSON((*i).second.m_maxStreamBitrate > 0 ? tos((*i).second.m_maxStreamBitrate) : escapeJSON("maxbitrate")) + "\"," - "\"public\":\"" + escapeJSON((*i).second.m_publicServer) + "\"," - "\"allowrelay\":\"" + tos((*i).second.m_allowRelay) + "\"," - "\"publicrelay\":\"" + tos((*i).second.m_allowPublicRelay) + "\"" - "}"; - read = true; - } - else - { - ++moved; - } - } - const size_t total = (streams.size() - moved); - body += "\"total\":\"" + tos(total) + "\"" + - (total > 0 ? ",\"streams\":[" : "") + block + - (total > 0 ? utf8("]") : "") + "}"; - } - - body += (page < 2 ? utf8("}") : "") + (jsonp ? ")" : ""); - - COMPRESS(header, body); - header += "Content-Length:" + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_sources(const uniString::utf8& host) throw() -{ - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Source Connection Details") + - "<table cellpadding=\"5\" cellspacing=\"0\" border=\"0\" width=\"100%\">" - "<tr><td class=\"tsp\" align=\"center\">" + - utf8(gOptions.requireStreamConfigs() ? "Sources are only able to connect on the configured streams shown" : - "Sources are able to connect on any \"Stream ID\" (using the appropriate details)") + - "</td></tr></table>" - "<div><br>" - - "<div style=\"width:19.5em;margin: 0 0 1em 1em;\" class=\"infb\">" - "<div align=\"center\" class=\"infh\"><b>Information</b></div>" - "Here are the login details to enter in your chosen source software so it can then be used to connect to the server.<br><br>" - "<b>Note:</b> Names of options in the source software may vary from those shown.<br><br>" - - "<b><font color=\"red\">*</font></b> This may not be correct and is a best guess from the current connection.<br><br><hr><br>" - "The '<b>Legacy Password</b>' is for use with legacy sources (which are sources that are not able to directly specify the " - "desired stream number).<br><br>This allows for use of any Shoutcast compatible source on any of the currently configured streams.<br><br>" - "If connecting a legacy source to stream #1, the '<b>Password</b>' value can be used.<br><br><hr><br>" - "The example JSON-P response uses callback=func which can be changed to a custom value as required for usage.<br><br><hr><br>" - - "For further information on connecting sources to the server, as well as ensuring that all of the required ports have been opened, " - "see <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_Server_Source_Support\"><b>this wiki page</b></a>.<br><br></div>"; - - config::streams_t streams; - gOptions.getStreamConfigs(streams); - - utf8 ids = ""; - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - ids += (i != streams.begin() ? ", ": "") + tos((*i).second.m_streamID); - - // skip over moved streams as they cannot be used, though we include the - // streamid above (whether or not that'll confuse people i do not know). - const utf8 movedUrl = gOptions.stream_movedUrl((*i).second.m_streamID); - if (movedUrl.empty()) - { - int maxbitrate = ((*i).second.m_maxStreamBitrate > 0 ? (*i).second.m_maxStreamBitrate : gOptions.maxBitrate()), - minbitrate = ((*i).second.m_minStreamBitrate > 0 ? (*i).second.m_minStreamBitrate : gOptions.minBitrate()); - - // test for being a relay which is active - if so then we need to not show - // direct source login details as they will not be able to connect anyway - bool noEntry = false, isRelay = (*i).second.m_relayUrl.isSet(); - if (isRelay && streamData::isRelayActive((*i).second.m_streamID, noEntry)) - { - body += "<div class=\"infb\" style=\"width:19.5em;word-wrap:break-word;margin: 0 0 1em 1em;\">" - "<div align=\"center\" class=\"infh\">" - "<b>Stream #" + tos((*i).second.m_streamID) + "</b></div>" - "This stream has been configured for use as a relay which is currently active.<br><br>" - "Any source connections attempted will be blocked whilst the relay is active.<br><br>" - "Password: <b>" + aolxml::escapeXML((*i).second.m_password) + "</b><br>" - "Source: <b>" + urlLink(niceURL((*i).second.m_relayUrl.url())) + "</b><br>" + - (!(*i).second.m_backupUrl.url().empty() ? "Backup Source: <b>" + - urlLink(niceURL((*i).second.m_backupUrl.url())) + "</b><br>" : ""); - } - // otherwise show direct source login details for specific as well as generic stream - // logins (even if configured to be a relay as long as it is inactive at the time) - else - { - body += "<div class=\"infb\" style=\"width:19.5em;word-wrap:break-word;margin: 0 0 1em 1em;\">" - "<div align=\"center\" class=\"infh\"><b>Stream #" + tos((*i).second.m_streamID) + "</b></div>" + - (isRelay ? "<b>Note:</b> Configured as a relay to use:<br><b>" + - niceURL((*i).second.m_relayUrl.url()) + "</b><br><br>" : "") + - "Stream ID: <b>" + tos((*i).second.m_streamID) + "</b><br>" - "Server Address: <b>" + (!host.empty() ? host : "<enter_server_address>") + "</b> <b>(<font color=\"red\">*</font>)</b><br>" - "Source Port: <b>" + tos(gOptions.portBase()) + "</b><br><br>" + - "Password: <b>" + aolxml::escapeXML((*i).second.m_password) + "</b><br>" + - ((*i).second.m_streamID > 1 && (g_legacyPort > 0) ? "Legacy Password: <b>" + - aolxml::escapeXML((*i).second.m_password) + ":#" + tos((*i).second.m_streamID) + "</b><br><br>" : "<br>") + - "Min Bitrate Allowed: <b>" + (!minbitrate ? "Unlimited" : tos(minbitrate / 1000) + " kbps") + "</b><br>" - "Max Bitrate Allowed: <b>" + (!maxbitrate ? "Unlimited" : tos(maxbitrate / 1000) + " kbps") + "</b><br><br>" - "Protocol Mode: <b>" + ((g_legacyPort > 0) ? "v2, v1" : "v2") + "</b><br>"; - } - - const utf8 address = "http://" + ((!host.empty() ? host : "<enter_server_address>") + ":" + tos(gOptions.portBase())), - params = "?sid=" + tos((*i).second.m_streamID) + "&pass=" + aolxml::escapeXML((*i).second.m_password); - body += "<br><hr><br>Listener Playlist(s):<br><b>" - "<a href=\"" + address + "/listen.pls?sid=" + tos((*i).second.m_streamID) + "\">PLS</a>, " - "<a href=\"" + address + "/listen.m3u?sid=" + tos((*i).second.m_streamID) + "\">M3U</a>, " - "<a href=\"" + address + "/listen.asx?sid=" + tos((*i).second.m_streamID) + "\">ASX</a>, " - "<a href=\"" + address + "/listen.xspf?sid=" + tos((*i).second.m_streamID) + "\">XSPF</a>, " - "<a href=\"" + address + "/listen.qtl?sid=" + tos((*i).second.m_streamID) + "\">QTL</a></b>" - - "<br><br>Direct Stream URL(s):<br><b>" - "<a title=\"Flash\" alt=\"Flash\" " - "href=\"" + address + getStreamPath((*i).second.m_streamID) + "?type=.flv\">" - "<img border=\"0\" style=\"vertical-align:bottom\" src=\"images/flash.png\"> FLV</a>, " - "<a title=\"HTTP / HTML5\" alt=\"HTTP / HTML5\" " - "href=\"" + address + getStreamPath((*i).second.m_streamID) + "?type=http\">" - "<img border=\"0\" style=\"vertical-align:bottom\" src=\"images/html5.png\"> HTTP</a>, " - "<a title=\"Shoutcast 1.x\" alt=\"Shoutcast 1.x\" " - "href=\"" + address + getStreamPath((*i).second.m_streamID) + "?type=sc1\">" - "<img border=\"0\" style=\"vertical-align:bottom\" src=\"images/favicon.ico\"> 1.x</a>, " - "<a title=\"Shoutcast 2.x\" alt=\"Shoutcast 2.x\" " - "href=\"" + address + getStreamPath((*i).second.m_streamID) + "?type=sc2\">" - "<img border=\"0\" style=\"vertical-align:bottom\" src=\"images/favicon.ico\"> 2.x</a></b>" - - "<br><br>History:<br><b>" - "<a href=\"" + address + "/played" + params + "&type=xml\">XML</a>, " - "<a href=\"" + address + "/played" + params + "&type=json\">JSON</a>, " - "<a href=\"" + address + "/played" + params + "&type=json&callback=func\">JSON-P</a></b>" - - "<br><br>Stream Statistics:<br><b>" - "<a href=\"" + address + "/stats" + params + "\">XML</a>, " - "<a href=\"" + address + "/stats" + params + "&json=1\">JSON</a>, " - "<a href=\"" + address + "/stats" + params + "&json=1&callback=func\">JSON-P</a></b><br></div>"; - } - } - - if (!gOptions.requireStreamConfigs()) - { - const int minbitrate = gOptions.minBitrate(), maxbitrate = gOptions.maxBitrate(); - body += "<div class=\"infb\" style=\"width:19.5em;word-wrap:break-word;margin: 0 0 1em 1em;\">" - "<div align=\"center\" class=\"infh\"><b>All" + (!ids.empty() ? " Other" : (utf8)"") + " Streams</b></div>" - "Stream ID: <b><any value" + (!ids.empty() ? " other than " + ids : "") + "></b><br>" - "Server Address: <b>" + aolxml::escapeXML(!host.empty() ? host : "<enter_server_address>") + "</b> <b>(<font color=\"red\">*</font>)</b><br>" - "Server Port: <b>" + tos(gOptions.portBase()) + "</b><br><br>" + - "Password: <b>" + aolxml::escapeXML(gOptions.password()) + "</b><br>" + - ((g_legacyPort > 0) ? "Legacy Password: <b>" + aolxml::escapeXML(gOptions.password()) + ":#xx</b><br><br>" : "<br>") + - "Min Bitrate Allowed: <b>" + (!minbitrate ? "Unlimited" : tos(minbitrate / 1000) + " kbps") + "</b><br>" - "Max Bitrate Allowed: <b>" + (!maxbitrate ? "Unlimited" : tos(maxbitrate / 1000) + " kbps") + "</b><br><br>" - "Protocol Mode: <b>" + ((g_legacyPort > 0) ? "v2, v1" : "v2") + "</b><br>"; - - const utf8 address = "http://" + ((!host.empty() ? host : "<enter_server_address>") + ":" + tos(gOptions.portBase())), - params = "?sid=xx&pass=" + aolxml::escapeXML(gOptions.password()); - body += "<br><hr><br>Listener Playlist(s):<br><b>" - "<a href=\"" + address + "/listen.pls?sid=xx\">PLS</a>, " - "<a href=\"" + address + "/listen.m3u?sid=xx\">M3U</a>, " - "<a href=\"" + address + "/listen.asx?sid=xx\">ASX</a>, " - "<a href=\"" + address + "/listen.xspf?sid=xx\">XSPF</a>, " - "<a href=\"" + address + "/listen.qtl?sid=xx\">QTL</a></b>" - - "<br><br>History:<br><b>" - "<a href=\"" + address + "/played" + params + "&type=xml\">XML</a>, " - "<a href=\"" + address + "/played" + params + "&type=json\">JSON</a>, " - "<a href=\"" + address + "/played" + params + "&type=json&callback=func\">JSON-P</a></b>" - - "<br><br>Stream Statistics:<br><b>" - "<a href=\"" + address + "/stats" + params + "\">XML</a>, " - "<a href=\"" + address + "/stats" + params + "&json=1\">JSON</a>, " - "<a href=\"" + address + "/stats" + params + "&json=1&callback=func\">JSON-P</a></b>" - "<br><br><b>Note:</b> Replace the '<b>xx</b>' in '<b>sid=xx</b>' in all of the example links " - "and in the '<b>Legacy Password</b>' with the stream number.<br></div>"; - } - - body += "</div>" + getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_adgroups() throw() -{ - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Advert Group Details") + - "<div style=\"padding-right:1em;\"><br>" - "<table align=\"center\" width=\"100%\"><tr valign=\"top\">" - "<td><table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" - "<tr><td valign=\"top\">" - "<div style=\"width:13em;\" class=\"infb\">" - "<div align=\"center\" class=\"infh\"><b>Information</b></div>" - "Here you can see which active stream(s) have adverts enabled and their status of obtaining the advert details." - "<br><br>This can help to see if a listener should be receiving adverts or not by " - "checking for the listener's group id with the group ids shown for the required stream.<br><br></div>" - - "</td><td valign=\"top\" width=\"100%\">" - "<table class=\"en\" style=\"border:0;text-align:center;word-wrap:break-word;\" " - "cellpadding=\"3\" cellspacing=\"0\" width=\"100%\" align=\"center\">"; - - const streamData::streamIDs_t streamIds = streamData::getStreamIds(); - if (!streamIds.empty()) - { - body += "<colgroup><col width=\"15%\"></colgroup>" - "<tr class=\"tll\"><td>Stream #</td><td>Advert Group(s)</td></tr>"; - - for (streamData::streamIDs_t::const_iterator i = streamIds.begin(); i != streamIds.end(); ++i) - { - streamData *sd = streamData::accessStream((*i)); - if (sd) - { - if (sd->isSourceConnected((*i))) - { - body += "<tr><td><b>" + tos((*i)) + "</b></td>" - "<td style=\"max-width:0;text-align:left;\">" + - sd->getAdvertGroup() + "</td></tr>"; - } - sd->releaseStream(); - } - } - } - else - { - body += "<tr><td style=\"border:0\">There are no active streams.</b></td></tr>"; - } - body += "</table></td></tr></table></td></tr></table></div>" + - getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_debug(const uniString::utf8& option, const int on_off, const bool adminRefer) throw() -{ - struct debug_options { - utf8 option; - utf8 desc; - utf8 msg; - bool value; - }; - debug_options debug[] = { - {"Listener Connections", "", ""}, - {"shoutcast1clientdebug", "Shoutcast 1.x Listener Connections", "Used to diagnose connection issues with listener connections using the legacy Shoutcast 1.x protocol" - "<br>(e.g. HTTP connections indicating they support icy-metadata).", gOptions.shoutcast1ClientDebug()}, - {"shoutcast2clientdebug", "Shoutcast 2.x Listener Connections", "Used to diagnose connection issues with listener connections using the Shoutcast 2.x protocol.", gOptions.shoutcast2ClientDebug()}, - {"httpclientdebug", "HTTP Listener Connections", "Used to diagnose connection issues with listener connections using the HTTP protocol.", gOptions.HTTPClientDebug()}, - {"flvclientdebug", "FLV Listener Connections", "Used to diagnose connection issues with listener connections using the FLV encapsulation.", gOptions.flvClientDebug()}, -#if 0 - {"m4aclientdebug", "M4A Listener Connections", "Used to diagnose connection issues with listener connections using the M4A encapsulation.", gOptions.m4aClientDebug()}, -#endif - {"Direct Source Connections", "", ""}, - {"shoutcastsourcedebug", "Shoutcast 1.x Source Connections", "Used to diagnose connection issues with source connections using the legacy Shoutcast 1.x protocol.", gOptions.shoutcastSourceDebug()}, - {"uvox2sourcedebug", "Shoutcast 2.x Source Connections", "Used to diagnose connection issues with source connections using the Shoutcast 2.x protocol.", gOptions.uvox2SourceDebug()}, - {"httpsourcedebug", "HTTP Source Connections", "Used to diagnose connection issues with source connections using HTTP PUT protocol (e.g. Icecast sources).", gOptions.HTTPSourceDebug()}, - {"Relay Source Connections", "", ""}, - {"relayshoutcastdebug", "Shoutcast 1.x Relay Connections", "Used to diagnose connection issues with relay connections using the legacy Shoutcast 1.x protocol.", gOptions.relayShoutcastDebug()}, - {"relayuvoxdebug", "Shoutcast 2.x Relay Connections", "Used to diagnose connection issues with relay connections using the Shoutcast 2.x protocol.", gOptions.relayUvoxDebug()}, - {"relaydebug", "Common Relay Handling", "Used to diagnose issues with general relay handling when a relay connection begins (non-protcool specific).", gOptions.relayDebug()}, - {"HTTP Connections", "", ""}, - {"httpstyledebug", "HTTP Requests", "Used to inspect HTTP requests made to the server (e.g. listener or statistic requests).", gOptions.httpStyleDebug()}, - {"webclientdebug", "HTTP Connections", "Used to inspect and diagnose issues with HTTP connections issued by the server.", gOptions.webClientDebug()}, - {"Shoutcast Services", "", ""}, - {"admetricsdebug", "Advert & Metrics Handling", "Used to inspect and diagnose issues with the advert and metric activity for client connections.", gOptions.adMetricsDebug()}, - {"yp2debug", "YP / Directory Connections", "Used to diagnose failures to connect to the Directory servers or to be listed.", gOptions.yp2Debug()}, -#if defined(_DEBUG) || defined(DEBUG) - // this is not enabled as we don't really want to promote the existence of this - {"authdebug", "Listener Auth Handling", "Used to diagnose issues with the client auth handling when clients connect to the stream.", gOptions.authDebug()}, -#endif - {"Miscellaneous", "", ""}, - {"streamdatadebug", "Common Stream Handling", "Used to diagnose issues with general streaming code (non-protcool specific).", gOptions.streamDataDebug()}, - {"statsdebug", "Client Statistics", "Used to inspect client statistics tracked by the server.", gOptions.statsDebug()}, - {"microserverdebug", "Common Server Activity", "Used to diagnose and track common server activity.", gOptions.microServerDebug()}, - {"threadrunnerdebug", "Thread Manager", "Used to diagnose and track the processing of threads by the thread manager.", gOptions.threadRunnerDebug()}, - }; - - if (option.empty()) - { - utf8 header = "HTTP/1.1 200 OK\r\n" - "Cache-Control:no-cache\r\n" - "Content-Type:text/html;charset=utf-8\r\n", - body = getServerAdminHeader("Server Debugging Options") + - "<div><br>" - "<table align=\"center\" width=\"100%\"><tr valign=\"top\">" - "<td><table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" - "<tr valign=\"top\"><td>" - "<div style=\"max-width:15em;\" class=\"infb\">" - "<div align=\"center\" class=\"infh\"><b>Information</b></div>" - "Here you can find are all debugging options provided by the " - "DNAS server.<br><br>Changing the debugging options will update " - "the value saved in the DNAS server configuration file(s) as " - "needed.<br><br>Any changes are applied immediately.<br><br><hr><br>" - - "<div align=\"left\"><b>All Options</b><br><br></div>" - "<input class=\"submit\" type=\"button\" onclick=\"toggle('all','true',1);\" name=\"all\" id=\"all\" value=\"Enable\">" - " <input class=\"submit\" type=\"button\" onclick=\"toggle('all','false',1);\" name=\"all\" id=\"all\" value=\"Disable\">" - "<br><br><hr><br>" - - "<div align=\"left\"><b>Listener Options</b><br><br></div>" - "<input class=\"submit\" type=\"button\" onclick=\"toggle('listener','true',2);\" name=\"listener\" id=\"listener\" value=\"Enable\">" - " <input class=\"submit\" type=\"button\" onclick=\"toggle('listener','false',2);\" name=\"listener\" id=\"listener\" value=\"Disable\">" - "<br><br><hr><br>" - - "<div align=\"left\"><b>Source Options</b><br><br></div>" - "<input class=\"submit\" type=\"button\" onclick=\"toggle('source','true',3);\" name=\"source\" id=\"sources\" value=\"Enable\">" - " <input class=\"submit\" type=\"button\" onclick=\"toggle('source','false',3);\" name=\"source\" id=\"source\" value=\"Disable\">" - "<br><br><hr><br>" - - "<div align=\"left\"><b>Force Short Sends</b> <div id=\"forceshortsendsval\" " - "style=\"display:inline-block\">[" + (gOptions.forceShortSends() ? "Enabled" : - "Disabled") + "]</div><br><br>This inserts delays into sending stream(s)" - "to replicate network limiting and bandwidth issues (Default: <b>Disabled</b>).<br><br></div>" - "<input class=\"submit\" type=\"button\" onclick=\"toggle('forceshortsends','true',4);\" name=\"forceshortsends\" id=\"forceshortsends\" value=\"Enable\">" - " <input class=\"submit\" type=\"button\" onclick=\"toggle('forceshortsends','false',4);\" name=\"forceshortsends\" id=\"forceshortsends\" value=\"Disable\">" - "<br><br><hr><br>" - - "<div align=\"left\"><b>Rate Limiting</b> <div " - "id=\"ratelimitval\" style=\"display:inline-block\">" - "[" + (gOptions.rateLimit() ? "Enabled" : "Disabled") + - "]</div><br><br>Controls the rate of output to even " - "it out and prefer sending larger blocks in one go instead of " - "doing smaller blocks more often (Default: <b>Enabled</b>).<br><br></div>" - "<input class=\"submit\" type=\"button\" onclick=\"toggle('ratelimit','true',5);\" name=\"ratelimit\" id=\"ratelimit\" value=\"Enable\">" - " <input class=\"submit\" type=\"button\" onclick=\"toggle('ratelimit','false',5);\" name=\"ratelimit\" id=\"ratelimit\" value=\"Disable\">" - - "</div><td>"; - - for (size_t i = 0; i < sizeof(debug) / sizeof(debug[0]); i++) - { - if (!debug[i].desc.empty()) - { - body += "<input autocomplete=\"off\" type=\"checkbox\" onclick=\"toggle('" + - debug[i].option + "',$('" + debug[i].option + - "').checked,0)\" name=\"" + debug[i].option + - "\" id=\"" + debug[i].option + "\"" + - (debug[i].value ? " checked=\"true\"" : " ") + " value=\"" + - (debug[i].value ? "1" : "0") + "\">" "<label for=\"" + - debug[i].option + "\" title=\"" + debug[i].option + - "\" style=\"padding-left: 7px;\"><b>" + debug[i].desc + "</b></label>" - "<div style=\"padding:5px 0 0 27px;\">" + debug[i].msg + "</div><br>"; - } - else - { - body += (i ? "<br>" : (utf8)"") + "<b><u>" + debug[i].option + "</u>:</b><br><br>"; - } - } - - body += "</td></tr></table></td></tr></table></div>" - + getUptimeScript() + - "<script type=\"text/javascript\">" EL - "function toggle(opt, on, mode) {" EL - "if(window.XMLHttpRequest){" EL - "xmlhttp=new XMLHttpRequest();" EL - "}else{" EL - "xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");" EL - "}" EL - "xmlhttp.open(\"GET\",\"admin.cgi?pass="+gOptions.adminPassword()+"&mode=debug&option=\"+opt+\"&on=\"+on,true);" EL - "xmlhttp.send(null);" EL - "if(mode == 1){" EL - "var labels = document.getElementsByTagName('LAB EL');" EL - "for (var i = 0; i < labels.length; i++) {" EL - "if (labels[i].htmlFor != '') {" EL - "$(labels[i].htmlFor).checked=(on=='true'?'true':'');" - "}" EL - "}" EL - "}" EL - "else if(mode == 2){" EL - "var labels = ['shoutcast1clientdebug', 'shoutcast2clientdebug', 'httpclientdebug', 'flvclientdebug'/*, 'm4aclientdebug'*/];" EL - "for (var i = 0; i < labels.length; i++) {" EL - "$(labels[i]).checked=(on=='true'?'true':'');" - "}" EL - "}" EL - "else if(mode == 3){" EL - "var labels = ['shoutcastsourcedebug', 'uvox2sourcedebug', 'httpsourcedebug', 'relayshoutcastdebug', 'relayuvoxdebug', 'relaydebug'];" EL - "for (var i = 0; i < labels.length; i++) {" EL - "$(labels[i]).checked=(on=='true'?'true':'');" - "}" EL - "}" EL - "else if(mode == 4){" EL - "$('forceshortsendsval').innerHTML=(on=='true'?'[Enabled]':'[Disabled]');" EL - "}" EL - "else if(mode == 5){" EL - "$('ratelimitval').innerHTML=(on=='true'?'[Enabled]':'[Disabled]');" EL - "}" EL - "}</script>" + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); - } - else - { - if (option == "all") - { - ILOG(LOGNAME + utf8(on_off ? "Enabling" : "Disabling") + " all debugging options"); - for (size_t i = 0; i < sizeof(debug) / sizeof(debug[0]); i++) - { - if (!debug[i].desc.empty()) - { - // always set even if the saving fails so we've got something working - try - { - gOptions.setOption(debug[i].option, utf8(tos(on_off))); - } - catch(const exception &) - { - } - - bool handled = false, idHandled = false; - // if we get a clear then just remove from the config and reload the page - if (gOptions.editConfigFileEntry(0, gOptions.confFile(), debug[i].option, tos(on_off), - true, handled, idHandled, true) == false) - { - ELOG(LOGNAME "Error saving debug option: `" + debug[i].option + "'"); - } - } - } - } - else if (option == "listener") - { - ILOG(LOGNAME + utf8(on_off ? "Enabling" : "Disabling") + " all listener debugging options"); - const utf8 options[] = {"shoutcast1clientdebug", "shoutcast2clientdebug", "httpclientdebug", "flvclientdebug"/*, "m4aclientdebug"*/}; - for (size_t i = 0; i < sizeof(options) / sizeof(options[0]); i++) - { - // always set even if the saving fails so we've got something working - try - { - gOptions.setOption(options[i], utf8(tos(on_off))); - } - catch(const exception &) - { - } - - bool handled = false, idHandled = false; - // if we get a clear then just remove from the config and reload the page - if (gOptions.editConfigFileEntry(0, gOptions.confFile(), options[i], tos(on_off), - true, handled, idHandled, true) == false) - { - ELOG(LOGNAME "Error saving debug option: `" + options[i] + "'"); - } - } - } - else if (option == "source") - { - ILOG(LOGNAME + utf8(on_off ? "Enabling" : "Disabling") + " all source debugging options"); - const utf8 options[] = {"shoutcastsourcedebug", "uvox2sourcedebug", "httpsourcedebug", - "relayshoutcastdebug", "relayuvoxdebug", "relaydebug"}; - for (size_t i = 0; i < sizeof(options) / sizeof(options[0]); i++) - { - // always set even if the saving fails so we've got something working - try - { - gOptions.setOption(options[i], utf8(tos(on_off))); - } - catch(const exception &) - { - } - - bool handled = false, idHandled = false; - // if we get a clear then just remove from the config and reload the page - if (gOptions.editConfigFileEntry(0, gOptions.confFile(), options[i], tos(on_off), - true, handled, idHandled, true) == false) - { - ELOG(LOGNAME "Error saving debug option: `" + options[i] + "'"); - } - } - } - else - { - ILOG(LOGNAME + utf8(on_off ? "Enabling" : "Disabling") + " the `" + option + "' debugging options"); - - // always set even if the saving fails so we've got something working - gOptions.setOption(option, utf8(tos(on_off))); - - bool handled = false, idHandled = false; - // if we get a clear then just remove from the config and reload the page - if (gOptions.editConfigFileEntry(0, gOptions.confFile(), option, tos(on_off), - true, handled, idHandled, true) == false) - { - ELOG(LOGNAME "Error saving debug option: `" + option + "'"); - } - } - - if (adminRefer) - { - sendMessageAndClose(redirect("admin.cgi", SHRINK)); - } - else - { - sendMessageAndClose(MSG_200); - } - } -} - -void protocol_admincgi::mode_help() throw() -{ - utf8 libs = "<u>Supporting Libraries</u>:<br><br>"; - std::vector<uniString::utf8> parts = tokenizer(utf8(curl_version()), ' '); - for (vector<uniString::utf8>::const_iterator i = parts.begin(); i != parts.end(); ++i) - { - utf8::size_type pos = (*i).find('/'); - if (pos != utf8::npos) - { - libs += (*i).substr(0, pos) + utf8(": <b>") + (*i).substr(pos + 1) + utf8("</b>"); - } - else - { - libs += "<b>" + (*i) + "</b>"; - } - - - if ((*i).find((utf8)"libcurl") != utf8::npos) - { - libs += " (<a target=\"_blank\" href=\"http://curl.haxx.se/\"><b>site</b></a>)"; - } - else if ((*i).find((utf8)"OpenSSL") != utf8::npos) - { - libs += " (<a target=\"_blank\" href=\"http://www.openssl.org/\"><b>site</b></a>)"; - } - else if ((*i).find((utf8)"zlib") != utf8::npos) - { - libs += " (<a target=\"_blank\" href=\"http://www.zlib.net/\"><b>site</b></a>)"; - } - libs += "<br>"; - } - - const int cpu_count = gOptions.getCPUCount(); - const utf8 cpu = "CPU Count: <b>" + tos(cpucount()) + "</b> -> " + - (cpu_count == cpucount() ? "using " + utf8(cpu_count > 1 ? "all" : "the") + - " available CPU" + (cpu_count > 1 ? "s" : "") : tos(cpu_count) + - " specified to be used") + "<br><br>"; - - XML_Expat_Version expat = XML_ExpatVersionInfo(); - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Help & Documentation") + - - "<div><br>" - - "<div style=\"width:19em;margin: 0 0 1em 1em;\" class=\"infb\">" - "<div align=\"center\" class=\"infh\"><b>Help</b></div>" - "If you are having issues, you should first try to contact your " - "hosting provider.<br><br>If running the DNAS server yourself (or if instructed " - "to do so), then you can use our <a target=\"_blank\" " - "href=\"http://forums.shoutcast.com/forumdisplay.php?f=140\"><b>forum</b></a> " - "or you can contact <a href=\"mailto:support@shoutcast.com?subject=Shoutcast%20Support\">" - "<b>Shoutcast support</b></a> directly (e.g. if the issue relates to an " - "account / authhash issue).<br><br><b>Note:</b> If using the <a target=\"_blank\" " - "href=\"http://forums.shoutcast.com/forumdisplay.php?f=140\"><b>forum</b></a>, " - "do not post any information which could be used to compromise " - "your account / authhash / etc (e.g. passwords and authhash(s)).<br><br></div>" - - "<div style=\"width:19em;margin: 0 0 1em 1em;\" class=\"infb\">" - "<div align=\"center\" class=\"infh\"><b>Documentation</b></div>" - "Supporting documentation for using the DNAS server from setup " - "to getting statistics from the server are <a target=\"_blank\" " - "href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_Broadcaster\"><b>online</b></a>.<br><br>" - "Otherwise a local copy can usually be found on the host machine at:<br><br>" - "<div style=\"word-break:break-all;\"><b>" + aolxml::escapeXML(gStartupDirectory) + - "</b></div><br><b>Note:</b> The local copy is usually correct for the version being " - "used and the <a target=\"_blank\" href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_Broadcaster\">" - "<b>online</b></a> version will be for the most recent release.<br><br></div>" - - "<div style=\"width:19em;margin: 0 0 1em 1em;\" class=\"infb\">" - "<div align=\"center\" class=\"infh\"><b>About</b></div>" - "Information about the DNAS server and the supporting libraries currently used.<br><br>" - "Version: <b>" + addWBR(gOptions.getVersionBuildStrings()) + "</b><br>" - "Platform: <b>" + SERV_OSNAME "</b><br>" - "Built: <b>" __DATE__"</b><br><br>" - + libs + // libcurl, openssl, zlib - "expat: <b>" + tos(expat.major) + "." + tos(expat.minor) + "." + tos(expat.micro) + "</b>" - " (<a target=\"_blank\" href=\"http://www.libexpat.org/\"><b>site</b></a>)" - //#ifdef _WIN32 - //"<br>pthread-win32: <b>" PTW32_VERSION_STR "-mod</b>" - //" (<a target=\"_blank\" href=\"https://github.com/GerHobbelt/pthread-win32\"><b>site</b></a>)" - //#endif - "<br><br></div></div>" - - "<div style=\"width:19em;margin: 0 0 1em 1em;\" class=\"infb\"><div " - "align=\"center\" class=\"infh\"><b>Diagnostics</b></div>" + cpu + - "<u>Current thread & runner usage</u>:<br><br>" + - threadedRunner::getRunnabledetails() + "<br></div></div>" - - + getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -void protocol_admincgi::mode_config() throw() -{ - utf8 conf = gOptions.confFile(); - utf8::size_type pos = conf.rfind(fileUtil::getFilePathDelimiter()); - if ((pos != utf8::npos)) - { - conf = conf.substr(pos + 1); - } - - utf8 header = MSG_NO_CLOSE_200, - body = getServerAdminHeader("Server Configuration Settings") + - "<div><div style=\"padding:1em;\"><b>This page shows the custom configuration settings " - "that this DNAS server is currently using. (Settings which match DNAS server defaults " - "may not be shown.)<br><br><u>Note #1:</u> To change these values, you will need to edit the " - "<u title=\"" + aolxml::escapeXML(fileUtil::getFullFilePath(gOptions.confFile())) + "\">" + - (!conf.empty() ? conf : "sc_serv.conf") + "</u> file on your server. See <a target=\"_blank\" " - "href=\"http://wiki.shoutcast.com/wiki/SHOUTcast_DNAS_Server_2#Configuration_File\">here</a> " - "for more information.<br><br><u>Note #2:</u> This is not the same as the actual configuration file " - "(i.e. the structure of the configuration file(s) being used is not shown)</b></div>" + - gOptions.dumpConfigFile() + "<br></div>" + getUptimeScript() + getIEFlexFix() + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} - -#if 0 -void protocol_admincgi::mode_logs() throw() -{ - utf8 header = "HTTP/1.1 200 OK\r\n" - "Cache-Control:no-cache\r\n" - "Content-Type:text/html;charset=utf-8\r\n", - headerTitle = "Server Log Management", childPage = ""; - - bool bwstyle = false; - int refreshRequired = 0; - utf8 body = s_serverAdminHeading; - - body += "<div style=\"padding:0 1em;\"><br>" - "<table align=\"center\" width=\"100%\"><tr valign=\"top\">" - "<td><table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"padding-left:1em;\">" - "<tr valign=\"top\"><td>" - "<div style=\"width:215px;\" class=\"infb\">" - "<div align=\"center\" class=\"infh\"><b>Information</b></div>" - "Here you can find are all debugging options provided by the DNAS server.<br><br>Changing the debugging " - "options will update the value saved in the DNAS server configuration file(s) as needed.<br><br>" - "Any changes are applied immediately.<br><br></div>" - - "<td>"; - - utf8 logfile = gOptions.realLogFile(); - - body += "<div style=\"padding-bottom:5px;\">Current log file:</div>"; - body += "<div class=\"en\" style=\"padding-left:27px;padding:10px;margin-bottom:1em;" - "display:inline-block;border-radius:5px;\"><b>" + - aolxml::escapeXML(fileUtil::stripPath(logfile)) + "</b>" - " <a href=\"admin.cgi?mode=viewlog&server=1\">View</a>" - " <a href=\"admin.cgi?mode=viewlog&server=1&viewlog=save\">Save</a>" - "<br>Size: <b>" + formatSizeString(uniFile::fileSize(logfile)) + "</b></div><br>"; - - utf8 rotated = fileUtil::stripSuffix(logfile) + "_*." + fileUtil::getSuffix(logfile); - body += "<div style=\"padding-bottom:5px;\">Older log file(s):</div>"; - body += "<div>"; - #ifdef _WIN32 - vector<wstring> fileList = fileUtil::directoryFileList(utf8(fileUtil::getFullFilePath(rotated)).toWString(), L"", true, true); - #else - vector<string> fileList = fileUtil::directoryFileList(fileUtil::getFullFilePath(rotated), ""); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector<wstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector<string>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - body += "<div class=\"en\" style=\"padding-left:27px;padding:10px;margin-bottom:1em;" - "display:inline-block;border-radius:5px;\"><b>" + fileUtil::stripPath(u8f) + "</b>" - "<div style=\"float:right;\"> <a href=\"admin.cgi?mode=viewlog&server=1&file=" + - urlUtils::escapeURI_RFC3986(u8f) + "\">View</a> " - "<a href=\"admin.cgi?mode=viewlog&server=1&viewlog=save&file=" + - urlUtils::escapeURI_RFC3986(u8f) + "\">Save</a></div><br>Size: <b>" + - formatSizeString(uniFile::fileSize(u8f)) + "</b>" - "<br>Last Modified: <b>" + getRFCDate(uniFile::fileTime(u8f)) + "</b></div><br>"; - #else - body += "<div style=\"padding-left:27px;\"><b>" + fileUtil::stripPath(*i) + "</b> " - "<a href=\"admin.cgi?mode=viewlog&server=1&viewlog=save&file="+urlUtils::escapeURI_RFC3986(*i)+"\">Save</a></div>"; - #endif - } - } - body += "</div>"; -#if 0 - utf8 archived = fileUtil::stripSuffix(logfile) + "_*.gz"; - body += "<div style=\"padding:5px 0 0 27px;\"><b>Log file (archived):</b> "/* + aolxml::escapeXML(fileUtil::getFullFilePath(archived)) + */"</div><br>"; - body += "<div>"; - #ifdef _WIN32 - fileList = fileUtil::directoryFileList(utf8(fileUtil::getFullFilePath(archived)).toWString(), L"", true, true); - #else - fileList = fileUtil::directoryFileList(fileUtil::getFullFilePath(archived), ""); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector<wstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector<string>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - body += "<div style=\"padding-left:27px;\">" + fileUtil::stripPath(u8f) + "</div>"; - #else - body += "<div style=\"padding-left:27px;\">" + fileUtil::stripPath(*i) + "</div>"; - #endif - } - } - body += "</div>"; - - body += "<hr>"; - - utf8 w3cfile = gOptions.w3cLog(); - body += "<div style=\"padding:5px 0 0 27px;\">W3C file: " + aolxml::escapeXML(fileUtil::getFullFilePath(w3cfile)) + "</div><br>"; - utf8 archived = fileUtil::stripSuffix(w3cfile) + "_*.gz"; - body += "<div style=\"padding:5px 0 0 27px;\">W3C file (archived): " + aolxml::escapeXML(fileUtil::getFullFilePath(archived)) + "</div><br>"; - archived = fileUtil::stripSuffix(w3cfile) + "_*_w3c.gz"; - body += "<div style=\"padding:5px 0 0 27px;\">W3C file (archived 2): " + aolxml::escapeXML(fileUtil::getFullFilePath(archived)) + "</div><br>"; - body += "<div>"; - config::streams_t streams; - gOptions.getStreamConfigs(streams); - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // w3c logging - if (gOptions.read_stream_w3cLog((*i).first)) - { - body += "<div style=\"padding:5px 0 0 27px;\">Stream W3C file: " + aolxml::escapeXML(fileUtil::getFullFilePath(gOptions.stream_w3cLog((*i).first))) + "</div><br>"; - } - } - body += "</div>"; - body += "<hr>"; - body += "<div>"; - #ifdef _WIN32 - fileList = fileUtil::directoryFileList(gStartupDirectory.toWString() + L"sc_w3c*.log", L"", true, true); - #else - fileList = fileUtil::directoryFileList(gStartupDirectory.hideAsString() + "sc_w3c*.log", ""); - #endif - if (!fileList.empty()) - { - #ifdef _WIN32 - for (vector<wstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #else - for (vector<string>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - #endif - { - #ifdef _WIN32 - utf32 u32file(*i); - utf8 u8f(u32file.toUtf8()); - body += "<div style=\"padding-left:27px;\">" + fileUtil::stripPath(u8f) + "</div>"; - #else - body += "<div style=\"padding-left:27px;\">" + fileUtil::stripPath(*i) + "</div>"; - #endif - } - } - body += "</div>"; -#endif - body += "</td></tr></table></td></tr></table></div>" - + getUptimeScript() + - "<script type=\"text/javascript\">" EL - "function toggle(opt, on, all) {" EL - "if(window.XMLHttpRequest){" EL - "xmlhttp=new XMLHttpRequest();" EL - "}else{" EL - "xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");" EL - "}" EL - "xmlhttp.open(\"GET\",\"admin.cgi?pass="+gOptions.adminPassword()+"&mode=debug&option=\"+opt+\"&on=\"+on,true);" EL - "xmlhttp.send(null);" EL - "if(all){" EL - "var labels = document.getElementsByTagName('LAB EL');" EL - "for (var i = 0; i < labels.length; i++) {" EL - "if (labels[i].htmlFor != '') {" EL - "$(labels[i].htmlFor).checked=(on=='true'?'true':'');" - "}" EL - "}" EL - "}" EL - "}</script>" + getfooterStr(); - - COMPRESS(header, body); - header += "Content-Length: " + tos(body.size()) + "\r\n\r\n"; - sendMessageAndClose(header + (!HEAD_REQUEST ? body : "")); -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_admincgi.h b/Src/Plugins/DSP/sc_serv3/protocol_admincgi.h deleted file mode 100644 index eeec9327..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_admincgi.h +++ /dev/null @@ -1,115 +0,0 @@ -#pragma once -#ifndef protocol_admincgi_H_ -#define protocol_admincgi_H_ - -#include "threadedRunner.h" -#include "protocol_HTTPStyle.h" -#include "streamData.h" - -// this class takes any necessary actions indicated by an HTTP -// call with the /admin.cgi url -class protocol_admincgi: public runnable -{ -private: - const bool m_noSID; - const bool m_zeroSID; - short m_saveLogFile; - - const uniString::utf8 m_clientLogString; - const protocol_HTTPStyle::HTTPRequestInfo m_httpRequestInfo; - const uniString::utf8 m_password; - uniString::utf8 m_referer; - const uniString::utf8 m_hostIP; - const uniString::utf8 m_userAgent; - const streamData::streamID_t m_sid; - - virtual uniString::utf8 name() const throw() { return "protocol_admincgi"; } - void timeSlice() throw(std::exception); - typedef void (protocol_admincgi::*state_t)(); - - state_t m_state; - state_t m_nextState; - - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - - bool m_tailLogFile; - // for log file output colouring - char lastChar; - bool inMsg; - bool first; - - uniString::utf8 m_outMsg; - uniString::utf8 m_updinfoSong; // for the updinfo so we're not re-processing after checking - uniString::utf8 m_updinfoURL; // for the updinfo so we're not re-processing after checking - uniString::utf8 m_updinfoDJ; // for the updinfo so we're not re-processing after checking - uniString::utf8 m_updinfoNext; // for the updinfo so we're not re-processing after checking - - // for log file transmission - FILE* m_logFile; - uniString::utf8 m_logFileName; - uniString::utf8 m_logFileHeader; - uniString::utf8 m_logFileBodyPrefix; - uniString::utf8 m_logFileBodyFooter; - std::vector<uniString::utf8::value_type> m_logFileBuffer; - z_stream m_stream; - - void state_ConfirmPassword() throw(std::exception); - void state_Send() throw(std::exception); - void state_Close() throw(std::exception); - void state_UpdateMetadata() throw(std::exception); - void state_UpdateXMLMetadata() throw(std::exception); - void state_SendFileHeader() throw(std::exception); - void state_SendFileFooter() throw(std::exception); - void state_SendFileContents() throw(std::exception); - void state_SendFileEnd() throw(std::exception); - - void sendMessageAndClose(const uniString::utf8 &msg) throw(); - - void mode_none(const streamData::streamID_t sid, const int refreshRequired) throw(); - void mode_kickdst(const streamData::streamID_t sid, const uniString::utf8 &kickAddrs) throw(); - void mode_ban(const streamData::streamID_t sid, const uniString::utf8 &banAddrs, const int banMask) throw(); - void mode_unban(const streamData::streamID_t sid, const uniString::utf8 &banAddr, const int banMask) throw(); - void mode_viewban(const streamData::streamID_t sid) throw(); - void mode_viewrip(const streamData::streamID_t sid) throw(); - void mode_rip(const streamData::streamID_t sid, const uniString::utf8 &ripAddr, const uniString::utf8 &rawIpAddr) throw(); - void mode_unrip(const streamData::streamID_t sid, const uniString::utf8 &ripAddr, const uniString::utf8 &rawIpAddr) throw(); - void mode_viewagent(const streamData::streamID_t sid) throw(); - void mode_agent(const streamData::streamID_t sid, const uniString::utf8 &agent) throw(); - void mode_unagent(const streamData::streamID_t sid, const uniString::utf8 &agent) throw(); - void mode_viewxml(const streamData::streamID_t sid, int page, const bool iponly, const bool ipcount) throw(); - void mode_viewjson(const streamData::streamID_t sid, int page, const bool iponly, const bool ipcount, const uniString::utf8& callback) throw(); - void mode_viewlog(const streamData::streamID_t sid, const bool tail, const bool save, const bool server) throw(); - void mode_art(const streamData::streamID_t sid, const int mode) throw(); - void mode_register(const streamData::streamID_t sid, const streamData::streamInfo &info) throw(); - void mode_listeners(const streamData::streamID_t sid) throw(); - void mode_summary(const int refreshRequired) throw(); - void mode_bandwidth_html(const int refreshRequired) throw(); - void mode_bandwidth_xml() throw(); - void mode_bandwidth_json(const uniString::utf8& callback) throw(); - void mode_ypstatus_xml() throw(); - void mode_ypstatus_json(const uniString::utf8& callback) throw(); - void mode_sources(const uniString::utf8& host) throw(); - void mode_adgroups() throw(); - void mode_debug(const uniString::utf8& option, const int on_off, const bool adminRefer) throw(); - void mode_logs() throw(); - void mode_history(const streamData::streamID_t sid) throw(); - void mode_help() throw(); - void mode_config() throw(); - - const uniString::utf8 getClientIP(const bool streamPublic, const uniString::utf8 &publicIP) throw(); - uniString::utf8 escapeText(const std::vector<uniString::utf8::value_type> &s) throw(); - -public: - protocol_admincgi(const socketOps::tSOCKET s, const streamData::streamID_t sid, const bool no_sid, - const bool zero_sid, const uniString::utf8 &clientLogString, - const uniString::utf8 &password, const uniString::utf8 &referer, - const uniString::utf8 &hostIP, const uniString::utf8 &m_userAgent, - const protocol_HTTPStyle::HTTPRequestInfo &httpRequestInfo) throw(std::exception); - ~protocol_admincgi() throw(); -}; - -extern uniString::utf8 logId; -const uniString::utf8 randomId(uniString::utf8 &temp); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_backup.cpp b/Src/Plugins/DSP/sc_serv3/protocol_backup.cpp deleted file mode 100644 index 2ebe5562..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_backup.cpp +++ /dev/null @@ -1,538 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <assert.h> -#include "protocol_backup.h" -#include "protocol_relay_shoutcast.h" -#include "protocol_relay_uvox.h" -#include "bandwidth.h" -#include "streamData.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#define LOGNAME "BACKUP" - -#define DEBUG_LOG(...) do { if (gOptions.relayDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_backup::protocol_backup(const config::streamConfig &info, const int originalBitrate, const uniString::utf8& originalMimeType) throw() - : m_originalMimeType(originalMimeType), m_outBuffer(0), - m_outBufferSize(0), m_originalBitrate(originalBitrate), m_retryCount(0), - m_backupWaitingToReconnect(false), m_backupSentConnectWait(false), - m_skip(false), m_tryRelaySource(false), m_backupReconnectStartTime(0), - m_state(&protocol_backup::state_Initial), m_nextState(0), - m_backupInfo(info), m_originalbackupInfo(info), m_redirectCount(0) -{ - m_srcPort = m_backupInfo.m_backupUrl.port(); - m_srcAddrName = m_backupInfo.m_backupUrl.server(); - m_srcURLpart = m_backupInfo.m_backupUrl.path(); - m_srcLogString = "[BACKUP " + m_srcAddrName + ":" + tos(m_srcPort) + - (m_srcURLpart == "/" ? "" : m_srcURLpart) + - " sid=" + tos(m_backupInfo.m_streamID) + "] "; - - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); -} - -protocol_backup::~protocol_backup() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - socketOps::forgetTCPSocket(m_socket); -} - -void protocol_backup::timeSlice() throw(exception) -{ - // check if the DNAS has stopped or that the relay hasn't been stopped as - // otherwise this'll sit and keep making backup attempts when not needed, - // making sure that we've given the backup at least an attempt to connect - - bool serverDown = iskilled(); - bool noEntry = false, inactive = ((streamData::isRelayActive(m_backupInfo.m_streamID, noEntry) & 8) != 8); - - if (serverDown || noEntry || inactive) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - ILOG (m_srcLogString + "Termination for source backup detected", LOGNAME, m_originalbackupInfo.m_streamID); - m_result.done(); - return; - } - - if (m_backupWaitingToReconnect && (::time(NULL) < m_backupReconnectStartTime)) - { - // an error occured in the past and we are waiting for the appropriate time interval before we do anything - m_result.schedule(350); - return; - } - else - { - // normal running - try - { - (this->*m_state)(); - } - catch(const exception &ex) - { - // close socket and move into waiting state for reconnect - socketOps::forgetTCPSocket(m_socket); - - // but first see if we've hit the retry limit (which can be set as zero to keep on going) - ++m_retryCount; - int retryLimit = gOptions.relayConnectRetries(); - DEBUG_LOG(m_srcLogString + __FUNCTION__ + utf8(" m_retryCount:") + tos(m_retryCount) + " retryLimit:" + tos(retryLimit) + " m_tryRelaySource: " + tos(m_tryRelaySource), LOGNAME, m_originalbackupInfo.m_streamID); - if ((retryLimit == 0) || (m_retryCount < retryLimit && retryLimit > 0)) - { - utf8 msg = ex.what(); - if (!msg.empty()) - { - ELOG(ex.what()); - } - - m_backupWaitingToReconnect = true; - m_state = &protocol_backup::state_Initial; - m_backupInfo = m_originalbackupInfo; - m_backupReconnectStartTime = ::time(NULL) + gOptions.relayReconnectTime(); - m_result.schedule (550); - } - else - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - throwEx<runtime_error>(m_srcLogString + ex.what()); - } - } - } -} - -// parse out backupInfo object -void protocol_backup::state_Initial() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - // if m_retryCount is over 1 then pull the stream relay url from - // the config details as we could be in a re-try or having done - // a config reload and the stream relay url has then since changed - // - this primarily aids a config change for a pending relay join - if (m_retryCount > 0) - { - m_backupInfo.m_backupUrl = gOptions.stream_backupURL (m_backupInfo.m_streamID); - m_backupInfo.m_relayUrl = gOptions.stream_relayURL (m_backupInfo.m_streamID); - } - - m_srcAddrName = m_backupInfo.m_backupUrl.server(); - m_srcPort = m_backupInfo.m_backupUrl.port(); - m_srcURLpart = m_backupInfo.m_backupUrl.path(); - - m_srcLogString = "[BACKUP " + m_srcAddrName + ":" + tos(m_srcPort) + - (m_srcURLpart == "/" ? "" : m_srcURLpart) + - " sid=" + tos(m_backupInfo.m_streamID) + "] "; - - // make sure we're not trying to run a backup which is the same relay as failed - if (m_backupInfo.m_relayUrl.isSet()) - { - // check on individual parts as the general url may not be formatted the same - // as well as checking against the 'streampath' version is specified for the - // /stream/x/ alternative (am sure someone is going to try to hack on that). - if (!m_tryRelaySource && - (m_backupInfo.m_relayUrl.server() == m_srcAddrName) && - (m_backupInfo.m_relayUrl.port() == m_srcPort) && - (m_backupInfo.m_relayUrl.path() == m_srcURLpart)) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - ELOG(m_srcLogString + "Backup source rejected. The backup cannot be the same as the original relay source.", LOGNAME, m_originalbackupInfo.m_streamID); - m_result.done(); - return; - } - else - { - if ((m_backupInfo.m_relayUrl.server() == m_srcAddrName) && - (m_backupInfo.m_relayUrl.port() == m_srcPort)) - { - utf8::size_type pos = (!m_srcURLpart.empty() ? m_srcURLpart.find(utf8("/stream/")) : utf8::npos); - streamData::streamID_t streamID = 0; - if (pos != utf8::npos) - { - streamID = atoi((const char *)m_srcURLpart.substr(pos + 8).c_str()); - } - - if (streamID > 0) - { - bool htmlPage = false; - if (!m_tryRelaySource && streamData::getStreamIdFromPath(m_backupInfo.m_relayUrl.path(), htmlPage) == streamID) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - ELOG(m_srcLogString + "Backup source rejected. The backup cannot be the same as the original relay source.", LOGNAME, m_originalbackupInfo.m_streamID); - m_result.done(); - return; - } - } - } - } - } - - m_state = &protocol_backup::state_ResolveServer; - m_result.run(); -} - -// resolve server name to numeric address -void protocol_backup::state_ResolveServer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - assert(m_socket == socketOps::cINVALID_SOCKET); - m_socket = socketOps::createTCPSocketTHROW(); - socketOps::setNonblock(m_socket,true); - m_srcAddrNumeric = socketOps::hostNameToAddress(m_srcAddrName.hideAsString(), m_srcPort); - if (m_srcAddrNumeric.empty()) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - m_result.done(); - return; - } - - m_state = &protocol_backup::state_Connect; - m_result.run(); -} - -// TCP connect -void protocol_backup::state_Connect() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - assert(m_socket != socketOps::cINVALID_SOCKET); - - bool isSourceActive = false, relayRunning = false; - streamData *sd = streamData::accessStream(m_backupInfo.m_streamID, isSourceActive); - if (sd) - { - relayRunning = sd->isRelayStream(m_backupInfo.m_streamID); - sd->releaseStream(); - } - - if ((isSourceActive == false) || relayRunning) - { - if ((m_retryCount > 0) && !m_skip) - { - ILOG(m_srcLogString + "Connecting to source backup [attempt #" + tos(m_retryCount+1) + "]", LOGNAME, m_originalbackupInfo.m_streamID); - } - - m_skip = false; - socketOps::connect(m_socket, m_srcAddrNumeric, m_srcPort); - - m_lastActivityTime = ::time(NULL); - m_state = &protocol_backup::state_ConnectWait; - m_result.run(); - } - else - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - m_result.done(); - } -} - -// wait for connect to complete -void protocol_backup::state_ConnectWait() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - assert(m_socket != socketOps::cINVALID_SOCKET); - - time_t cur_time; - const int autoDumpSourceTime = detectAutoDumpTimeout (cur_time, m_originalbackupInfo.m_streamID, m_srcLogString + "Timeout trying to connect"); - - if (streamData::isSourceConnected (m_backupInfo.m_streamID)) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_backupInfo.m_streamID, noEntry, 0, 8); - - ILOG (m_srcLogString + "Original stream available, Abort trying to " + - (m_retryCount > 0 ? "re-" : "") + - "connect to the source backup", LOGNAME, m_originalbackupInfo.m_streamID); - m_result.done(); - return; - } - - // not pretty but the 'sent' checks allow this to work within the expected timeouts - // irrespective of being run on Windows or Linux as it could just sit and do nothing - // for a few minutes if there was no network activity on the DNAS causing there to be - // no attempt made to re-connect to the backup source (hopefully resolved in build 56) - string error; - socketOps::nonBlockConnect_t connectResult = socketOps::nonBlockingConnectWait(m_socket, error); - switch (connectResult) - { - case socketOps::NBC_ERROR: - { - throwEx<runtime_error>(m_srcLogString + error); - break; - } - case socketOps::NBC_INPROGRESS: - { - // try again but wait a bit - m_result.schedule(100); - m_result.timeout((autoDumpSourceTime - (int)(cur_time - m_lastActivityTime))); - break; - } - case socketOps::NBC_CONNECTED: - { - m_lastActivityTime = ::time(NULL); - m_state = &protocol_backup::state_SendGreeting; - m_result.run(); - break; - } - default: - { - ELOG(m_srcLogString + "Unknown non-blocking connect state.", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx<runtime_error>(""); - } - } -} - -void protocol_backup::state_SendGreeting() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - m_HTTPHeaders.clear(); - m_HTTPGreetingResponse.clear(); - - string cdn; - if (isCDNSlave(m_backupInfo.m_streamID)) - { - cdn = "cdn-slave:1\r\n"; - } - - m_lineBuffer = "GET " + m_srcURLpart + " " + "HTTP/1.1\r\n" + - "Host:" + stripHTTPprefix(m_srcAddrName) + ":" + tos(m_srcPort) + "\r\n" + - "User-Agent:" + g_userAgent + " Relay" + - (!m_tryRelaySource ? " Backup" : "") + "\r\n" + - "Ultravox transport type:TCP\r\n" + - "Accept:*/*\r\n" + - "icy-metadata:1\r\n" + - cdn + - "icy-host:" + metrics::metrics_verifyDestIP(gOptions) + "\r\n\r\n"; - - DEBUG_LOG(m_srcLogString + "Sending request [" + eol() + stripWhitespace(m_lineBuffer) + eol() + "]", LOGNAME, m_originalbackupInfo.m_streamID); - m_outBuffer = &(m_lineBuffer[0]); - bandWidth::updateAmount(bandWidth::RELAY_MISC_RECV, (m_outBufferSize = (int)m_lineBuffer.size())); - - m_lastActivityTime = ::time(NULL); - m_state = &protocol_backup::state_Send; - m_nextState = &protocol_backup::state_GetGreetingResponse; - - m_result.write(); - m_result.timeoutSID(m_originalbackupInfo.m_streamID); -} - -// send whatever is in outBuffer -void protocol_backup::state_Send() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - if (sendDataBuffer(m_backupInfo.m_streamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - m_lineBuffer.clear(); - } -} - -void protocol_backup::state_GetLine() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - if (getHTTPStyleHeaderLine(m_backupInfo.m_streamID, m_lineBuffer, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_backup::state_GetGreetingResponse() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - m_state = &protocol_backup::state_GetLine; - m_nextState = &protocol_backup::state_AnalyzeGreetingResponse; - - m_lastActivityTime = ::time(NULL); - m_result.read(); - m_result.timeoutSID(m_originalbackupInfo.m_streamID); -} - -// analyze header lines in greeting response -void protocol_backup::state_AnalyzeGreetingResponse() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - m_lastActivityTime = ::time(NULL); - - if ((int)m_HTTPHeaders.size() >= gOptions.maxHeaderLineCount()) - { - ELOG (m_srcLogString + "Max HTTP header lines exceeded", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx<runtime_error>(""); - } - - m_lineBuffer = stripWhitespace(m_lineBuffer); - if (m_lineBuffer.empty()) - { - m_state = &protocol_backup::state_DetermineProtocol; - m_result.run(); - } - else - { - if (m_HTTPGreetingResponse.empty()) - { - m_HTTPGreetingResponse = m_lineBuffer; - } - else - { - // find the colon that divides header lines into key/value fields - utf8::size_type pos = m_lineBuffer.find(utf8(":")); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx<runtime_error>(""); - } - - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0, pos))); - utf8 value = stripWhitespace(m_lineBuffer.substr(pos + 1)); - // allow empty values. (for urls and what-not) - if (key.empty()) - { - ELOG (m_srcLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx<runtime_error>(""); - } - m_HTTPHeaders[key] = value; - } - - m_state = &protocol_backup::state_GetLine; - m_nextState = &protocol_backup::state_AnalyzeGreetingResponse; - m_result.read(); - m_result.timeoutSID(m_originalbackupInfo.m_streamID); - m_lineBuffer.clear(); - } -} - -void protocol_backup::state_DetermineProtocol() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalbackupInfo.m_streamID); - - if (m_HTTPGreetingResponse.empty()) - { - ELOG (m_srcLogString + "Empty greeting response", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx<runtime_error>(""); - } - - // parse into three fields - utf8 s = m_HTTPGreetingResponse; - - utf8::size_type pos = (!s.empty() ? s.find(utf8(" ")) : utf8::npos); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Badly formed response line [" + m_HTTPGreetingResponse + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx<runtime_error>(""); - } - - s = stripWhitespace(s.substr(pos)); - pos = (!s.empty() ? s.find(utf8(" ")) : utf8::npos); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Badly formed response line [" + m_HTTPGreetingResponse + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx<runtime_error>(""); - } - - int resultCode = utf8(s.substr(0, pos)).toInt(); - if (resultCode == 200) - { - utf8 diag; - for (httpHeaderMap_t::const_iterator i = m_HTTPHeaders.begin(); i != m_HTTPHeaders.end(); ++i) - { - diag += (*i).first + ": " + (*i).second + eol(); - } - DEBUG_LOG(m_srcLogString + "Received headers [" + eol() + stripWhitespace(diag) + eol() + "]", LOGNAME, m_originalbackupInfo.m_streamID); - - const socketOps::tSOCKET s = m_socket; - m_socket = socketOps::cINVALID_SOCKET; - - // changed order of this in build 19 so that all uvox2 is reported as misc/ultravox - // and we then base things off the user-agent containing 'Ultravox/2.1' - // we look at content-type to determine the protocol - if ((m_HTTPHeaders["content-type"] == "misc/ultravox") && - (m_HTTPHeaders["server"].find(utf8("Ultravox/2.1")) != utf8::npos)) - { - // uvox 2.1 - threadedRunner::scheduleRunnable(new protocol_relay_uvox(s, m_originalbackupInfo, m_srcAddrName, m_srcAddrNumeric, - m_srcPort, (m_srcURLpart == "/" ? "" : m_srcURLpart), - m_HTTPHeaders, m_originalBitrate, m_originalMimeType, - !m_tryRelaySource)); - } - else - { - // shoutcast - threadedRunner::scheduleRunnable(new protocol_relay_shoutcast(s, m_originalbackupInfo, m_srcAddrName, m_srcAddrNumeric, - m_srcPort, (m_srcURLpart == "/" ? "" : m_srcURLpart), - m_HTTPHeaders, m_originalBitrate, m_originalMimeType, - !m_tryRelaySource)); - } - - m_result.done(); - } - else if ((resultCode >= 300) && (resultCode < 400)) - { - utf8 location = m_HTTPHeaders["location"]; - - // do we maybe have a /stream/x url and gotten a /index.html?sid=# redirect? - // if so then we should attempt to access a relay on /stream/x/ (note end / ) - utf8::size_type pos = (!location.empty() ? location.find(utf8("/index.html?sid=")) : utf8::npos); - if (pos != utf8::npos) - { - streamData::streamID_t foundID = atoi((const char *)location.substr(pos + 16).c_str()); - utf8::size_type pos2 = m_backupInfo.m_backupUrl.path().find(utf8("/stream/")); - if (pos2 != utf8::npos) - { - streamData::streamID_t origID = atoi((const char *)m_backupInfo.m_backupUrl.path().substr(pos2 + 8).c_str()); - if (foundID == origID) - { - m_backupInfo.m_backupUrl = m_backupInfo.m_backupUrl.url() + "/"; - gOptions.setOption(utf8("streambackupurl_" + tos(m_originalbackupInfo.m_streamID)), - m_backupInfo.m_backupUrl.url()); - - m_skip = true; - m_state = &protocol_backup::state_Initial; - socketOps::forgetTCPSocket(m_socket); - m_result.run(); - WLOG(m_srcLogString + "Received an invalid redirect to `" + location + "' - trying " + m_backupInfo.m_backupUrl.url(), LOGNAME, m_originalbackupInfo.m_streamID); - return; - } - } - } - - ILOG(m_srcLogString + "Received redirect to " + location, LOGNAME, m_originalbackupInfo.m_streamID); - if (++m_redirectCount > gOptions.maxHTTPRedirects()) - { - WLOG (m_srcLogString + "Max redirects exceeded", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx<runtime_error>(""); - } - - m_skip = true; - m_backupInfo.m_backupUrl = location; - m_state = &protocol_backup::state_Initial; - socketOps::forgetTCPSocket(m_socket); - m_result.run(); - } - else - { - WLOG (m_srcLogString + (resultCode >= 400 ? "Source responded with error [" : "Unsupported HTTP response code [") + - m_HTTPGreetingResponse + "]", LOGNAME, m_originalbackupInfo.m_streamID); - throwEx<runtime_error>(""); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_backup.h b/Src/Plugins/DSP/sc_serv3/protocol_backup.h deleted file mode 100644 index 5f83bf18..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_backup.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#ifndef protocol_backup_H_ -#define protocol_backup_H_ - -#include "threadedRunner.h" - -/* - Runnable object that handles the initial part of a backup connection - which is basically the same as a relay connection bar a different name. - Makes the connection to the source and determines what type of protocol - should be used, then hands off to the particular relay protocol - (shoutcast or uvox relay) -*/ - -class protocol_backup: public runnable -{ -private: - uniString::utf8 m_srcAddrName; // server DNS name or value as specified in backupInfo - std::string m_srcAddrNumeric; // resolved numeric addr - uniString::utf8 m_srcURLpart; // server - - uniString::utf8 m_originalMimeType; // original mimetype for checking - - uniString::utf8 m_srcLogString; - httpHeaderMap_t m_HTTPHeaders; - uniString::utf8 m_HTTPGreetingResponse; // first line of response - - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - const int m_originalBitrate; // original bitrate for checking - - uniString::utf8 m_lineBuffer; // in/out lines - - int m_retryCount; - bool m_backupWaitingToReconnect; - bool m_backupSentConnectWait; - bool m_skip; - bool m_tryRelaySource; - - time_t m_backupReconnectStartTime; - - typedef void (protocol_backup::*state_t)(); - - state_t m_state; - state_t m_nextState; - - config::streamConfig m_backupInfo; - const config::streamConfig m_originalbackupInfo; // used for reconnects later on - - u_short m_srcPort; // server port - short m_redirectCount; - - void state_Initial() throw(std::exception); - void state_ResolveServer() throw(std::exception); - void state_Connect() throw(std::exception); - void state_ConnectWait() throw(std::exception); - void state_SendGreeting() throw(std::exception); - void state_GetGreetingResponse() throw(std::exception); - void state_AnalyzeGreetingResponse() throw(std::exception); - void state_DetermineProtocol() throw(std::exception); - void state_Send() throw(std::exception); - void state_GetLine() throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_backup"; } - -public: - protocol_backup(const config::streamConfig &info, const int originalBitrate, const uniString::utf8& originalMimeType) throw(); - virtual ~protocol_backup() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_flvClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_flvClient.cpp deleted file mode 100644 index 205621e9..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_flvClient.cpp +++ /dev/null @@ -1,275 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "protocol_flvClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "FLV.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.flvClientDebug()) DLOG(__VA_ARGS__); } while (0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_flvClient::protocol_flvClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, const uniString::utf8 &XFF) throw (std::exception) - - : protocol_shoutcastClient (hs, streamID, hostName, addr, XFF, streamData::FLV) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - m_timestamp = 0; - m_fileOffset = 0; - setCallback (&protocol_shoutcastClient::state_AttachToStream); -} - -protocol_flvClient::~protocol_flvClient() throw() -{ - cleanup("FLV", gOptions.flvClientDebug(), false, true); -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_flvClient::timeSlice() throw(exception) -{ - int ret = doTimeSlice(); - if (ret == 1) - { - m_state = &protocol_flvClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - - -void protocol_flvClient::setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next) -{ - m_state = callback ? callback : m_nextState; - m_nextState = callback ? next : NULL; -} - - -void protocol_flvClient::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_flvClient::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - if (sendText()) - { - m_metaIntervalCounter = 0; - m_state = m_nextState; - } -} - -// find the appropriate stream and try to attach to it -void protocol_flvClient::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - int read_bitrate = 0; - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - if (processReject("FLV", bandWidth::CLIENT_FLV_SENT, MSG_ICY_HTTP401, - MSG_ICY_HTTP401_LEN, &read_bitrate)) - { - goto fall_through; - } - - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { -fall_through: - - // for FLV, we can only support specific sample rates before we - // have playback / compatibility issues vs what the spec wants. - if (m_streamData) - { - const unsigned int samplerate = m_streamData->streamSampleRate(); - if ((m_streamData->streamUvoxDataType() == MP3_DATA) && - ((samplerate != 44100) && (samplerate != 22050) && (samplerate != 11025))) - { - m_outBuffer = MSG_ICY_HTTP401.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_FLV_SENT, (m_outBufferSize = MSG_ICY_HTTP401_LEN)); - - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - m_result.write(); - m_result.timeoutSID(m_streamID); - m_ignoreDisconnect = true; - - if (gOptions.logClients()) - { - ELOG(m_clientLogString + "FLV client connection rejected. Stream samplerate is " + - sampleRateStr(samplerate) + " which is not supported for MP3-in-FLV streaming " + - "(only 44.1 kHz, 22.05 kHz and 11.025 kHz samplerates are allowed)."); - } - - return; - } - } - - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - const int add = processAdd("FLV", bandWidth::CLIENT_FLV_SENT, - MSG_ICY_HTTP401, MSG_ICY_HTTP401_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - m_OKResponse = MSG_ICY_HTTP200 + "Content-Type:video/x-flv\r\n"; - - if (!m_streamData) - { - utf8 path = getStreamPath(m_streamID); - if (!path.empty() && path.find(utf8("/")) == 0) - { - path = path.substr(1); - } - - if (isPodcast) - { - m_OKResponse += "Content-Disposition:attachment;filename=\"" + path + "\"\r\n" - "Content-Length:" + tos(m_backupFile.size()) + "\r\n"; - } - } - - if (gOptions.clacks()) - { - m_OKResponse += "X-Clacks-Overhead:GNU Terry Pratchett\r\n"; - } - m_OKResponse += "\r\n"; - - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_FLV_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_shoutcastClient::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_shoutcastClient::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_shoutcastClient::state_Close; - } - m_result.write(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("FLV"); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("FLV", bandWidth::CLIENT_FLV_SENT, movedUrl, 2); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - } -} - -void protocol_flvClient::state_SendIntro() throw(exception) -{ - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - m_state = &protocol_shoutcastClient::state_Stream; - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntroFile; - } - } -} - -void protocol_flvClient::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetReadPtr(); - - if (!m_streamData || m_introFile.empty()) - { - // send intro file if we have it - acquireIntroFile(); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntro; - } - - setW3CState(); - - m_result.run(); -} - - -void protocol_flvClient::processFrame (int type, const unsigned char *buf, unsigned int len) -{ - bool is_mp3 = (type == MP3_DATA); - unsigned int read_samplerate = 0; - int read_bitrate = 0; - bool read_mono = true; - __uint8 asc_header[2] = {0}; - - if (len < 7) - return; - if (is_mp3) - getMP3FrameInfo ((char*)buf, &read_samplerate, &read_bitrate, &read_mono); - else - getADTSFrameInfo ((char*)buf, &read_samplerate, asc_header); - - createFLVTag (m_output, (char*)&buf [is_mp3 ? 0 : 7], len - (is_mp3 ? 0 : 7), - m_timestamp, is_mp3, read_mono, read_samplerate, read_bitrate, asc_header, m_streamID); -} - - - -void protocol_flvClient::return_403(void) -{ - protocol_shoutcastClient::return_403(); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_flvClient.h b/Src/Plugins/DSP/sc_serv3/protocol_flvClient.h deleted file mode 100644 index 11105bf7..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_flvClient.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -#ifndef protocol_flvClient_H_ -#define protocol_flvClient_H_ - -#include "protocol_shoutcastClient.h" -#include <vector> - -class streamData; - -class protocol_flvClient: public protocol_shoutcastClient -{ -private: - - typedef void (protocol_flvClient::*state_t)(); - state_t m_state; - state_t m_nextState; - - int m_timestamp; - int m_fileOffset; - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_SendText() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_SendIntro() throw(std::exception); - - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_flvClient"; } - -public: - protocol_flvClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, const uniString::utf8 &hostName, const uniString::utf8 &addr, const uniString::utf8 &XFF) throw(std::exception); - - protocol_flvClient(const socketOps::tSOCKET s, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, - const u_short port, const uniString::utf8 &userAgent, - const uniString::utf8 &XFF, const uniString::utf8 &referer, - const bool headRequest) throw(std::exception); - virtual ~protocol_flvClient() throw(); - - virtual void setCallback (protocol_shoutcastClient::state_t callback = NULL, protocol_shoutcastClient::state_t next = NULL); - void processFrame (int type, const unsigned char *buf, unsigned int len); - - void return_403(void); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.cpp deleted file mode 100644 index 11dad38c..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.cpp +++ /dev/null @@ -1,674 +0,0 @@ -#if 0 -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "protocol_m4aClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(x) { if (gOptions.m4aClientDebug()) DLOG((x)); } -#define AD_DEBUG_LOG(x) { if (gOptions.adMetricsDebug()) DLOG((x)); } - -protocol_m4aClient::protocol_m4aClient(const socketOps::tSOCKET s, const streamData::streamID_t streamID, - const utf8 &hostName, const utf8 &addr, const u_short port, - const utf8 &userAgent, const utf8 &XFF, const utf8 &referer, - const bool headRequest) throw(exception) - : protocol_shoutcastClient(s, port, streamData::M4A, hostName, - (streamID <= 0 || streamID > INT_MAX ? DEFAULT_CLIENT_STREAM_ID : streamID), - stats::getNewClientId(), userAgent, referer, addr, XFF, headRequest), - - m_state(&protocol_m4aClient::state_AttachToStream), m_nextState(0) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); -} - -protocol_m4aClient::~protocol_m4aClient() throw() -{ - cleanup("M4A", gOptions.m4aClientDebug()); -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_m4aClient::timeSlice() throw(exception) -{ - int ret = doTimeSlice(result); - if (ret == 1) - { - m_state = &protocol_m4aClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - -void protocol_m4aClient::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_m4aClient::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - if (sendText()) - { - m_metaIntervalCounter = 0; - m_state = m_nextState; - } -} - -// find the appropriate stream and try to attach to it -void protocol_m4aClient::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - if (processReject("M4A", bandWidth::CLIENT_M4A_SENT, MSG_ICY_HTTP401, - MSG_ICY_HTTP401_LEN, &read_bitrate, &dataType)) - { - goto fall_through; - } - - m_state = &protocol_m4aClient::state_SendText; - m_nextState = &protocol_m4aClient::state_Close; - } - else - { -fall_through: - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - const int add = processAdd("FLV", bandWidth::CLIENT_M4A_SENT, - MSG_ICY_HTTP401, MSG_ICY_HTTP401_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_m4aClient::state_SendText; - m_nextState = &protocol_m4aClient::state_Close; - } - else - { - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - m_OKResponse = MSG_ICY_HTTP200 + "Content-Type:audio/mp4\r\n"; - - if (!m_streamData) - { - utf8 path = getStreamPath(m_streamID); - if (!path.empty() && path.find(utf8("/")) == 0) - { - path = path.substr(1); - } - - if (isPodcast) - { - m_OKResponse += "Content-Disposition:attachment;filename=\"" + path + "\"\r\n" - "Content-Length:" + tos(m_backupFile.size()) + "\r\n"; - } - } - - if (gOptions.clacks()) - { - m_OKResponse += "X-Clacks-Overhead:GNU Terry Pratchett\r\n"; - } - m_OKResponse += "\r\n"; - - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_m4aClient::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_m4aClient::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_m4aClient::state_Close; - } - m_result.write(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("M4A"); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("M4A", bandWidth::CLIENT_M4A_SENT, movedUrl, 2); - m_state = &protocol_m4aClient::state_SendText; - m_nextState = &protocol_m4aClient::state_Close; - } - } -} - -void protocol_m4aClient::state_SendIntro() throw(exception) -{ - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - m_state = &protocol_m4aClient::state_Stream; - } - else - { - m_state = &protocol_m4aClient::state_SendIntroFile; - } - } -} - -void protocol_m4aClient::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetReadPtr(); - - if (!m_streamData || (m_streamData && m_introFile.empty())) - { - // send intro file if we have it - acquireIntroFile(); - m_state = (m_introFile.empty() ? &protocol_m4aClient::state_Stream : &protocol_m4aClient::state_SendIntroFile); - } - else - { - m_state = &protocol_m4aClient::state_SendIntro; - } - - setW3CState(); - - m_result.run(); -} - -// handle state where we are sending intro files -void protocol_m4aClient::state_SendIntroFile() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetCommon(); - - time_t cur_time; - const bool debug = gOptions.m4aClientDebug(); - const int autoDumpTime = detectAutoDumpTimeout(cur_time, m_lastActivityTime, (m_clientLogString + - "Timeout waiting to send data"), - (!m_ignoreDisconnect && debug), m_streamID); - - if (m_shortSend.empty() && (m_frameCount > calculateFrameLimit(cur_time))) - { - if (calculateDelay((autoDumpTime - (int)(cur_time - m_lastActivityTime)))) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - return; - } - } - - int amt = (int)(m_introFile.size() - m_introFileOffset); - if (amt == 0) - { - // we're done with the intro file - m_introFile.clear(); - m_introFile.resize(0); - m_introFileOffset = 0; - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - resetReadPtr(); - m_result.run(); - } - else if (amt > 0) - { - const bool debug = gOptions.m4aClientDebug(); - checkListenerIsValid(debug); - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - bool advert = false; - doM4AFrameSync(m_streamData->streamUvoxDataType(), debug, m_introFileOffset, - (const char*)&m_introFile[0], cur_time, m_streamData->streamBitrate(), - m_streamData->streamSampleRate(), len, frames, advert); - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - // we adjust by the pre-M4A size - m_introFileOffset += len; - } - - updateFrameCount(frames, cur_time); - - handleShortSend(autoDumpTime, cur_time, rval); - } -} - -// handle state where we are sending backup files -void protocol_m4aClient::state_SendBackupFile() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetCommon(); - - int amt = (int)(m_backupFile.size() - m_backupFileOffset); - - if (streamData::isSourceConnected(m_streamID)) - { - if (m_streamData) - { - m_streamData->releaseStream(); - } - m_streamData = streamData::accessStream(m_streamID); - - // we're done with the backup file - m_backupFile.clear(); - m_backupFile.resize(0); - m_backupFileOffset = 0; - m_backupLoopTries = 0; - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - resetReadPtr(); - m_result.run(); - } - else if (amt == 0) - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - // we're done with the backup file. get more data - acquireBackupFile(); - if (!m_backupFile.empty()) - { - ++m_backupLoopTries; - resetReadPtr(); - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - } - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFileOffset = 0; - m_backupFile.clear(); - } - else - { - resetReadPtr(); - m_backupFileOffset = 0; - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - } - - m_result.run(); - } - else if (amt > 0) - { - const bool debug = gOptions.m4aClientDebug(); - checkListenerIsValid(debug); - - time_t cur_time; - const int autoDumpTime = detectAutoDumpTimeout(cur_time, m_lastActivityTime, (m_clientLogString + - "Timeout waiting to send data"), - (!m_ignoreDisconnect && debug), m_streamID); - - if (m_shortSend.empty() && (m_frameCount > calculateFrameLimit(cur_time))) - { - if (calculateDelay((autoDumpTime - (int)(cur_time - m_lastActivityTime)))) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - return; - } - } - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, backup_type = MP3_DATA, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - if (!m_streamData) - { - utf8 backupFile = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - backupFile = gOptions.backupFile(); - } - if (!backupFile.empty()) - { - backup_type = ((backupFile.rfind((utf8)".aac") == utf8::npos) ? MP3_DATA : AACP_DATA); - } - } - - bool advert = false; - doM4AFrameSync((m_streamData ? m_streamData->streamUvoxDataType() : backup_type), - debug, m_backupFileOffset, (const char*)&m_backupFile[0], cur_time, - (m_streamData ? m_streamData->streamBitrate() : 0), - (m_streamData ? m_streamData->streamSampleRate() : 0), len, frames, advert); - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - // we adjust by the pre-M4A size - m_backupFileOffset += len; - } - - updateFrameCount(frames, cur_time); - - handleShortSend(autoDumpTime, cur_time, rval); - } -} - -// handle state where we are sending advert content -void protocol_m4aClient::state_SendAdverts() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - resetCommon(); - - streamData::specialFileData *ad = m_adAccess.getAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - int amt = (ad ? (int)(ad->m_sc1Buffer.size() - m_adAccess.offset) : 0); - - while (true) - { - // DLOG ("amount remaining to be sent " + tos(amt)); - if (amt > 0) - { - break; - } - if (m_adAccess.anotherAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest)) - { - ad = m_adAccess.getAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - amt = (ad ? (int)(ad->m_sc1Buffer.size() - m_adAccess.offset) : 0); - continue; - } - // no more adverts - m_lastActivityTime = ::time(NULL); - m_state = &protocol_m4aClient::state_Stream; - m_adAccess.stopAdRun(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - // go to the latest point in the ring buffer. - resetReadPtr(); - m_result.run(); - m_result.timeoutSID(m_streamID); - - ILOG(m_clientLogString + "Transitioning back to stream [Agent: `" + - m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(m_group) + "]"); - return; - } - - try - { - const bool debug = gOptions.m4aClientDebug(); - checkListenerIsValid(debug); - - time_t cur_time; - const int autoDumpTime = detectAutoDumpTimeout(cur_time, m_lastActivityTime, (m_clientLogString + - "Timeout waiting to send data"), - (!m_ignoreDisconnect && debug), m_streamID); - - if (m_shortSend.empty() && (m_frameCount > calculateFrameLimit(cur_time))) - { - if (calculateDelay((autoDumpTime - (int)(cur_time - m_lastActivityTime)))) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - return; - } - } - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - bool advert = false; - doM4AFrameSync(m_streamData->streamUvoxDataType(), (int)m_adAccess.offset, - debug, (const char*)&ad->m_sc1Buffer[0], cur_time, - m_streamData->streamBitrate(), m_streamData->streamSampleRate(), - len, frames, advert); - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - // we adjust by the pre-M4A size - m_adAccess.offset += len; - - m_nextState = &protocol_m4aClient::state_SendText; - } - - updateFrameCount(frames, cur_time); - - handleShortSend(autoDumpTime, cur_time, rval); - } - catch (std::runtime_error) - { - m_adAccess.stopAdRun(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - throw; - } -} - -void protocol_m4aClient::state_Stream() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - resetCommon(); - - const time_t cur_time = ::time(NULL); - const bool debug = gOptions.m4aClientDebug(); - const int autoDumpTime = gOptions.getAutoDumpTime(m_streamID); // don't want this value to change during this call - if ((autoDumpTime > 0) && ((cur_time - m_lastActivityTime) >= autoDumpTime)) - { - throwEx<runtime_error>((!m_ignoreDisconnect && debug ? - (m_clientLogString + "Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + - tos(cur_time - m_lastActivityTime) + "] )") : (utf8)"")); - } - - if (m_shortSend.empty() && (m_frameCount > calculateFrameLimit(cur_time))) - { - if (calculateDelay((autoDumpTime - (int)(cur_time - m_lastActivityTime)))) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - return; - } - } - - const streamData::ringBuffer_t rb = (m_streamData ? m_streamData->getSc1RingBuffer() : streamData::ringBuffer_t()); - streamData::ringBufferAccess_t amt = (m_streamData ? (rb.m_writePtr - m_readPtr) : 0); - if ((amt > 0) && (amt > rb.m_data.size())) - { - // the pointers are too far apart. Underrun - resetReadPtr(&amt); - } - - std::vector<__uint8>& rem = getRemainder(); - const streamData::ringBufferAccess_t offset = (m_readPtr & rb.m_ptrMask); - // clamp again so we don't read pass the end of the buffer - // - // if we've got more in remainder than what we're wanting - // to send then we'll prioritise the remainder data first - // before trying to acquire more new data to try to send. - amt = min(amt, min((rb.m_data.size() - offset), (streamData::ringBufferAccess_t)max(0, (SEND_SIZE - rem.size())))); - - bool advert = false; - int remainder = 0, len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - if ((len > 0) || !rem.empty() || !m_shortSend.empty()) - { - const std::vector<__uint8>::const_iterator pos = rb.m_data.begin(); - std::vector<__uint8>& tempBuf; - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if (!rem.empty() && ((len + rem.size()) <= (BUF_SIZE * 4))) - { - tempBuf.insert(tempBuf.end(), rem.begin(), rem.end()); - tempBuf.insert(tempBuf.end(), pos + offset, pos + (offset + len)); - len += m_remainderSize; - } - else if (len > 0) - { - tempBuf.insert(tempBuf.end(), pos + offset, pos + (offset + len)); - } - rem.clear(); - - remainder = doM4AFrameSync((m_streamData ? m_streamData->streamUvoxDataType() : MP3_DATA), - debug, 0, cur_time, (m_streamData ? m_streamData->streamBitrate() : 0), - (m_streamData ? m_streamData->streamSampleRate() : 0), - len, frames, advert, true); - } - - // if no data then we need to just go to adverts - // otherwise we need to see what we've got and - // if we can, then transition to adverts or spin - // and wait for the current data to be sent and - // then we should be able to re-process into ads - if (m_output.empty()) - { - // this will close the stream or go to backups as needed - if (handleNoData("M4A", remainder, amt, autoDumpTime, cur_time)) - { - m_state = &protocol_m4aClient::state_SendBackupFile; - } - else - { - if (processAdvertTrigger(advert)) - { - m_state = &protocol_m4aClient::state_SendAdverts; - return; - } - - // at this point, we're in a bit of a weird state - // as we've not been able to generate / retrieve - // anything and if we don't slwo down things then - // we need to delay things to allow it to catchup - if (m_frameCount > calculateFrameLimit(cur_time)) - { - // determine things based on the 'next' second when working out - // the differential as that's how long we want to wait to run - m_result.schedule((int)((__uint64)((cur_time + 1) * 1000) - m_result.m_currentTime)); - } - else - { - // just go with an arbitrary value as we cannot - // be certain when we're going to get data next - // and we don't know the impact on playback etc - m_result.schedule(100); - } - - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - m_result.write(); - } - } - else - { - processTitleW3C(); - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_M4A_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_totalBytesSent += rval; - m_lastActivityTime = ::time(NULL); - m_metaIntervalCounter += rval; - - if (processAdvertTrigger(advert)) - { - m_state = &protocol_m4aClient::state_SendAdverts; - remainder = 0; - } - } - - // as we're keeping a copy of the remainder / non-sent data - // we need to move the readptr on so that it doesn't cause - // the stream to effectively stick on the same point and in - // turn then lead to resetReadPtr() being called (skipping) - m_readPtr += amt; - updateFrameCount(frames, cur_time); - - handleShortSend(autoDumpTime, cur_time, rval); - - // we only keep the remainder if - // there's no advert to provide - m_remainderSize = remainder; - } -} - -void protocol_m4aClient::return_403(void) -{ - protocol_shoutcastClient::return_403(); - m_state = &protocol_m4aClient::state_SendText; - m_nextState = &protocol_m4aClient::state_Close; -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h b/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h deleted file mode 100644 index 8455754f..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_m4aClient.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#if 0 -#ifndef protocol_m4aClient_H_ -#define protocol_m4aClient_H_ - -#include "protocol_shoutcastClient.h" -#include <vector> - -class streamData; - -class protocol_m4aClient: public protocol_shoutcastClient -{ -private: - typedef void (protocol_m4aClient::*state_t)(); - state_t m_state; - state_t m_nextState; - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_SendText() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_Stream() throw(std::exception); - void state_SendIntroFile() throw(std::exception); - void state_SendIntro() throw(std::exception); - void state_SendBackupFile() throw(std::exception); - void state_SendAdverts() throw(std::exception); - - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_m4aClient"; } - -public: - protocol_m4aClient(const socketOps::tSOCKET s, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, - const u_short port, const uniString::utf8 &userAgent, - const uniString::utf8 &XFF, const uniString::utf8 &referer) throw(std::exception); - virtual ~protocol_m4aClient() throw(); - - void return_403(void); -}; - -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay.cpp b/Src/Plugins/DSP/sc_serv3/protocol_relay.cpp deleted file mode 100644 index 6db504ec..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay.cpp +++ /dev/null @@ -1,544 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <assert.h> -#include "protocol_relay.h" -#include "protocol_backup.h" -#include "protocol_relay_shoutcast.h" -#include "protocol_relay_uvox.h" -#include "bandwidth.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -// g_streamSourceRelayIsActive -// This is a map of sid to int, where the int is a bitmap of flags, the bits being -// 0 - registered, some runnable is working with this. -// 1 - shutdown of relay requested. -// 2 - primary relay in use -// 3 - backup runnable started - -#define LOGNAME "RELAY" -#define DEBUG_LOG(...) do { if (gOptions.relayDebug()) DLOG(__VA_ARGS__); } while (0) - -protocol_relay::protocol_relay(const config::streamConfig &info, const bool retry) throw() - : m_redirectCount(0), m_outBuffer(0), m_outBufferSize(0), m_relayWaitingToReconnect(false), - m_relaySentConnectWait(false), m_retryRelay(retry), m_skip(false), - m_backupStarted(false), m_registered(false), m_relayInfo(info), - m_originalRelayInfo(info), m_retryCount(0), m_relayReconnectStartTime(::time(NULL)), - m_state(&protocol_relay::state_Initial), m_nextState(0) -{ - streamData::setRelayActive (info.m_streamID, -1); // make sure entry exists - - m_srcPort = m_relayInfo.m_relayUrl.port(); - m_srcAddrName = m_relayInfo.m_relayUrl.server(); - m_srcURLpart = m_relayInfo.m_relayUrl.path(); - m_srcLogString = "[RELAY " + m_srcAddrName + ":" + tos(m_srcPort) + - (m_srcURLpart == "/" ? "" : m_srcURLpart) + - " sid=" + tos(m_relayInfo.m_streamID) + "] "; - - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); -} - -protocol_relay::~protocol_relay() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - socketOps::forgetTCPSocket(m_socket); - if (m_registered) - { - bool noEntry = false; - streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 0, 7); - } -} - -void protocol_relay::timeSlice() throw(exception) -{ - if (iskilled()) - { - m_result.done(); - return; - } - - // normal running - try - { - if (m_registered && m_relayWaitingToReconnect && (::time(NULL) < m_relayReconnectStartTime)) - { - // an error occured in the past and we are waiting for the appropriate time interval before we do anything - bool noEntry = false; - int status = streamData::isRelayActive(m_originalRelayInfo.m_streamID, noEntry); - if ((status & 2) == 0) // if no shutdown req - { - m_result.schedule(400); - return; - } - DEBUG_LOG (m_srcLogString + "relay shutdown req", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error>(""); - } - (this->*m_state)(); - } - catch(const exception &ex) - { - // close socket and move into waiting state for reconnect - socketOps::forgetTCPSocket(m_socket); - - // but first see if we've hit the retry limit (which can be set as zero to keep on going) - ++m_retryCount; - int retryLimit = gOptions.relayConnectRetries(); - bool noEntry = false; - - DEBUG_LOG(m_srcLogString + __FUNCTION__ + utf8(" m_retryCount:") + tos(m_retryCount) + " retryLimit:" + tos(retryLimit), LOGNAME, m_originalRelayInfo.m_streamID); - int status = streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 0, 4); - -#if defined(_DEBUG) || defined(DEBUG) - bool relayActive = status & 4 ? true : false; - - DLOG(m_srcLogString + __FUNCTION__ + " a: " + tos(retryLimit) + - " " + tos(m_retryCount) + " "+tos(relayActive) + " " + - tos(m_retryCount < retryLimit && retryLimit > 0) + " " + - tos(((m_retryCount < retryLimit && retryLimit > 0)) && relayActive),LOGNAME, m_originalRelayInfo.m_streamID); -#endif - - if (noEntry == false && (status & 2) == 0) // is relay still configured - { - if ((status & 8) == 0) - startBackupConnection (""); // kick backup off if present, in case of repeated failure - - utf8 msg = ex.what(); - if (!msg.empty()) - { - ELOG (ex.what(), LOGNAME, m_originalRelayInfo.m_streamID); - } - - if (retryLimit == 0 || (m_retryCount < retryLimit && retryLimit > 0)) - { - - m_relayWaitingToReconnect = true; - m_state = &protocol_relay::state_Initial; - m_relayInfo = m_originalRelayInfo; - m_relayReconnectStartTime = ::time(NULL) + gOptions.relayReconnectTime(); - m_result.schedule (550); - DLOG (m_srcLogString + "reconnect time " + tos ((long)m_relayReconnectStartTime), LOGNAME, m_originalRelayInfo.m_streamID); - return; - } - } - else - { - utf8 ss = m_srcLogString + "Abort trying to "; - if (m_retryCount > 0) - ss += "re"; - ss += "connect to the source relay"; - ILOG (ss, LOGNAME, m_originalRelayInfo.m_streamID); - } - m_result.done(); - } -} - -// parse out relayInfo object -void protocol_relay::state_Initial() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - // if we have a moved stream then now we have the stream id - // then we need to check and block the source as applicable - utf8 movedUrl = gOptions.stream_movedUrl(m_relayInfo.m_streamID); - if (!movedUrl.empty()) - { - ELOG (m_srcLogString + "Relay connection aborted. Stream is configured as having moved.", LOGNAME, m_originalRelayInfo.m_streamID); - m_result.done(); - return; - } - - bool noEntry = false; - if (m_registered == false) - { - int state = streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 1); - if (state < 0) - { - ILOG (m_srcLogString + "waiting on other relay termination", LOGNAME, m_originalRelayInfo.m_streamID); - streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 2); // request shutdown of other relay - m_result.schedule (100); - return; - } - m_registered = true; - } - int state = streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 4); - - if (noEntry || (state & 2) == 2) - { - ILOG (m_srcLogString + "relay shutting down", LOGNAME, m_originalRelayInfo.m_streamID); - m_result.done(); - return; - } - - // if m_retryCount is over 1 then pull the stream relay url from - // the config details as we could be in a re-try or having done - // a config reload and the stream relay url has then sinc changed - // - this primarily aids a config change for a pending relay join - if (m_retryCount > 0) - { - m_relayInfo.m_relayUrl = gOptions.stream_relayURL(m_originalRelayInfo.m_streamID); - } - m_relayWaitingToReconnect = false; - m_srcAddrName = m_relayInfo.m_relayUrl.server(); - m_srcPort = m_relayInfo.m_relayUrl.port(); - m_srcURLpart = m_relayInfo.m_relayUrl.path(); - - m_srcLogString = "[RELAY " + m_srcAddrName + ":" + tos(m_srcPort) + - (m_srcURLpart == "/" ? "" : m_srcURLpart) + - " sid=" + tos(m_relayInfo.m_streamID) + "] "; - - m_state = &protocol_relay::state_ResolveServer; - m_result.run(); -} - - -// resolve server name to numeric address -void protocol_relay::state_ResolveServer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - assert(m_socket == socketOps::cINVALID_SOCKET); - m_socket = socketOps::createTCPSocketTHROW(); - socketOps::setNonblock(m_socket, true); - m_srcAddrNumeric = socketOps::hostNameToAddress(m_srcAddrName.hideAsString(), m_srcPort); - if (m_srcAddrNumeric.empty()) - { - ELOG (m_srcLogString + "Could not resolve host address", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error>(""); - } - - m_state = &protocol_relay::state_Connect; - m_result.run(); -} - -// TCP connect -void protocol_relay::state_Connect() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - assert(m_socket != socketOps::cINVALID_SOCKET); - - if (!m_skip) - { - utf8 ss = m_srcLogString; - if (m_retryCount > 0) - { - ss += "Trying to restore connection to source relay [attempt #"; - ss += tos(m_retryCount+1) + "]"; - } - else - ss += "Connecting to source relay"; - ILOG (ss, LOGNAME, m_originalRelayInfo.m_streamID); - } - - m_skip = false; - socketOps::connectTHROW (m_socket, m_srcAddrNumeric, m_srcPort); - - m_lastActivityTime = ::time(NULL); - m_state = &protocol_relay::state_ConnectWait; - m_result.run(); -} - -// wait for connect to complete -void protocol_relay::state_ConnectWait() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - assert(m_socket != socketOps::cINVALID_SOCKET); - - time_t cur_time; - const int autoDumpSourceTime = detectAutoDumpTimeout (cur_time, m_originalRelayInfo.m_streamID, (m_srcLogString + "Timeout trying to connect")); - - bool noEntry = false, relayActive = ((streamData::isRelayActive(m_originalRelayInfo.m_streamID, noEntry) & 6) == 4); - if (!relayActive && !noEntry) - { - throwEx<runtime_error>(""); - } - - string error; - socketOps::nonBlockConnect_t connectResult = socketOps::nonBlockingConnectWait(m_socket, error); - switch (connectResult) - { - case socketOps::NBC_ERROR: - { - ELOG (m_srcLogString + error, LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error>(""); - break; - } - case socketOps::NBC_INPROGRESS: - { - // try again but wait a bit - m_result.schedule(100); - m_result.timeout((autoDumpSourceTime - (int)(cur_time - m_lastActivityTime))); - break; - } - case socketOps::NBC_CONNECTED: - { - m_lastActivityTime = ::time(NULL); - m_state = &protocol_relay::state_SendGreeting; - m_result.run(); - break; - } - default: - { - ELOG (m_srcLogString + "Unknown non-blocking connect state.", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error>(""); - } - } -} - -void protocol_relay::state_SendGreeting() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_HTTPHeaders.clear(); - m_HTTPGreetingResponse.clear(); - - string cdn; - if (isCDNSlave(m_relayInfo.m_streamID)) - { - cdn = "cdn-slave:1\r\n"; - } - - m_lineBuffer = "GET " + m_srcURLpart + " " + "HTTP/1.1\r\n" + - "Host:" + stripHTTPprefix(m_srcAddrName) + ":" + tos(m_srcPort) + "\r\n" + - "User-Agent:" + g_userAgent + " Relay\r\n" + - "Ultravox transport type:TCP\r\n" + - "Accept:*/*\r\n" + - "icy-metadata:1\r\n" + - cdn + - "icy-host:" + metrics::metrics_verifyDestIP(gOptions) + "\r\n\r\n"; - - DEBUG_LOG(m_srcLogString + "Sending request [" + eol() + stripWhitespace(m_lineBuffer) + eol() + "]", LOGNAME, m_originalRelayInfo.m_streamID); - m_outBuffer = &(m_lineBuffer[0]); - bandWidth::updateAmount(bandWidth::RELAY_MISC_RECV, (m_outBufferSize = (int)m_lineBuffer.size())); - - m_lastActivityTime = ::time(NULL); - m_state = &protocol_relay::state_Send; - m_nextState = &protocol_relay::state_GetGreetingResponse; - - m_result.write(); - m_result.timeoutSID(m_originalRelayInfo.m_streamID); -} - -// send whatever is in outBuffer -void protocol_relay::state_Send() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (sendDataBuffer(m_relayInfo.m_streamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - m_lineBuffer.clear(); - } -} - -void protocol_relay::state_GetLine() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (getHTTPStyleHeaderLine(m_relayInfo.m_streamID, m_lineBuffer, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_relay::state_GetGreetingResponse() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_state = &protocol_relay::state_GetLine; - m_nextState = &protocol_relay::state_AnalyzeGreetingResponse; - - m_lastActivityTime = ::time(NULL); - m_result.read(); - m_result.timeoutSID(m_originalRelayInfo.m_streamID); -} - -// analyze header lines in greeting response -void protocol_relay::state_AnalyzeGreetingResponse() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_lastActivityTime = ::time(NULL); - - if ((int)m_HTTPHeaders.size() >= gOptions.maxHeaderLineCount()) - { - throwEx<runtime_error>(m_srcLogString + "Max HTTP header lines exceeded"); - } - - m_lineBuffer = stripWhitespace(m_lineBuffer); - if (m_lineBuffer.empty()) - { - m_state = &protocol_relay::state_DetermineProtocol; - m_result.run(); - } - else - { - if (m_HTTPGreetingResponse.empty()) - { - m_HTTPGreetingResponse = m_lineBuffer; - } - else - { - // find the colon that divides header lines into key/value fields - utf8::size_type pos = m_lineBuffer.find(utf8(":")); - if (pos == utf8::npos) - { - throwEx<runtime_error>(m_srcLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]"); - } - - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0, pos))); - utf8 value = stripWhitespace(m_lineBuffer.substr(pos + 1)); - // allow empty values. (for urls and what-not) - if (key.empty()) - { - throwEx<runtime_error>(m_srcLogString + "Connection rejected. Bad HTTP header string [" + m_lineBuffer + "]"); - } - m_HTTPHeaders[key] = value; - } - - m_state = &protocol_relay::state_GetLine; - m_nextState = &protocol_relay::state_AnalyzeGreetingResponse; - m_result.read(); - m_result.timeoutSID(m_originalRelayInfo.m_streamID); - m_lineBuffer.clear(); - } -} - -void protocol_relay::state_DetermineProtocol() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (m_HTTPGreetingResponse.empty()) - { - throwEx<runtime_error>(m_srcLogString + "Empty greeting response"); - } - - // parse into three fields - utf8 s = m_HTTPGreetingResponse; - - utf8::size_type pos = (!s.empty() ? s.find(utf8(" ")) : utf8::npos); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Badly formed response line [" + m_HTTPGreetingResponse + "]", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error>(""); - } - - s = stripWhitespace(s.substr(pos)); - pos = (!s.empty() ? s.find(utf8(" ")) : utf8::npos); - if (pos == utf8::npos) - { - ELOG (m_srcLogString + "Badly formed response line [" + m_HTTPGreetingResponse + "]", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error>(""); - } - - int resultCode = utf8(s.substr(0, pos)).toInt(); - if (resultCode == 200) - { - utf8 diag; - for (httpHeaderMap_t::const_iterator i = m_HTTPHeaders.begin(); i != m_HTTPHeaders.end(); ++i) - { - diag += (*i).first + ": " + (*i).second + eol(); - } - DEBUG_LOG(m_srcLogString + "Received headers [" + eol() + stripWhitespace(diag) + eol() + "]", LOGNAME, m_originalRelayInfo.m_streamID); - - const socketOps::tSOCKET s = m_socket; - - m_result.done(); - - // changed order of this in build 19 so that all uvox2 is reported as misc/ultravox - // and we then base things off the user-agent containing 'Ultravox/2.1' - // we look at content-type to determine the protocol - if ((m_HTTPHeaders["content-type"] == "misc/ultravox") && - (m_HTTPHeaders["server"].find(utf8("Ultravox/2.1")) != utf8::npos)) - { - // uvox 2.1 - threadedRunner::scheduleRunnable(new protocol_relay_uvox(s, m_originalRelayInfo, m_srcAddrName, m_srcAddrNumeric, - m_srcPort, (m_srcURLpart == "/" ? "" : m_srcURLpart), m_HTTPHeaders)); - } - else - { - // shoutcast - threadedRunner::scheduleRunnable(new protocol_relay_shoutcast(s, m_originalRelayInfo, m_srcAddrName, m_srcAddrNumeric, - m_srcPort, (m_srcURLpart == "/" ? "" : m_srcURLpart), m_HTTPHeaders)); - } - m_socket = socketOps::cINVALID_SOCKET; - m_backupStarted = false; // any backup client should terminate automatically - } - else if ((resultCode >= 300) && (resultCode < 400)) - { - utf8 location = m_HTTPHeaders["location"]; - - // do we maybe have a /stream/x url and gotten a /index.html?sid=# redirect? - // if so then we should attempt to access a relay on /stream/x/ (note end / ) - utf8::size_type pos = (!location.empty() ? location.find(utf8("/index.html?sid=")) : utf8::npos); - if (pos != utf8::npos) - { - streamData::streamID_t foundID = atoi((const char *)location.substr(pos + 16).c_str()); - utf8::size_type pos2 = m_relayInfo.m_relayUrl.path().find(utf8("/stream/")); - if (pos2 != utf8::npos) - { - streamData::streamID_t origID = atoi((const char *)m_relayInfo.m_relayUrl.path().substr(pos2 + 8).c_str()); - if (foundID == origID) - { - m_relayInfo.m_relayUrl = m_relayInfo.m_relayUrl.url() + "/"; - gOptions.setOption(utf8("streamrelayurl_"+tos(m_originalRelayInfo.m_streamID)), - m_relayInfo.m_relayUrl.url()); - - m_skip = true; - m_state = &protocol_relay::state_Initial; - socketOps::forgetTCPSocket(m_socket); - m_result.run(); - WLOG(m_srcLogString + "Received an invalid redirect to `" + location + "' - trying " + m_relayInfo.m_relayUrl.url(), LOGNAME, m_originalRelayInfo.m_streamID); - return; - } - } - } - - WLOG(m_srcLogString + "Received redirect to " + location, LOGNAME, m_originalRelayInfo.m_streamID); - if (++m_redirectCount > gOptions.maxHTTPRedirects()) - { - ELOG ("Max redirects exceeded", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error>(""); - } - - m_skip = true; - m_relayInfo.m_relayUrl = location; - m_state = &protocol_relay::state_Initial; - socketOps::forgetTCPSocket(m_socket); - m_result.run(); - } - else - { - ELOG ((resultCode >= 400 ? "Source responded with error [" : "Unsupported HTTP response code [") + m_HTTPGreetingResponse + "]"); - throwEx<runtime_error>(""); - } -} - -#ifdef INCLUDE_BACKUP_STREAMS -void protocol_relay::startBackupConnection(uniString::utf8 errorMessage) throw(exception) -{ - if (!m_relayInfo.m_backupUrl.url().empty() && m_backupStarted == false) - { - if (errorMessage.empty() == false) - ELOG(m_srcLogString + errorMessage, LOGNAME, m_originalRelayInfo.m_streamID); - // this should pass through the bitrate of the original stream but as we do not - // know what it is then we have to effectively force through to allow the backup - - bool noEntry = false; - streamData::setRelayActiveFlags (m_originalRelayInfo.m_streamID, noEntry, 8); - threadedRunner::scheduleRunnable(new protocol_backup(m_relayInfo, 0, "")); - m_backupStarted = true; - return; - } -} -#else -void protocol_relay::startBackupConnection(uniString::utf8) throw(exception) -{ -} -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay.h b/Src/Plugins/DSP/sc_serv3/protocol_relay.h deleted file mode 100644 index ba01c1ee..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#ifndef protocol_relay_H_ -#define protocol_relay_H_ - -#include "threadedRunner.h" - -/* - Runnable object that handles the initial part of a relay connection. - Makes the connection to the source and determines what type of protocol - should be used, then hands off to that particular protocol - (shoutcast or uvox relay) -*/ - -class protocol_relay: public runnable -{ -private: - u_short m_srcPort; // server port - short m_redirectCount; - - uniString::utf8 m_srcAddrName; // server DNS name or value as specified in relayInfo - std::string m_srcAddrNumeric; // resolved numeric addr - uniString::utf8 m_srcURLpart; // server - - uniString::utf8 m_srcLogString; - httpHeaderMap_t m_HTTPHeaders; - uniString::utf8 m_HTTPGreetingResponse; // first line of response - - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - - bool m_relayWaitingToReconnect; - bool m_relaySentConnectWait; - bool m_retryRelay; - bool m_skip; - bool m_backupStarted; - bool m_registered; // true if runnable is ok to start. new relay have to wait for exisitng one to drop - - uniString::utf8 m_lineBuffer; // in/out lines - - config::streamConfig m_relayInfo; - const config::streamConfig m_originalRelayInfo; // used for reconnects later on - - /// reconnects - int m_retryCount; - time_t m_relayReconnectStartTime; - - typedef void (protocol_relay::*state_t)(); - - state_t m_state; - state_t m_nextState; - - void state_Initial() throw(std::exception); - void state_ResolveServer() throw(std::exception); - void state_Connect() throw(std::exception); - void state_ConnectWait() throw(std::exception); - void state_SendGreeting() throw(std::exception); - void state_GetGreetingResponse() throw(std::exception); - void state_AnalyzeGreetingResponse() throw(std::exception); - void state_DetermineProtocol() throw(std::exception); - void state_Send() throw(std::exception); - void state_GetLine() throw(std::exception); - void startBackupConnection(uniString::utf8 errorMessage) throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_relay"; } - -public: - protocol_relay(const config::streamConfig &info, const bool retry = false) throw(); - virtual ~protocol_relay() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.cpp b/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.cpp deleted file mode 100644 index 91c06f79..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.cpp +++ /dev/null @@ -1,455 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include "protocol_relay_shoutcast.h" -#include "protocol_backup.h" -#include "protocol_relay.h" -#include "streamData.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.relayShoutcastDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "RELAY" - -protocol_relay_shoutcast::protocol_relay_shoutcast(socketOps::tSOCKET s, - const config::streamConfig &originalRelayInfo, const uniString::utf8 &srcAddrName, - const uniString::utf8 &srcAddrNumeric, const int srcPort, - const uniString::utf8 &srcURLpart, httpHeaderMap_t &headers, - const int originalBitrate, const uniString::utf8& originalMimeType, const bool backup) - : runnable(s), m_originalBitrate(originalBitrate), m_originalRelayInfo(originalRelayInfo), - m_metadataInterval(mapGet(headers, "icy-metaint", (short unsigned int)0)), - m_backup(backup), m_denied(false), m_remainderSize(0), - m_remainder(new __uint8[BUF_SIZE * 4]), m_srcAddrName(srcAddrName), - m_srcAddrNumeric(srcAddrNumeric), m_srcURLpart(srcURLpart), m_streamData(0), - m_srcLogString((!backup ? "[RELAY " : "[BACKUP ") + m_srcAddrName + ":" + - tos(srcPort) + m_srcURLpart + " sid=" + - tos(originalRelayInfo.m_streamID) + "] "), - m_bytesSinceMetadata(0), m_metadataSizeByte(-1) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, originalRelayInfo.m_streamID); - bool noEntry = false; - streamData::isRelayActive (m_originalRelayInfo.m_streamID, noEntry); - - // for a backup we need to check that the mimetype matches the original source - // as otherwise there will be issues with the transition between the sources! - utf8 mimeType = fixMimeType(mapGet(headers, "content-type", utf8("audio/mpeg"))); - if (m_backup && !originalMimeType.empty() && (originalMimeType != mimeType)) - { - ELOG(m_srcLogString + "Backup source rejected. The content type does not match the original stream " - "source - detected `" + mimeType + "' instead of `" + originalMimeType + "'.", (char*)m_srcLogString.c_str(), originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_CloseConnection; - return; - } - m_originalMimeType = mimeType; - - // for a backup we need to check that the bitrate matches the original source - // as otherwise there will be issues with the transition between the sources! - const int bitrate = getStreamBitrate(headers); - if (m_backup && (m_originalBitrate > 0) && (m_originalBitrate != bitrate) && (m_originalBitrate/1000 != bitrate)) - { - ELOG(m_srcLogString + "Backup source rejected. The bitrate " - "does not match the original stream source - detected " + - tos(bitrate) + " kbps instead of " + - tos(m_originalBitrate) + " kbps.", (char*)m_srcLogString.c_str(), originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_CloseConnection; - return; - } - m_originalBitrate = bitrate; - - // check that these bitrates are allowed (looking at both max and average values) - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int ret = gOptions.isBitrateDisallowed(originalRelayInfo.m_streamID, bitrate, - streamMaxBitrate, streamMinBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - ELOG(m_srcLogString + (!m_backup ? "Relay" : "Backup") + - " source rejected. Only bitrates " + mode + " " + - tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + " kbps are allowed " - "- detected " + tos(bitrate) + " kbps.", LOGNAME, m_originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_CloseConnection; - return; - } - - bool allowPublicRelay = gOptions.stream_allowPublicRelay(m_originalRelayInfo.m_streamID); - if (!gOptions.read_stream_allowPublicRelay(m_originalRelayInfo.m_streamID)) - { - allowPublicRelay = gOptions.allowPublicRelay(); - } - headers["icy-pub"] = (allowPublicRelay ? "1" : "0"); - - /// data might be encoded in url portion, so decode. - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_originalRelayInfo.m_streamID); - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, - m_originalRelayInfo.m_relayUrl.server(), - (found ? stream.m_authHash : ""), "", - m_originalRelayInfo.m_relayUrl.url(), - m_originalRelayInfo.m_backupUrl.url(), - streamData::SHOUTCAST1, - m_originalRelayInfo.m_streamID, - m_originalRelayInfo.m_relayUrl.port(), - m_originalRelayInfo.m_maxStreamUser, - m_originalRelayInfo.m_maxStreamBitrate, - m_originalRelayInfo.m_minStreamBitrate, - m_originalRelayInfo.m_allowPublicRelay, - m_backup, getStreamSamplerate(headers), - mapGet(headers, "icy-vbr", (bool)false), headers)); - if (!m_streamData) - { - throwEx<runtime_error>(m_srcLogString + "Could not create " + - (!m_backup ? "relay" : "backup") + " connection."); - } - - // attempt to determine the version of the source based - // on the icy-notice2 line (assuming it is provided etc) - utf8 sourceIdent = mapGet(headers, "icy-notice2", utf8()); - m_streamData->updateSourceIdent(sourceIdent, true); - sourceIdent = mapGet(headers, "server", utf8()); - m_streamData->updateSourceIdent(sourceIdent, true); - - ILOG(m_srcLogString + "Connected to Shoutcast 1 source " + (!m_backup ? "relay" : "backup") + ".", LOGNAME, m_originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_GetStreamData; -} - -void protocol_relay_shoutcast::cleanup() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (m_streamData) - { - int killed = m_streamData->isKill(); - // if this was a kill i.e. when a source re-joins then we need to keep things intact - if (!killed) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_originalRelayInfo.m_streamID); - m_streamData = 0; - bool remove_relay = false; - if (gOptions.stream_relayURL(m_originalRelayInfo.m_streamID).empty() && - gOptions.stream_backupURL(m_originalRelayInfo.m_streamID).empty()) - remove_relay = true; - if (remove_relay) - streamData::removeRelayStatus (m_originalRelayInfo.m_streamID); - } - else - { - m_streamData->setKill(false); - } - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_remainder); -} - -protocol_relay_shoutcast::~protocol_relay_shoutcast() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - ILOG(m_srcLogString + "Disconnected from Shoutcast 1 source " + - (!m_backup ? "relay" : "backup"), (char*)m_srcLogString.c_str(), m_originalRelayInfo.m_streamID); - cleanup(); -} - -void protocol_relay_shoutcast::timeSlice() throw(exception) -{ - const int killed = (m_streamData ? m_streamData->isKill() : 0); - - try - { - if (m_streamData && (m_streamData->isDead() || (!m_backup && killed == 1) || (m_backup && killed == 2))) - { - DLOG(m_srcLogString + "Detected termination of stream", LOGNAME, m_originalRelayInfo.m_streamID); - m_state = &protocol_relay_shoutcast::state_Fail; - } - return (this->*m_state)(); - } - catch (const exception &ex) - { - // on error, we should get ready to retry if applicable - utf8 str = ex.what(); - if (!str.empty()) - { - ELOG(ex.what(), LOGNAME, m_originalRelayInfo.m_streamID); - } - if (m_streamData) - m_streamData->setKill (0); - m_state = &protocol_relay_shoutcast::state_Fail; - m_result.run(); - } -} - -void protocol_relay_shoutcast::state_Fail() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (!m_backup) - { - cleanup(); - threadedRunner::scheduleRunnable(new protocol_relay(m_originalRelayInfo)); - } -#ifdef INCLUDE_BACKUP_STREAMS - else - { - threadedRunner::scheduleRunnable(new protocol_backup(m_originalRelayInfo, m_originalBitrate, m_originalMimeType)); - } -#endif - m_result.done(); -} - -void protocol_relay_shoutcast::state_GetMetadata() throw(exception) -{ - time_t cur_time; - const bool debug = gOptions.relayShoutcastDebug(); - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_originalRelayInfo.m_streamID, (m_srcLogString + "Timeout waiting for stream data")); - - while (m_metadataSizeByte != 0) - { - char buf[BUF_SIZE] = {0}; - // don't read beyond metadata interval - int amt = (m_metadataSizeByte < 0 ? 1 : m_metadataSizeByte); - amt = min(amt, (BUF_SIZE - 1)); - - int rval = 0; - if ((rval = recv (buf, amt, 0x0)) < 1) - { - if (rval == 0) - { - throwEx<runtime_error>((debug ? (m_srcLogString + "Remote socket " - "closed while waiting for stream data.") : (utf8)"")); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - throwEx<runtime_error>((debug ? (m_srcLogString + "Socket error " - "while waiting for stream data. " + - socketErrString(rval)) : (utf8)"")); - } - - m_result.schedule(); - m_result.read(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - } - bandWidth::updateAmount(bandWidth::RELAY_V1_RECV, rval); - m_lastActivityTime = ::time(NULL); - if (m_metadataSizeByte < 0) - { - m_metadataSizeByte = buf[0] * 16; - m_metadataBuffer.clear(); - } - else - { - m_metadataBuffer.insert(m_metadataBuffer.end(), buf, buf + rval); - m_metadataSizeByte -= rval; - } - } - - // parse and add - // this will pull StreamTitle='' and StreamUrl='' from the string - if (!m_metadataBuffer.empty()) - { - bool song = false, url = false, next = false; - utf8 songStr, urlStr, nextStr; - - // StreamTitle='' - utf8::size_type pos_start = m_metadataBuffer.find(utf8("itle='")); - if (pos_start != utf8::npos) - { - pos_start += 6; - utf8::size_type pos_end = m_metadataBuffer.find(utf8("';")); - if (pos_end != utf8::npos) - { - songStr = m_metadataBuffer.substr(pos_start,pos_end - pos_start); - if (!songStr.empty() && !songStr.isValid()) - { - // use this as a way to try to ensure we've got a utf-8 - // encoded title to improve legacy source title support - songStr = asciiToUtf8(songStr.toANSI(true)); - } - - // advance the buffer as StreamUrl=''; has to follow StreamTitle='' - m_metadataBuffer = m_metadataBuffer.substr(pos_end + 2); - song = true; - } - else - { - ELOG(m_srcLogString + "Bad metadata string [" + m_metadataBuffer + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - - // StreamUrl='' - pos_start = m_metadataBuffer.find(utf8("mUrl='")); - if (pos_start != utf8::npos) - { - pos_start += 6; - utf8::size_type pos_end = m_metadataBuffer.find(utf8("';")); - if (pos_end != utf8::npos) - { - urlStr = m_metadataBuffer.substr(pos_start,pos_end - pos_start); - url = true; - } - else - { - ELOG(m_srcLogString + "Bad metadata string [" + m_metadataBuffer + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - - // StreamNext='' - pos_start = m_metadataBuffer.find(utf8("mNext='")); - if (pos_start != utf8::npos) - { - pos_start += 7; - utf8::size_type pos_end = m_metadataBuffer.find(utf8("';")); - if (pos_end != utf8::npos) - { - nextStr = m_metadataBuffer.substr(pos_start,pos_end - pos_start); - next = true; - } - else - { - ELOG(m_srcLogString + "Bad metadata string [" + m_metadataBuffer + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - - if (!song && !url && !next) - { - ELOG(m_srcLogString + "Bad metadata string [" + m_metadataBuffer + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - else - { - if (m_streamData->addSc1MetadataAtCurrentPosition(m_srcLogString, songStr, urlStr, nextStr) & 1) - { - ILOG(m_srcLogString + "Title update [" + songStr + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - } - - // it's streaming time - m_metadataSizeByte = -1; - m_metadataBuffer.clear(); - m_bytesSinceMetadata = 0; - m_state = &protocol_relay_shoutcast::state_GetStreamData; - - m_result.run(); -} - -void protocol_relay_shoutcast::state_GetStreamData() throw(exception) -{ - time_t cur_time; - - - try - { - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_originalRelayInfo.m_streamID, (m_srcLogString + "Timeout waiting for stream data")); - - int bitrate = m_streamData->streamBitrate(); - const int type = m_streamData->streamUvoxDataType(); - while ((!m_metadataInterval) || (m_bytesSinceMetadata < m_metadataInterval)) - { - char buf[BUF_SIZE * 4] = {0}; - // don't read beyond metadata interval otherwise we'll have audio glitching issues :o( - int amt = ((m_metadataInterval > 0) ? m_metadataInterval - m_bytesSinceMetadata : BUF_SIZE); - amt = min(amt, (BUF_SIZE - 1)); - - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if ((m_remainderSize > 0) && ((amt + m_remainderSize) <= (BUF_SIZE * 4))) - { - memcpy(buf, m_remainder, m_remainderSize); - } - else - { - m_remainderSize = 0; - } - - // adjust the position in the buffer based on the prior - // state of the remaining data as part of frame syncing - int rval = 0; - if ((rval = recv (&buf[m_remainderSize], amt, 0x0)) < 1) - { - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule (70); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - WLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_originalRelayInfo.m_streamID); - } - else - ILOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error> (""); - } - - // update these details before we mess with anything - // else as we have read things and it's needed to - // ensure that we don't break the metadata detection - bandWidth::updateAmount(bandWidth::RELAY_V1_RECV, rval); - m_bytesSinceMetadata += rval; - - // if we're here then we account for what we already had in the total - // so that we then don't skip the new data read with the original data - rval += m_remainderSize; - m_remainderSize = 0; - amt = rval; - - if (m_streamData->syncToStream(m_remainderSize, m_remainder, amt, bitrate, - type, buf, m_srcLogString)) - { - m_denied = true; - ELOG (m_srcLogString + (!m_backup ? "Relay" : "Backup") + - " source rejected. Unable to sync to the stream. Please " - "check the source is valid and in a supported format.", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error> (""); - } - - m_lastActivityTime = ::time(NULL); - } - - if (m_metadataInterval > 0) - { - // it's metadata time! - m_metadataSizeByte = -1; - m_metadataBuffer.clear(); - m_state = &protocol_relay_shoutcast::state_GetMetadata; - } - - m_result.run(); - } - catch (exception &e) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector<config::streamConfig> backupInfo = gOptions.getBackupUrl(m_originalRelayInfo.m_streamID); - if (!m_backup && !backupInfo.empty() && !m_denied) - { - m_denied = true; - if (m_streamData) - { - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_originalRelayInfo.m_streamID); - m_streamData = 0; - } - } - throw; - } -} - -void protocol_relay_shoutcast::state_CloseConnection() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_result.done(); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.h b/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.h deleted file mode 100644 index 07872249..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay_shoutcast.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once -#ifndef protocol_relay_shoutcast_H_ -#define protocol_relay_shoutcast_H_ - -#include "threadedRunner.h" - -class streamData; - -class protocol_relay_shoutcast: public runnable -{ - int m_originalBitrate; // original bitrate for checking - uniString::utf8 m_originalMimeType; // original mimetype for checking - const config::streamConfig m_originalRelayInfo; - - short unsigned int m_metadataInterval; // interval on source - const bool m_backup; // used to change log output depending on relay or backup usage - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - - short unsigned int m_remainderSize; - __uint8 *m_remainder; - - const uniString::utf8 m_srcAddrName; - const uniString::utf8 m_srcAddrNumeric; - const uniString::utf8 m_srcURLpart; - - uniString::utf8 m_metadataBuffer; - - streamData *m_streamData; - const uniString::utf8 m_srcLogString; - - typedef void (protocol_relay_shoutcast::*state_t)(); - state_t m_state; - - int m_bytesSinceMetadata; - int m_metadataSizeByte; // metadata length indicator - - void state_GetStreamData() throw(std::exception); - void state_GetMetadata() throw(std::exception); - void state_Fail() throw(std::exception); - void state_CloseConnection() throw(std::exception); - - void cleanup(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_relay_shoutcast"; } - -public: - protocol_relay_shoutcast(const socketOps::tSOCKET s, const config::streamConfig &originalRelayInfo, - const uniString::utf8 &srcAddrName, const uniString::utf8 &srcAddrNumeric, - const int srcPort, const uniString::utf8 &srcURLpart, - httpHeaderMap_t &httpHeaders, const int originalbitrate = 0, - const uniString::utf8& originalMimeType = "", const bool backup = false); - ~protocol_relay_shoutcast() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.cpp b/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.cpp deleted file mode 100644 index 94dcfcd1..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.cpp +++ /dev/null @@ -1,693 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include "protocol_relay_uvox.h" -#include "protocol_backup.h" -#include "protocol_relay.h" -#include "streamData.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.relayUvoxDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "RELAY" - -protocol_relay_uvox::protocol_relay_uvox(const socketOps::tSOCKET s, const config::streamConfig &originalRelayInfo, - const uniString::utf8 &srcAddrName, const uniString::utf8 &srcAddrNumeric, - const int srcPort, const uniString::utf8 &srcURLpart, - const httpHeaderMap_t &httpHeaders, const int originalBitrate, - const uniString::utf8& originalMimeType, const bool backup) throw(runtime_error) - : runnable(s), m_backup(backup), m_denied(false), m_remainderSize(0), - m_remainder(new __uint8[BUF_SIZE * 4]), m_srcAddrName(srcAddrName), - m_srcAddrNumeric(srcAddrNumeric), m_srcURLpart(srcURLpart), - m_srcLogString((!backup ? "[RELAY " : "[BACKUP ") + m_srcAddrName + - ":" + tos(srcPort) + m_srcURLpart + " sid=" + - tos(originalRelayInfo.m_streamID) + "] "), - m_outData(new __uint8[MAX_MESSAGE_SIZE]), m_outBuffer(0), m_outBufferSize(0), - m_originalRelayInfo(originalRelayInfo), m_streamData(0), m_nextState(0) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - // we need to look in the response headers and figure out what's going on - - // mime type. For uvox2 there is none, for shoutcast 2 it must be there - // changed in build 22 to match new specs as there's no part in brackets now - // i.e. should just be 'misc/ultravox if it's a SC2 stream being relayed - - // fixed in build 23 so we set the mime type to the source's details - // which means older clients can connect and keeps relaying to specs - switch (strtol((const char*)mapGet(httpHeaders, "ultravox-class-type", utf8()).c_str(), 0, 16)) - { - case MP3_DATA: - { - m_configData.m_mimeType = "audio/mpeg"; - break; - } - case AAC_LC_DATA: - case AACP_DATA: - { - m_configData.m_mimeType = "audio/aacp"; - break; - } - case OGG_DATA: - { - m_configData.m_mimeType = "audio/ogg"; - break; - } - default: - { - m_configData.m_mimeType = mapGet(httpHeaders, "content-type", utf8("audio/mpeg")); - break; - } - } - - if (m_configData.m_mimeType.empty()) - { - throwEx<runtime_error>(m_srcLogString + "No mime-type specified."); - } - - utf8 cdn_authhash; - if (mapGet(httpHeaders, "cdn-master", false)) - { - DEBUG_LOG(m_srcLogString + "CDN master response received by slave", LOGNAME, m_originalRelayInfo.m_streamID); - utf8 authhash = mapGet(httpHeaders, "cdn-token", utf8()); - authhash = XTEA_decipher(authhash.c_str(), authhash.size(), bob().c_str(), bob().size()); - if (yp2::isValidAuthhash(authhash)) - { - cdn_authhash = authhash; - } - else - { - DEBUG_LOG(m_srcLogString + "CDN master response rejected - invalid master authash provided", LOGNAME, m_originalRelayInfo.m_streamID); - } - } - - // for a backup we need to check that the mimetype matches the original source - // as otherwise there will be issues with the transition between the sources! - if (m_backup && !originalMimeType.empty() && (originalMimeType != m_configData.m_mimeType)) - { - ELOG(m_srcLogString + "Backup source rejected. The content type does not match the original stream " - "source - detected `" + m_configData.m_mimeType + "' instead of `" + originalMimeType + "'.", LOGNAME, m_originalRelayInfo.m_streamID); - loadAndSendMsg("NAK:Unsupported mime type", MSG_BROADCAST_SETUP, &protocol_relay_uvox::state_CloseConnection); - return; - } - - utf8 p = mapGet(httpHeaders,"ultravox-max-msg",utf8()); - if (p.empty()) - { - throwEx<runtime_error>(m_srcLogString + "Missing Ultravox-Max-Msg header"); - } - - int max_msg = p.toInt(); - if ((max_msg < 256) || (max_msg > MAX_PAYLOAD_SIZE)) - { - throwEx<runtime_error>(m_srcLogString + "Bad Ultravox-Max-Msg value " + tos(max_msg)); - } - - p = mapGet(httpHeaders, "ultravox-samplerate", utf8("0")); - int samplerate = p.toInt(); - if (samplerate < 0) - { - throwEx<runtime_error>(m_srcLogString + "Bad samplerate specified (" + tos(samplerate) + ")"); - } - - // this is basically a hint that should only appear - // if relaying a MP3 VBR stream from a 2.5+ DNAS... - p = mapGet(httpHeaders, "ultravox-vbr", utf8("0")); - const bool vbr = !!p.toInt(); - - m_configData.m_avgBitrate = 0; - m_configData.m_maxBitrate = 0; - p = mapGet(httpHeaders, "ultravox-avg-bitrate", utf8("0")); - m_configData.m_avgBitrate = p.toInt(); - p = mapGet(httpHeaders, "ultravox-max-bitrate", utf8("0")); - m_configData.m_maxBitrate = p.toInt(); - p = mapGet(httpHeaders, "ultravox-bitrate", utf8("0")); - - int x = p.toInt(); - if (x > 0) - { - m_configData.m_maxBitrate = m_configData.m_avgBitrate = x; - } - - if (m_configData.m_avgBitrate <= 0) - { - throwEx<runtime_error>(m_srcLogString + "Bad avg bitrate specified (" + - tos(m_configData.m_avgBitrate) + ")"); - } - - if (m_configData.m_maxBitrate <= 0) - { - throwEx<runtime_error>(m_srcLogString + "Bad max bitrate specified (" + - tos(m_configData.m_maxBitrate) + ")"); - } - - // for a backup we need to check that the bitrate matches the original source - // as otherwise there will be issues with the transition between the sources! - int bitrate = max(m_configData.m_avgBitrate, m_configData.m_maxBitrate); - if (m_backup && (originalBitrate > 0) && (originalBitrate != bitrate)) - { - ELOG(m_srcLogString + "Backup source rejected. The bitrate " - "does not match the original stream source - detected " + - tos(bitrate / 1000) + " kbps instead of " + - tos(originalBitrate / 1000) + " kbps."); - loadAndSendMsg("NAK:Bit Rate Error", MSG_BROADCAST_SETUP, &protocol_relay_uvox::state_CloseConnection); - return; - } - - // check that these bitrates are allowed (looking at both max and average values) - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int ret = gOptions.isBitrateDisallowed(originalRelayInfo.m_streamID, bitrate, - streamMaxBitrate, streamMinBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - ELOG(m_srcLogString + (!m_backup ? "Relay" : "Backup") + - " source rejected. Only bitrates " + mode + " " + - tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + " kbps are allowed " - "- detected " + tos(bitrate / 1000) + " kbps."); - loadAndSendMsg("NAK:Bit Rate Error", MSG_BROADCAST_SETUP, &protocol_relay_uvox::state_CloseConnection); - return; - } - - - m_configData.m_minimumBufferSize = m_configData.m_desiredBufferSize = 0; - - m_configData.m_icyName = mapGet(httpHeaders,"ultravox-title", (utf8)""); - m_configData.m_icyGenre = mapGet(httpHeaders,"ultravox-genre", utf8("Misc")); - m_configData.m_icyURL = mapGet(httpHeaders,"ultravox-url", (utf8)""); - m_configData.m_icyPub = m_originalRelayInfo.m_allowPublicRelay; - - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_originalRelayInfo.m_streamID); - - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, - m_originalRelayInfo.m_relayUrl.server(), - (!cdn_authhash.empty() ? cdn_authhash : - (found ? stream.m_authHash : "")), "", - m_originalRelayInfo.m_relayUrl.url(), - m_originalRelayInfo.m_backupUrl.url(), - streamData::SHOUTCAST2, - m_originalRelayInfo.m_streamID, - m_originalRelayInfo.m_relayUrl.port(), - m_originalRelayInfo.m_maxStreamUser, - m_originalRelayInfo.m_maxStreamBitrate, - m_originalRelayInfo.m_minStreamBitrate, - m_originalRelayInfo.m_allowPublicRelay, - m_backup, samplerate, vbr, m_configData)); - if (!m_streamData) - { - throwEx<runtime_error>(m_srcLogString + "Could not create " + (!m_backup ? - "relay" : "backup") + " connection."); - } - - // attempt to determine the version of the source based - // on the icy-notice2 line (assuming it is provided etc) - utf8 sourceIdent = mapGet(httpHeaders, "icy-notice2", utf8()); - m_streamData->updateSourceIdent(sourceIdent, true); - sourceIdent = mapGet(httpHeaders, "server", utf8()); - m_streamData->updateSourceIdent(sourceIdent, true); - - DEBUG_LOG(m_srcLogString + "Stream configuration [" + eol() + m_configData.toLogString() + eol() + "]"); - ILOG(m_srcLogString + "Connected to Shoutcast 2 source " + (!m_backup ? "relay" : "backup") + "."); - m_state = &protocol_relay_uvox::state_GetStreamData; -} - -void protocol_relay_uvox::cleanup() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (m_streamData) - { - int killed = m_streamData->isKill(); - if (!m_denied) - { - ILOG(m_srcLogString + "Disconnected from Shoutcast 2 source " + - (!m_backup ? "relay" : "backup") + - (!killed ? "." : " - original source connected.")); - } - - // if this was a kill i.e. when a source re-joins then we need to keep things intact - if (!killed) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_originalRelayInfo.m_streamID); - m_streamData = 0; - bool remove_relay = false; - if (gOptions.stream_relayURL(m_originalRelayInfo.m_streamID).empty() && - gOptions.stream_backupURL(m_originalRelayInfo.m_streamID).empty()) - remove_relay = true; - if (remove_relay) - streamData::removeRelayStatus (m_originalRelayInfo.m_streamID); - } - else - { - m_streamData->setKill(false); - } - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_outData); - forgetArray(m_remainder); -} - -protocol_relay_uvox::~protocol_relay_uvox() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - cleanup(); -} - -void protocol_relay_uvox::timeSlice() throw(exception) -{ - const int killed = (m_streamData ? m_streamData->isKill() : 0); - try - { - if (m_streamData && (m_streamData->isDead() || (!m_backup && killed == 1) || (m_backup && killed == 2))) - { - DLOG(m_srcLogString + "Detected termination of stream", LOGNAME, m_originalRelayInfo.m_streamID); - m_state = &protocol_relay_uvox::state_Fail; - } - (this->*m_state)(); - } - catch (const exception &ex) - { - // on error, we should get ready to retry if applicable - utf8 str = ex.what(); - if (!str.empty()) - { - ELOG(ex.what()); - } - if (m_streamData) - m_streamData->setKill (0); - m_state = &protocol_relay_uvox::state_Fail; - m_result.run(); - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////// Similar to protocol_uvox2Source from here on in /////////////////////////// - -template<typename T> -void protocol_relay_uvox::loadAndSendMsg(const T &msg, int type, state_t nextState) throw() -{ - formMessage(msg, type, m_outData, m_outBufferSize); - bandWidth::updateAmount(bandWidth::RELAY_V2_SENT, m_outBufferSize); - m_outBuffer = m_outData; - m_state = &protocol_relay_uvox::state_SendBuffer; - m_nextState = nextState; -} - -// load outbound message into buffer, and establish state to transition to after send -#define SEND_AND_TRANSITION(msg, vtype, state)\ - loadAndSendMsg(msg, vtype, state);\ - m_result.write();\ - m_result.run();\ - return; - -// get next packet, without acknowledgement -#define NEXT_PACKET\ - m_inBuffer.clear();\ - m_nextState = m_state;\ - m_state = &protocol_relay_uvox::state_GetPacket;\ - m_result.read();\ - m_result.schedule();\ - m_result.timeoutSID(m_originalRelayInfo.m_streamID);\ - return; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void protocol_relay_uvox::state_GetPacket() throw(exception) -{ - time_t cur_time; - - try - { - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_originalRelayInfo.m_streamID, (m_srcLogString + "Timeout waiting for data")); - - while (true) - { - // calculate optimal read size - char buf[BUF_SIZE] = {0}; - int amt = MAX_MESSAGE_SIZE; - int len = (int)m_inBuffer.size(); - - if (!len) - { - amt = UV2X_HDR_SIZE; - } - else if (len >= UV2X_HDR_SIZE) - { - amt = min(MAX_MESSAGE_SIZE, (int)((ntohs(reinterpret_cast<const uv2xHdr*>(&(m_inBuffer[0]))->msgLen) + UV2X_OVERHEAD) - len)); - } - else - { - amt = min(MAX_MESSAGE_SIZE, (UV2X_OVERHEAD - len)); - } - - int rval = 0; - if ((rval = recv (buf, amt, 0x0)) < 1) - { - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule (70); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - WLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_originalRelayInfo.m_streamID); - } - else - ILOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_originalRelayInfo.m_streamID); - throwEx<runtime_error> (""); - } - - m_lastActivityTime = ::time(NULL); - m_inBuffer.insert(m_inBuffer.end(), buf, buf + rval); - - len = (int)m_inBuffer.size(); - if ((len > 1) && (len <= UV2X_HDR_SIZE)) - { - // check for sync byte as we cannot be - // certain of good data coming in from - // the connection and so we check it - int found = -1; - for (int i = 0; i < len - 1; i++) - { - // check for sync byte - if ((buf[i] == UVOX2_SYNC_BYTE) && (buf[i + 1] == 0)) - { - found = i; - break; - } - } - - // track what we've received for the bandwidth stats - bandWidth::updateAmount(bandWidth::RELAY_V2_RECV, len); - - if (found != -1) - { - // we need to re-sync and so need to - // clear the buffer and replace it - // according to the re-sync position - if (found > 0) - { - DEBUG_LOG(m_srcLogString + "Shoutcast 2 source relay re-synced to stream [pos: " + tos(found) + "]."); - - m_inBuffer.clear(); - - // we insert in to the start of the buffer - // what appears to be 'good' sync'd data. - m_inBuffer.insert(m_inBuffer.end(), &buf[found], &buf[found] + rval - found); - } - } - else - { - // and then we clear out the buffer which - // is ok to do since we're trying to find - // the frame (as first or next in stream) - m_inBuffer.clear(); - } - - continue; - } - else if (len > MAX_MESSAGE_SIZE) - { - bandWidth::updateAmount(bandWidth::RELAY_V2_RECV, len); - throwEx<runtime_error>(m_srcLogString + "UVOX packet is too large" - " [got: " + tos(len) + " bytes, max: " + - tos(MAX_MESSAGE_SIZE) + " bytes]"); - } - else if (len > UV2X_HDR_SIZE) - { - if ((int)(ntohs(reinterpret_cast<const uv2xHdr*>(&(m_inBuffer[0]))->msgLen) + UV2X_OVERHEAD) == len) - { - // got it - bandWidth::updateAmount(bandWidth::RELAY_V2_RECV, len); - - m_result.run(); - m_state = m_nextState; - return; - } - } - } - } - catch (exception &e) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector<config::streamConfig> backupInfo = gOptions.getBackupUrl(m_originalRelayInfo.m_streamID); - if (!m_backup && !backupInfo.empty() && !m_denied) - { - m_denied = true; - if (m_streamData) - { - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_originalRelayInfo.m_streamID); - m_streamData = 0; - } - } - throw; - } -} - -void protocol_relay_uvox::state_SendBuffer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (sendDataBuffer(m_originalRelayInfo.m_streamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - } -} - -// normal streaming state -void protocol_relay_uvox::state_GetStreamData() throw(std::exception) -{ - if (!m_inBuffer.empty()) - { - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - if ((voxMsgType >= 0x7000) && (voxMsgType < 0x9000)) - { - // if we have old uvox, then we don't know our mime-type (since old uvox 2 doesn't - // specify it, though 2.1 does). In the case that mime_type is empty, inspect the packet type and - // set it in the stream - if (m_configData.m_mimeType.empty()) - { - switch (voxMsgType) - { - case MP3_DATA: - { - m_configData.m_mimeType = "audio/mpeg"; - break; - } - case AAC_LC_DATA: - case AACP_DATA: - { - m_configData.m_mimeType = "audio/aacp"; - break; - } - case OGG_DATA: - { - m_configData.m_mimeType = "audio/ogg"; - break; - } - } - - if (!m_configData.m_mimeType.empty()) - { - m_streamData->streamSetMimeType(m_configData.m_mimeType); - } - } - - char buf[BUF_SIZE * 4] = {0}; - __uint16 amt = ntohs(voxHdr->msgLen); - - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if ((m_remainderSize > 0) && ((amt + m_remainderSize) <= (BUF_SIZE * 4))) - { - memcpy(buf, m_remainder, m_remainderSize); - } - else - { - m_remainderSize = 0; - } - - memcpy(&buf[m_remainderSize], (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))), amt); - amt += m_remainderSize; - m_remainderSize = 0; - - int br = m_streamData->streamBitrate(); - if (m_streamData->syncToStream (m_remainderSize, m_remainder, amt, br, voxMsgType, buf, m_srcLogString)) - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + (!m_backup ? "Relay" : "Backup") + - " source rejected. Unable to sync to the stream. Please " - "check the source is valid and in a supported format."); - } - } - else if ((voxMsgType >= 0x3000) && (voxMsgType < 0x5000)) - { - DEBUG_LOG(m_srcLogString + "Cacheable metadata received type=0x" + tohex(voxMsgType), LOGNAME, m_originalRelayInfo.m_streamID); - const __uint16 voxPayloadSize = ntohs(voxHdr->msgLen); - if (voxPayloadSize >= UV2X_META_HDR_SIZE) // make sure there's enough data - { - const __uint8 *contents = (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const uv2xMetadataHdr *metaHdr = reinterpret_cast<const uv2xMetadataHdr*>(contents); - const __uint16 metadataID = ntohs(metaHdr->id); - const __uint16 metadataSpan = ntohs(metaHdr->span); - const __uint16 metadataIndex = ntohs(metaHdr->index) - 1; - const __uint8* metadataContents = contents + UV2X_META_HDR_SIZE; - const size_t metadataContentsSize = voxPayloadSize - UV2X_META_HDR_SIZE; - - if ((metadataSpan <= MAX_METADATA_FRAGMENTS) && - (metadataSpan > 0) && - (metadataIndex < MAX_METADATA_FRAGMENTS) && - (metadataIndex < metadataSpan)) - { - assemblyTableIndex_t ati = makeAssemblyTableIndex(voxMsgType, metadataID); - metadataEntry_t &me = m_metadataAssemblyTable[ati]; - - if (metadataSpan != me.m_expectedFragments) // span changed, clear the entire thing - { - __uint16 expectedFragments = me.m_expectedFragments; - me.clear(); - DEBUG_LOG(m_srcLogString + "Cacheable metadata reset due to span change [" + tos(metadataSpan) + "," + tos(expectedFragments) + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - - me.m_expectedFragments = metadataSpan; - if (me.m_fragments[metadataIndex].m_isValid) // duplicate fragment, clear the entire thing - { - me.clear(); - DEBUG_LOG(m_srcLogString + "Cacheable metadata reset due to duplicate fragment", LOGNAME, m_originalRelayInfo.m_streamID); - } - - me.m_fragments[metadataIndex].m_isValid = true; - me.m_fragments[metadataIndex].m_fragment.insert(me.m_fragments[metadataIndex].m_fragment.end(), - metadataContents, metadataContents + metadataContentsSize); - - if ((++me.m_receivedFragments) == me.m_expectedFragments) - { - // assembly, send and clear - vector<__uint8> assembledData; - for (__uint16 x = 0; x < me.m_expectedFragments; ++x) - { - assembledData.insert(assembledData.end(), me.m_fragments[x].m_fragment.begin(), me.m_fragments[x].m_fragment.end()); - } - - // send - m_streamData->addUvoxMetadataAtCurrentPosition(voxMsgType,assembledData); - - if (gOptions.relayUvoxDebug()) - { - if ((voxMsgType >= 0x3000) && (voxMsgType < 0x4000)) - { - ILOG(m_srcLogString + "Got complete metadata message type=0x" + tohex(voxMsgType) + - " [" + tos(assembledData.size()) + " bytes]" + - " id=" + tos(metadataID) + - " span=" + tos(metadataSpan) + - " content=" + eol() + utf8(&(assembledData[0]), assembledData.size()), LOGNAME, m_originalRelayInfo.m_streamID); - } - else - { - ILOG(m_srcLogString + "Got complete metadata message type=0x" + tohex(voxMsgType) + - " [" + tos(assembledData.size()) + " bytes]" + - " id=" + tos(metadataID) + - " span=" + tos(metadataSpan), LOGNAME, m_originalRelayInfo.m_streamID); - } - } - else - { - if ((voxMsgType >= 0x3000) && (voxMsgType < 0x4000)) - { - utf8 currentSong, comingSoon; - std::vector<uniString::utf8> nextSongs; - m_streamData->getStreamNextSongs(m_originalRelayInfo.m_streamID, currentSong, comingSoon, nextSongs); - - if (!currentSong.empty()) - { - if (!comingSoon.empty()) - { - ILOG(m_srcLogString + "Title update [now: \"" + currentSong + "\", next: \"" + comingSoon + "\"]", LOGNAME, m_originalRelayInfo.m_streamID); - } - else - { - ILOG(m_srcLogString + "Title update [" + currentSong + "]", LOGNAME, m_originalRelayInfo.m_streamID); - } - m_streamData->resetAdvertTriggers(currentSong); - } - } - } - - // clear - m_metadataAssemblyTable.erase(ati); - } - } - else - { - ELOG(m_srcLogString + "Badly formed metadata packet type=0x" + tohex(voxMsgType) + " id=" + - tos(metadataID) + " span=" + tos(metadataSpan) + " index=" + tos(metadataIndex + 1), LOGNAME, m_originalRelayInfo.m_streamID); - } - } - else - { - ELOG(m_srcLogString + "Badly formed metadata packet type=0x" + tohex(voxMsgType) + - " content of packet is too small payloadsize=" + tos(voxPayloadSize), LOGNAME, m_originalRelayInfo.m_streamID); - } - } - else if ((voxMsgType >= 0x5000) && (voxMsgType < 0x7000)) - { - // pass thru metadata - DEBUG_LOG(m_srcLogString + "Pass thru metadata"); - m_streamData->writeSc21(m_inBuffer); // like data, but don't write to sc1 buffers - } - else - { - ELOG(m_srcLogString + "Unknown or out of sequence packet " + tos(voxMsgType), LOGNAME, m_originalRelayInfo.m_streamID); - if ((voxMsgType < 0x2000) && (voxMsgType != MSG_FILE_TRANSFER_DATA)) - { - // probably have to NAK it - SEND_AND_TRANSITION("NAK:Unsupported packet type", voxMsgType, &protocol_relay_uvox::state_GetStreamData); - } - } - } - - NEXT_PACKET; -} - -void protocol_relay_uvox::state_Fail() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - if (!m_backup) - { - cleanup(); - threadedRunner::scheduleRunnable(new protocol_relay(m_originalRelayInfo, true)); - } -#ifdef INCLUDE_BACKUP_STREAMS - else - { - threadedRunner::scheduleRunnable(new protocol_backup(m_originalRelayInfo, max(m_configData.m_avgBitrate/1000, - m_configData.m_maxBitrate/1000), m_configData.m_mimeType)); - } -#endif - m_result.done(); -} - -void protocol_relay_uvox::state_CloseConnection() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__, LOGNAME, m_originalRelayInfo.m_streamID); - - m_result.done(); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.h b/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.h deleted file mode 100644 index 50350e0e..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_relay_uvox.h +++ /dev/null @@ -1,108 +0,0 @@ -#pragma once -#ifndef protocol_relay_uvox_H_ -#define protocol_relay_uvox_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include "uvox2Common.h" - -class protocol_relay_uvox: public runnable -{ -private: - const bool m_backup; // used to change log output depending on relay or backup usage - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - - short unsigned int m_remainderSize; - __uint8 * m_remainder; - - const uniString::utf8 m_srcAddrName; - const uniString::utf8 m_srcAddrNumeric; - const uniString::utf8 m_srcURLpart; - const uniString::utf8 m_srcLogString; - - ///////////// for outgoing data ////////////////////////////// - __uint8 * m_outData; - const __uint8 * m_outBuffer; // for outgoing data lines - int m_outBufferSize; - - const config::streamConfig m_originalRelayInfo; - - ///////////// incoming data //////////////////////////////////// - std::vector<__uint8> m_inBuffer; - //////////////////////////////////////////////////////////// - - /////////////////////////////////////////////////////////////////////// - //// data structures for assembling cached metadata - typedef std::vector<__uint8> metadataFragment_t; - struct metadataFragmentEntry_t - { - metadataFragment_t m_fragment; - bool m_isValid; - - void clear() throw() {m_isValid = false; m_fragment.clear(); } - metadataFragmentEntry_t() throw():m_isValid(false){} - }; - - typedef metadataFragmentEntry_t metadataFragmentCollection_t[MAX_METADATA_FRAGMENTS]; - #pragma pack(push, 1) - struct metadataEntry_t - { - __uint16 m_expectedFragments; - __uint16 m_receivedFragments; - metadataFragmentCollection_t m_fragments; - - void clear() throw() - { - for (int x = 0; x < MAX_METADATA_FRAGMENTS; ++x) - { - m_fragments[x].clear(); - } - m_receivedFragments = 0; - } - metadataEntry_t() throw() : m_expectedFragments(0), m_receivedFragments(0) { } - }; - #pragma pack(pop) - - typedef __uint32 assemblyTableIndex_t; - static assemblyTableIndex_t makeAssemblyTableIndex(__uint16 voxMsgType,__uint16 metadataID) throw() - { - return ((((assemblyTableIndex_t)voxMsgType) << 16) | metadataID); - } - - typedef std::map<assemblyTableIndex_t,metadataEntry_t> metadataAssemblyTable_t; - metadataAssemblyTable_t m_metadataAssemblyTable; - ///////////////////////////////////////////////////// - - streamData *m_streamData; - - typedef void (protocol_relay_uvox::*state_t)(); - - void state_GetPacket() throw(std::exception); - void state_SendBuffer() throw(std::exception); - void state_GetStreamData() throw(std::exception); - void state_Fail() throw(std::exception); - void state_CloseConnection() throw(std::exception); - - state_t m_state; - state_t m_nextState; - - streamData::uvoxConfigData_t m_configData; - - void cleanup(); - - template<typename T> void loadAndSendMsg(const T &msg, int type,state_t nextState) throw(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_relay_uvox"; } - -public: - protocol_relay_uvox(const socketOps::tSOCKET s, const config::streamConfig &originalRelayInfo, - const uniString::utf8 &srcAddrName, const uniString::utf8 &srcAddrNumeric, - const int srcPort, const uniString::utf8 &srcURLpart, - const httpHeaderMap_t &httpHeaders, const int originalBitrate = 0, - const uniString::utf8& originalMimeType = "", const bool backup = false) throw(std::runtime_error); - ~protocol_relay_uvox() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.cpp b/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.cpp deleted file mode 100644 index c8621176..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.cpp +++ /dev/null @@ -1,417 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "protocol_shoutcast1Client.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.shoutcast1ClientDebug()) DLOG(__VA_ARGS__); } while (0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while (0) - - -protocol_shoutcast1Client::protocol_shoutcast1Client (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, const uniString::utf8 &XFF) throw (std::exception) - - : protocol_shoutcastClient (hs, streamID, hostName, addr, XFF, streamData::SHOUTCAST1) -{ - setCallback (&protocol_shoutcastClient::state_AttachToStream); -} - -protocol_shoutcast1Client::~protocol_shoutcast1Client() throw() -{ - cleanup("Shoutcast 1", gOptions.shoutcast1ClientDebug()); -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_shoutcast1Client::timeSlice() throw(exception) -{ - int ret = doTimeSlice(); - if (ret == 1) - { - m_state = &protocol_shoutcastClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - -void protocol_shoutcast1Client::setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next) -{ - m_state = callback ? callback : m_nextState; - m_nextState = callback ? next : NULL; -} - - -void protocol_shoutcast1Client::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -// find the appropriate stream and try to attach to it -void protocol_shoutcast1Client::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - int read_bitrate = 0, dataType = 0; - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - m_outBuffer = MSG_ICY_HTTP401.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_V1_SENT, (m_outBufferSize = MSG_ICY_HTTP401_LEN)); - - if (processReject("Shoutcast 1", bandWidth::CLIENT_V1_SENT, MSG_ICY_HTTP401, - MSG_ICY_HTTP401_LEN, &read_bitrate, &dataType)) - { - goto fall_through; - } - - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { -fall_through: - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - const int add = processAdd("Shoutcast 1", bandWidth::CLIENT_V1_SENT, - MSG_ICY_HTTP401, MSG_ICY_HTTP401_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - else - { - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - m_OKResponse = (m_clientType == streamData::WMP ? MSG_ICY200 : MSG_ICY_HTTP200); - if (!isPodcast) - { - utf8 title = (m_streamData ? m_streamData->streamName() : gOptions.stream_backupTitle(m_streamID)); - if (!m_streamData) - { - if (!gOptions.read_stream_backupTitle(m_streamID)) - { - title = gOptions.backupTitle(); - } - - if (title.empty()) - { - title = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - title = gOptions.backupFile(); - } - - if (!title.empty()) - { - title = fileUtil::stripSuffix(fileUtil::stripPath(title)); - } - } - } - - m_OKResponse += "icy-name:" + title + "\r\n" - "icy-genre:"; - if (m_streamData) - { - for (int i = 0; i < 5; i++) - { - if (!m_streamData->m_streamInfo.m_streamGenre[i].empty()) - { - m_OKResponse += (i ? ", " : "") + m_streamData->m_streamInfo.m_streamGenre[i]; - } - } - } - else - { - m_OKResponse += "Misc"; - } - - m_OKResponse += "\r\n" - "icy-br:" + tos((m_streamData ? m_streamData->streamBitrate() : read_bitrate)) + "\r\n" + - "icy-sr:" + tos((m_streamData ? m_streamData->streamSampleRate() : 0)) + "\r\n" + - (m_streamData ? (m_streamData->streamIsVBR() ? "icy-vbr:1\r\n" : "") : ""); - } - - if (m_streamData) - { - m_OKResponse += "icy-url:" + m_streamData->streamURL() + "\r\n"; - - if (isUserAgentRelay(toLower(m_userAgent)) && (!m_streamData->allowPublicRelay())) - { - m_OKResponse += "icy-pub:0\r\n"; - } - else - { - m_OKResponse += "icy-pub:" + tos(m_streamData->streamPublic()) + "\r\n"; - } - - m_OKResponse += "content-type:" + m_streamData->streamContentType() + "\r\n"; - } - else - { - utf8 path = getStreamPath(m_streamID); - if (!path.empty() && path.find(utf8("/")) == 0) - { - path = path.substr(1); - } - - m_OKResponse += "Content-Type:" + utf8(dataType == AACP_DATA ? "audio/aacp" : "audio/mpeg") + "\r\n"; - - if (!isPodcast) - { - //m_OKResponse += "icy-url:" + utf8("TODO") + "\r\n"; - - utf8 pub = toLower(gOptions.stream_publicServer(m_streamID)); - if (pub.empty()) - { - pub = toLower(gOptions.publicServer()); - } - if (pub == "always") - { - m_OKResponse += "icy-pub:1\r\n"; - } - else if (pub == "never") - { - m_OKResponse += "icy-pub:0\r\n"; - } - } - else - { - m_OKResponse += "Content-Disposition:attachment;filename=\"" + path + "\"\r\n" - "Content-Length:" + tos(m_backupFile.size()) + "\r\n"; - } - } - - // ignore setting if we've already determined we shouldn't send in-stream metadata - // otherwise for some clients where we force disable just in-case, if it explicitly - // includes a valid "icy-metadata" header, then see if we should override things... - m_OKResponse += "icy-metaint:" + tos(m_metaInterval) + "\r\n"; - - if (gOptions.clacks()) - { - m_OKResponse += "X-Clacks-Overhead:GNU Terry Pratchett\r\n"; - } - m_OKResponse += "\r\n"; - - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_V1_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_shoutcastClient::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_shoutcastClient::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_shoutcastClient::state_Close; - } - m_result.write(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - if (!m_userAgent.empty() && toLower(m_userAgent).find(utf8("shoutcast-to-dnas message sender")) == 0) - { - utf8::size_type pos = toLower(m_userAgent).find(utf8("[message:")); - if (pos != utf8::npos) - { - utf8 message = m_userAgent.substr(pos + 9); - pos = message.rfind(utf8("]")); - if (pos != utf8::npos) - { - message = message.substr(0, pos); - } - - if ((message.find(utf8("!doctype")) != utf8::npos) || - (message.find(utf8("<script")) != utf8::npos) || - (message.find(utf8("<html")) != utf8::npos) || - (message.find(utf8("<body")) != utf8::npos) || - (message.find(utf8("<div")) != utf8::npos) || - (message.find(utf8("http://")) != utf8::npos) || - (message.find(utf8("https://")) != utf8::npos)) - { - WLOG("[MESSAGE sid=" + tos(m_streamID) + "] Invalid message received."); - } - else - { - WLOG("[MESSAGE sid=" + tos(m_streamID) + "] " + ((message == "<clear>") ? "Message cleared." : message)); - if (m_streamData) - { - m_streamData->updateStreamMessage(m_streamID, message); - } - } - m_ignoreDisconnect = true; - } - } - else - { - // setGroup(500); // for testing - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("Shoutcast 1"); - } - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("Shoutcast 1", bandWidth::CLIENT_V1_SENT, movedUrl, 2); - m_state = &protocol_shoutcastClient::state_SendText; - m_nextState = &protocol_shoutcastClient::state_Close; - } - } -} - -void protocol_shoutcast1Client::state_SendIntro() throw(exception) -{ - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - m_state = &protocol_shoutcastClient::state_Stream; - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntroFile; - } - } -} - -void protocol_shoutcast1Client::state_InitiateStream() throw(exception) -{ - resetReadPtr(); - - // if it's a SHOUTcast Directory test connection then we send just the title (which will - // be a default string if nothing is available) which will still allow the connection to - // work and validate the stream exists whilst only sending the minimum of data nededed. - if (!m_userAgent.empty() && (toLower(m_userAgent) == utf8("shoutcast directory tester"))) - { - // TODO check if artwork needs to also be indicated - const utf8 metadata = fixICYMetadata((m_streamData ? m_streamData->getSc1Metadata(m_readPtr).m_songTitle : "")); - sendICYMetadata((!metadata.empty() ? metadata : "StreamTitle='';")); - m_nextState = &protocol_shoutcastClient::state_Close; - m_ignoreDisconnect = true; - } - else - { - if (!m_streamData || m_introFile.empty()) - { - // send intro file if we have it - acquireIntroFile(); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - m_state = &protocol_shoutcastClient::state_SendIntro; - } - - setW3CState(); - } - - m_result.run(); -} - -// construct the necessary metadata information and load into outbound buffers. -void protocol_shoutcast1Client::sendICYMetadata(const utf8 &md) throw() -{ - m_ICYMetadata.clear(); - m_ICYMetadata.push_back(1); // placeholder - if (md != m_lastSentMetadata) // don't sent duplicates - { - m_ICYMetadata.insert(m_ICYMetadata.end(),md.begin(),md.end()); - if (!m_lastSentMetadata.empty()) - { - logW3C(); - } - m_lastSentMetadata = md; - } - - unsigned int dlen = (unsigned int)m_ICYMetadata.size(); - if (dlen == 1) - { - dlen = 0; - } - unsigned int l1 = ((dlen + 15) & ~15); - m_ICYMetadata[0] = l1 / 16; - unsigned int send_len = l1 + 1; - m_ICYMetadata.insert(m_ICYMetadata.end(), send_len - m_ICYMetadata.size(), 0); - //assert(m_ICYMetadata.size() == (size_t)((m_ICYMetadata[0] * 16) + 1)); - m_metaIntervalCounter = 0; - - m_outBuffer = &m_ICYMetadata[0]; - bandWidth::updateAmount(bandWidth::CLIENT_V1_SENT, (m_outBufferSize = (int)m_ICYMetadata.size())); - m_nextState = m_state; - m_state = &protocol_shoutcastClient::state_SendText; - m_result.run(); -} - - -int protocol_shoutcast1Client::doSend(const bool debug, const time_t cur_time, const int autoDumpTime, int adjust) throw(std::runtime_error) -{ - // we are going to do a forced short-send if we - // are now needing to be trying to send metadata - int size = (int)m_output.size(); - int rval = 0; - - if ((m_metaIntervalCounter + size) > m_metaInterval) - { - adjust = (size - ((m_metaIntervalCounter + size) - m_metaInterval)); - if (adjust) - { - rval = protocol_shoutcastClient::doSend(debug, cur_time, autoDumpTime, adjust); - // DLOG ("Adjusted send ret " + tos(rval) + " for per-meta " + tos(adjust)); - } - - if (rval == adjust) - { - const utf8 metadata = (!m_streamData ? "StreamTitle='';" : - fixICYMetadata((m_streamData ? - m_streamData->getSc1Metadata(m_readPtr).m_songTitle : ""))); - - sendICYMetadata(metadata); - return rval; - } - size = adjust; - } - else - rval = protocol_shoutcastClient::doSend(debug, cur_time, autoDumpTime); - m_metaIntervalCounter += rval; - if (rval < size) - m_result.schedule(120); - - return rval; -} - - -void protocol_shoutcast1Client::return_403(void) -{ - protocol_shoutcastClient::return_403(); - setCallback (&protocol_shoutcastClient::state_SendText, &protocol_shoutcastClient::state_Close); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.h b/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.h deleted file mode 100644 index 970acc7e..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast1Client.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#ifndef protocol_shoutcast1Client_H_ -#define protocol_shoutcast1Client_H_ - -#include "protocol_shoutcastClient.h" -#include <vector> - -class streamData; - -class protocol_shoutcast1Client: public protocol_shoutcastClient -{ -private: - - typedef void (protocol_shoutcast1Client::*state_t)(); - state_t m_state; - state_t m_nextState; - - std::vector<__uint8> m_ICYMetadata; // metadata buffer - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_SendIntro() throw(std::exception); - - void sendICYMetadata(const uniString::utf8 &md) throw(); - - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_shoutcast1Client"; } - -public: - protocol_shoutcast1Client (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr, const uniString::utf8 &XFF) throw(std::exception); - - virtual ~protocol_shoutcast1Client() throw(); - - virtual void setCallback (protocol_shoutcastClient::state_t callback = NULL, protocol_shoutcastClient::state_t next = NULL); - virtual int doSend(const bool debug, const time_t cur_time, const int autoDumpTime, int adjust = 0) throw(std::runtime_error); - - void return_403(void); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.cpp b/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.cpp deleted file mode 100644 index 745f46c9..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.cpp +++ /dev/null @@ -1,568 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "protocol_shoutcast2Client.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "metadata.h" -#include "uvox2Common.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "DST" -#define DEBUG_LOG(...) do { if (gOptions.shoutcast2ClientDebug()) DLOG(__VA_ARGS__); } while(0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while(0) - -protocol_shoutcast2Client::protocol_shoutcast2Client (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &addr,const uniString::utf8 &XFF, const bool cdnSlave) - - : protocol_shoutcastClient (hs, streamID, hostName, addr, XFF, streamData::SHOUTCAST2), m_cdnSlave(cdnSlave) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__, LOGNAME, streamID); - m_state = &protocol_shoutcast2Client::state_AttachToStream; - m_nextState = NULL; -} - -protocol_shoutcast2Client::~protocol_shoutcast2Client() throw() -{ - cleanup("Shoutcast 2", gOptions.shoutcast2ClientDebug(), true); -} - -///////////////////////////////////// W3C Logging ////////////////////////////////////////////// - -// create W3C entry. Entries describe the duration a client has listened to a specific -// title. the entry is generated on a title change, or when the client disconnects -void protocol_shoutcast2Client::logW3C() throw() -{ - if (gOptions.w3cEnable()) - { - vector<utf8::value_type> md; - if (!m_lastMetadata.empty()) - { - // loop through packets and reassemble. Since we put this stuff in there, we don't need to do integrity checks - size_t total_data_size = m_lastMetadata.size(); - for (size_t x = 0; x < total_data_size;) - { - if ((UV2X_OVERHEAD + UV2X_META_HDR_SIZE) > (total_data_size - x)) - { - break; // out of data - } - - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_lastMetadata[x])); - const __uint8 *contents = (const __uint8 *)((&(m_lastMetadata[x])) + UV2X_HDR_SIZE); - const __uint8* metadataContents = contents + UV2X_META_HDR_SIZE; - const size_t metadataContentsSize = ntohs(voxHdr->msgLen) - UV2X_META_HDR_SIZE; - - if ((UV2X_OVERHEAD + UV2X_META_HDR_SIZE + metadataContentsSize) > (total_data_size - x)) - { - break; // out of data - } - - md.insert(md.end(), metadataContents,metadataContents + metadataContentsSize); - x += UV2X_OVERHEAD + UV2X_META_HDR_SIZE + metadataContentsSize; - } - } - - utf8 md_s(md.begin(), md.end()); - - // do a sanity check when trying to form the metadata if a uvox 2 connection - // is attempted from an older Winamp client e.g. 5.54 - means a connection - // can be made from the client without it aborting if there's no metadata. - utf8 title; - if (!md_s.empty()) - { - title = metadata::get_song_title_from_3902(md_s); - } - - doLogW3C(title); - } -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_shoutcast2Client::timeSlice() throw(exception) -{ - int ret = doTimeSlice(true); - if (ret == 1) - { - m_state = &protocol_shoutcastClient::state_Stream; - return; - } - else if (ret == 2) - { - return; - } - - (this->*m_state)(); -} - - -void protocol_shoutcast2Client::setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next) -{ - m_state = callback ? callback : m_nextState; - m_nextState = callback ? next : NULL; -} - - -void protocol_shoutcast2Client::state_Close() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_shoutcast2Client::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - if (sendText()) - { - m_state = m_nextState; - } -} - -// find the appropriate stream and try to attach to it -void protocol_shoutcast2Client::state_AttachToStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - int read_bitrate = 0; - m_streamData = streamData::accessStream(m_streamID); - if (!m_streamData) - { - if (processReject("Shoutcast 2", bandWidth::CLIENT_V2_SENT, MSG_HTTP404, - MSG_HTTP404_LEN, &read_bitrate, 0, true)) - { - goto fall_through; - } - - m_state = &protocol_shoutcast2Client::state_SendText; - m_nextState = &protocol_shoutcast2Client::state_Close; - } - else - { -fall_through: - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - // we use this to control the cdn mode so we'll only provide the - // headers needed if it's all enabled and the client asks for it - string cdn; - if (isCDNMaster(m_streamID) && m_cdnSlave) - { - DEBUG_LOG(m_clientLogString + "CDN slave request received by master", LOGNAME, m_streamID); - utf8 authhash = (m_streamData ? m_streamData->streamAuthhash() : ""); - if (yp2::isValidAuthhash(authhash)) - { - utf8 key = XTEA_encipher(authhash.c_str(), authhash.size(), bob().c_str(), bob().size()); - cdn = "cdn-master:1\r\n" - "cdn-token:" + key.hideAsString() + "\r\n"; - m_clientType = ((streamData::source_t)(m_clientType | streamData::SC_CDN_SLAVE)); - } - else - { - DEBUG_LOG(m_clientLogString + "CDN slave request not sent - invalid authhash provided", LOGNAME, m_streamID); - } - } - - const int add = processAdd("FLV", bandWidth::CLIENT_V2_SENT, - MSG_HTTP404, MSG_HTTP404_LEN, movedUrl, - (m_streamData ? m_streamData->streamBackupServer() : "")); - if (add != 1) - { - m_state = &protocol_shoutcast2Client::state_SendText; - m_nextState = &protocol_shoutcast2Client::state_Close; - } - else - { - utf8 pub = "0", genre = ""; - const bool isPodcast = (!m_streamData && (gOptions.getBackupLoop(m_streamID) == 1)); - if (!isPodcast) - { - pub = (m_streamData ? tos(m_streamData->streamPublic()) : "1"); - if (m_streamData) - { - if (isUserAgentRelay(toLower(m_userAgent)) && (!m_streamData->allowPublicRelay())) - { - pub = "0"; - } - - for (int i = 0; i < 5; i++) - { - if (!m_streamData->m_streamInfo.m_streamGenre[i].empty()) - { - genre += (i ? ", " : "") + m_streamData->m_streamInfo.m_streamGenre[i]; - } - } - } - // if running from a backup file then no need to set the states - else - { - pub = toLower(gOptions.stream_publicServer(m_streamID)); - if (pub.empty()) - { - pub = toLower(gOptions.publicServer()); - } - if (pub == "always") - { - pub = "1"; - } - else if (pub == "never") - { - pub = "0"; - } - } - } - else - { - // TODO how do we handle podcasts for 2.x - // as we should somehow swap to 1.x - } - - utf8 title = (m_streamData ? m_streamData->streamName() : gOptions.stream_backupTitle(m_streamID)); - if (!m_streamData) - { - if (!gOptions.read_stream_backupTitle(m_streamID)) - { - title = gOptions.backupTitle(); - } - - if (title.empty()) - { - title = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - title = gOptions.backupFile(); - } - - if (!title.empty()) - { - title = fileUtil::stripSuffix(fileUtil::stripPath(title)); - } - } - } - - m_OKResponse = MSG_UVOX_HTTP200 + - "icy-pub:" + pub + "\r\n" + cdn + - "Ultravox-SID:" + tos(m_streamID) + "\r\n" + - "Ultravox-Bitrate:" + tos(m_streamData ? m_streamData->streamAvgBitrate() : (read_bitrate * 1000)) + "\r\n" + - "Ultravox-Samplerate:" + tos(m_streamData ? m_streamData->streamSampleRate() : 0) + "\r\n" + - "Ultravox-Title:" + title + "\r\n" + - "Ultravox-Genre:" + genre + "\r\n" + - "Ultravox-URL:" + (m_streamData ? m_streamData->streamURL() : (utf8)""/*"TODO"*/) + "\r\n" + - "Ultravox-Max-Msg:" + tos(MAX_PAYLOAD_SIZE) + "\r\n" + - "Ultravox-Class-Type:" + tohex(m_streamData ? m_streamData->streamUvoxDataType() : MP3_DATA) + "\r\n" + - (m_streamData && m_streamData->streamIsVBR() ? "Ultravox-VBR:1\r\n" : "") + - (gOptions.clacks() ? "X-Clacks-Overhead:GNU Terry Pratchett\r\n\r\n" : "\r\n"); - - DEBUG_LOG(m_clientLogString + "Sending [" + eol() + stripWhitespace(m_OKResponse) + eol() + "]"); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(bandWidth::CLIENT_V2_SENT, (m_outBufferSize = (int)m_OKResponse.size())); - m_state = &protocol_shoutcast2Client::state_SendText; - if (!m_headRequest) - { - m_nextState = &protocol_shoutcast2Client::state_InitiateStream; - } - else - { - m_removeClientFromStats = false; - m_ignoreDisconnect = true; - m_nextState = &protocol_shoutcast2Client::state_Close; - } - m_result.write(); - m_result.timeoutSID(m_streamID); - m_result.run(); - - // when the client is added, we get back the unique id of the connection - // but we now check for being > 0 as we need to filter out some of the - // YP connections from being counted as valid clients for stats, etc - reportNewListener("Shoutcast 2"); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected("Shoutcast 2", bandWidth::CLIENT_V2_SENT, movedUrl, 2); - m_state = &protocol_shoutcast2Client::state_SendText; - m_nextState = &protocol_shoutcast2Client::state_Close; - } - } -} - -void protocol_shoutcast2Client::state_SendCachedMetadata() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - if (sendDataBuffer(m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - bool playingAlbumArt = false; - - // send intro file if we have it - acquireIntroFile(true); - - // see if there's any albumart and attempt to send stream and then playing or whatever is present - m_cachedMetadata = (m_streamData ? m_streamData->getSc21StreamAlbumArt(0xFFFFFFFF) : streamData::uvoxMetadata_t()); - if (m_cachedMetadata.empty()) - { - m_cachedMetadata = m_streamData->getSc21PlayingAlbumArt(m_readPtr); - playingAlbumArt = true; - } - - if (m_cachedMetadata.empty()) - { - // send intro file if we have it - acquireIntroFile(true); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - bandWidth::updateAmount(bandWidth::CLIENT_V2_SENT, (m_outBufferSize = (int)m_cachedMetadata.size())); - m_outBuffer = (uniString::utf8::value_type*)&(m_cachedMetadata[0]); // slam cast so we can reuse variable - m_state = (playingAlbumArt == false ? &protocol_shoutcast2Client::state_SendCachedStreamAlbumArt : &protocol_shoutcast2Client::state_SendCachedPlayingAlbumArt); - } - } -} - -void protocol_shoutcast2Client::state_InitiateStream() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__); - - resetReadPtr(true); - - m_cachedMetadata = (m_streamData ? m_streamData->getSc21Metadata(m_readPtr) : streamData::uvoxMetadata_t()); - - if (m_cachedMetadata.empty()) - { - // send intro file if we have it - acquireIntroFile(true); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntro); - } - else - { - bandWidth::updateAmount(bandWidth::CLIENT_V2_SENT, (m_outBufferSize = (int)m_cachedMetadata.size())); - m_outBuffer = (uniString::utf8::value_type*)&(m_cachedMetadata[0]); // slam cast so we can reuse variable - m_state = &protocol_shoutcast2Client::state_SendCachedMetadata; - } - - m_result.run(); -} - -void protocol_shoutcast2Client::state_SendCachedStreamAlbumArt() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__ + "sending stream albumart: " + tos(m_outBufferSize) + - " bytes, mime type: " + tos(m_streamData->streamAlbumArtMime())); - - if (sendDataBuffer(m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - // if all went ok then look to send the playing album art if it is present otherwise do intro / stream data - m_cachedMetadata = m_streamData->getSc21PlayingAlbumArt(m_readPtr); - - if (m_cachedMetadata.empty()) - { - // send intro file if we have it - acquireIntroFile(true); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } - else - { - bandWidth::updateAmount(bandWidth::CLIENT_V2_SENT, (m_outBufferSize = (int)m_cachedMetadata.size())); - m_outBuffer = (uniString::utf8::value_type*)&(m_cachedMetadata[0]); // slam cast so we can reuse variable - m_state = &protocol_shoutcast2Client::state_SendCachedPlayingAlbumArt; - } - } -} - -void protocol_shoutcast2Client::state_SendCachedPlayingAlbumArt() throw(exception) -{ - DEBUG_LOG(m_clientLogString + __FUNCTION__ + "sending playing albumart: " + tos(m_outBufferSize) + - " bytes, mime type: " + tos(m_streamData->streamPlayingAlbumArtMime())); - - if (sendDataBuffer(m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - // send intro file if we have it - acquireIntroFile(true); - m_state = (m_introFile.empty() ? &protocol_shoutcastClient::state_Stream : &protocol_shoutcastClient::state_SendIntroFile); - } -} - - -void protocol_shoutcast2Client::return_403(void) -{ - protocol_shoutcastClient::return_403(); - m_state = &protocol_shoutcast2Client::state_SendText; - m_nextState = &protocol_shoutcast2Client::state_Close; -} - - -const int protocol_shoutcast2Client::doFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& inbuf, - const time_t /*cur_time */, const int, const unsigned int, - int &frames, bool &advert, - bool fill_remainder) throw() -{ - bool mp3; - int end = 0; - - if (streamData::isAllowedType(type, mp3)) - { - int last = min (len, (int)(inbuf.size() - offset)); - const unsigned char *buf; - - if (m_remainder.empty () || offset < last) - { - buf = &inbuf [offset]; - // DLOG ("last " + tos(last) + ", off " + tos(offset)); - } - else - { - const std::vector<__uint8>::const_iterator pos = inbuf.begin(); - size_t cc = min (inbuf.size(), (size_t)len); - - cc = min (cc, (size_t)4096); - if (cc > m_remainder.size()) - cc -= m_remainder.size(); - if (cc < 1 || cc > inbuf.size()) - { - ILOG ("sync2, cc is " + tos (cc)); - abort(); - } - m_remainder.insert (m_remainder.end(), inbuf.begin(), inbuf.begin() + cc); - - buf = &m_remainder [0]; - last = min (len, (int)m_remainder.size()); - fill_remainder = false; - // DLOG ("merged remainder, now " + tos (last) + ", added " + tos(cc)); - } - if (last > 8) - { - int last_size = 0; - //double fps_limit = m_fps*2; - - fill_remainder = false; - - for (int i = 0; (i < last-8) && !iskilled();) - { - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(buf[i])); - const int msgLen = ntohs(voxHdr->msgLen); - const int found = ((voxHdr->sync == UVOX2_SYNC_BYTE) && - (msgLen > UV2X_OVERHEAD) && - (msgLen <= MAX_PAYLOAD_SIZE) ? (msgLen + UV2X_OVERHEAD) : 0); - - // need to find frames and that the input is the correct format! - // - // is a bit of a pain for AAC though as we've already done the - // rough bitrate match when the advert / intro / backup was read - // we'll just pass things through as though the bitrate is ok... - if ((found > 0)) // && (found <= len)) - { - if (!frames) - { - end = i; - protocol_shoutcastClient::createFrameRate(mp3, (m_streamData ? m_streamData->streamSampleRate() : 0)); - } - - i += (last_size = found); - // only count valid full-size frames - if (i <= last) - { - //const std::vector<__uint8>::const_iterator pos = inbuf.begin(); - - m_output.insert(m_output.end(), buf+end, buf+end+last_size); - end += last_size; - - // we only want to count audio frames and not metadata - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - if ((voxMsgType >= 0x7000) && (voxMsgType < 0x9000)) - { - ++frames; - } - // DLOG ("frame " + tos(m_frameCount+frames) + " (" + tos(found) + ") last " + tos(last) + " end " + tos(end) + " i " + tos(i)); - } - else - { - // DLOG ("EOB, " + tos (i) + ", " + tos(offset) + ", " + tos(inbuf.size())); - if (m_remainder.empty()) - { - if (i+offset > inbuf.size()) - fill_remainder = true; - } - else if (end + offset < inbuf.size()) - fill_remainder = true; - break; - } - } - else - { - // we now look for the "SCAdvert" marker - // for detecting if we've got an advert. - if (i < (len - 8) && ((buf[i]) == 'S') && ((buf[i+1]) == 'C')) - { - if (!memcmp(&buf[i], "SCAdvert", 8)) - { - if (frames == 0) - { - // DLOG ("Found SCAdvert"); - advert = true; - end += 8; - m_remainder.clear(); - } - break; - } - } - else - { - // if we found something but there is not enough - // data in the read buffer then we'll abort asap - if ((found > 0) && (found > len)) - { - break; - } - - if (m_frameCount && debug) - { - DLOG(m_clientLogString + "Bad frame found at pos: " + - tos(i) + " [" + tos(found) + "]", LOGNAME, m_streamID); - } - } - // otherwise we just need to move on and keep - // looking for what is a valid starting frame - ++i; - } - } - } - else - fill_remainder = true; - if (m_remainder.empty() == false && frames) - m_remainder.clear(); - if (fill_remainder) - { - const int remainder = (last - end); - if (remainder > 0) - m_remainder.insert(m_remainder.end(), buf + end, buf + (end + remainder)); - } - } - return (len - end); -} - - -void protocol_shoutcast2Client::setIntro (vector<__uint8> &buf, int uvoxDataType) -{ - m_introFile.clear(); - if (buf.empty()) - return; - streamData::convertRawToUvox (m_introFile, buf, uvoxDataType, 0, 0); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.h b/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.h deleted file mode 100644 index ec89e127..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcast2Client.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once -#ifndef protocol_shoutcast2Client_H_ -#define protocol_shoutcast2Client_H_ - -#include "protocol_shoutcastClient.h" -#include <vector> - -class streamData; - -class protocol_shoutcast2Client: public protocol_shoutcastClient -{ -private: - typedef void (protocol_shoutcast2Client::*state_t)(); - state_t m_state; - state_t m_nextState; - - /// w3c logging - streamData::uvoxMetadata_t m_lastMetadata; // used for w3C tracking - ///////////////////// - - streamData::uvoxMetadata_t m_cachedMetadata; // cached metadata that must be sent at connect time - - const bool m_cdnSlave; // based on the connection header - - void state_AttachToStream() throw(std::exception); - void state_Close() throw(std::exception); - void state_SendText() throw(std::exception); - void state_InitiateStream() throw(std::exception); - void state_SendCachedMetadata() throw(std::exception); - void state_SendCachedStreamAlbumArt() throw(std::exception); - void state_SendCachedPlayingAlbumArt() throw(std::exception); - - void logW3C() throw(); - const int doFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& buf, - const time_t cur_time, const int bitrate, - const unsigned int samplerate, int &frames, - bool &advert, const bool fill_remainder = false) throw(); - - virtual void timeSlice() throw(std::exception); - virtual void setCallback (protocol_shoutcastClient::state_t callback, protocol_shoutcastClient::state_t next); - virtual uniString::utf8 name() const throw() { return "protocol_shoutcast2Client"; } - -public: - protocol_shoutcast2Client (protocol_HTTPStyle &hs, const streamData::streamID_t streamID,const uniString::utf8 &hostName, const uniString::utf8 &addr,const uniString::utf8 &XFF, const bool cdnSlave); - virtual ~protocol_shoutcast2Client() throw(); - - virtual void setIntro(vector<__uint8> &v, int uvoxDataType); - - void return_403(void); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.cpp b/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.cpp deleted file mode 100644 index 97b0427c..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.cpp +++ /dev/null @@ -1,1917 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#ifndef MSG_DONTWAIT -#define MSG_DONTWAIT 0 -#endif -#endif -#include <stdio.h> -#include "protocol_shoutcastClient.h" -#include "ripList.h" -#include "stats.h" -#include "streamData.h" -#include "w3cLog.h" -#include "global.h" -#include "bandwidth.h" -#include "metrics.h" -#include "auth.h" -#include "yp2.h" -#include "FLV.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "DST" -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while(0) - -protocol_shoutcastClient::protocol_shoutcastClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, - const uniString::utf8 &hostName, const uniString::utf8 &clientAddr, const uniString::utf8 &XFF, const streamData::source_t clientType) - - : runnable (hs), m_streamID(streamID <= 0 || streamID > INT_MAX ? DEFAULT_CLIENT_STREAM_ID : streamID), - m_unique(stats::getNewClientId()), m_adAccess(clientType == streamData::SHOUTCAST2) -{ - m_newListener = m_timerStart = (time_t)0; - m_timerFrames = m_frameLimit = m_frameCount = 0; - m_fps = 0.0; - m_bytesSentForCurrentTitle = m_totalBytesSent = 0; - m_metaIntervalCounter = m_backupLoopTries = m_outBufferSize = 0; - m_backupFileOffset = m_introFileOffset = 0; - m_readPtr = 0; - m_outBuffer = NULL; - m_streamData = NULL; - m_kickNextRound = m_ignoreDisconnect = false; - m_lagOffset = 0; - setGroup (m_unique); - - m_headRequest = (hs.m_httpRequestInfo.m_request == protocol_HTTPStyle::HTTP_HEAD); - m_clientType = streamData::getClientType (clientType, stringUtil::toLower (hs.m_userAgent)); // double toLower work ?? - m_removeClientFromStats = (isUserAgentOfficial (stringUtil::toLower (hs.m_userAgent)) == false); - - if (gOptions.useXFF() && !XFF.empty() && metrics::metrics_verifyDestIP (gOptions, true, XFF).empty() == false) - m_clientAddr = XFF; - else - m_clientAddr = clientAddr; - m_clientLogString = dstAddrLogString (hostName, hs.m_clientPort, XFF, streamID); - - m_clientHostName = hostName; - - m_metaInterval = gOptions.getMetaInterval (streamID); - m_userAgent = hs.m_userAgent; - m_referer = hs.m_referer; - m_XFF = XFF; - m_startTime = m_lastTitleTime = ::time(NULL); -} - - -// setup tracking variables for W3C log -void protocol_shoutcastClient::setW3CState() throw() -{ - m_lastTitleTime = ::time(NULL); - m_bytesSentForCurrentTitle = 0; -} - -int protocol_shoutcastClient::detectAutoDumpTimeout (time_t &cur_time, const size_t streamID, const uniString::utf8 &msg) throw(runtime_error) -{ - const int autoDumpTime = gOptions.getAutoDumpTime(streamID); - cur_time = ::time(NULL); - if ((autoDumpTime > 0) && ((cur_time - m_lastActivityTime) >= autoDumpTime)) - { - if (m_ignoreDisconnect == false) - DLOG (msg, LOGNAME, streamID); - throwEx<runtime_error>(""); - } - return autoDumpTime; -} - -////////////////////////////////////////////////////////////////////////////// - -void protocol_shoutcastClient::acquireIntroFile(const bool sc2) throw() -{ - // if we've already loaded something then we won't keep - // trying to re-acquire it for speed and consistency - // whilst this specific client is connected at the time - if (m_streamData && m_introFile.empty()) - { - if (!sc2) - { - m_streamData->getIntroFile().getSc1Data(m_introFile); - } - else - { - m_streamData->getIntroFile().getSc2Data(m_introFile); - } - } - - m_introFileOffset = 0; -} - -int protocol_shoutcastClient::acquireBackupFile(int *dataType, const bool sc2) throw() -{ - int read_bitrate = 0; - // if we've already loaded something then we won't keep - // trying to re-acquire it for speed and consistency - // whilst this specific client is connected at the time - if (m_backupFile.empty()) - { - if (m_streamData) - { - if (!sc2) - { - m_streamData->getBackupFile().getSc1Data(m_backupFile); - } - else - { - m_streamData->getBackupFile().getSc2Data(m_backupFile); - } - - m_streamData->streamSampleRate(); - } - else - { - // for when there is no stream, we'll manually load the - // file and try to do what we can to get it running... - utf8 backupFile = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - backupFile = gOptions.backupFile(); - } - - if (!backupFile.empty()) - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - int streamBitrate = gOptions.stream_maxBitrate(m_streamID); - if (!gOptions.read_stream_maxBitrate(m_streamID) || !streamBitrate) - { - streamBitrate = gOptions.maxBitrate(); - } - if (streamBitrate) - { - streamBitrate /= 1000; - } - - unsigned int read_samplerate = 0; - const int type = ((toLower(backupFile).rfind(utf8(".aac")) == (backupFile.size() - 4)) ? AACP_DATA : MP3_DATA); - streamData::specialFileData loadBackupFile((backuploop == 1 ? "podcast" : "backup")); - read_bitrate = loadBackupFile.loadFromFile(backupFile, streamBitrate, type, read_samplerate, m_clientLogString); - if (!sc2) - { - loadBackupFile.getSc1Data(m_backupFile); - } - else - { - loadBackupFile.getSc2Data(m_backupFile); - } - if (dataType) - { - *dataType = type; - createFrameRate ((type==MP3_DATA), loadBackupFile.m_samplerate); - } - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFile.clear(); - } - } - } - } - - m_backupFileOffset = 0; - - return read_bitrate; -} - -const int protocol_shoutcastClient::doTimeSlice(const bool sc2) throw(exception) -{ - int listenerTime = (int)gOptions.stream_listenerTime(m_streamID); - if (!gOptions.read_stream_listenerTime(m_streamID)) - { - listenerTime = (int)gOptions.listenerTime(); - } - - listenerTime *= 60; // convert to seconds - const bool timesUp = listenerTime && ((::time(NULL) - m_startTime) > listenerTime); - if (m_kickNextRound || timesUp || (m_streamData && m_streamData->isDead() && m_backupFile.empty())) - { - if (timesUp) - { - ILOG(m_clientLogString + "Listener time exceeded.", LOGNAME, m_streamID); - } - else if (m_kickNextRound) - { - ILOG(m_clientLogString + "Kicked [Agent: `" + m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()) + "]", LOGNAME, m_streamID); - } - else - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - // we're done with the backup file. get more data - acquireBackupFile(0, sc2); - if (!m_backupFile.empty()) - { - ++m_backupLoopTries; - m_lastActivityTime = ::time(NULL); - return 1; - } - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFileOffset = 0; - m_backupFile.clear(); - } - } - - m_result.done(); - return 2; - } - - return 0; -} - -const bool protocol_shoutcastClient::sendText() throw(exception) -{ - return sendDataBuffer(m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString); -} - -void protocol_shoutcastClient::resetCommon() throw() -{ - if (m_newListener == 0) - { - time_t now = ::time (NULL); - if (m_removeClientFromStats && m_streamData && m_streamData->streamPublic()) - { - if (m_startTime + 3 < now) - { - metrics::metrics_listener_new(*this); - m_streamData->advertGroups.attachGroupQueue (this->m_adAccess); - m_newListener = now; - } - } - else - m_newListener = now; - } - if (m_streamData) - m_adAccess.changedGroup (m_streamData->advertGroups); -} - -// set read pointer to a nice distance from the write pointer. Return that distance -const streamData::ringBufferAccess_t protocol_shoutcastClient::resetReadPtr(std::vector<__uint8>& data, const bool sc2) throw() -{ -#if defined(_DEBUG) || defined(DEBUG) - DLOG(m_clientLogString + __FUNCTION__); -#endif - - // we also reset the remainder handling as - // by this point, it's unlikely that it's - // worth trying to keep up and so we reset - m_remainder.clear(); - - m_lagOffset = 0; - if (m_streamData) - { - m_readPtr = m_streamData->getClientStartPosition(sc2); - streamData::ringBufferAccess_t amt = 0; - return m_streamData->getStreamData(amt, m_readPtr, data, 0, sc2); - } - else - { - m_readPtr = 0; - return 0; - } -} - -void protocol_shoutcastClient::resetReadPtr(const bool sc2) throw() -{ -#if defined(_DEBUG) || defined(DEBUG) - DLOG(m_clientLogString + __FUNCTION__); -#endif - - // we also reset the remainder handling as - // by this point, it's unlikely that it's - // worth trying to keep up and so we reset - m_remainder.clear(); - - if (m_streamData == NULL) - { - m_readPtr = 0; - return; - } - m_lagOffset = 0; - if (m_adAccess.inAdvertMode ()) - { - const streamData::adTrigger *t = m_adAccess.getCurrentTrigger(); - streamData::ringBufferAccess_t ptr; - - if (t) - ptr = sc2 ? t->m_returnPtrSC2 : t->m_returnPtrSC1; - else - { - ptr = sc2 ? m_streamData->advertGroups.m_returnPtrSC2 : m_streamData->advertGroups.m_returnPtrSC1; - if (!ptr) - ptr = (sc2 ? m_streamData->m_sc21_packet_starts : m_streamData->m_sc1_packet_starts).back(); - } - streamData::ringBufferAccess_t lag = ((sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_writePtr - m_readPtr); - - if (lag < (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_data.size()) - m_lagOffset = (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_writePtr - m_readPtr; - else - { - ptr = (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_writePtr; - m_lagOffset = 0; - } - - m_readPtr = m_streamData->getClientStartPosition (ptr, sc2); - // DLOG ("lag offset is " + tos (m_lagOffset) + " readptr " + tos (m_readPtr)); - } - else if (m_totalBytesSent > 30000) - { - std::deque<streamData::ringBufferAccess_t> &starts = (sc2 ? m_streamData->m_sc21_packet_starts : m_streamData->m_sc1_packet_starts); - if (starts.size()) - m_readPtr = m_streamData->getClientStartPosition (starts.back(), sc2); - else - m_readPtr = 0; - } - else - m_readPtr = m_streamData->getClientStartPosition(sc2); -} - - -void protocol_shoutcastClient::resetReadPtr (streamData::ringBufferAccess_t ptr, bool sc2) throw() -{ - m_readPtr = (m_streamData ? m_streamData->getClientStartPosition (ptr, sc2) : 0); - m_lagOffset = 0; -} - - -const __uint64 protocol_shoutcastClient::calculateFrameLimit(const time_t cur_time) -{ - // to allow for a burst on joining the stream for listener pre-buffering - // and stuff, we're trying to give an ~5sec of data before we rate limit - // without such handling then a number of listeners stutter at the start - if (gOptions.rateLimit()) - { - time_t conn; - - if (m_timerStart) - { - conn = (cur_time ? cur_time : ::time(NULL)) - m_timerStart; - float fps = conn > 0 ? ((m_timerFrames) / (float)conn) : 0; - //DLOG ("ad rate values are " + tos (conn) + " TF " + tos((long)m_timerFrames)); - if (fps > m_fps) - { - //DLOG ("rate in calc is " + tos (fps)); - return 0; // cause a stall - } - } - } - // just to make sure something is returned then we'll - // take the current number of frames and adjust by the - // intended rate. much better than returning zero rate - return (__uint64)(m_frameCount + m_fps); -} - -void protocol_shoutcastClient::updateFrameCount(const int frames, const time_t) -{ - if (m_timerStart) - m_timerFrames += frames; - m_frameCount += frames; -} - -const bool protocol_shoutcastClient::calculateDelay(const int autoDumpTime) -{ - bool delayed = false; - const double diff = ((m_frameCount * 1.0) / (max((time_t)1, (m_lastActivityTime - m_startTime))) - m_fps); - if (diff >= 0.0) - { - // if we're at the limit then we're going to need to sit and spin - // which will need to be a bit short of the required frame rate - // so that we've got a bit of leeway on scheduling delays, etc - // determine things based on the 'next' second when working out - // the differential as that's how long we want to wait to run - m_result.schedule((int)(m_result.m_currentTime - (__uint64)(m_lastActivityTime * 1000))); - delayed = true; - } - - m_result.write(); - if (autoDumpTime != -1) - { - m_result.timeout(autoDumpTime); - } - else - { - m_result.timeoutSID(m_streamID); - } - return delayed; -} - - -int protocol_shoutcastClient::doSend(const bool debug, const time_t cur_time, - const int autoDumpTime, int adjust) throw(runtime_error) -{ - int l = (adjust ? adjust : (int)m_output.size()), rval = -1; - if (l == 0) return 0; - if (l > 0) - { - if (!gOptions.forceShortSends()) - { - rval = send ((const char*)&m_output[0], l, 0); - } - else - { - static unsigned int v = 0; - if (((++v) % 7) == 0) - { - char ch = 0; - rval = ::recv(m_socket, &ch, 1, MSG_DONTWAIT | MSG_PEEK); - l = 1; - } - else - { - rval = send ((const char*)&m_output[0], l, 0); - } - } - } - if (rval > 0) - { - m_totalBytesSent += rval; - if (rval < l) - m_result.timeout (0,100); - else - m_result.timeout (0,10); - return rval; - } - - if (rval == 0) - { - if (!m_ignoreDisconnect && debug) - ELOG (m_clientLogString + "Remote socket closed while sending data.", LOGNAME, m_streamID); - throwEx<runtime_error>(""); - } - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - if (debug && ( -#ifdef _WIN32 - (rval == WSAECONNABORTED) || (rval == WSAECONNRESET) -#else - (rval == ECONNABORTED) || (rval == ECONNRESET) || (rval == EPIPE) -#endif - )) - DLOG (m_clientLogString + "Socket error while waiting to send data. " + socketErrString(rval), LOGNAME, m_streamID); - throwEx<runtime_error>(""); - } - - m_result.schedule(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - - rval = 0; - } - return rval; -} - -void protocol_shoutcastClient::checkListenerIsValid(const bool debug) throw(std::runtime_error) -{ - char ch = 0; - int rval = ::recv(m_socket, &ch, 1, MSG_DONTWAIT | MSG_PEEK); - if (rval == 0) - { - throwEx<runtime_error>((!m_ignoreDisconnect && debug ? (m_clientLogString + - "Remote socket closed while sending data.") : (utf8)"")); - } - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - throwEx<runtime_error>((debug ? ((( - #ifdef _WIN32 - (rval == WSAECONNABORTED) || (rval == WSAECONNRESET) - #else - (rval == ECONNABORTED) || (rval == ECONNRESET) || (rval == EPIPE) - #endif - ) ? (utf8)"" : m_clientLogString + - "Socket error while waiting to send data. " + - socketErrString(rval))) : (utf8)"")); - } - } -} - -const utf8 protocol_shoutcastClient::getContainer() const -{ - return ((m_clientType & streamData::FLV) ? "video/x-flv" : - ((m_clientType & streamData::M4A) ? "audio/mp4" : - ((m_clientType & streamData::SHOUTCAST2) ? "misc/ultravox" : ""))); -} - -void protocol_shoutcastClient::authForStream(streamData *_sd) -{ - streamData *sd = (_sd ? _sd : streamData::accessStream(m_streamID)); - if (sd) - { - if (!sd->radionomyID().empty() && sd->streamAdvertMode()) - { - httpHeaderMap_t vars; - auth::auth_info *info = new auth::auth_info(); - const streamData::streamInfo &stream = sd->getInfo(); - - vars["action"] = "listener_add"; - vars["tstamp"] = tos(::time(NULL)); - vars["host"] = sd->streamPublicIP(); - vars["radionomyid"] = vars["ref"] = sd->radionomyID(); - vars["id"] = tos(m_unique); - vars["ip"] = m_clientAddr; - vars["srvid"] = stream.m_serverID; - if (m_queryParams.empty()) - vars["mount"] = getStreamPath (m_streamID); - else - vars["mount"] = getStreamPath (m_streamID) + "?" + m_queryParams; - - vars["agent"] = m_userAgent; - vars["referer"] = m_referer; - vars["bitrate"] = tos(sd->streamBitrate()); - vars["codec"] = sd->streamContentType(); - vars["contr"] = getContainer(); - info->m_dataType = sd->streamUvoxDataType(); - if (!_sd) - { - sd->releaseStream(); - } - - info->post = encodeVariables(vars); - info->client = this; - info->sid = m_streamID; - - if (_sd) - { - info->delayed_auth = true; - info->group = 0; - } - auth::schedule(info); - return; - } - - if (!_sd) - { - sd->releaseStream(); - } - } - - if (!_sd) - { - // if we need to auth after the listener - // joined the stream due to DNAS / stream - // start-up then we don't want to re-add - threadedRunner::scheduleRunnable(this); - } -} - -void protocol_shoutcastClient::return_403() -{ - m_outBuffer = (const utf8::value_type*)"HTTP/1.1 403 Forbidden\r\n" - "Connection:close\r\n\r\n"; - m_outBufferSize = 44; - m_lastActivityTime = ::time(NULL); -} - -// create W3C entry. Entries describe the duration a client has listened to a specific title. -// the entry is generated on a title change, or when the client disconnects -void protocol_shoutcastClient::doLogW3C(const utf8 &title) throw() -{ - if (gOptions.w3cEnable()) - { - time_t durationOfTitle = (::time(NULL) - m_lastTitleTime); - w3cLog::log(m_streamID, m_clientAddr, m_clientHostName, title, - m_userAgent, m_bytesSentForCurrentTitle, durationOfTitle, - (int)(durationOfTitle ? (8 * m_bytesSentForCurrentTitle) / durationOfTitle : 0)); - - setW3CState(); - } -} - -#if 0 -const bool protocol_shoutcastClient::handleNoData(const utf8 &logString, const int remainder, - const streamData::ringBufferAccess_t amt, - const int autoDumpTime, const time_t cur_time, - const bool sc2) -{ - // nothing in the source - // if the source has gone away, and we have a backup file, send it. - bool sendBackupFile = false, ret = false; - if (!streamData::isSourceConnected(m_streamID)) - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - acquireBackupFile(0, sc2); - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFile.clear(); - } - sendBackupFile = !m_backupFile.empty(); - - if (sendBackupFile && backuploop && (m_backupLoopTries > backuploop)) - { - // clear trying to play the backup - sendBackupFile = false; - m_backupFile.clear(); - } - } - else - { - // if we're here then we'll have tried to do something - // but are very likely are not able to due to being at - // the frame rate limit or we're not able to send yet - // but we need to move the readPtr on if anything was - // read was well as then making sure that we maintain - // the remainder otherwise we can gltich on playback. - if (amt > 0) - { - m_readPtr += amt; - } - - if (!remainder) - { - m_remainder.clear(); - } - - // if we're starting and we're not able to correctly - // sync to the stream then this will abort otherwise - // we can potentially sit and spin which isn't good. - if (!m_frameCount && (remainder > 0) && (remainder == (int)amt)) - { - m_ignoreDisconnect = true; - ELOG(m_clientLogString + logString + " client connection closed. Unable to sync to the stream (" + - tos(::time(NULL) - m_startTime).c_str() + " seconds)" + " Agent: `" + m_userAgent + "', UID: " + - tos(m_unique) + ", GRID: " + tos(getGroup()) + " [amt=" + tos(amt) + ", rem=" + tos(remainder) + "]"); - m_result.done(); // state_Close - m_result.write(); - m_result.timeout(autoDumpTime); - } - } - - if (sendBackupFile) - { - // we also reset the remainder handling as - // there is no need to send the remainder. - m_remainder.clear(); - // this is to clear up things with the stream - // as we can otherwise be in a weird state if - // the source then later returns and we have - // a listener still present via backup mode. - if (m_streamData) - { - m_streamData->releaseStream(); - m_streamData = 0; - } - ++m_backupLoopTries; - ret = true; // state_SendBackupFile - m_result.run(); - } - else - { - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - m_result.read(m_limitTrigger.test()); - if (m_streamData) - { - m_streamData->scheduleLimitTrigger(&m_limitTrigger, m_readPtr, sc2); - } - else - { - m_result.done(); // state_Close - m_result.write(); - m_result.timeout(autoDumpTime); - } - } - - return ret; -} -#endif - -void protocol_shoutcastClient::createFrameRate(const bool mp3, const int samplerate) -{ - // now we have some stream data we can create - // a fps for this which we'll assume standard - // rates if not all of the info is available. - // this is mainly for AAC where we assume a - // 44.1kHz samplerate (~43.06 fps) as default - if (!m_fps) - { - m_fps = (mp3 ? 1000.0 / 26 : ((1.0 / (1024.0 / (samplerate > 0 ? samplerate : 44100))))); - } -} - -void protocol_shoutcastClient::setupWorkingBuffer(const std::vector<__uint8>& data, std::vector<__uint8>& tempBuf, int& len) throw() -{ - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if (!m_remainder.empty() && ((len + m_remainder.size()) <= (BUF_SIZE * 4))) - { - tempBuf = m_remainder; - tempBuf.insert(tempBuf.end(), data.begin(), data.end()); - len += (int)m_remainder.size(); - } - else if (len > 0) - { - tempBuf = data; - } - m_remainder.clear(); -} - -#if 0 -const int protocol_shoutcastClient::doUvoxFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& buf, - const time_t cur_time, int &frames, bool &advert, - const bool fill_remainder) throw() -{ - bool mp3; - if (streamData::isAllowedType(type, mp3)) - { - if (!m_shortSend.empty()) - { - m_output.insert(m_output.end(), m_shortSend.begin(), m_shortSend.end()); - m_shortSend.clear(); - - if (!fill_remainder) - { - // for intro / backup / advert then it's - // better to just send what was left and - // then look at processing new when this - // is empty else it'll duplicate output. - return 0; - } - } - - int end = 0; - if ((len > 8) && !buf.empty()) - { - int last_size = 0; - for (int i = 0; (i < (len - 8)) && !iskilled();) - { - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(buf[i + offset])); - const int msgLen = ntohs(voxHdr->msgLen); - const int found = ((voxHdr->sync == UVOX2_SYNC_BYTE) && - (msgLen > UV2X_OVERHEAD) && - (msgLen <= MAX_PAYLOAD_SIZE) ? (msgLen + UV2X_OVERHEAD) : 0); - - // need to find frames and that the input is the correct format! - // - // is a bit of a pain for AAC though as we've already done the - // rough bitrate match when the advert / intro / backup was read - // we'll just pass things through as though the bitrate is ok... - if ((found > 0) && (found <= len)) - { - if (!frames) - { - end = (i + offset); - protocol_shoutcastClient::createFrameRate(mp3, (m_streamData ? m_streamData->streamSampleRate() : 0)); - } - - i += (last_size = found); - - // only count valid full-size frames - if (i <= len) - { - if (advert) - { - // skip over the advert trigger - end += 8; - } - - const std::vector<__uint8>::const_iterator pos = buf.begin(); - m_output.insert(m_output.end(), pos + end, pos + (end + last_size)); - end += last_size; - - // we only want to count audio frames and not metadata - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - if ((voxMsgType >= 0x7000) && (voxMsgType < 0x9000)) - { - ++frames; - } - - // we use this to help clamp to the desired frame - // rate as well as not sending anything else asap - if (advert || (gOptions.rateLimit() ? (frames > m_fps) || - ((m_frameCount + frames) > calculateFrameLimit(cur_time)) : 0)) - { - break; - } - } - } - else - { - // we now look for the "SCAdvert" marker - // for detecting if we've got an advert. - if ((i <= len + 8) && ((buf[i + offset]) == 'S') && ((buf[i + offset + 1]) == 'C')) - { - if (!memcmp(&buf[i + offset], "SCAdvert", 8)) - { - advert = true; - i += 8; - } - else - { - ++i; - } - } - else - { - // if we found something but there is not enough - // data in the read buffer then we'll abort asap - if ((found > 0) && (found > len)) - { - break; - } - - if (m_frameCount && debug) - { - DLOG(m_clientLogString + "Bad frame found at pos: " + - tos(i) + " [" + tos(found) + "]"); - } - - // otherwise we just need to move on and keep - // looking for what is a valid starting frame - ++i; - } - } - } - } - - if (fill_remainder && !buf.empty()) - { - const int remainder = (len - end); - if (remainder > 0) - { - const std::vector<__uint8>::const_iterator pos = buf.begin(); - m_remainder.insert(m_remainder.end(), pos + end, pos + (end + remainder)); - } - return remainder; - } - } - return 0; -} -#endif - - -const int protocol_shoutcastClient::doFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& inbuf, - const time_t /*cur_time*/, const int bitrate, - const unsigned int samplerate, int &frames, - bool &advert, bool fill_remainder) throw() -{ - bool mp3; - int end = 0; - bool VBR = m_streamData ? m_streamData->streamIsVBR() : false; - - if (streamData::isAllowedType(type, mp3)) - { - int last = min (len, (int)(inbuf.size() - offset)); - const unsigned char *buf; - - if (m_remainder.empty () || offset < last) - { - buf = &inbuf [offset]; - //DLOG ("last " + tos(last) + ", off " + tos(offset)); - } - else - { - // const std::vector<__uint8>::const_iterator pos = inbuf.begin(); - size_t cc = min (inbuf.size(), (size_t)len); - - cc = min (cc, (size_t)4096); - if (cc > m_remainder.size()) - cc -= m_remainder.size(); - if (cc < 1 || cc > inbuf.size()) - { - ILOG ("sync, cc is " + tos(cc)); - abort(); - } - m_remainder.insert (m_remainder.end(), inbuf.begin(), inbuf.begin() + cc); - - buf = &m_remainder [0]; - last = min (len, (int)m_remainder.size()); - fill_remainder = false; - // DLOG ("merged remainder, len " + tos(len) + " now " + tos (last) + ", added " + tos(cc)); - } - - if (last > 8) - { - int last_size = 0; - bool report_frame_settings = m_streamData ? true : false; - - fill_remainder = false; - - for (int i = 0; (i < last-8) && !iskilled();) - { - unsigned int read_samplerate = 0; - int read_bitrate = bitrate; - //const char* f = (const char *)&(buf[(i + offset)]); - const int found = (mp3 ? getMP3FrameInfo ((char*)buf+i, &read_samplerate, &read_bitrate) : - getADTSFrameInfo ((char*)buf+i, &read_samplerate)); - - if (found > len) // do we need more - break; - if (found > 0) - { - bool bitrate_odd = (VBR || (read_bitrate == 0 || read_bitrate == bitrate)) ? false : true; - bool srate_odd = (samplerate == 0 || samplerate == read_samplerate) ? false : true; - - // need to find frames and that the input is the correct format! - // - // is a bit of a pain for AAC though as we've already done the - // rough bitrate match when the advert / intro / backup was read - // we'll just pass things through as though the bitrate is ok... - if (report_frame_settings && (bitrate_odd || srate_odd)) - { - utf8 msg = m_clientLogString + "Frame settings changed, could cause playback problems:"; - if (bitrate_odd) - { - msg += " bitrate " + tos(read_bitrate) + "(" + tos(bitrate) + ")"; - m_streamData->m_streamInfo.m_streamBitrate = read_bitrate; - } - if (srate_odd) - { - msg += " samplerate " + tos(read_samplerate) + "(" + tos(samplerate) + ")"; - } - WLOG (msg, LOGNAME, m_streamID); - protocol_shoutcastClient::createFrameRate(mp3, read_samplerate); - report_frame_settings = false; - } - if (!frames) - { - end = i; - protocol_shoutcastClient::createFrameRate(mp3, read_samplerate); - } - - i += (last_size = found); - - // only count valid full-size frames - if (i <= last) - { - processFrame (type, buf + end, last_size); - ++frames; - end += last_size; - if (m_output.size() > SEND_SIZE) - break; - } - else - { - // DLOG ("EOB, " + tos (i) + ", " + tos(offset) + ", " + tos(inbuf.size())); - if (m_remainder.empty()) - { - if (i+offset > inbuf.size()) - fill_remainder = true; - } - else if (end + offset < inbuf.size()) - fill_remainder = true; - break; - } - continue; - } - // we now look for the "SCAdvert" marker - // for detecting if we've got an advert. - if (i < (len - 8) && ((buf[i]) == 'S') && ((buf[i+1]) == 'C')) - { - if (!memcmp(&buf[i], "SCAdvert", 8)) - { - if (frames == 0) - { - // DLOG ("Found SCAdvert"); - advert = true; - end += 8; - m_remainder.clear(); - } - break; - } - } - if (m_frameCount && debug) - { - DLOG(m_clientLogString + "Bad frame found at pos: " + - tos(i) + " [" + tos(found) + "], " + - tos(read_bitrate) + "(" + tos(bitrate) + "), " + - tos(read_samplerate) + "(" + tos(samplerate) + ")", LOGNAME, m_streamID); - } - // looking for what is a valid starting frame - ++i; - } - } - else - fill_remainder = true; - - if (m_remainder.empty() == false) - { - if (last < m_remainder.size()) - fill_remainder = false; - if (frames) - m_remainder.clear(); - } - if (last < (inbuf.size() - offset)) - fill_remainder = false; - - if (fill_remainder) - { - const int remainder = (last - end); - if (remainder > 0) - m_remainder.insert(m_remainder.end(), buf + end, buf + (end + remainder)); - } - } - return (len - end); -} - - -void protocol_shoutcastClient::processFrame (int, const unsigned char *buf, unsigned int len) -{ - //#define USE_CHUNKED -#ifdef USE_CHUNKED - const utf8 chunked_start (tohex(len) + "\r\n"), chunked_end("\r\n"); - m_output->insert (m_output->end(), chunked_start.begin(), chunked_start.end()); -#endif - //const std::vector<__uint8>::const_iterator pos = buf.begin(); - m_output.insert (m_output.end(), buf, buf + len); -#ifdef USE_CHUNKED - m_output.insert (m_output.end(), chunked_end.begin(), chunked_end.end()); -#endif -} - - -const int protocol_shoutcastClient::addClient() -{ - size_t stream_id = (gOptions.read_stream_ripFile(m_streamID) && !gOptions.stream_ripFile(m_streamID).empty()) ? m_streamID : 0; - - return stats::addClient (m_streamID, m_clientHostName, m_clientAddr, m_userAgent, - g_ripList.find (m_clientAddr, stream_id), m_unique, this); -} - - -void protocol_shoutcastClient::reportNewListener(const utf8 &logString) -{ - if (!logString.empty() && gOptions.logClients()) - { - if (m_removeClientFromStats) - { - // setGroup (500); - // ILOG(m_clientLogString + logString + " client connection accepted. User-Agent: `" + - // m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()), LOGNAME, m_streamID); - utf8 s = m_clientLogString + logString + " client connection accepted. User-Agent: `" + - m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()); - ILOG (s, LOGNAME, m_streamID); - } - else - { - m_ignoreDisconnect = true; - } - } -} - -void protocol_shoutcastClient::reportStopListener() -{ - if (m_removeClientFromStats && m_streamData && m_streamData->streamPublic()) - { - metrics::metrics_listener_drop(*this); - } -} - -const bool protocol_shoutcastClient::processAdvertTrigger(const bool advert) -{ - if (advert && m_streamData) - { - // check if we've got an advert trigger and if the stream is either - // public or it is private but the DNAS is running in any CDN mode. - if ((m_streamData->m_streamInfo.m_streamPublic || - (!gOptions.cdn().empty())) && - // if a CDN slave then we're ok to send the stream but we don't - // want to be sending the adverts to it as those should instead - // be actioned on the slave's ->listener handling and not here. - !isCDNSlave(m_streamID)) - { - // DLOG ("in trigger with g " + tos(m_group)); - if ((getGroup() > 0) || m_streamData->m_adTest) - { - if (m_adAccess.haveAdverts(m_streamID, m_streamData->advertGroups, m_readPtr)) - { - time_t now = ::time(NULL); - ILOG(m_clientLogString + "Transitioning to advert(s) [Agent: `" + - m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()) + "]", LOGNAME, m_streamID); - m_lastActivityTime = now; - stats::updateTriggers(m_streamID, m_unique); - m_adAccess.total_processed = 0; - m_adAccess.start_time = now; - m_remainder.clear(); - m_result.schedule(60); - m_result.timeoutSID(m_streamID); - return true; - } - else - { - AD_DEBUG_LOG("[ADVERT sid=" + tos(m_streamID) + "] Advert trigger detected - no advert(s) available " - "[Agent: `" + m_userAgent + "', UID: " + tos(m_unique) + ", Group: " + tos(getGroup()) + "]", LOGNAME, m_streamID); - } - } - } - } - return false; -} - -const utf8 protocol_shoutcastClient::fixICYMetadata(utf8 metadata) -{ - // we use this to provide a nicer title to clients when the advert update occurs - // for detected relays, we will skip over the filtering so it will be relayed on - if (!metadata.empty() && !(((streamData::source_t)(m_clientType & streamData::RELAY))) && - !metadata.find(utf8("StreamTitle='Advert:")) && !metadata.find(utf8("StreamTitle='Advert!"))) - { - // got a first matching block - metadata = metadata.replace(13, 7, (utf8)""); - - // look for an end block - utf8::size_type pos = metadata.find(utf8("Advert:")); - if (pos != utf8::npos) - { - metadata = metadata.replace(pos, 7, (utf8)""); - } - metadata = stripWhitespace(metadata); - } - return metadata; -} - -// create W3C entry. Entries describe the duration a client has listened to a specific title. -// the entry is generated on a title change, or when the client disconnects -void protocol_shoutcastClient::logW3C() throw() -{ - utf8 title; - if (!m_lastSentMetadata.empty()) - { - utf8::size_type p1 = m_lastSentMetadata.find(utf8("itle='")); - if (p1 != utf8::npos) - { - p1 += 6; - utf8::size_type p2 = m_lastSentMetadata.find(utf8("';"),p1); - if (p2 != utf8::npos) - { - title = m_lastSentMetadata.substr(p1, p2 - p1); - } - } - } - doLogW3C(title); -} - -void protocol_shoutcastClient::processTitleW3C() throw() -{ - if (gOptions.w3cEnable()) // put inside this if block, because this can slow us down a bit - { - if (m_metaIntervalCounter >= m_metaInterval) - { - m_metaIntervalCounter = 0; - const utf8 metadata = fixICYMetadata((m_streamData ? m_streamData->getSc1Metadata(m_readPtr).m_songTitle : "")); - if (m_lastSentMetadata != metadata) - { - logW3C(); - m_lastSentMetadata = metadata; - } - } - } -} - -void protocol_shoutcastClient::streamMovedOrRejected(const utf8 &logString, const bandWidth::usageType_t type, - const utf8 &serverUrl, const int mode) throw() -{ - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - if (!mode) - { - m_outBuffer = MSG_HTTP503; - bandWidth::updateAmount(type, (m_outBufferSize = MSG_HTTP503_LEN)); - } - else - { - const utf8::size_type check = (!serverUrl.empty() ? serverUrl.find(utf8("://")) : 0); - if (check == utf8::npos) - { - m_OKResponse = http302("http://" + serverUrl); - } - else - { - m_OKResponse = http302(serverUrl); - } - - m_OKResponse = http302(serverUrl); - m_outBuffer = m_OKResponse.c_str(); - bandWidth::updateAmount(type, (m_outBufferSize = (int)m_OKResponse.size())); - } - m_ignoreDisconnect = true; - - if (gOptions.logClients()) - { - switch (mode) - { - case 0: - { - ELOG(m_clientLogString + logString + " client connection " - "rejected. Max users reached. Agent: `" + m_userAgent + "'", LOGNAME, m_streamID); - break; - } - case 1: - { - WLOG(m_clientLogString + logString + " client connection rejected. Max users " - "reached. Redirecting to " + serverUrl + ". Agent: `" + m_userAgent + "'", LOGNAME, m_streamID); - break; - } - case 2: - { - WLOG(m_clientLogString + logString + " client connection rejected. Stream has " - "moved. Redirecting to " + serverUrl + ". Agent: `" + m_userAgent + "'", LOGNAME, m_streamID); - break; - } - } - } - - m_result.run(); - m_result.write(); - m_result.timeoutSID(m_streamID); -} - -void protocol_shoutcastClient::cleanup(const utf8 &logString, const bool debug, const bool , const bool altLog) throw(exception) -{ - if (debug) - { - DLOG(m_clientLogString + logString + " " + __FUNCTION__, LOGNAME, m_streamID); - } - - try - { - if (gOptions.logClients() && !m_ignoreDisconnect) - { - ILOG(m_clientLogString + logString + " client connection closed (" + - tos(::time(NULL) - m_startTime).c_str() + " seconds)" + " [Bytes: " + - tos(m_totalBytesSent).c_str() + "] Agent: `" + m_userAgent + - "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()), LOGNAME, m_streamID); - } - - if (m_removeClientFromStats) - { - stats::removeClient(m_streamID, m_unique); - // create W3C entry. Entries describe the duration a client has listened to a specific title. - // the entry is generated on a title change, or when the client disconnects - if (!altLog) - { - logW3C(); - } - else - { - doLogW3C(); - } - } - - if (m_streamData) - { - releaseAdvert(); - m_streamData->advertGroups.detachGroupQueue (m_adAccess); - - reportStopListener(); - - m_streamData->releaseStream(); - m_streamData = 0; - } - } - catch(const exception &ex) - { - ELOG(ex.what()); - } -} - -const int protocol_shoutcastClient::processAdd(const utf8 &logString, const bandWidth::usageType_t type, - const utf8 &msg, const int msgLen, const utf8 &movedUrl, - const utf8 &serverUrl) throw() -{ - // if we've got a HEAD request then we need to just force things through - const int add = (!m_headRequest ? addClient() : 1); - if (add != 1) - { - if (!add) - { - utf8 backup_server = (m_streamData ? m_streamData->streamBackupServer() : ""); - if (backup_server.empty()) - { - streamMovedOrRejected(logString, type, movedUrl, 0); - } - else - { - streamMovedOrRejected(logString, type, serverUrl, 1); - } - } - else - { - m_outBuffer = msg.c_str(); - bandWidth::updateAmount(type, (m_outBufferSize = msgLen)); - - m_result.write(); - m_result.timeoutSID(m_streamID); - m_ignoreDisconnect = true; - - if (gOptions.logClients()) - { - const bool missing = (add == -1); - ELOG(m_clientLogString + logString + " client connection rejected. " - "Client connection " + (missing ? "missing a" : "from a banned") + - " user-agent" + (missing ? "." : ": `" + m_userAgent + "'"), LOGNAME, m_streamID); - } - } - } - return add; -} - -const bool protocol_shoutcastClient::processReject(const utf8 &logString, const bandWidth::usageType_t type, - const utf8 &msg, const int msgLen, int *read_bitrate, - int *dataType, const bool sc2) throw() -{ - m_outBuffer = msg.c_str(); - bandWidth::updateAmount(type, (m_outBufferSize = msgLen)); - - m_result.write(); - m_result.timeoutSID(m_streamID); - m_ignoreDisconnect = true; - if (gOptions.logClients()) - { - // to prevent some of the stats / logs getting skewed - // then we filter out the SHOUTcast site 'test' users - if (m_removeClientFromStats) - { - const utf8 movedUrl = gOptions.stream_movedUrl(m_streamID); - if (movedUrl.empty()) - { - *read_bitrate = acquireBackupFile(dataType, sc2); - if (!m_backupFile.empty()) - { - m_ignoreDisconnect = false; - return true;//goto fall_through; - } - else - { - ELOG(m_clientLogString + logString + " client connection rejected. " + - (!iskilled() ? "Stream not available as there is no source connected" : - "Server is shutting down") + ". Agent: `" + m_userAgent + "'", LOGNAME, m_streamID); - } - } - else - { - // if we get to here then we attempt to redirect the clients to the moved url - // which is useful if the stream has moved hosting or it has been deprecated. - streamMovedOrRejected(logString, type, movedUrl, 2); - } - } - } - return false; -} - - -void protocol_shoutcastClient::state_SendIntroFile() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - // DLOG(m_clientLogString + __FUNCTION__); -#endif - bool sc2 = (m_clientType & streamData::SHOUTCAST2) ? true : false; - - resetCommon(); - - time_t cur_time; - const bool debug = gOptions.HTTPClientDebug(); - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_streamID, (m_clientLogString + "Timeout waiting to send data")); - - if (m_timerStart == 0) - { - m_timerStart = cur_time - 10; // prime the rate regulation - m_timerFrames = (__uint64)m_fps * 10; - time_t conn = ::time(NULL) - m_startTime; - if (conn >= 0 && conn < 3) - m_timerStart -= (3 - conn); - } - if (m_frameCount > calculateFrameLimit(cur_time)) - { - m_result.schedule(150); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - //DLOG ("Limited at " + tos(m_frameCount)); - - return; - } - int amt = (int)(m_introFile.size() - m_introFileOffset); - if (amt == 0) - { - // we're done with the intro file - m_introFile.clear(); - m_introFile.resize(0); - m_introFileOffset = 0; - m_lastActivityTime = ::time(NULL); - setCallback (&protocol_shoutcastClient::state_Stream); - resetReadPtr (sc2); - m_result.run(); - } - else if (amt > 0) - { - checkListenerIsValid(debug); - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - bool advert = false; - if (m_output.size() < 2000) - { - int rval = doFrameSync(m_streamData->streamUvoxDataType(), debug, - len, m_introFileOffset, m_introFile, - cur_time, m_streamData->streamBitrate(), - m_streamData->streamSampleRate(), frames, advert); - m_introFileOffset += (len - rval); - //DLOG ("offset now " + tos (m_introFileOffset)); - updateFrameCount(frames, cur_time); - } - - int rval = doSend(debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_HTTP_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_lastActivityTime = ::time(NULL); - if (rval < m_output.size()) - { - //DLOG ("short send " + tos(rval) + "/" + tos(m_output.size())); - m_output.erase (m_output.begin(), m_output.begin() + rval); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - m_result.write(); - return; - } - m_output.clear(); - } - m_result.schedule(20); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - } -} - - -void protocol_shoutcastClient::state_SendIntro() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - // AD_DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - state_SendIntroFile(); - if (m_introFile.empty()) - { - acquireIntroFile(); - if (m_introFile.empty()) - { - setCallback (&protocol_shoutcastClient::state_Stream); - } - else - { - setCallback (&protocol_shoutcastClient::state_SendIntroFile); - } - } -} - - -void protocol_shoutcastClient::state_Stream() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - //DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - resetCommon(); - - const time_t cur_time = ::time(NULL); - const bool debug = gOptions.shoutcast1ClientDebug(); - const int autoDumpTime = gOptions.getAutoDumpTime(m_streamID); // don't want this value to change during this call - int remain = autoDumpTime - (int)(cur_time - m_lastActivityTime); - - if ((autoDumpTime > 0) && ((cur_time - m_lastActivityTime) >= autoDumpTime)) - { - throwEx<runtime_error>((!m_ignoreDisconnect && debug ? - (m_clientLogString + "Timeout waiting to send data (" + - tos(cur_time) + " " + tos(m_lastActivityTime) + " [" + - tos(cur_time - m_lastActivityTime) + "] )") : (utf8)"")); - } - - bool advert = false; - bool sc2 = (m_clientType & streamData::SHOUTCAST2) ? true : false; - AOL_namespace::rwLock &lock = (sc2 ? m_streamData->m_sc21StreamLock : m_streamData->m_sc1StreamLock); - - do - { - int samplerate = (m_streamData ? m_streamData->streamSampleRate() : 0); - int bitrate = (m_streamData ? m_streamData->streamBitrate() : 0); - int type = (m_streamData ? m_streamData->streamUvoxDataType() : MP3_DATA); - - m_result.timeout (remain); - if (streamData::isSourceConnected (m_streamID) == false) - { - acquireBackupFile (0, sc2); - //DLOG ("listener detected source drop, backup " + utf8(m_backupFile.size() ? "present" : "not present")); - if (m_backupFile.size()) - { - setCallback (&protocol_shoutcastClient::state_SendBackupFile); - m_timerStart = 0; - m_backupLoopTries = 1; - m_result.run(); - return; - } - if (m_streamData == NULL) - { - m_result.schedule (300); - return; - } - } - - stackRWLock sl (lock, false, false); - if (sl.tryRdLock() == false) - { - m_result.schedule (3); - return; - } - int frames = 0; - - if (m_output.size() < 2000) - { - streamData::ringBufferAccess_t lag = ((sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_writePtr - m_readPtr); - - if (lag == 0) - { - if (m_frameCount > calculateFrameLimit(cur_time)) - { - m_result.schedule(333); - } - else - { - m_result.schedule(150); - } - return; - } - - const streamData::ringBufferAccess_t offset = (m_readPtr & (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_ptrMask); - - if (lag > (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_data.size()) - break; // off the queue, lagging too much - - lag -= m_lagOffset; - - size_t remainder = doFrameSync (type, debug, (int)lag, (int)offset, - (sc2 ? m_streamData->m_sc21_ring_buffer : m_streamData->m_sc1_ring_buffer).m_data, - cur_time, bitrate, samplerate, frames, advert, true); - - m_readPtr += (lag-remainder); - updateFrameCount (frames, cur_time); - } - // processTitleW3C(); needs looking into - - // lets jump out if there isn't much to send except in cases where an advert, as we need to - // process the transistion - if (m_output.size() < 1000 && (frames || advert == false)) - { - //DLOG ("not enough to send really"); - m_result.schedule(150); - return; - } - int rval = doSend (debug, cur_time, autoDumpTime); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_V1_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_lastActivityTime = ::time(NULL); - - if (rval < m_output.size()) - { - // DLOG ("short send " + tos(rval) + "/" + tos(m_output.size())); - m_output.erase (m_output.begin(), m_output.begin() + rval); - // if we short send and don't need to transition to advert then jump out - if (advert == false) - { - m_result.schedule(80); // back off on sending too much - return; - } - } - else - m_output.clear(); - } - if (processAdvertTrigger(advert)) - { - // DLOG ("advert detected by listener"); - setCallback (&protocol_shoutcastClient::state_SendAdverts); - m_result.schedule(200); - } - else - m_result.schedule(10); - return; - } while (0); - - m_result.schedule(); - resetReadPtr (sc2); -} - - - -// handle state where we are sending backup files -void protocol_shoutcastClient::state_SendBackupFile() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - // DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - bool sc2 = (m_clientType & streamData::SHOUTCAST2) ? true : false; - - resetCommon(); - - int amt = (int)(m_backupFile.size() - m_backupFileOffset); - - if (amt == 0) - { - const int backuploop = gOptions.getBackupLoop(m_streamID); - if (!backuploop || (m_backupLoopTries <= backuploop)) - { - // we're done with the backup file. get more data - acquireBackupFile (0, sc2); - if (m_backupFile.empty()) - { - ++m_backupLoopTries; - resetReadPtr (sc2); - m_lastActivityTime = ::time(NULL); - setCallback (&protocol_shoutcastClient::state_Stream); - return; - } - } - else if (backuploop && (m_backupLoopTries < backuploop)) - { - m_backupFileOffset = 0; - m_backupFile.clear(); - } - else - { - resetReadPtr (sc2); - m_backupFileOffset = 0; - m_lastActivityTime = ::time(NULL); - setCallback (&protocol_shoutcastClient::state_Stream); - } - m_result.run(); - } - else if (amt > 0) - { - const bool debug = gOptions.HTTPClientDebug(); - checkListenerIsValid(debug); - - time_t cur_time = ::time(NULL); - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_streamID, (m_clientLogString + "Timeout waiting to send data")); - - if (m_timerStart == 0) - { - int adj = m_frameCount < 50 ? 3 : 10; - m_timerStart = cur_time - 10; // prime the rate regulation, make it on the slow side to rejoin queue - m_timerFrames = (__uint64)m_fps * adj; - } - if (m_frameCount > calculateFrameLimit(cur_time)) - { - m_result.schedule (333); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - int len = (int)amt, backup_type = MP3_DATA, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - if (!m_streamData) - { - utf8 backupFile = gOptions.stream_backupFile(m_streamID); - if (!gOptions.read_stream_backupFile(m_streamID)) - { - backupFile = gOptions.backupFile(); - } - if (!backupFile.empty()) - { - backup_type = ((backupFile.rfind((utf8)".aac") == utf8::npos) ? MP3_DATA : AACP_DATA); - } - } - - bool advert = false; - if (m_output.size() < 4096) - { - int rval = doFrameSync((m_streamData ? m_streamData->streamUvoxDataType() : backup_type), - debug, len, m_backupFileOffset, m_backupFile, cur_time, - (m_streamData ? m_streamData->streamBitrate() : 0), - (m_streamData ? m_streamData->streamSampleRate() : 0), frames, advert); - m_backupFileOffset += (len - rval); - updateFrameCount (frames, cur_time); - } - int rval = doSend(debug, cur_time, autoDumpTime); - - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_HTTP_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_lastActivityTime = cur_time; - if (rval < m_output.size()) - { - // DLOG ("short send " + tos(rval) + "/" + tos(m_output.size())); - m_output.erase (m_output.begin(), m_output.begin() + rval); - return; - } - m_output.clear(); - // look at moving now that a complete frame is sent - if (streamData::isSourceConnected (m_streamID)) - { - if (m_streamData) - { - m_streamData->releaseStream(); - } - m_streamData = streamData::accessStream(m_streamID); - - if (m_streamData->m_sc1_packet_starts.size() == 0) - { - m_result.schedule (100); // no data from stream, so ignore for now. - return; - } - - // we're done with the backup file - m_backupFile.clear(); - m_backupFile.resize(0); - m_backupFileOffset = 0; - m_backupLoopTries = 0; - setCallback (&protocol_shoutcastClient::state_Stream); - resetReadPtr (sc2); - m_result.run(); - return; - } - m_result.schedule ((rval/512) + 15); - } - else - m_result.schedule(90); - } -} - - - -// handle state where we are sending advert content -void protocol_shoutcastClient::state_SendAdverts() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - //AD_DEBUG_LOG(m_clientLogString + __FUNCTION__); -#endif - - resetCommon(); - - streamData::specialFileData *ad = m_adAccess.getAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - bool sc2 = (m_clientType & streamData::SHOUTCAST2) ? true : false; - - while (true) - { - if (ad) - { - std::vector<__uint8> &adBuffer = (sc2 ? ad->m_sc2Buffer : ad->m_sc1Buffer); - int amt = (ad ? (int)(adBuffer.size() - m_adAccess.offset) : 0); - - if (amt > 0) - break; - } - if (m_adAccess.anotherAd(m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest)) - { - ad = m_adAccess.getAd (m_streamID, m_streamData->advertGroups, !!m_streamData->m_adTest); - continue; - } - // no more adverts - m_lastActivityTime = ::time(NULL); - if (m_timerStart) - { - // add a small retry here to allow for queue priming after adverts - m_result.schedule (300); - m_result.timeoutSID(m_streamID); - m_timerStart = 0; - //DLOG ("kicking back to retry before transition"); - return; - } - setCallback (&protocol_shoutcastClient::state_Stream); - resetReadPtr (sc2); // this should do a search for a nearest matching frame - releaseAdvert(); - m_result.schedule (); - m_result.timeoutSID(m_streamID); - - ILOG(m_clientLogString + "Transitioning back to stream [Agent: `" + - m_userAgent + "', UID: " + tos(m_unique) + ", GRID: " + tos(getGroup()) + "]", LOGNAME, m_streamID); - return; - } - - try - { - std::vector<__uint8> &adBuffer = (sc2 ? ad->m_sc2Buffer : ad->m_sc1Buffer); - int amt = (ad ? (int)(adBuffer.size() - m_adAccess.offset) : 0); - const bool debug = gOptions.HTTPClientDebug(); - checkListenerIsValid(debug); - - time_t cur_time; - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_streamID, (m_clientLogString + "Timeout waiting to send data")); - - if (m_timerStart == 0) - { - m_timerStart = cur_time - 8; // prime the rate regulation, make it on the slow side to rejoin queue - m_timerFrames = (__uint64)m_fps * 8; - } - if (m_frameCount > calculateFrameLimit(cur_time)) - { - m_result.schedule(333); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - // DLOG ("throttle in send adverts, count " + tos(m_frameCount)); - return; - } - - if (!m_lastSentMetadata.empty()) - { - logW3C(); - m_lastSentMetadata.clear(); - } - - amt = min(amt, SEND_SIZE); - - int len = (int)amt, - frames = 0; // this will be uvox frames as we pre-process earlier to ensure - // that the audio frames are frame-synced when this is created - bool advert = false; - if (m_output.size() < 4096) - { - int rval = doFrameSync (m_streamData->streamUvoxDataType(), debug, len, - (int)m_adAccess.offset, adBuffer, - cur_time, m_streamData->streamBitrate(), - m_streamData->streamSampleRate(), frames, advert); - int processed = len - rval; - m_adAccess.offset += processed; - m_adAccess.total_processed += processed; - updateFrameCount (frames, cur_time); - } - int rval = doSend(debug, cur_time, autoDumpTime); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - if (rval > 0) - { - bandWidth::updateAmount(bandWidth::CLIENT_HTTP_SENT, rval); - m_bytesSentForCurrentTitle += rval; - m_lastActivityTime = ::time(NULL); - if (rval < m_output.size()) - { - // DLOG ("short send " + tos(rval) + "/" + tos(m_output.size())); - m_output.erase (m_output.begin(), m_output.begin() + rval); - return; - } - m_output.clear(); - } - m_result.write(); - } - catch (std::runtime_error &) - { - releaseAdvert(); - throw; - } -} - - -void protocol_shoutcastClient::state_SendText() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - // AD_DEBUG_LOG (m_clientLogString + __FUNCTION__); -#endif - - if (sendDataBuffer (m_streamID, m_outBuffer, m_outBufferSize, m_clientLogString)) - { - setCallback (); - } -} - -// wrapper for the StopAdRun, as we also need to kick off some listener metrics -void protocol_shoutcastClient::releaseAdvert () -{ - if (m_adAccess.inAdvertMode ()) - { - metrics::adSummary summary; - - summary.sid = m_streamID; - summary.path = getStreamPath (m_streamID); - summary.tstamp = ::time(NULL); - summary.id = m_adAccess.getCurrentTrigger()->m_id; - summary.sd = m_streamData; - metrics_adListener (*this, summary); - - m_adAccess.stopAdRun (m_streamID, m_streamData->advertGroups, false); - } -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.h b/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.h deleted file mode 100644 index ab1bcb43..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastClient.h +++ /dev/null @@ -1,209 +0,0 @@ -#pragma once -#ifndef protocol_shoutcastClient_H_ -#define protocol_shoutcastClient_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include "stats.h" -#include "bandwidth.h" -#include "protocol_HTTPStyle.h" - - -#pragma pack(push, 1) -class protocol_shoutcastClient: public runnable, public clientProtocol -{ -public: - friend class protocol_HTTPStyle; - - typedef void (protocol_shoutcastClient::*state_t)(); - protocol_shoutcastClient (protocol_HTTPStyle &hs, const streamData::streamID_t streamID, const uniString::utf8 &hostName, const uniString::utf8 &clientAddr, const uniString::utf8 &XFF, const streamData::source_t clientType); - - protocol_shoutcastClient(const socketOps::tSOCKET socket, const u_short port, - const streamData::source_t clientType, const uniString::utf8 &hostName, - const streamData::streamID_t streamID, const size_t unique, - const uniString::utf8 &userAgent, const uniString::utf8 &referer, - const uniString::utf8 &clientAddr, const uniString::utf8 &XFF, - const bool headRequest); - - virtual ~protocol_shoutcastClient() throw() - { - m_streamData = 0; - socketOps::forgetTCPSocket(m_socket); - } - - virtual void setIntro(vector<__uint8> &v, int uvoxDataType = MP3_DATA) { m_introFile = v; m_introFileOffset = 0; (void)uvoxDataType; } - - virtual void acquireIntroFile(const bool sc2 = false) throw(); - virtual int acquireBackupFile(int *dataType = 0, const bool sc2 = false) throw(); - - void kickNextRound() throw() { m_kickNextRound = true; } - - void setGroup(size_t group) throw() { m_adAccess.setGroup (group); } - const size_t getGroup() const throw() { return m_adAccess.getGroup(); } - - const size_t getUnique() const throw() { return m_unique; } - const streamData::source_t getClientType() const throw() { return m_clientType; } - const time_t getStartTime() const throw() { return m_startTime; } - - const uniString::utf8 getXFF() const throw() { return m_XFF; } - const uniString::utf8 getUserAgent() const throw() { return (!m_userAgent.empty() ? m_userAgent : EMPTY_AGENT); } - const uniString::utf8 getReferer() const throw() { return m_referer; } - - void return_403(); - - const streamData::ringBufferAccess_t resetReadPtr(std::vector<__uint8>& data, const bool sc2 = false) throw(); - void resetReadPtr(const bool sc2 = false) throw(); - void resetReadPtr (streamData::ringBufferAccess_t ptr, bool sc2) throw(); - - const int doTimeSlice(const bool sc2 = false) throw(std::exception); - void resetCommon() throw(); - - const bool sendText() throw(std::exception); - - void setupWorkingBuffer(const std::vector<__uint8>& data, std::vector<__uint8>& tempBuf, int& len) throw(); - - virtual void processFrame (int type, const unsigned char *buf, unsigned int len); - - const int doFLVFrameSync(const int type, const bool debug, const int offset, - const std::vector<__uint8>& buf, const time_t cur_time, - const int bitrate, const unsigned int samplerate, - int &len, int &frames, bool &advert, int ×tamp, - const bool fill_remainder = false) throw(); - - virtual const int doFrameSync(const int type, const bool debug, const int len, - const int offset, const std::vector<__uint8>& buf, - const time_t cur_time, const int bitrate, - const unsigned int samplerate, int &frames, - bool &advert, const bool fill_remainder = false) throw(); - - void createFrameRate(const bool mp3, const int samplerate); - const __uint64 calculateFrameLimit(const time_t cur_time = 0); - void updateFrameCount(const int frames, const time_t cur_time = 0); - const bool calculateDelay(const int autoDumpTime = -1); - virtual int doSend(const bool debug, const time_t cur_time, - const int autoDumpTime, int adjust = 0) throw(std::runtime_error); - void checkListenerIsValid(const bool debug) throw(std::runtime_error); - - void setW3CState() throw(); - const uniString::utf8 getContainer() const; - void authForStream(streamData *_sd = 0); - - const bool handleNoData(const uniString::utf8 &logString, const int remainder, - const streamData::ringBufferAccess_t amt, - const int autoDumpTime, const time_t cur_time, - const bool sc2 = false); - - void streamMovedOrRejected(const uniString::utf8 &logString, const bandWidth::usageType_t type, - const uniString::utf8 &serverUrl, const int mode) throw(); - - const bool processAdvertTrigger(const bool advert); - - const uniString::utf8 fixICYMetadata(uniString::utf8 metadata); - void logW3C() throw(); - void doLogW3C(const uniString::utf8 &title = "") throw(); - void processTitleW3C() throw(); - - const adGroupAccess &getAdAccess () const { return m_adAccess; } - void releaseAdvert(); - - const int processAdd(const uniString::utf8 &logString, const bandWidth::usageType_t type, - const uniString::utf8 &msg, const int msgLen, - const uniString::utf8 &movedUrl, const uniString::utf8 &serverUrl) throw(); - const bool processReject(const uniString::utf8 &logString, const bandWidth::usageType_t type, - const uniString::utf8 &msg, const int msgLen, int *read_bitrate, - int *dataType = 0, const bool sc2 = false) throw(); - - const int addClient(); - void reportNewListener(const uniString::utf8 &logString = ""); - void reportStopListener(); - - void cleanup(const uniString::utf8 &logString, const bool debug, - const bool sc2 = false, const bool altLog = false) throw(exception); - - virtual int detectAutoDumpTimeout (time_t &cur_time, const size_t streamID, const uniString::utf8 &msg) throw(runtime_error); - - virtual void state_AttachToStream() throw(exception) = 0; - virtual void state_Close() throw(std::exception) = 0; - virtual void state_InitiateStream() throw(std::exception) = 0; - virtual void state_SendText() throw(std::exception); - virtual void state_SendAdverts() throw(std::exception); - virtual void state_Stream() throw(std::exception); - virtual void state_SendBackupFile() throw(std::exception); - virtual void state_SendIntroFile() throw(std::exception); - virtual void state_SendIntro() throw(std::exception); - - virtual void setCallback (state_t callback = NULL, state_t next = NULL) = 0; - - friend class auth::authService; - friend void metrics::metrics_listener_new(const protocol_shoutcastClient &client); - friend void metrics::metrics_listener_drop(const protocol_shoutcastClient &client); - friend void stats::catchPreAddClients(const streamData::streamID_t id); - -protected: - uniString::utf8 m_clientHostName; - const streamData::streamID_t m_streamID; // stream ID for this connection - - const size_t m_unique; // clients' unique id - uniString::utf8 m_userAgent; // client's user agent string - uniString::utf8 m_referer; // client's referer string - uniString::utf8 m_queryParams; // client's query parameters - - streamData::source_t m_clientType; // stream client type - - bool m_removeClientFromStats; // do we have to do a stats::removeClient - bool m_kickNextRound; - bool m_headRequest; - bool m_ignoreDisconnect; // used to prevent the 'client connection closed (0 seconds) [Bytes: 0] Agent:' - // message if redirecting or if max limit was reached which keeps logs cleaner - - time_t m_startTime; // when connection started, used to implement listenerTime - time_t m_newListener; // when the new listener metric was sent - time_t m_timerStart; // for time regulated sending - __uint64 m_timerFrames; // amount sent during timer; - - streamData *m_streamData; - - uniString::utf8 m_clientLogString; - uniString::utf8 m_clientAddr; // client's address - uniString::utf8 m_XFF; - uniString::utf8 m_OKResponse; - - uniString::utf8 m_lastSentMetadata; // used for w3C tracking - - std::vector<__uint8> m_introFile; - int m_introFileOffset; - int m_backupFileOffset; - std::vector<__uint8> m_backupFile; - int m_backupLoopTries; - unsigned int m_lagOffset; - - adGroupAccess m_adAccess; - - //// stats for w3c logs - time_t m_lastTitleTime; // time of last title update used for w3c logs - __uint64 m_bytesSentForCurrentTitle; // bytes sent since last title change. used for w3c logs - __uint64 m_totalBytesSent; // total bytes sent whilst the connection is open - /////////////////////////// - - streamData::ringBufferAccess_t m_readPtr; // pointer into ring buffer (main playback) - - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - int m_outBufferSize; - - unsigned short m_metaInterval; - unsigned short m_metaIntervalCounter; // counter for metadata updates - - double m_fps; - __uint64 m_frameLimit; // how many frames we're allowed - __uint64 m_frameCount; // how many frames we've provided - - std::vector<__uint8> m_shortSend; // used to keep a copy of the data from short sends - // which will be re-inserted into the output buffer - // before processing more audio data to the output. - std::vector<__uint8> m_remainder; - std::vector<__uint8> m_output; - -}; -#pragma pack(pop) - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.cpp b/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.cpp deleted file mode 100644 index b8b3ec23..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.cpp +++ /dev/null @@ -1,439 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include "protocol_shoutcastSource.h" -#include "protocol_backup.h" -#include "streamData.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.shoutcastSourceDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "SRC" - -protocol_shoutcastSource::protocol_shoutcastSource (microConnection &mc, const uniString::utf8 &password) throw (std::exception) - - : runnable (mc), m_srcPort(mc.m_srcPort), m_srcAddr(mc.m_srcAddress) -{ - m_srcStreamID = DEFAULT_SOURCE_STREAM; - m_denied = false; - m_remainder = new __uint8[BUF_SIZE * 4]; - m_remainderSize = 0; - m_outBuffer = NULL; - m_outBufferSize = 0; - m_streamData = NULL; - - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - // we're looking to see if this is an updated 1.x source - // which is able to indicate the stream # for the stream - // so that we're able to support multiple 1.x sources so - // we need to parse the password and extract the parts - utf8 m_srcPassword = password; - extractPassword(m_srcPassword, m_srcUserID, m_srcStreamID); - - // ensure that only valid stream id's are allowed to connect (1 -> 2147483647) - if (!m_srcStreamID || (m_srcStreamID > INT_MAX)) - { - m_denied = true; - ELOG(m_srcLogString + "Bad Stream ID (" + tos(m_srcStreamID) + "). Stream ID cannot be below 1 or above 2147483647."); - - m_outBuffer = MSG_BADSTREAMID; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_BADSTREAMID_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - return; - } - - // update the log message for the read stream number - m_srcLogString = srcAddrLogString (m_srcAddr, m_srcPort, m_srcStreamID); - - // if we have a moved stream then now we have the stream id - // then we need to check and block the source as applicable - utf8 movedUrl = gOptions.stream_movedUrl(m_srcStreamID); - - if (!movedUrl.empty()) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 1 source rejected. Stream is configured as having moved."); - - m_outBuffer = MSG_STREAMMOVED; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMMOVED_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - return; - } - - // as we are a v1 source then we must adhere to the master password - // instead of using a specific per stream password as in v2 streams - // though we also accept connections as sid=1 so check for that too - utf8 srcPassword = gOptions.stream_password(m_srcStreamID); - if (srcPassword.empty()) - { - srcPassword = gOptions.password(); - } - - if (m_srcPassword.empty() || (m_srcPassword != srcPassword)) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 1 source connection denied" + (m_srcUserID.empty() ? "" : " for user (" + m_srcUserID + ")") + - ". " + (m_srcPassword.empty() ? "Empty password not allowed." : "Bad password: " + m_srcPassword), LOGNAME, m_srcStreamID); - m_outBuffer = MSG_INVALIDPASSWORD; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_INVALIDPASSWORD_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - } - else - { - // if we've got a source already connected and it's not a backup - // then it's better that we just abort processing now than later - bool isSourceActive = false; - streamData *sd = streamData::accessStream(m_srcStreamID, isSourceActive); - if (sd && (isSourceActive == true) && (sd->isBackupStream(m_srcStreamID) == false)) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 1 source rejected. A source is already connected.", LOGNAME, m_srcStreamID); - m_outBuffer = MSG_STREAMINUSE; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMINUSE_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - } - else - { - ILOG(m_srcLogString + "Shoutcast 1 source connection starting.", LOGNAME, m_srcStreamID); - m_outBuffer = MSG_VALIDPASSWORD; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_VALIDPASSWORD_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_GetHeaders; - } - - if (sd) - { - sd->releaseStream(); - } - } -} - -protocol_shoutcastSource::~protocol_shoutcastSource() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (m_streamData) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_remainder); - - if (!m_denied) - { - ILOG(m_srcLogString + "Shoutcast 1 source disconnected.", LOGNAME, m_srcStreamID); - } -} - - -void protocol_shoutcastSource::state_AnalyzeHeaders() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - int maxHeaderLineCount = gOptions.maxHeaderLineCount(); - if ((int)m_headers.size() >= maxHeaderLineCount) - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "Max icy header lines exceeded"); - } - - m_lineBuffer = stripWhitespace(m_lineBuffer); - if (m_lineBuffer.empty()) - { - // adjust icy headers for titleFormat and urlFormat - utf8 titleFormat = gOptions.titleFormat(); - utf8 urlFormat = gOptions.urlFormat(); - if (!titleFormat.empty()) - { - utf8::size_type pos = titleFormat.find(utf8("%s")); - m_headers["icy-name"] = (pos == utf8::npos ? titleFormat : titleFormat.replace(pos,2,m_headers["icy-name"])); - } - - if (!urlFormat.empty()) - { - utf8::size_type pos = urlFormat.find(utf8("%s")); - m_headers["icy-url"] = (pos == utf8::npos ? urlFormat : urlFormat.replace(pos,2,m_headers["icy-url"])); - } - - // dump icy headers to log - if (gOptions.shoutcastSourceDebug()) - { - for (map<utf8,utf8>::const_iterator i = m_headers.begin(); i != m_headers.end(); ++i) - { - DEBUG_LOG(m_srcLogString + "Source client header [" + (*i).first + ":" + (*i).second + "]"); - } - } - - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_srcStreamID); - if (!found && gOptions.requireStreamConfigs()) - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "Shoutcast 1 source rejected. Stream " + - tos(m_srcStreamID) + " must be defined in config file"); - } - - // check that these bitrates are allowed (looking at both max and average values) - const int bitrate = getStreamBitrate(m_headers) * 1000; - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int ret = gOptions.isBitrateDisallowed(m_srcStreamID, bitrate, streamMaxBitrate, streamMinBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - throwEx<runtime_error>(m_srcLogString + "Shoutcast 1 source rejected. Only bitrates " + - mode + " " + tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + - " kbps are allowed - detected " + tos(bitrate / 1000) + " kbps."); - } - - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, m_srcAddr, - (found ? stream.m_authHash : ""), m_srcUserID, "", - stream.m_backupUrl.url(), streamData::SHOUTCAST1, - m_srcStreamID, m_srcPort, stream.m_maxStreamUser, - stream.m_maxStreamBitrate, stream.m_minStreamBitrate, - stream.m_allowPublicRelay, false, getStreamSamplerate(m_headers), - mapGet(m_headers, "icy-vbr", (bool)false), m_headers)); - if (!m_streamData) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 1 source rejected. A source is already connected."); - m_outBuffer = MSG_STREAMINUSE; - bandWidth::updateAmount(bandWidth::SOURCE_V1_SENT, (m_outBufferSize = MSG_STREAMINUSE_LEN)); - m_state = &protocol_shoutcastSource::state_SendBuffer; - m_nextState = &protocol_shoutcastSource::state_CloseConnection; - m_result.run(); - return; - } - - utf8 sourceIdent = mapGet(m_headers, "user-agent", utf8()); - m_streamData->updateSourceIdent(sourceIdent); - - m_state = &protocol_shoutcastSource::state_GetStreamData; - m_result.read(); - } - else - { - // find the colon that divides header lines into key/value fields - utf8::size_type pos = m_lineBuffer.find(utf8(":")); - utf8 key = toLower(stripWhitespace(m_lineBuffer.substr(0, pos))); - if (pos == utf8::npos) - { - if (!key.empty() && ((key == "icy-name") || (key == "icy-url"))) - { - // allow through icy-name and icy-url if there is - // a titleformat and urlformat to use respectively - } - else - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "Shoutcast 1 source connection rejected. " - "Bad icy header string [" + m_lineBuffer + "]"); - } - } - - utf8 value = stripWhitespace(m_lineBuffer.substr(pos+1)); - if (key.empty() || value.empty()) - { - if (!key.empty() && value.empty()) - { - if (key == "icy-genre") - { - value = "Misc"; - } - else if (((key == "icy-name") && !gOptions.titleFormat().empty()) || - ((key == "icy-url") && !gOptions.urlFormat().empty())) - { - // allow through icy-name and icy-url if there is - // a titleformat and urlformat to use respectively - } - else - { - if (key == "icy-url") - { - value = "http://www.shoutcast.com"; - } - else if (!((key == "icy-irc") || (key == "icy-aim") || (key == "icy-icq"))) - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "Shoutcast 1 source connection rejected. " - "Bad icy header string [" + m_lineBuffer + "]"); - } - } - } - else - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "Shoutcast 1 source connection rejected. " - "Bad icy header string [" + m_lineBuffer + "]"); - } - } - m_headers[key] = value; - m_nextState = &protocol_shoutcastSource::state_AnalyzeHeaders; - m_state = &protocol_shoutcastSource::state_GetLine; - m_result.read(); - m_lineBuffer.clear(); - } -} - -void protocol_shoutcastSource::timeSlice() throw(std::exception) -{ - try - { - if (m_streamData && m_streamData->isDead()) - { - m_result.done(); - return; - } - (this->*m_state)(); - } - catch(const exception &) - { - if (m_streamData && !m_denied) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector<config::streamConfig> backupInfo = gOptions.getBackupUrl(m_srcStreamID); - if (!backupInfo.empty()) - { - streamData::streamInfo info; - streamData::extraInfo extra; - if (streamData::getStreamInfo (m_streamData->ID(), info, extra) && info.m_allowBackupURL) - { - m_denied = true; - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - ILOG (m_srcLogString + "Shoutcast 1 source disconnected - trying source backup.", LOGNAME, m_srcStreamID); - threadedRunner::scheduleRunnable(new protocol_backup(backupInfo[0], getStreamBitrate(m_headers), - fixMimeType(m_headers["content-type"]))); - } - else - WLOG ("Stream backup URL not allowed", LOGNAME, m_srcStreamID); - } - } - throw; - } -} - -void protocol_shoutcastSource::state_SendBuffer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (sendDataBuffer(m_srcStreamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_shoutcastSource::state_GetLine() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (getHTTPStyleHeaderLine(m_srcStreamID, m_lineBuffer, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_shoutcastSource::state_GetHeaders() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - m_state = &protocol_shoutcastSource::state_GetLine; - m_nextState = &protocol_shoutcastSource::state_AnalyzeHeaders; - m_result.read(); -} - -void protocol_shoutcastSource::state_GetStreamData() throw(exception) -{ -/*#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_srcLogString + __FUNCTION__); -#endif*/ - - time_t cur_time; - - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_srcStreamID, (m_srcLogString + "Timeout waiting for stream data")); - - int bitrate = m_streamData->streamBitrate(); - const int type = m_streamData->streamUvoxDataType(); - while (true) - { - char buf[BUF_SIZE * 4] = {0}; - int amt = (BUF_SIZE - 1); - - // if we had anything left over then now we - // need to copy it back into the buffer and - // adjust the max data amount to be read in - if ((m_remainderSize > 0) && ((amt + m_remainderSize) <= (BUF_SIZE * 4))) - { - memcpy(buf, m_remainder, m_remainderSize); - } - else - { - m_remainderSize = 0; - } - - // adjust the position in the buffer based on the prior - // state of the remaining data as part of frame syncing - int rval = 0; - if ((rval = recv (&buf[m_remainderSize], (BUF_SIZE - 1), 0x0)) < 1) - { - if (rval < 0) - { - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule(85); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - DLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_srcStreamID); - } - else - DLOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_srcStreamID); - - throwEx<runtime_error> ((utf8)""); - } - - // update these details before we mess with anything - bandWidth::updateAmount(bandWidth::SOURCE_V1_RECV, rval); - - // if we're here then we account for what we already had in the total - // so that we then don't skip the new data read with the original data - rval += m_remainderSize; - m_remainderSize = 0; - amt = rval; - - if (m_streamData->syncToStream(m_remainderSize, m_remainder, amt, - bitrate, type, buf, m_srcLogString)) - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "Shoutcast 1 source disconnected. " - "Unable to sync to the stream. Please check the " - "source is valid and in a supported format."); - } - - m_lastActivityTime = ::time(NULL); - m_result.schedule(25); - } -} - -void protocol_shoutcastSource::state_CloseConnection() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - m_result.done(); -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.h b/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.h deleted file mode 100644 index b9116165..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_shoutcastSource.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once -#ifndef protocol_shoutcastSource_H_ -#define protocol_shoutcastSource_H_ - -#include "threadedRunner.h" -#include <map> - -class streamData; - -/* - Runnable object that handles the shoutcast source (broadcaster) - protocol -*/ - -class protocol_shoutcastSource: public runnable -{ -private: - const u_short m_srcPort; - short unsigned int m_remainderSize; - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - // is a padding hole around here... - __uint8 * m_remainder; - const uniString::utf8 m_srcAddr; - uniString::utf8 m_srcLogString; - uniString::utf8 m_srcUserID; - int m_srcStreamID; - int m_outBufferSize; - const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines - uniString::utf8 m_lineBuffer; // received header line - httpHeaderMap_t m_headers; // the received source headers - streamData *m_streamData; // associated stream object - - typedef void (protocol_shoutcastSource::*state_t)(); - - state_t m_state; - state_t m_nextState; - - void state_ConfirmPassword() throw(std::exception); - void state_SendBuffer() throw(std::exception); - void state_GetLine() throw(std::exception); - void state_GetHeaders() throw(std::exception); - void state_AnalyzeHeaders() throw(std::exception); - void state_CloseConnection() throw(std::exception); - void state_GetStreamData() throw(std::exception); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_shoutcastSource"; } - -public: - protocol_shoutcastSource (microConnection &mc, const uniString::utf8 &password) throw(std::exception); - - protocol_shoutcastSource(const socketOps::tSOCKET s, const uniString::utf8 &addr, - const u_short port, const uniString::utf8 &password) throw(std::exception); - virtual ~protocol_shoutcastSource() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.cpp b/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.cpp deleted file mode 100644 index f67d9df4..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.cpp +++ /dev/null @@ -1,1010 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include "protocol_uvox2Source.h" -#include "protocol_backup.h" -#include "uvox2Common.h" -#include "streamData.h" -#include "global.h" -#include "bandwidth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define DEBUG_LOG(...) do { if (gOptions.uvox2SourceDebug()) DLOG(__VA_ARGS__); } while (0) -#define LOGNAME "SRC" - - -protocol_uvox2Source::protocol_uvox2Source (microConnection &mc, const __uint8 *firstPacket, const int sizeOfFirstPacket) throw(exception) - - : runnable (mc), m_srcPort(mc.m_srcPort), m_srcAddr(mc.m_srcHostName) -{ - m_srcLogString = srcAddrLogString (m_srcAddr, m_srcPort); - m_outData = new __uint8 [MAX_MESSAGE_SIZE]; - m_remainder = new __uint8 [BUF_SIZE * 4]; - m_remainderSize = 0; - m_srcStreamID = DEFAULT_SOURCE_STREAM; - m_outBuffer = NULL; - m_outBufferSize = 0; - m_flushCachedMetadata = false; - m_specialFileBytesExpected = 0; - m_denied = false; - m_streamData = NULL; - m_loop = 0; - m_state = &protocol_uvox2Source::state_SendCrypto; - m_nextState = NULL; - - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - ILOG(m_srcLogString + "Shoutcast 2 source connection starting.", LOGNAME, m_srcStreamID); - - m_configData.m_maxBitrate = 0; - m_configData.m_avgBitrate = 0; - m_configData.m_desiredBufferSize = 0; - m_configData.m_minimumBufferSize = 0; - - if (sizeOfFirstPacket > MAX_MESSAGE_SIZE) - { - m_denied = true; - throw runtime_error(m_srcLogString.hideAsString() + "Initial data packet too large (" + tos(sizeOfFirstPacket) + ")"); - } - - bandWidth::updateAmount(bandWidth::SOURCE_V2_RECV, sizeOfFirstPacket); - m_inBuffer.insert(m_inBuffer.end(), firstPacket, firstPacket + sizeOfFirstPacket); -} - -protocol_uvox2Source::~protocol_uvox2Source() throw() -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (m_streamData) - { - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } - - socketOps::forgetTCPSocket(m_socket); - forgetArray(m_outData); - forgetArray(m_remainder); - - if (!m_denied) - { - ILOG(m_srcLogString + "Shoutcast 2 source disconnected.", LOGNAME, m_srcStreamID); - } -} - -void protocol_uvox2Source::timeSlice() throw(std::exception) -{ - try - { - if (m_streamData && m_streamData->isDead()) - { - m_result.done(); - return; - } - (this->*m_state)(); - } - catch(const exception &) - { - // if there was a failure, now see if we have a backup and attempt to run - // before we remove the current handling of the dropped source connection - vector<config::streamConfig> backupInfo = gOptions.getBackupUrl(m_srcStreamID); - if (!backupInfo.empty() && !m_denied) - { - m_denied = true; - if (m_streamData) - { - m_streamData->clearCachedMetadata(); - streamData::streamSourceLost(m_srcLogString, m_streamData, m_srcStreamID); - m_streamData = 0; - } -#ifdef INCLUDE_BACKUP_STREAMS - ILOG(m_srcLogString + "Shoutcast 2 source disconnected - trying source backup.", LOGNAME, m_srcStreamID); - threadedRunner::scheduleRunnable(new protocol_backup(backupInfo[0], - max(m_configData.m_avgBitrate/1000, m_configData.m_maxBitrate/1000), - m_configData.m_mimeType)); -#endif - } - throw; - } -} - -void protocol_uvox2Source::state_CloseConnection() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - m_result.done(); -} - -void protocol_uvox2Source::state_SendBuffer() throw(exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - if (sendDataBuffer(m_srcStreamID, m_outBuffer, m_outBufferSize, m_srcLogString)) - { - m_state = m_nextState; - } -} - -void protocol_uvox2Source::state_GetPacket() throw(exception) -{ - time_t cur_time; - - const int autoDumpTime = detectAutoDumpTimeout (cur_time, m_srcStreamID, (m_srcLogString + "Timeout waiting for data")); - - while (true) - { - // calculate optimal read size - char buf[BUF_SIZE] = {0}; - int amt = MAX_MESSAGE_SIZE; - int len = (int)m_inBuffer.size(); - - if (!len) - { - amt = UV2X_HDR_SIZE; - } - else if (len >= UV2X_HDR_SIZE) - { - amt = min(MAX_MESSAGE_SIZE, (int)((ntohs(reinterpret_cast<const uv2xHdr*>(&(m_inBuffer[0]))->msgLen) + UV2X_OVERHEAD) - len)); - } - else - { - amt = min(MAX_MESSAGE_SIZE, (UV2X_OVERHEAD - len)); - } - - int rval = 0; - if ((rval = recv (buf, amt, 0x0)) < 1) - { - if (rval < 0) - { - m_loop = 0; - rval = socketOps::errCode(); - if (rval == SOCKETOPS_WOULDBLOCK) - { - m_result.schedule(75); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - WLOG (m_srcLogString + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, m_srcStreamID); - } - else - DLOG (m_srcLogString + "Remote socket closed while waiting for data.", LOGNAME, m_srcStreamID); - - throwEx<runtime_error> (""); - } - if (rval < amt) - m_loop = 100000; // force a stop when processed. - - m_lastActivityTime = ::time(NULL); - m_inBuffer.insert(m_inBuffer.end(), buf, buf + rval); - - len = (int)m_inBuffer.size(); - if ((len > 1) && (len <= UV2X_HDR_SIZE)) - { - // check for sync byte as we cannot be - // certain of good data coming in from - // the connection and so we check it - int found = -1; - for (int i = 0; i < len - 1; i++) - { - // check for sync byte - if ((buf[i] == UVOX2_SYNC_BYTE) && (buf[i + 1] == 0)) - { - found = i; - break; - } - } - - // track what we've received for the bandwidth stats - bandWidth::updateAmount(bandWidth::SOURCE_V2_RECV, len); - - if (found != -1) - { - // we need to re-sync and so need to - // clear the buffer and replace it - // according to the re-sync position - if (found > 0) - { - DEBUG_LOG(m_srcLogString + "Shoutcast 2 source re-synced to stream [pos: " + tos(found) + "]."); - - m_inBuffer.clear(); - - // we insert in to the start of the buffer - // what appears to be 'good' sync'd data. - m_inBuffer.insert(m_inBuffer.end(), &buf[found], &buf[found] + rval - found); - } - } - else - { - // and then we clear out the buffer which - // is ok to do since we're trying to find - // the frame (as first or next in stream) - m_inBuffer.clear(); - } - - continue; - } - else if (len > MAX_MESSAGE_SIZE) - { - m_denied = true; - bandWidth::updateAmount(bandWidth::SOURCE_V2_RECV, rval); - throwEx<runtime_error>(m_srcLogString + "UVOX packet is too large" - " [got: " + tos(len) + " bytes, max: " + - tos(MAX_MESSAGE_SIZE) + " bytes]"); - } - else if (len > UV2X_HDR_SIZE) - { - if ((int)(ntohs(reinterpret_cast<const uv2xHdr*>(&(m_inBuffer[0]))->msgLen) + UV2X_OVERHEAD) == len) - { - // got it - bandWidth::updateAmount(bandWidth::SOURCE_V2_RECV, rval); - - m_result.run(); - m_state = m_nextState; - return; - } - } - } -} - -template<typename T> -void protocol_uvox2Source::loadAndSendMsg(const T &msg, int type, state_t nextState) throw() -{ - formMessage(msg, type, m_outData, m_outBufferSize); - bandWidth::updateAmount(bandWidth::SOURCE_V2_SENT, m_outBufferSize); - m_outBuffer = m_outData; - m_state = &protocol_uvox2Source::state_SendBuffer; - m_nextState = nextState; -} - -// load outbound message into buffer, and establish state to transition to after send -#define SEND_AND_TRANSITION(msg, vtype, state)\ - loadAndSendMsg(msg, vtype, state);\ - m_result.write();\ - m_result.run();\ - return; - -// get a packet and then transition to indicated state -#define GET_AND_TRANSITION(a)\ - m_inBuffer.clear();\ - m_state = &protocol_uvox2Source::state_GetPacket;\ - m_nextState = a;\ - m_result.run();\ - m_result.read();\ - m_result.timeoutSID(m_srcStreamID);\ - return; - -// send a packet then transition to closed state -#define SEND_AND_CLOSE(a, b)\ - SEND_AND_TRANSITION(a, b, &protocol_uvox2Source::state_CloseConnection) - -// get next packet, without acknowledgement -#define NEXT_PACKET\ - m_inBuffer.clear();\ - m_nextState = m_state;\ - m_state = &protocol_uvox2Source::state_GetPacket;\ - m_result.schedule();\ - m_result.timeoutSID(m_srcStreamID);\ - return; - -void protocol_uvox2Source::state_ConfirmPasswordGet() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - GET_AND_TRANSITION(&protocol_uvox2Source::state_ConfirmPassword); -} - -void protocol_uvox2Source::state_SendCrypto() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - // parse the contents of the packet to get user,password,streamid etc. - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - if (voxMsgType != MSG_CIPHER) - { - m_denied = true; - ELOG(m_srcLogString + "Out of sequence uvox packet. Got " + tos(voxMsgType) + " but expected " + tos(MSG_CIPHER), LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Sequence Error", voxMsgType); - } - - const char *contents = (const char *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - if (strcmp(contents,"2.1")) - { - ELOG(m_srcLogString + "Cipher request has bad version (" + contents + ")", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Version Error", voxMsgType, &protocol_uvox2Source::state_ConfirmPasswordGet); - } - - m_cipherKey = gOptions.stream_uvoxCipherKey(m_srcStreamID); - if (!gOptions.read_stream_uvoxCipherKey(m_srcStreamID) || m_cipherKey.empty()) - { - m_cipherKey = gOptions.uvoxCipherKey(); - } - - SEND_AND_TRANSITION(("ACK:" + m_cipherKey).hideAsString(), voxMsgType, &protocol_uvox2Source::state_ConfirmPasswordGet); -} - -// get stream,userID and password out of MSG_AUTH (0x1001) packet -void protocol_uvox2Source::state_ConfirmPassword() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - // parse the contents of the packet to get user,password,streamid etc. - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - if (voxMsgType != MSG_AUTH) - { - m_denied = true; - ELOG(m_srcLogString + "Out of sequence uvox packet. Got " + tos(voxMsgType) + " but expected " + tos(MSG_AUTH), LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Sequence Error", voxMsgType); - } - - const char *contents = (const char *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const char *pos = strstr(contents, ":"); - if (!pos) - { - m_denied = true; - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No version field.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - - std::string srcVersion = stripWhitespace(string(contents, pos)); - if (srcVersion != "2.1") - { - m_denied = true; - ELOG(m_srcLogString + "Uvox version of type " + srcVersion + " is not accepted. Expecting 2.1", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Version Error", voxMsgType); - } - - contents = pos+1; - pos = strstr(contents, ":"); - if (!pos) - { - m_denied = true; - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No SID field.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - - int sourceStreamID = atoi(string(contents, pos).c_str()); - // ensure that only valid stream id's are allowed to connect (1 -> 2147483647) - if (!sourceStreamID || (sourceStreamID > INT_MAX)) - { - m_denied = true; - ELOG(m_srcLogString + "Bad Stream ID (" + tos(sourceStreamID) + "). Stream ID cannot be below 1 or above 2147483647.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Stream ID Error", voxMsgType); - } - - // if we have a moved stream then now we have the stream id - // then we need to check and block the source as applicable - utf8 movedUrl = gOptions.stream_movedUrl(sourceStreamID); - if (!movedUrl.empty()) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source rejected. Stream is configured as having moved.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Deny", voxMsgType); - } - - m_srcStreamID = sourceStreamID; - - // if stream configs are required then we have an error if we didn't find one - if (gOptions.requireStreamConfigs()) - { - config::streamConfig stream; - if (!gOptions.getStreamConfig(stream, m_srcStreamID)) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source rejected. Stream " + tos(m_srcStreamID) + " must be defined in config file.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Stream ID Error", voxMsgType); - } - } - - contents = pos+1; - pos = strstr(contents, ":"); - if (!pos) - { - m_denied = true; - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No UID field.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - m_srcUserID = string(contents, pos); - if (!(m_srcUserID.size() % 16)) - { - m_srcUserID = XTEA_decipher(m_srcUserID.c_str(), m_srcUserID.size(), m_cipherKey.c_str(), m_cipherKey.size()); - } - else - { - m_denied = true; - ELOG(m_srcLogString + "Bad username format. Size of parameters not matching specification.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - - contents = pos + 1; - utf8 srcPassword = contents; - - if (!(srcPassword.size() % 16)) - { - srcPassword = XTEA_decipher(srcPassword.c_str(), srcPassword.size(), m_cipherKey.c_str(), m_cipherKey.size()); - } - else - { - m_denied = true; - ELOG(m_srcLogString + "Bad password format. Size of parameters not matching specification.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Parse Error", voxMsgType); - } - - // if no stream configuration is specified then we need to fallback - utf8 password = gOptions.stream_password(m_srcStreamID); - if (!gOptions.read_stream_password(m_srcStreamID) || password.empty()) - { - password = gOptions.password(); - } - - // look at the password and check for the multi-1.x style support, - // extracting as needed so we are consistent with all other modes. - // note: we ignore the other parameters and just want 'password'. - utf8 dj_name; // throw-away (equivalent of 'm_srcUserID') - extractPassword(srcPassword, dj_name, sourceStreamID); - - if (srcPassword != password) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source connection denied" + (m_srcUserID.empty() ? "" : " for user (" + m_srcUserID + ")") + - " on stream #" + tos(m_srcStreamID) + ". " + (srcPassword.empty() ? "Empty password not allowed." : "Bad password: " + srcPassword), LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:2.1:Deny", voxMsgType); - } - - // if we've got a source already connected and it's not a backup - // then it's better that we just abort processing now than later - bool isSourceActive = false; - streamData *sd = streamData::accessStream(m_srcStreamID, isSourceActive); - if (sd && (isSourceActive == true) && (sd->isBackupStream(m_srcStreamID) == false)) - { - sd->releaseStream(); - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source rejected. A source is already connected.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:Stream In Use", voxMsgType); - } - - if (sd) - { - sd->releaseStream(); - } - - m_srcLogString = srcAddrLogString(m_srcAddr, m_srcPort, m_srcStreamID); - DEBUG_LOG(m_srcLogString + "Password accepted. Stream id is " + tos(m_srcStreamID), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("ACK:2.1:Allow", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); -} - -// first part of stream configuration state, get the next packet, then process it -void protocol_uvox2Source::state_StreamConfigurationGet() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - GET_AND_TRANSITION(&protocol_uvox2Source::state_StreamConfiguration); -} - -// handle various stream configuration packets -// note: to allow real negotiation, most errors are rejected, but do not cause the connection to be shut -void protocol_uvox2Source::state_StreamConfiguration() throw(std::exception) -{ - DEBUG_LOG(m_srcLogString + __FUNCTION__); - - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const char *contents = (const char *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - switch (voxMsgType) - { - case MSG_MIME_TYPE: - { - // this is mainly to cope with legacy / incomplete uvox2.x implementations - m_configData.m_mimeType = contents; - DEBUG_LOG(m_srcLogString + "original mime type=" + m_configData.m_mimeType, LOGNAME, m_srcStreamID); - m_configData.m_mimeType = fixMimeType(m_configData.m_mimeType); - DEBUG_LOG(m_srcLogString + "mime type=" + m_configData.m_mimeType, LOGNAME, m_srcStreamID); - break; - } - case MSG_BROADCAST_SETUP: - { - const char *pos = strstr(contents, ":"); - if (!pos) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No avg bitrate field.", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Parse Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - m_configData.m_avgBitrate = atoi(string(contents,pos).c_str()); - contents = pos + 1; - m_configData.m_maxBitrate = atoi(contents); - - // check that these bitrates are allowed (looking at both max and average values) - const int bitrate = max(m_configData.m_avgBitrate, m_configData.m_maxBitrate); - int streamMaxBitrate = 0, streamMinBitrate = 0; - const int ret = gOptions.isBitrateDisallowed(m_srcStreamID, bitrate, streamMaxBitrate, streamMinBitrate); - if (ret) - { - m_denied = true; - utf8 mode = ((streamMaxBitrate == streamMinBitrate) ? "of" : (ret == 2 ? "up to" : "from")); - ELOG(m_srcLogString + "Shoutcast 2 source rejected. Only bitrates " + mode + " " + - tos((ret == 1 ? streamMinBitrate : streamMaxBitrate) / 1000) + - " kbps are allowed - detected " + tos(bitrate / 1000) + " kbps.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:Bit Rate Error", voxMsgType); - } - - DEBUG_LOG(m_srcLogString + "avg bitrate=" + tos(m_configData.m_avgBitrate) + " max bitrate=" + tos(m_configData.m_maxBitrate), LOGNAME, m_srcStreamID); - break; - } - case MSG_NEGOTIATE_BUFFER_SIZE: - { - const char *pos = strstr(contents, ":"); - if (!pos) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". No desired buffer size field.", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Parse Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - m_configData.m_desiredBufferSize = atoi(string(contents, pos).c_str()); - contents = pos + 1; - m_configData.m_minimumBufferSize = atoi(contents); - DEBUG_LOG(m_srcLogString + "desired buffer size=" + tos(m_configData.m_desiredBufferSize) + " min buffer size=" + tos(m_configData.m_minimumBufferSize), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("ACK:" + tos(m_configData.m_desiredBufferSize), voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - case MSG_MAX_PAYLOAD_SIZE: - { - const char *pos = strstr(contents, ":"); - if (!pos) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". Parse error.", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Parse Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - int max1 = atoi(string(contents, pos).c_str()); - contents = pos + 1; - int max2 = atoi(contents); - DEBUG_LOG(m_srcLogString + "max payload size 1=" + tos(max1) + " max payload size 2=" + tos(max2), LOGNAME, m_srcStreamID); - int new_max = max(max1, max2); - if ((new_max > MAX_PAYLOAD_SIZE) || (new_max < 256)) - { - ELOG(m_srcLogString + "Bad max payload size of " + tos(new_max), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Payload Size Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - - SEND_AND_TRANSITION("ACK:" + tos(MAX_PAYLOAD_SIZE), voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - case MSG_ICYNAME: - { - m_configData.m_icyName = contents; - utf8 titleFormat = gOptions.titleFormat(); - if (!titleFormat.empty()) - { - utf8::size_type pos = titleFormat.find(utf8("%s")); - m_configData.m_icyName = (pos == utf8::npos ? titleFormat : titleFormat.replace(pos, 2, m_configData.m_icyName)); - } - DEBUG_LOG(m_srcLogString + "icy-name=" + m_configData.m_icyName, LOGNAME, m_srcStreamID); - break; - } - case MSG_ICYGENRE: - { - m_configData.m_icyGenre = contents; - DEBUG_LOG(m_srcLogString + "icy-genre=" + m_configData.m_icyGenre, LOGNAME, m_srcStreamID); - break; - } - case MSG_ICYURL: - { - m_configData.m_icyURL = contents; - if (m_configData.m_icyURL.empty()) - { - m_configData.m_icyURL = "http://www.shoutcast.com"; - } - utf8 urlFormat = gOptions.urlFormat(); - if (!urlFormat.empty()) - { - utf8::size_type pos = urlFormat.find(utf8("%s")); - m_configData.m_icyURL = (pos == utf8::npos ? urlFormat : urlFormat.replace(pos,2,m_configData.m_icyURL)); - } - DEBUG_LOG(m_srcLogString + "icy-url=" + m_configData.m_icyURL, LOGNAME, m_srcStreamID); - break; - } - case MSG_ICYPUB: - { - m_configData.m_icyPub = atoi(contents); - DEBUG_LOG(m_srcLogString + "icy-pub=" + tos(m_configData.m_icyPub), LOGNAME, m_srcStreamID); - break; - } - case MSG_STANDBY: - { - DEBUG_LOG(m_srcLogString + "Standby", LOGNAME, m_srcStreamID); - if (m_streamData) - { - SEND_AND_CLOSE("NAK:Sequence Error", voxMsgType); - } - else - { - try - { - // build the correct path for the stream clients - config::streamConfig stream; - const bool found = gOptions.getStreamConfig(stream, m_srcStreamID); - m_streamData = streamData::createStream(streamData::streamSetup(m_srcLogString, m_srcAddr, - (found ? stream.m_authHash : ""), m_srcUserID, "", - (found ? stream.m_backupUrl.url() : ""), - streamData::SHOUTCAST2, m_srcStreamID, m_srcPort, - (found ? stream.m_maxStreamUser : 0), - (found ? stream.m_maxStreamBitrate : 0), - (found ? stream.m_minStreamBitrate : 0), - (found ? stream.m_allowPublicRelay : true), - false, 0, false, m_configData)); - } - catch(const exception &ex) - { - ELOG(m_srcLogString + ex.what(), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION(string("NAK:") + ex.what(), voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - - if (!m_streamData) - { - m_denied = true; - ELOG(m_srcLogString + "Shoutcast 2 source rejected. A source is already connected.", LOGNAME, m_srcStreamID); - SEND_AND_CLOSE("NAK:Stream In Use", voxMsgType); - } - else - { - if (m_flushCachedMetadata) - { - m_streamData->clearCachedMetadata(); - m_metadataAssemblyTable.clear(); - } - m_flushCachedMetadata = false; - } - } - DEBUG_LOG(m_srcLogString + "Stream configuration complete. [" + eol() + m_configData.toLogString() + eol() + "]", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("ACK:Data transfer mode", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - case MSG_FLUSH_CACHED_METADATA: - { - DEBUG_LOG(m_srcLogString + "Flush cached metadata", LOGNAME, m_srcStreamID); - m_metadataAssemblyTable.clear(); - m_flushCachedMetadata = true; - break; - } - case MSG_TERMINATE: - { - DEBUG_LOG(m_srcLogString + "Terminate", LOGNAME, m_srcStreamID); - throwEx<runtime_error> (""); - break; - } - case MSG_LISTENER_AUTHENTICATION: // not supported, just ACK it - { - WLOG(m_srcLogString + "Listener Auth - not supported", LOGNAME, m_srcStreamID); - break; - } - default: // out of sequence - { - ELOG(m_srcLogString + "Unknown or out of sequence packet " + tos(voxMsgType), LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Sequence Error", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); - } - } - - SEND_AND_TRANSITION("ACK", voxMsgType, &protocol_uvox2Source::state_StreamConfigurationGet); -} - -// this is needed to allow the source to process the -// response before starting to send the stream data -void protocol_uvox2Source::state_StreamDataGet() throw(std::exception) -{ - GET_AND_TRANSITION(&protocol_uvox2Source::state_GetStreamData); -} - -// normal streaming state -void protocol_uvox2Source::state_GetStreamData() throw(std::exception) -{ - if (!m_inBuffer.empty()) - { - const uv2xHdr *voxHdr = (const uv2xHdr*)(&(m_inBuffer[0])); - const __uint16 voxMsgType = ntohs(voxHdr->msgType); - - if ((voxMsgType >= 0x7000) && (voxMsgType < 0x9000)) - { - // if we have old uvox, then we don't know our mime-type (since old uvox 2 doesn't - // specify it, though 2.1 does). In the case that mime_type is empty, inspect the packet type and - // set it in the stream - if (m_configData.m_mimeType.empty()) - { - switch (voxMsgType) - { - case MP3_DATA: - { - m_configData.m_mimeType = "audio/mpeg"; - break; - } - case AAC_LC_DATA: - case AACP_DATA: - { - m_configData.m_mimeType = "audio/aacp"; - break; - } - case OGG_DATA: - { - m_configData.m_mimeType = "audio/ogg"; - break; - } - } - - if (!m_configData.m_mimeType.empty()) - { - m_streamData->streamSetMimeType(m_configData.m_mimeType); - } - } - - __uint16 amt = ntohs(voxHdr->msgLen); - vector <__uint8> tempbuf; - const char *buf; - - // if we had anything left over then now we - // need to copy it back into the buffer - if (m_remainderSize > 0 && m_remainder) - { - tempbuf.insert (tempbuf.end(), m_remainder, m_remainder+m_remainderSize); - tempbuf.insert (tempbuf.end(), m_inBuffer.begin() + UV2X_HDR_SIZE, m_inBuffer.begin()+UV2X_HDR_SIZE+amt); - amt = (__uint16)tempbuf.size(); - buf = (char *)&tempbuf[0]; - } - else - { - // buf.insert (buf.end(), m_inBuffer.begin() + UV2X_HDR_SIZE, m_inBuffer.begin()+UV2X_HDR_SIZE+amt); - buf = (char*)&m_inBuffer [UV2X_HDR_SIZE]; - } - - m_remainderSize = 0; - - int br = m_streamData->streamBitrate(); - if (m_streamData->syncToStream (m_remainderSize, m_remainder, amt, br, - m_streamData->streamUvoxDataType(), buf, - m_srcLogString)) - { - m_denied = true; - throwEx<runtime_error>(m_srcLogString + "Shoutcast 2 source disconnected. " - "Unable to sync to the stream. Please check the " - "source is valid and in a supported format."); - } - if (++m_loop < 20) - { - // force several small uvox packets to read/processed for now - m_inBuffer.clear(); - m_nextState = m_state; - m_state = &protocol_uvox2Source::state_GetPacket; - m_result.run(); - return; - } - m_loop = 0; - } - else if ((voxMsgType >= 0x3000) && (voxMsgType < 0x5000)) - { - DEBUG_LOG(m_srcLogString + "Cacheable metadata received type=0x" + tohex(voxMsgType), LOGNAME, m_srcStreamID); - const __uint16 voxPayloadSize = ntohs(voxHdr->msgLen); - if (voxPayloadSize >= UV2X_META_HDR_SIZE) // make sure there's enough data - { - const __uint8 *contents = (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const uv2xMetadataHdr *metaHdr = reinterpret_cast<const uv2xMetadataHdr*>(contents); - const __uint16 metadataID = ntohs(metaHdr->id); - const __uint16 metadataSpan = ntohs(metaHdr->span); - const __uint16 metadataIndex = ntohs(metaHdr->index) - 1; - const __uint8* metadataContents = contents + UV2X_META_HDR_SIZE; - const size_t metadataContentsSize = voxPayloadSize - UV2X_META_HDR_SIZE; - - if ((metadataSpan <= MAX_METADATA_FRAGMENTS) && - (metadataSpan > 0) && - (metadataIndex < MAX_METADATA_FRAGMENTS) && - (metadataIndex < metadataSpan)) - { - assemblyTableIndex_t ati = makeAssemblyTableIndex(voxMsgType, m_srcStreamID); - metadataEntry_t &me = m_metadataAssemblyTable[voxMsgType][ati]; - - if (metadataSpan != me.m_expectedFragments) // span changed, clear the entire thing - { - __uint16 expectedFragments = me.m_expectedFragments; - me.clear(); - DEBUG_LOG(m_srcLogString + "Cacheable metadata reset due to span change [" + tos(metadataSpan) + "," + tos(expectedFragments) + "]", LOGNAME, m_srcStreamID); - } - - me.m_expectedFragments = metadataSpan; - if (me.m_fragments[metadataIndex].m_isValid) // duplicate fragment, clear the entire thing - { - me.clear(); - DEBUG_LOG(m_srcLogString + "Cacheable metadata reset due to duplicate fragment", LOGNAME, m_srcStreamID); - } - - me.m_fragments[metadataIndex].m_isValid = true; - me.m_fragments[metadataIndex].m_fragment.insert(me.m_fragments[metadataIndex].m_fragment.end(), - metadataContents, metadataContents + metadataContentsSize); - - if ((++me.m_receivedFragments) == me.m_expectedFragments) - { - // assembly, send and clear - vector<__uint8> assembledData; - for (__uint16 x = 0; x < me.m_expectedFragments; ++x) - { - assembledData.insert(assembledData.end(), me.m_fragments[x].m_fragment.begin(), me.m_fragments[x].m_fragment.end()); - } - - // send - m_streamData->addUvoxMetadataAtCurrentPosition(voxMsgType,assembledData); - - if (gOptions.uvox2SourceDebug()) - { - if ((voxMsgType >= 0x3000) && (voxMsgType < 0x4000)) - { - ILOG(m_srcLogString + "Got complete metadata message type=0x" + tohex(voxMsgType) + - " [" + tos(assembledData.size()) + " bytes]" + - " id=" + tos(metadataID) + - " span=" + tos(metadataSpan) + - " content=" + eol() + utf8(&(assembledData[0]), assembledData.size()), LOGNAME, m_srcStreamID); - } - else - { - ILOG(m_srcLogString + "Got complete metadata message type=0x" + tohex(voxMsgType) + - " [" + tos(assembledData.size()) + " bytes]" + - " id=" + tos(metadataID) + - " span=" + tos(metadataSpan), LOGNAME, m_srcStreamID); - } - } - else - { - if ((voxMsgType >= 0x3000) && (voxMsgType < 0x4000)) - { - utf8 currentSong, comingSoon; - std::vector<uniString::utf8> nextSongs; - m_streamData->getStreamNextSongs(m_srcStreamID, currentSong, comingSoon, nextSongs); - - if (!currentSong.empty()) - { - if (!comingSoon.empty()) - { - ILOG(m_srcLogString + "Title update [now: \"" + currentSong + "\", next: \"" + comingSoon + "\"]", LOGNAME, m_srcStreamID); - } - else - { - ILOG(m_srcLogString + "Title update [" + currentSong + "]", LOGNAME, m_srcStreamID); - } - m_streamData->resetAdvertTriggers(currentSong); - } - } - else - { - utf8 mimeType[] = { - "image/jpeg", - "image/png", - "image/bmp", - "image/gif" - }; - - __uint16 ArtType = voxMsgType & 0x0F00; - if (!assembledData.size()) - { - ILOG(m_srcLogString + ((ArtType & MSG_METADATA_PLAYING_ART) ? "Playing" : "Stream") + " artwork cleared", LOGNAME, m_srcStreamID); - m_streamData->clearCachedArtwork(((ArtType & MSG_METADATA_PLAYING_ART) ? 1 : 0)); - } - else - { - ILOG(m_srcLogString + ((ArtType & MSG_METADATA_PLAYING_ART) ? "Playing" : "Stream") + - " artwork update [mime=" + mimeType[(voxMsgType & 0x00FF)] + ", " + tos(assembledData.size()) + " bytes]", LOGNAME, m_srcStreamID); - } - } - } - - // clear - m_metadataAssemblyTable[voxMsgType].erase(ati); - } - } - else - { - ELOG(m_srcLogString + "Badly formed metadata packet type=0x" + tohex(voxMsgType) + " id=" + - tos(metadataID) + " span=" + tos(metadataSpan) + " index=" + tos(metadataIndex + 1), LOGNAME, m_srcStreamID); - } - } - else - { - ELOG(m_srcLogString + "Badly formed metadata packet type=0x" + tohex(voxMsgType) + - " content of packet is too small payloadsize=" + tos(voxPayloadSize), LOGNAME, m_srcStreamID); - } - } - else if ((voxMsgType >= 0x5000) && (voxMsgType < 0x7000)) - { - // pass thru metadata - DEBUG_LOG(m_srcLogString + "Pass thru metadata", LOGNAME, m_srcStreamID); - m_streamData->writeSc21(m_inBuffer); // like data, but don't write to sc1 buffers - } - else if (voxMsgType == MSG_FILE_TRANSFER_BEGIN) - { - const __uint8 *contents = (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - const __uint8 *pos = (const __uint8*)strstr((const char *)contents, ":"); - if (!pos) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + ". Parse error.", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Parse Error", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - m_specialFileType = toLower(string(contents, pos)); - if ((m_specialFileType != "intro") && (m_specialFileType != "backup")) - { - ELOG(m_srcLogString + "Bad uvox packet " + tos(voxMsgType) + " Special file type (" + m_specialFileType + ") is not supported", LOGNAME, m_srcStreamID); - SEND_AND_TRANSITION("NAK:Type Error", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - - contents = pos + 1; - m_specialFileBytesExpected = atoi((const char *)contents); - if (m_specialFileBytesExpected > gOptions.maxSpecialFileSize()) - { - ELOG(m_srcLogString + "Bad special file size " + tos(m_specialFileBytesExpected) + ". Parse error.", LOGNAME, m_srcStreamID); - m_specialFileBytesExpected = 0; - SEND_AND_TRANSITION("NAK:Size Error",voxMsgType,&protocol_uvox2Source::state_StreamDataGet); - } - - m_specialFileBytes.clear(); - if (m_specialFileBytesExpected == 0) - { - ILOG(m_srcLogString + "Clearing " + m_specialFileType + " file.", LOGNAME, m_srcStreamID); - streamData::specialFileData &fd = (m_specialFileType == "intro" ? m_streamData->getIntroFile() : m_streamData->getBackupFile()); - fd.replaceData(m_specialFileBytes, m_streamData->streamUvoxDataType(), - m_streamData->streamBitrate(), m_streamData->streamSampleRate()); - } - else - { - ILOG(m_srcLogString + "Beginning " + m_specialFileType + " file transfer of size " + tos(m_specialFileBytesExpected) + " bytes.", LOGNAME, m_srcStreamID); - } - SEND_AND_TRANSITION("ACK", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - else if (voxMsgType == MSG_FILE_TRANSFER_DATA) - { - // do not NAK or ACK this packet - if (m_specialFileBytesExpected > 0) - { - int amt = ntohs(voxHdr->msgLen); - if (amt > m_specialFileBytesExpected) - { - WLOG(m_srcLogString + "Received too many bytes during special file transfer for " + m_specialFileType + ". Data will be truncated", LOGNAME, m_srcStreamID); - amt = m_specialFileBytesExpected; - } - - const __uint8 *contents = (const __uint8 *)((&(m_inBuffer[UV2X_HDR_SIZE]))); - m_specialFileBytes.insert(m_specialFileBytes.end(), contents, contents + amt); - m_specialFileBytesExpected -= amt; - if (m_specialFileBytesExpected == 0) - { - streamData::specialFileData &fd = (m_specialFileType == "intro" ? m_streamData->getIntroFile() : m_streamData->getBackupFile()); - fd.replaceData(m_specialFileBytes, m_streamData->streamUvoxDataType(), - m_streamData->streamBitrate(), m_streamData->streamSampleRate()); - m_specialFileBytes.clear(); - string fileType = m_specialFileType; - fileType[0] -= ('a' - 'A'); - ILOG(m_srcLogString + fileType + " file transfer complete.", LOGNAME, m_srcStreamID); - } - } - } - else if (voxMsgType == MSG_FLUSH_CACHED_METADATA) - { - ILOG(m_srcLogString + "Flush cached metadata", LOGNAME, m_srcStreamID); - m_streamData->clearCachedMetadata(); - m_metadataAssemblyTable.clear(); - SEND_AND_TRANSITION("ACK", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - else if (voxMsgType == MSG_TERMINATE) - { - ILOG(m_srcLogString + "Terminate", LOGNAME, m_srcStreamID); - throwEx<runtime_error> (""); - } - else - { - ELOG(m_srcLogString + "Unknown or out of sequence packet " + tos(voxMsgType), LOGNAME, m_srcStreamID); - if ((voxMsgType < 0x2000) && (voxMsgType != MSG_FILE_TRANSFER_DATA)) - { - // probably have to NAK it - SEND_AND_TRANSITION("NAK:Unsupported packet type", voxMsgType, &protocol_uvox2Source::state_StreamDataGet); - } - } - } - - NEXT_PACKET; -} diff --git a/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.h b/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.h deleted file mode 100644 index 1bd7343c..00000000 --- a/Src/Plugins/DSP/sc_serv3/protocol_uvox2Source.h +++ /dev/null @@ -1,129 +0,0 @@ -#pragma once -#ifndef protocol_uvox2Source_H_ -#define protocol_uvox2Source_H_ - -#include "threadedRunner.h" -#include "streamData.h" -#include "uvox2Common.h" -#include <map> - -class streamData; - -/* - Runnable object that handles the uvox 2 and 2.1 source (broadcaster) - protocol -*/ - -class protocol_uvox2Source: public runnable -{ -private: - int m_srcStreamID; - const u_short m_srcPort; - - bool m_flushCachedMetadata; // flush cached metadata when source connects - bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords - - const uniString::utf8 m_srcAddr; - uniString::utf8 m_srcLogString; - - ///////////// for outgoing data ////////////////////////////// - __uint8 *m_outData; - const __uint8 *m_outBuffer; // for outgoing data lines - int m_outBufferSize; - /////////////////////////////////////////////////////////////// - - /////////// temporary storage buffer for special file transfers (uvox 0x1050) ///////////////// - int m_specialFileBytesExpected; - std::vector<__uint8> m_specialFileBytes; - std::string m_specialFileType; - - ///////////// incoming data //////////////////////////////////// - std::vector<__uint8> m_inBuffer; - //////////////////////////////////////////////////////////// - - streamData *m_streamData; // associated stream object - - ///// source information - uniString::utf8 m_srcUserID; - uniString::utf8 m_cipherKey; // for uvox 2.1 - streamData::uvoxConfigData_t m_configData; - - /////////////////////////////////////////////////////////////////////// - //// data structures for assembling cached metadata - typedef std::vector<__uint8> metadataFragment_t; - struct metadataFragmentEntry_t - { - metadataFragment_t m_fragment; - bool m_isValid; - - void clear() throw() - { - m_isValid = false; - m_fragment.clear(); - } - metadataFragmentEntry_t() throw() : m_isValid(false) {} - }; - - typedef metadataFragmentEntry_t metadataFragmentCollection_t[MAX_METADATA_FRAGMENTS]; - struct metadataEntry_t - { - metadataFragmentCollection_t m_fragments; - __uint16 m_expectedFragments; - __uint16 m_receivedFragments; - - void clear() throw() - { - for (int x = 0; x < MAX_METADATA_FRAGMENTS; ++x) - { - m_fragments[x].clear(); - } - m_receivedFragments = 0; - } - metadataEntry_t() throw() : m_expectedFragments(0), m_receivedFragments(0) {} - }; - - typedef __uint32 assemblyTableIndex_t; - static assemblyTableIndex_t makeAssemblyTableIndex(__uint16 voxMsgType,__uint16 metadataID) throw() - { - return ((((assemblyTableIndex_t)voxMsgType) << 16) | metadataID); - } - - typedef std::map<assemblyTableIndex_t,metadataEntry_t> metadataAssemblyTable_t; - std::map<__uint16,metadataAssemblyTable_t> m_metadataAssemblyTable; - ///////////////////////////////////////////////////// - - typedef void (protocol_uvox2Source::*state_t)(); - - state_t m_state; - state_t m_nextState; - - __uint8 *m_remainder; - short unsigned int m_remainderSize; - int m_loop; // hack until the read handler can process more than 1 packet at a time - - void state_SendBuffer() throw(std::exception); - void state_ConfirmPasswordGet() throw(std::exception); - void state_ConfirmPassword() throw(std::exception); - void state_SendCrypto() throw(std::exception); - void state_CloseConnection() throw(std::exception); - void state_StreamConfiguration() throw(std::exception); - void state_StreamConfigurationGet() throw(std::exception); - void state_GetPacket() throw(std::exception); - void state_StreamDataGet() throw(std::exception); - void state_GetStreamData() throw(std::exception); - - template<typename T> void loadAndSendMsg(const T &msg,int type,state_t nextState) throw(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "protocol_uvox2Source"; } - -public: - protocol_uvox2Source (microConnection &mc, const __uint8 *firstPacket, const int sizeOfFirstPacket) throw(exception); - - protocol_uvox2Source(const socketOps::tSOCKET s, const uniString::utf8 &addr, const u_short port, - const __uint8 *firstPacket, const int sizeOfFirstPacket) throw(std::exception); - virtual ~protocol_uvox2Source() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/readme.txt b/Src/Plugins/DSP/sc_serv3/readme.txt deleted file mode 100644 index e7daea4d..00000000 --- a/Src/Plugins/DSP/sc_serv3/readme.txt +++ /dev/null @@ -1,89 +0,0 @@ -Building sc_serv2 ------------------ - -The build dependencies for sc_serv2 are expat and zlib and these already have a pre-built -library stored in the 'libs' folder. Otherwise everything else is built from the contents -of the sc_serv3 folder so the libs only need to be updated rarely. - -It is assumed in all cases that there is a valid gcc + g++ tool chain in place along with -all standard libraries for building tools on the platform being used. - - -Win32 / Win64 -------------- - -The MSVC 2008 project builds straight from here with it using the pre-built libraries. - -As from DNAS v2.6, additional libcurl, libssl & libcrypto .lib files are required. -External zip files can be downloaded from the Nullsoft github repo: -https://github.com/Radionomy/Nullsoft/blob/master/Shoutcast/sc_serv3/deps/win32.7z -https://github.com/Radionomy/Nullsoft/blob/master/Shoutcast/sc_serv3/deps/win64.7z - -Extract locally to Shoutcast\sc_serv3\deps - - -BSD / Mac OS X / Linux ----------------------- - -The following is only needed if there is an update of the dependency library current -setup requires building expat before you can build sc_serv2 itself (not ideal but as it -is usually a build once event on the dependencies then it isn't too much of an issue...). - -EXPAT ------ - -In most cases just running ./unix_build_expat in the aolxml folder will build it. - - -ZLIB ----- - -./configure --static && make - -May also need to set (or applicable): - - export CC="/usr/bin/gcc44" - -in order to get it using the desired version of GCC on the system used to build this. - - ------------ - -Once all of the dependencies have been built then you just need to do "(g)make release" -to get a build. The make stage accepts the following modes: - - clean - release - fire - debug - - -Building on Centos 7 (on x64) ------------------------------ -Packages to install to enable compilation - sudo yum install gcc-c++ - sudo yum install openssl-devel - sudo yum install libstdc++-static - - curl http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/libcurl-devel-7.61.1-22.el8.x86_64.rpm > libcurl-devel.rpm - sudo rpm install libcur-devel.rpm - -If the directory deps/x86_64/lib does not exists create it - mkdir -p deps/x86_64/lib -Copy the static dependencies to this directory - cp libs/Aol_XML/Linux_x86_64/libexpat.a deps/x86_64/lib/ - cp libs/zlib/Linux_x86_64/libz.a deps/x86_64/lib/ - -Notes ------ - -Building assumes that both the C and C++ compilers are correctly setup on the machine. -When doing the linux build on ubuntu 10.10 the g++ compiler was not available leading to -"error trying to exec 'cc1plus' execvp" errors during building. The fix is: - - sudo apt-get install g++ - -When doing the linux build on Centos 5.5 the g++ compiler was not available leading to -"gcc: error trying to exec 'cc1plus': execvp: No such file or directory". The fix is: - - yum install gcc-c++ diff --git a/Src/Plugins/DSP/sc_serv3/resource.h b/Src/Plugins/DSP/sc_serv3/resource.h deleted file mode 100644 index e16fd8f7..00000000 --- a/Src/Plugins/DSP/sc_serv3/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by sc_serv.rc -// -#define IDI_ICY 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/Src/Plugins/DSP/sc_serv3/ripList.cpp b/Src/Plugins/DSP/sc_serv3/ripList.cpp deleted file mode 100644 index b7e9348f..00000000 --- a/Src/Plugins/DSP/sc_serv3/ripList.cpp +++ /dev/null @@ -1,391 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#else -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#endif - -#include <algorithm> -#include <stdio.h> -#include "ripList.h" -#include "global.h" -#include "stl/stringUtils.h" -#include "macros.h" -#include "webNet/socketOps.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" -#include <assert.h> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -#define LOGNAME "[RIP] " - -#ifdef _WIN32 -typedef unsigned long in_addr_t; -#endif - -ripList g_ripList; - -class ripList::impl -{ -private: - struct ripEntrySave - { - FILE *f; - size_t stream_ID; - }; - - struct ripEntry: public rip_t - { - in_addr_t m_ip; // ip as binary type. Old style, but that's how the old sc_serv did it and we'll - // continue to do it that way until we're ready to break the old software - - void save(ripEntrySave entrySave) throw(exception) - { - if (m_stream_ID == entrySave.stream_ID) - { - utf8 s(m_numericIP + eol()); - if (fwrite(s.c_str(),1,s.size(),entrySave.f) != s.size()) - { - throwEx<tagged_error>(LOGNAME "I/O error writing " + (!entrySave.stream_ID ? "global" : "sid=" + tos(entrySave.stream_ID)) + " rip file"); - } - } - } - - bool validIP() throw() - { - return ((m_ip != INADDR_NONE) && (m_ip != 0)); - } - - static in_addr_t stringToIP(const utf8 &sIP, utf8 &hostIP) - { - // default is to assume a raw IP address in the list - in_addr_t ip = inet_addr((const char *)sIP.c_str()); - if (ip == INADDR_NONE) - { - // though if that fails then attempt to - // get an IP address from a hostname... - string sHost; - try - { - sHost = socketOps::hostNameToAddress(sIP.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - ip = inet_addr((const char *)sHost.c_str()); - if (ip != INADDR_NONE) - { - hostIP = sHost; - } - } - } - return ip; - } - - ripEntry(const utf8 &numericIP, const size_t stream_ID) throw() : rip_t(numericIP, stream_ID), m_ip(stringToIP(numericIP, m_hostIP)) {} - ripEntry() throw() : m_ip(0) {} - }; - - AOL_namespace::mutex m_lock; - list<ripEntry> m_list; - -public: - bool load(const uniFile::filenameType &fn, size_t stream_ID) throw(exception) - { - if (fn.empty()) - { - throwEx<tagged_error>(LOGNAME "No " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "Attempting to read rip file: " + fileUtil::getFullFilePath(fn)); - } - - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"rb"); - if (!f) return false; - - bool updating = (!m_list.empty()); - m_list.clear(); - - try - { - int l = 0; - int count = 0; - while (true) - { - char buffer[4096] = {0}; - - if (!fgets(buffer, sizeof(buffer), f)) break; // get a line - - ++l; // increment line counter - - utf8 s; - - // skip utf-8 BOM - if ((strlen(buffer) > 2) && - (((unsigned char*)buffer)[0] == 0xef) && - (((unsigned char*)buffer)[1] == 0xbb) && - (((unsigned char*)buffer)[2] == 0xbf)) - { - s = &(buffer[3]); - } - else - { - s = buffer; - } - - ripEntry e(stripWhitespace(s),stream_ID); - - if (!e.validIP()) - { - WLOG(LOGNAME "Line " + tos(l) + " of " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip list has been ignored (bad IP)"); - } - else - { - if (this->find(e.m_numericIP,e.m_stream_ID,false) == false) - { - m_list.push_back(e); - ++count; - } - } - } - if (!updating) - { - if (count > 0) - { - ILOG(LOGNAME "Reserved " + tos(count) + " IP" + (count != 1 ? "'s" : "") + - " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip file"); - } - else if (gOptions.microServerDebug()) - { - DLOG(LOGNAME "No IPs read from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip file"); - } - } - else - { - ILOG(LOGNAME "Reloaded " + tos(count) + " Reserved IP" + (count != 1 ? "'s" : "") + - " from " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + " rip file"); - } - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - return true; - } - - void save(const uniFile::filenameType &fn,size_t stream_ID) throw(exception) - { - stackLock sml(m_lock); - - FILE *f = uniFile::fopen(fn,"wb"); - if (!f) - { - throwEx<tagged_error>(LOGNAME "Could not open " + (!stream_ID ? "global" : "sid=" + tos(stream_ID)) + - " rip file `" + fn + "' for writing (" + errMessage().hideAsString() + ")"); - } - try - { - ripEntrySave entrySave; - entrySave.f = f; - entrySave.stream_ID = stream_ID; - for_each(m_list.begin(),m_list.end(),bind2nd(mem_fun_ref(&ripEntry::save),entrySave)); - } - catch(...) - { - if (f) ::fclose(f); - throw; - } - if (f) ::fclose(f); - - if (!uniFile::fileSize(fn)) - { - uniFile::unlink(fn); - } - } - - bool add(const utf8 &ipAddr, const size_t stream_ID, const bool soft) throw(exception) - { - // skip loopback addresses as we treat them specially anyway - if ((ipAddr.find(utf8("127.")) == utf8::npos)) - { - ripEntry e(ipAddr, stream_ID); - if (!e.validIP()) - { - if (!soft) - { - throwEx<runtime_error>(LOGNAME "Invalid IP specified - `" + ipAddr + "'"); - } - else - { - return false; - } - } - - stackLock sml(m_lock); - m_list.push_back(e); - return true; - } - return false; - } - - // true if removed - bool remove(const utf8 &ipAddr, const size_t stream_ID, const bool allStream, const bool fallback = false, const bool use_lock = true) - { - if (use_lock) - { - stackLock sml(m_lock); - } - - for (list<ripEntry>::iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ( - (allStream || ((!allStream && ((*i).m_numericIP == ipAddr)) || ((*i).m_hostIP == ipAddr))) && - ((*i).m_stream_ID == stream_ID)) - { - m_list.erase(i); - return true; - } - } - - // attempt to see if we've got a hostname which has not been detected from the loading mapping - if (!fallback) - { - string sHost; - try - { - sHost = socketOps::hostNameToAddress(ipAddr.hideAsString()); - } - catch(...) - { - } - if (!sHost.empty()) - { - return remove(sHost, stream_ID, allStream, true, false); - } - } - - return false; - } - - // true if found - bool find(const utf8 &ipAddr, const size_t stream_ID, const bool use_lock = true) throw() - { - if (use_lock) - { - stackLock sml(m_lock); - } - - if (!m_list.empty()) - { - for (list<ripEntry>::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if (((*i).m_stream_ID == stream_ID) && - ((ipAddr == (*i).m_numericIP) || (ipAddr == (*i).m_hostIP))) - { - return true; - } - } - } - - return false; - } - - void get(std::vector<ripList::rip_t> &rl, size_t stream_ID) throw() - { - stackLock sml(m_lock); - - for (list<ripEntry>::const_iterator i = m_list.begin(); i != m_list.end(); ++i) - { - if ((*i).m_stream_ID == stream_ID) - { - rl.push_back(*i); - } - } - } -}; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// - -ripList::ripList() : m_impl(0) -{ - m_impl = new ripList::impl; -} - -ripList::~ripList() throw() -{ - forget(m_impl); -} - -bool ripList::load(const uniFile::filenameType &fn, size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - result = m_impl->load(fn,stream_ID); - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -bool ripList::save(const uniFile::filenameType &fn, size_t stream_ID) throw() -{ - assert(m_impl); - - bool result(false); - - try - { - m_impl->save(fn,stream_ID); - result = true; - } - catch(const exception &ex) - { - ELOG(ex.what()); - } - return result; -} - -// throws if parameters are invalid -bool ripList::add(const utf8 &ipAddr, const size_t stream_ID, const bool soft) throw(exception) -{ - assert(m_impl); - return m_impl->add(ipAddr, stream_ID, soft); -} - -// true if removed -bool ripList::remove(const utf8 &ipAddr, const size_t stream_ID, const bool allStream) throw() -{ - assert(m_impl); - return m_impl->remove(ipAddr, stream_ID, allStream); -} - -// true if found -bool ripList::find(const utf8 &ipAddr, const size_t stream_ID) throw() -{ - assert(m_impl); - return m_impl->find(ipAddr, stream_ID); -} - -void ripList::get(vector<ripList::rip_t> &bl, const size_t stream_ID) throw() -{ - assert(m_impl); - m_impl->get(bl, stream_ID); -} diff --git a/Src/Plugins/DSP/sc_serv3/ripList.h b/Src/Plugins/DSP/sc_serv3/ripList.h deleted file mode 100644 index 9ae418a2..00000000 --- a/Src/Plugins/DSP/sc_serv3/ripList.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -#ifndef ripList_H_ -#define ripList_H_ - -#include "unicode/uniFile.h" - -// class that manages lists of reserved IPs -// these are remote addresses that must always be allowed in no matter what. - -class ripList -{ -private: - class impl; - impl *m_impl; - -public: - struct rip_t - { - uniString::utf8 m_numericIP; - uniString::utf8 m_hostIP; // used to hold the converted IP from a hostname - size_t m_stream_ID; // used to differentiate - - rip_t(const uniString::utf8 &numericIP, const size_t stream_ID) throw() : m_numericIP(numericIP), m_stream_ID(stream_ID) {} - rip_t() throw() : m_stream_ID(0) {} - }; - - // throws if parameters are invalid - bool add(const uniString::utf8 &ipAddr, const size_t stream_ID, const bool soft) throw(std::exception); - // true if removed - bool remove(const uniString::utf8 &ipAddr, const size_t stream_ID, const bool allStream) throw(); - // true if found - bool find(const uniString::utf8 &ipAddr, const size_t stream_ID) throw(); - - bool load(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - bool save(const uniFile::filenameType &fn, const size_t stream_ID) throw(); - - ripList(); - ~ripList() throw(); - - // for web administration reference - void get(std::vector<rip_t> &rl, size_t stream_ID) throw(); -}; - -extern ripList g_ripList; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/sc_serv.rc b/Src/Plugins/DSP/sc_serv3/sc_serv.rc deleted file mode 100644 index 080ed630..00000000 --- a/Src/Plugins/DSP/sc_serv3/sc_serv.rc +++ /dev/null @@ -1,112 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 777,21,01,2023 - PRODUCTVERSION 2,6,1,777 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Radionomy SA" - VALUE "FileDescription", "Shoutcast DNAS v2.6.1" - VALUE "FileVersion", "777, 21, 01, 2022" - VALUE "InternalName", "sc_serv.exe" - VALUE "LegalCopyright", "Copyright � 2014-2023 Radionomy SA" - VALUE "LegalTrademarks", "Shoutcast is a trademark of Radionomy SA" - VALUE "OriginalFilename", "sc_serv.exe" - VALUE "ProductName", "Shoutcast DNAS v2.6.1" - VALUE "ProductVersion", "2, 6, 1, 777" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_ICY ICON "icy.ico" -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj b/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj deleted file mode 100644 index 4d3d1187..00000000 --- a/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj +++ /dev/null @@ -1,393 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <VCProjectVersion>17.0</VCProjectVersion> - <ProjectGuid>{5A93B2EA-61E0-4079-A002-06B4EA498853}</ProjectGuid> - <RootNamespace>sc_serv</RootNamespace> - <Keyword>Win32Proj</Keyword> - <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <ConfigurationType>Application</ConfigurationType> - <PlatformToolset>v142</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - <WholeProgramOptimization>true</WholeProgramOptimization> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <ConfigurationType>Application</ConfigurationType> - <PlatformToolset>v142</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - <WholeProgramOptimization>false</WholeProgramOptimization> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <ConfigurationType>Application</ConfigurationType> - <PlatformToolset>v142</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - <WholeProgramOptimization>true</WholeProgramOptimization> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <ConfigurationType>Application</ConfigurationType> - <PlatformToolset>v142</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - <WholeProgramOptimization>false</WholeProgramOptimization> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup> - <_ProjectFileVersion>17.0.32505.173</_ProjectFileVersion> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> - <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> - <GenerateManifest>false</GenerateManifest> - <LinkIncremental>false</LinkIncremental> - <IncludePath>$(IncludePath)</IncludePath> - <LibraryPath>$(LibraryPath)</LibraryPath> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> - <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> - <LinkIncremental>false</LinkIncremental> - <GenerateManifest>false</GenerateManifest> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> - <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> - <GenerateManifest>false</GenerateManifest> - <LinkIncremental>false</LinkIncremental> - <IncludePath>$(IncludePath)</IncludePath> - <LibraryPath>$(LibraryPath)</LibraryPath> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir> - <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir> - <LinkIncremental>false</LinkIncremental> - <GenerateManifest>false</GenerateManifest> - </PropertyGroup> - <PropertyGroup Label="Vcpkg"> - <VcpkgEnableManifest>false</VcpkgEnableManifest> - <VcpkgEnabled>true</VcpkgEnabled> - </PropertyGroup> - <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <VcpkgUseStatic>false</VcpkgUseStatic> - <VcpkgInstalledDir> - </VcpkgInstalledDir> - <VcpkgConfiguration>Debug</VcpkgConfiguration> - <VcpkgTriplet>x86-windows-static</VcpkgTriplet> - </PropertyGroup> - <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <VcpkgInstalledDir> - </VcpkgInstalledDir> - <VcpkgUseStatic>false</VcpkgUseStatic> - <VcpkgTriplet>x86-windows-static</VcpkgTriplet> - </PropertyGroup> - <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <VcpkgInstalledDir> - </VcpkgInstalledDir> - <VcpkgUseStatic>false</VcpkgUseStatic> - <VcpkgTriplet>x86-windows-static</VcpkgTriplet> - <VcpkgConfiguration>Debug</VcpkgConfiguration> - </PropertyGroup> - <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <VcpkgInstalledDir> - </VcpkgInstalledDir> - <VcpkgUseStatic>false</VcpkgUseStatic> - <VcpkgTriplet>x86-windows-static</VcpkgTriplet> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>.;nmrCommon;GeoIP\libGeoIP;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\include;.\deps\win32\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <PreprocessorDefinitions>_WINDOWS;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WINVER=0x0601;XML_STATIC;_DEBUG;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <MinimalRebuild>false</MinimalRebuild> - <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <WarningLevel>Level3</WarningLevel> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <DisableSpecificWarnings>4290;4996;4512;4505;4244;4127;4100;4057;%(DisableSpecificWarnings)</DisableSpecificWarnings> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> - </ClCompile> - <Link> - <AdditionalDependencies>crypt32.lib;version.lib;ws2_32.lib;shlwapi.lib;wldap32.lib;%(AdditionalDependencies)</AdditionalDependencies> - <GenerateDebugInformation>true</GenerateDebugInformation> - <GenerateMapFile>true</GenerateMapFile> - <SubSystem>Console</SubSystem> - <LargeAddressAware>true</LargeAddressAware> - <TargetMachine>MachineX86</TargetMachine> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> - <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>nmrCommon;deps\win64\include;GeoIP\libGeoIP;libcurl\include;pthread-win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;WINVER=0x0500;ZLIB_WINAPI;CURL_STATICLIB;XML_STATIC;PTW32_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <MinimalRebuild>false</MinimalRebuild> - <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <WarningLevel>Level3</WarningLevel> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <DisableSpecificWarnings>4290;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> - </ClCompile> - <Link> - <AdditionalDependencies>crypt32.lib;version.lib;ws2_32.lib;shlwapi.lib;wldap32.lib;expat.lib;%(AdditionalDependencies)</AdditionalDependencies> - <ShowProgress>LinkVerboseLib</ShowProgress> - <AdditionalLibraryDirectories>$(ProjectDir)..\..\..\external_dependencies\expat\$(PlatformShortName)_$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - <GenerateDebugInformation>true</GenerateDebugInformation> - <GenerateMapFile>true</GenerateMapFile> - <SubSystem>Console</SubSystem> - <LargeAddressAware>true</LargeAddressAware> - <TargetMachine>MachineX64</TargetMachine> - <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> - <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <Optimization>MinSpace</Optimization> - <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> - <AdditionalIncludeDirectories>.;nmrCommon;GeoIP\libGeoIP;..\..\..\external_dependencies\vcpkg\$(PlatformShortName)-windows-static\include;.\deps\win32\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <PreprocessorDefinitions>_WINDOWS;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0601;WINVER=0x0601;XML_STATIC;NDEBUG;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <StringPooling>true</StringPooling> - <BufferSecurityCheck>true</BufferSecurityCheck> - <WarningLevel>Level3</WarningLevel> - <DebugInformationFormat>None</DebugInformationFormat> - <DisableSpecificWarnings>4290;4996;4512;4505;4244;4127;4100;4057;%(DisableSpecificWarnings)</DisableSpecificWarnings> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - </ClCompile> - <Link> - <AdditionalDependencies>crypt32.lib;version.lib;ws2_32.lib;shlwapi.lib;wldap32.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - <GenerateDebugInformation>false</GenerateDebugInformation> - <SubSystem>Console</SubSystem> - <LargeAddressAware>true</LargeAddressAware> - <OptimizeReferences>true</OptimizeReferences> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <TargetMachine>MachineX86</TargetMachine> - <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> - <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> - <GenerateMapFile>true</GenerateMapFile> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <Optimization>MinSpace</Optimization> - <FavorSizeOrSpeed>Size</FavorSizeOrSpeed> - <AdditionalIncludeDirectories>nmrCommon;GeoIP\libGeoIP;deps\win64\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;WINVER=0x0500;ZLIB_WINAPI;CURL_STATICLIB;XML_STATIC;PTW32_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <StringPooling>true</StringPooling> - <BufferSecurityCheck>true</BufferSecurityCheck> - <WarningLevel>Level3</WarningLevel> - <DebugInformationFormat>None</DebugInformationFormat> - <DisableSpecificWarnings>4290;4996;%(DisableSpecificWarnings)</DisableSpecificWarnings> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - </ClCompile> - <ProjectReference> - <UseLibraryDependencyInputs>false</UseLibraryDependencyInputs> - </ProjectReference> - <Link> - <AdditionalDependencies>crypt32.lib;version.lib;ws2_32.lib;shlwapi.lib;wldap32.lib;expat.lib;%(AdditionalDependencies)</AdditionalDependencies> - <ShowProgress>NotSet</ShowProgress> - <AdditionalLibraryDirectories>$(ProjectDir)..\..\..\external_dependencies\expat\$(PlatformShortName)_$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> - <GenerateDebugInformation>false</GenerateDebugInformation> - <SubSystem>Console</SubSystem> - <LargeAddressAware>true</LargeAddressAware> - <OptimizeReferences>true</OptimizeReferences> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <TargetMachine>MachineX64</TargetMachine> - <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> - <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemGroup> - <ClCompile Include="adminList.cpp" /> - <ClCompile Include="ADTSHeader.cpp" /> - <ClCompile Include="agentList.cpp" /> - <ClCompile Include="aolxml\aolxml.cpp" /> - <ClCompile Include="aolxml\aolxmlutils.cpp" /> - <ClCompile Include="auth.cpp" /> - <ClCompile Include="bandwidth.cpp" /> - <ClCompile Include="banList.cpp" /> - <ClCompile Include="base64.cpp" /> - <ClCompile Include="cache.cpp" /> - <ClCompile Include="config.cpp" /> - <ClCompile Include="cpucount.cpp" /> - <ClCompile Include="filenameMetadata.cpp" /> - <ClCompile Include="FLV.cpp" /> - <ClCompile Include="GeoIP\libGeoIP\GeoIP.c" /> - <ClCompile Include="GeoIP\libGeoIP\md5.c" /> - <ClCompile Include="GeoIP\libGeoIP\regionName.c" /> - <ClCompile Include="GeoIP\libGeoIP\timeZone.c" /> - <ClCompile Include="global.cpp" /> - <ClCompile Include="main.cpp" /> - <ClCompile Include="metadata.cpp" /> - <ClCompile Include="metrics.cpp" /> - <ClCompile Include="MP3Header.cpp" /> - <ClCompile Include="nmrCommon\file\fileUtils.cpp" /> - <ClCompile Include="nmrCommon\services\baseOptions.cpp" /> - <ClCompile Include="nmrCommon\services\logger.cpp" /> - <ClCompile Include="nmrCommon\services\serviceMain.cpp" /> - <ClCompile Include="nmrCommon\services\stdServiceImpl.cpp" /> - <ClCompile Include="nmrCommon\threading\thread.cpp" /> - <ClCompile Include="nmrCommon\unicode\uniFile.cpp" /> - <ClCompile Include="nmrCommon\unicode\uniString.cpp" /> - <ClCompile Include="nmrCommon\win32\rezFuncs.cpp" /> - <ClCompile Include="protocol_admincgi.cpp" /> - <ClCompile Include="protocol_backup.cpp" /> - <ClCompile Include="protocol_FlashPolicyServer.cpp" /> - <ClCompile Include="protocol_flvClient.cpp" /> - <ClCompile Include="protocol_HTTPClient.cpp" /> - <ClCompile Include="protocol_HTTPSource.cpp" /> - <ClCompile Include="protocol_HTTPStyle.cpp" /> - <ClCompile Include="protocol_m4aClient.cpp" /> - <ClCompile Include="protocol_relay.cpp" /> - <ClCompile Include="protocol_relay_shoutcast.cpp" /> - <ClCompile Include="protocol_relay_uvox.cpp" /> - <ClCompile Include="protocol_shoutcast1Client.cpp" /> - <ClCompile Include="protocol_shoutcast2Client.cpp" /> - <ClCompile Include="protocol_shoutcastClient.cpp" /> - <ClCompile Include="protocol_shoutcastSource.cpp" /> - <ClCompile Include="protocol_uvox2Source.cpp" /> - <ClCompile Include="ripList.cpp" /> - <ClCompile Include="stats.cpp" /> - <ClCompile Include="streamData.cpp" /> - <ClCompile Include="threadedRunner.cpp" /> - <ClCompile Include="updater.cpp" /> - <ClCompile Include="uvox2Common.cpp" /> - <ClCompile Include="w3cLog.cpp" /> - <ClCompile Include="webClient.cpp" /> - <ClCompile Include="webNet\socketOps.cpp" /> - <ClCompile Include="webNet\urlUtils.cpp" /> - <ClCompile Include="yp2.cpp" /> - </ItemGroup> - <ItemGroup> - <ClInclude Include="adminList.h" /> - <ClInclude Include="ADTSHeader.h" /> - <ClInclude Include="agentList.h" /> - <ClInclude Include="aolxml\aolxml.h" /> - <ClInclude Include="auth.h" /> - <ClInclude Include="bandwidth.h" /> - <ClInclude Include="banList.h" /> - <ClInclude Include="base64.h" /> - <ClInclude Include="cache.h" /> - <ClInclude Include="config.h" /> - <ClInclude Include="cpucount.h" /> - <ClInclude Include="FLV.h" /> - <ClInclude Include="GeoIP\libGeoIP\GeoIP.h" /> - <ClInclude Include="GeoIP\libGeoIP\GeoIP_internal.h" /> - <ClInclude Include="GeoIP\libGeoIP\global.h" /> - <ClInclude Include="GeoIP\libGeoIP\md5.h" /> - <ClInclude Include="GeoIP\libGeoIP\types.h" /> - <ClInclude Include="global.h" /> - <ClInclude Include="metadata.h" /> - <ClInclude Include="metrics.h" /> - <ClInclude Include="MP3Header.h" /> - <ClInclude Include="nmrCommon\file\fileUtils.h" /> - <ClInclude Include="nmrCommon\services\baseOptions.h" /> - <ClInclude Include="nmrCommon\services\logger.h" /> - <ClInclude Include="nmrCommon\services\serviceMain.h" /> - <ClInclude Include="nmrCommon\services\stdServiceImpl.h" /> - <ClInclude Include="nmrCommon\stl\functors.h" /> - <ClInclude Include="nmrCommon\stl\stlx.h" /> - <ClInclude Include="nmrCommon\stl\stringUtils.h" /> - <ClInclude Include="nmrCommon\threading\MT_stl.h" /> - <ClInclude Include="nmrCommon\threading\thread.h" /> - <ClInclude Include="nmrCommon\unicode\uniFile.h" /> - <ClInclude Include="nmrCommon\unicode\uniString.h" /> - <ClInclude Include="nmrCommon\win32\rezFuncs.h" /> - <ClInclude Include="protocol_admincgi.h" /> - <ClInclude Include="protocol_backup.h" /> - <ClInclude Include="protocol_FlashPolicyServer.h" /> - <ClInclude Include="protocol_flvClient.h" /> - <ClInclude Include="protocol_HTTPClient.h" /> - <ClInclude Include="protocol_HTTPSource.h" /> - <ClInclude Include="protocol_HTTPStyle.h" /> - <ClInclude Include="protocol_m4aClient.h" /> - <ClInclude Include="protocol_relay.h" /> - <ClInclude Include="protocol_relay_shoutcast.h" /> - <ClInclude Include="protocol_relay_uvox.h" /> - <ClInclude Include="protocol_shoutcast1Client.h" /> - <ClInclude Include="protocol_shoutcast2Client.h" /> - <ClInclude Include="protocol_shoutcastClient.h" /> - <ClInclude Include="protocol_shoutcastSource.h" /> - <ClInclude Include="protocol_uvox2Source.h" /> - <ClInclude Include="resource.h" /> - <ClInclude Include="ripList.h" /> - <ClInclude Include="stats.h" /> - <ClInclude Include="streamData.h" /> - <ClInclude Include="threadedRunner.h" /> - <CustomBuild Include="updater.h" /> - <ClInclude Include="uvox2Common.h" /> - <ClInclude Include="versions.h" /> - <ClInclude Include="w3cLog.h" /> - <ClInclude Include="webClient.h" /> - <ClInclude Include="webNet\socketops.h" /> - <ClInclude Include="webNet\urlUtils.h" /> - <ClInclude Include="yp2.h" /> - </ItemGroup> - <ItemGroup> - <Image Include="icy.ico" /> - </ItemGroup> - <ItemGroup> - <CustomBuild Include="messagefile.mc"> - <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">mc %(Filename)%(Extension) -</Command> - <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(Filename).rc;%(Outputs)</Outputs> - <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">mc %(Filename)%(Extension) -</Command> - <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(Filename).rc;%(Outputs)</Outputs> - </CustomBuild> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="messagefile.rc" /> - <ResourceCompile Include="sc_serv.rc" /> - </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> \ No newline at end of file diff --git a/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj.filters b/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj.filters deleted file mode 100644 index 96d430dd..00000000 --- a/Src/Plugins/DSP/sc_serv3/sc_serv.vcxproj.filters +++ /dev/null @@ -1,478 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup> - <Filter Include="Source Files"> - <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> - <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> - </Filter> - <Filter Include="Header Files"> - <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> - <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> - </Filter> - <Filter Include="Resource Files"> - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions> - </Filter> - <Filter Include="nmrCommon"> - <UniqueIdentifier>{c34a54ac-e9e7-4c8a-b9f9-9cc7758d3d21}</UniqueIdentifier> - </Filter> - <Filter Include="nmrCommon\services"> - <UniqueIdentifier>{3f82ce9b-8dc8-424a-bdde-8c342e7feb9b}</UniqueIdentifier> - </Filter> - <Filter Include="nmrCommon\threading"> - <UniqueIdentifier>{fb22ca6f-a754-4d98-b944-dd2661f51e25}</UniqueIdentifier> - </Filter> - <Filter Include="nmrCommon\unicode"> - <UniqueIdentifier>{22dcd7de-78a0-42dc-aaee-5e0e04ac5b77}</UniqueIdentifier> - </Filter> - <Filter Include="nmrCommon\win32"> - <UniqueIdentifier>{1988542f-b8aa-4c7c-8fb6-12b0e2526d28}</UniqueIdentifier> - </Filter> - <Filter Include="nmrCommon\stl"> - <UniqueIdentifier>{58a554bb-7523-4c5d-9241-bd5415e2c419}</UniqueIdentifier> - </Filter> - <Filter Include="nmrCommon\file"> - <UniqueIdentifier>{91c2a3ab-9a23-4d9e-bcd6-5b0d3e510903}</UniqueIdentifier> - </Filter> - <Filter Include="webNet"> - <UniqueIdentifier>{9ee51758-e92b-4ad9-aee0-ed69e46618d3}</UniqueIdentifier> - </Filter> - <Filter Include="aolxml"> - <UniqueIdentifier>{1ddb836e-12e8-49a1-b8c2-909481bb2c6d}</UniqueIdentifier> - </Filter> - <Filter Include="flashPolicyServer"> - <UniqueIdentifier>{737011da-050f-44ad-b3b6-5d567f7e4637}</UniqueIdentifier> - </Filter> - <Filter Include="listener_clients"> - <UniqueIdentifier>{5ee15fe3-52cc-4159-923c-e836529f487a}</UniqueIdentifier> - </Filter> - <Filter Include="listener_clients\Header Files"> - <UniqueIdentifier>{67d8861d-7f54-4184-80dd-c9678138388c}</UniqueIdentifier> - <Extensions>*.h</Extensions> - </Filter> - <Filter Include="yp"> - <UniqueIdentifier>{6e00589b-88ef-4ea1-8f8b-51596a345943}</UniqueIdentifier> - </Filter> - <Filter Include="geoip"> - <UniqueIdentifier>{a656032e-a732-4832-b3a3-0bcea8f6d791}</UniqueIdentifier> - </Filter> - <Filter Include="updater"> - <UniqueIdentifier>{07a48b1f-8e08-4e90-93b4-71653561b78a}</UniqueIdentifier> - </Filter> - <Filter Include="metrics"> - <UniqueIdentifier>{d27744f0-c242-402c-95be-646dc831abea}</UniqueIdentifier> - </Filter> - <Filter Include="auth"> - <UniqueIdentifier>{60d7f6d7-1b1e-464a-894b-52daa21450eb}</UniqueIdentifier> - </Filter> - <Filter Include="aac"> - <UniqueIdentifier>{95b2a92c-2e41-4f7c-810d-a04ae787d388}</UniqueIdentifier> - </Filter> - <Filter Include="mp3"> - <UniqueIdentifier>{8b2c078c-2c94-41bc-9132-db30125dc6d2}</UniqueIdentifier> - </Filter> - <Filter Include="flv"> - <UniqueIdentifier>{a969a98a-24a4-4466-95a2-829958825065}</UniqueIdentifier> - </Filter> - <Filter Include="source_clients"> - <UniqueIdentifier>{bdb6b5dd-09ef-4fd9-83b9-7ca8b40a7695}</UniqueIdentifier> - </Filter> - <Filter Include="source_clients\Header Files"> - <UniqueIdentifier>{1358113b-a1a5-45ec-8c3a-69915899e621}</UniqueIdentifier> - </Filter> - <Filter Include="web_ui"> - <UniqueIdentifier>{46611830-1bd8-417e-9843-14aa9c2e3a92}</UniqueIdentifier> - </Filter> - <Filter Include="web_ui\Header Files"> - <UniqueIdentifier>{d9918193-0071-4850-8917-f7ad4516fc3b}</UniqueIdentifier> - </Filter> - </ItemGroup> - <ItemGroup> - <ClCompile Include="adminList.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="agentList.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="bandwidth.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="banList.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="base64.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="cache.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="config.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="cpucount.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="filenameMetadata.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="global.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="main.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="metadata.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="ripList.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="stats.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="streamData.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="threadedRunner.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="uvox2Common.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="w3cLog.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="webClient.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="nmrCommon\services\baseOptions.cpp"> - <Filter>nmrCommon\services</Filter> - </ClCompile> - <ClCompile Include="nmrCommon\services\logger.cpp"> - <Filter>nmrCommon\services</Filter> - </ClCompile> - <ClCompile Include="nmrCommon\services\serviceMain.cpp"> - <Filter>nmrCommon\services</Filter> - </ClCompile> - <ClCompile Include="nmrCommon\services\stdServiceImpl.cpp"> - <Filter>nmrCommon\services</Filter> - </ClCompile> - <ClCompile Include="nmrCommon\threading\thread.cpp"> - <Filter>nmrCommon\threading</Filter> - </ClCompile> - <ClCompile Include="nmrCommon\unicode\uniFile.cpp"> - <Filter>nmrCommon\unicode</Filter> - </ClCompile> - <ClCompile Include="nmrCommon\unicode\uniString.cpp"> - <Filter>nmrCommon\unicode</Filter> - </ClCompile> - <ClCompile Include="nmrCommon\win32\rezFuncs.cpp"> - <Filter>nmrCommon\win32</Filter> - </ClCompile> - <ClCompile Include="nmrCommon\file\fileUtils.cpp"> - <Filter>nmrCommon\file</Filter> - </ClCompile> - <ClCompile Include="webNet\socketOps.cpp"> - <Filter>webNet</Filter> - </ClCompile> - <ClCompile Include="webNet\urlUtils.cpp"> - <Filter>webNet</Filter> - </ClCompile> - <ClCompile Include="aolxml\aolxml.cpp"> - <Filter>aolxml</Filter> - </ClCompile> - <ClCompile Include="aolxml\aolxmlutils.cpp"> - <Filter>aolxml</Filter> - </ClCompile> - <ClCompile Include="protocol_FlashPolicyServer.cpp"> - <Filter>flashPolicyServer</Filter> - </ClCompile> - <ClCompile Include="protocol_flvClient.cpp"> - <Filter>listener_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_HTTPClient.cpp"> - <Filter>listener_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_m4aClient.cpp"> - <Filter>listener_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_shoutcast1Client.cpp"> - <Filter>listener_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_shoutcast2Client.cpp"> - <Filter>listener_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_shoutcastClient.cpp"> - <Filter>listener_clients</Filter> - </ClCompile> - <ClCompile Include="yp2.cpp"> - <Filter>yp</Filter> - </ClCompile> - <ClCompile Include="GeoIP\libGeoIP\GeoIP.c"> - <Filter>geoip</Filter> - </ClCompile> - <ClCompile Include="GeoIP\libGeoIP\md5.c"> - <Filter>geoip</Filter> - </ClCompile> - <ClCompile Include="GeoIP\libGeoIP\regionName.c"> - <Filter>geoip</Filter> - </ClCompile> - <ClCompile Include="GeoIP\libGeoIP\timeZone.c"> - <Filter>geoip</Filter> - </ClCompile> - <ClCompile Include="updater.cpp"> - <Filter>updater</Filter> - </ClCompile> - <ClCompile Include="metrics.cpp"> - <Filter>metrics</Filter> - </ClCompile> - <ClCompile Include="auth.cpp"> - <Filter>auth</Filter> - </ClCompile> - <ClCompile Include="ADTSHeader.cpp"> - <Filter>aac</Filter> - </ClCompile> - <ClCompile Include="MP3Header.cpp"> - <Filter>mp3</Filter> - </ClCompile> - <ClCompile Include="FLV.cpp"> - <Filter>flv</Filter> - </ClCompile> - <ClCompile Include="protocol_backup.cpp"> - <Filter>source_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_HTTPSource.cpp"> - <Filter>source_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_relay.cpp"> - <Filter>source_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_relay_shoutcast.cpp"> - <Filter>source_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_relay_uvox.cpp"> - <Filter>source_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_shoutcastSource.cpp"> - <Filter>source_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_uvox2Source.cpp"> - <Filter>source_clients</Filter> - </ClCompile> - <ClCompile Include="protocol_admincgi.cpp"> - <Filter>web_ui</Filter> - </ClCompile> - <ClCompile Include="protocol_HTTPStyle.cpp"> - <Filter>web_ui</Filter> - </ClCompile> - </ItemGroup> - <ItemGroup> - <ClInclude Include="adminList.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="agentList.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="bandwidth.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="banList.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="base64.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="cache.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="config.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="cpucount.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="global.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="metadata.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="resource.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="ripList.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="stats.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="streamData.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="threadedRunner.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="uvox2Common.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="versions.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="w3cLog.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="webClient.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\services\baseOptions.h"> - <Filter>nmrCommon\services</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\services\logger.h"> - <Filter>nmrCommon\services</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\services\serviceMain.h"> - <Filter>nmrCommon\services</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\services\stdServiceImpl.h"> - <Filter>nmrCommon\services</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\threading\MT_stl.h"> - <Filter>nmrCommon\threading</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\threading\thread.h"> - <Filter>nmrCommon\threading</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\unicode\uniFile.h"> - <Filter>nmrCommon\unicode</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\unicode\uniString.h"> - <Filter>nmrCommon\unicode</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\win32\rezFuncs.h"> - <Filter>nmrCommon\win32</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\stl\functors.h"> - <Filter>nmrCommon\stl</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\stl\stlx.h"> - <Filter>nmrCommon\stl</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\stl\stringUtils.h"> - <Filter>nmrCommon\stl</Filter> - </ClInclude> - <ClInclude Include="nmrCommon\file\fileUtils.h"> - <Filter>nmrCommon\file</Filter> - </ClInclude> - <ClInclude Include="webNet\socketops.h"> - <Filter>webNet</Filter> - </ClInclude> - <ClInclude Include="webNet\urlUtils.h"> - <Filter>webNet</Filter> - </ClInclude> - <ClInclude Include="aolxml\aolxml.h"> - <Filter>aolxml</Filter> - </ClInclude> - <ClInclude Include="protocol_FlashPolicyServer.h"> - <Filter>flashPolicyServer</Filter> - </ClInclude> - <ClInclude Include="protocol_flvClient.h"> - <Filter>listener_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_HTTPClient.h"> - <Filter>listener_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_m4aClient.h"> - <Filter>listener_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_shoutcast1Client.h"> - <Filter>listener_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_shoutcast2Client.h"> - <Filter>listener_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_shoutcastClient.h"> - <Filter>listener_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="yp2.h"> - <Filter>yp</Filter> - </ClInclude> - <ClInclude Include="GeoIP\libGeoIP\GeoIP.h"> - <Filter>geoip</Filter> - </ClInclude> - <ClInclude Include="GeoIP\libGeoIP\GeoIP_internal.h"> - <Filter>geoip</Filter> - </ClInclude> - <ClInclude Include="GeoIP\libGeoIP\global.h"> - <Filter>geoip</Filter> - </ClInclude> - <ClInclude Include="GeoIP\libGeoIP\md5.h"> - <Filter>geoip</Filter> - </ClInclude> - <ClInclude Include="GeoIP\libGeoIP\types.h"> - <Filter>geoip</Filter> - </ClInclude> - <ClInclude Include="metrics.h"> - <Filter>metrics</Filter> - </ClInclude> - <ClInclude Include="auth.h"> - <Filter>auth</Filter> - </ClInclude> - <ClInclude Include="ADTSHeader.h"> - <Filter>aac</Filter> - </ClInclude> - <ClInclude Include="MP3Header.h"> - <Filter>mp3</Filter> - </ClInclude> - <ClInclude Include="FLV.h"> - <Filter>flv</Filter> - </ClInclude> - <ClInclude Include="protocol_backup.h"> - <Filter>source_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_HTTPSource.h"> - <Filter>source_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_relay.h"> - <Filter>source_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_relay_shoutcast.h"> - <Filter>source_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_relay_uvox.h"> - <Filter>source_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_shoutcastSource.h"> - <Filter>source_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_uvox2Source.h"> - <Filter>source_clients\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_admincgi.h"> - <Filter>web_ui\Header Files</Filter> - </ClInclude> - <ClInclude Include="protocol_HTTPStyle.h"> - <Filter>web_ui\Header Files</Filter> - </ClInclude> - </ItemGroup> - <ItemGroup> - <Image Include="icy.ico"> - <Filter>Resource Files</Filter> - </Image> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="messagefile.rc"> - <Filter>Resource Files</Filter> - </ResourceCompile> - <ResourceCompile Include="sc_serv.rc"> - <Filter>Resource Files</Filter> - </ResourceCompile> - </ItemGroup> - <ItemGroup> - <CustomBuild Include="messagefile.mc"> - <Filter>Resource Files</Filter> - </CustomBuild> - <CustomBuild Include="updater.h"> - <Filter>updater</Filter> - </CustomBuild> - </ItemGroup> -</Project> \ No newline at end of file diff --git a/Src/Plugins/DSP/sc_serv3/stats.cpp b/Src/Plugins/DSP/sc_serv3/stats.cpp deleted file mode 100644 index bfdeda21..00000000 --- a/Src/Plugins/DSP/sc_serv3/stats.cpp +++ /dev/null @@ -1,862 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif - -#include "protocol_shoutcastClient.h" -#include "stats.h" -#include "agentList.h" -#include "services/stdServiceImpl.h" -#include <map> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -static AOL_namespace::mutex g_statLock; - -#define DEBUG_LOG(...) do { if (gOptions.statsDebug()) DLOG(__VA_ARGS__); } while (0) - -#define LOGNAME "[STATS] " - -const utf8 EMPTY_AGENT("**EMPTY**"); - -struct statTableEntry_t -{ - size_t m_peakListeners; - size_t m_totalStreamHits; - typedef map<size_t, stats::clientData_t*> clientEntry_t; - clientEntry_t m_clientData; - - statTableEntry_t() : m_peakListeners(0), m_totalStreamHits(0) {} -}; - -typedef map<streamData::streamID_t,statTableEntry_t> streamStatTable_t; - -static streamStatTable_t g_streamStatTable; -static size_t g_totalClients; -static size_t g_uniqueClientId; - -const size_t stats::getNewClientId() -{ - return ++g_uniqueClientId; -} - -static bool _kickNonRipClientFromStream(const streamData::streamID_t id) throw() -{ - bool kicked = false; - - // first try our stream - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - statTableEntry_t::clientEntry_t &ce = ste.m_clientData; - - for (statTableEntry_t::clientEntry_t::iterator ci = ce.begin(); (ci != ce.end()) && (!kicked); ++ci) - { - if ((!(*ci).second->m_kicked) && (!(*ci).second->m_ripClient)) - { - (*ci).second->m_kicked = true; - if ((*ci).second->m_client) - { - (*ci).second->m_client->kickNextRound(); - } - kicked = true; - } - } - } - } - - return kicked; -} - -static bool _kickRandomNonRipClient(const streamData::streamID_t id, const bool anyStream) throw() -{ - bool kicked = _kickNonRipClientFromStream(id); - if ((!kicked) && anyStream) - { - for (streamStatTable_t::const_iterator i = g_streamStatTable.begin(); (i != g_streamStatTable.end()) && (!kicked); ++i) - { - kicked = _kickNonRipClientFromStream((*i).first); - } - } - - return kicked; -} - -const int stats::addClient(const streamData::streamID_t id, const utf8 &hostName, - const utf8 &ipAddr, const utf8 &userAgent, const bool ripClient, - const size_t clientUnique, protocol_shoutcastClient *client) -{ - if (id > 0) - { - stackLock sml(g_statLock); - - // to prevent some of the stats / logs getting skewed - // then we filter out the SHOUTcast site 'test' users - if (isUserAgentOfficial(toLower(userAgent))) - { - return 1; - } - - statTableEntry_t &ste = g_streamStatTable[id]; - ++ste.m_totalStreamHits; - - if (ste.m_clientData.find(clientUnique) == ste.m_clientData.end()) - { - // seen this crop up a bit and seem dodgy so rejecting (may change based on usage feedback) - if (userAgent.empty() && gOptions.blockEmptyUserAgent()) - { - return -1; - } - - // this will check against a blocked 'user agent' list - // so we can give stations a means to block bad clients - // e.g. Winamp/5.0 or Bass/2.x or something like that - if (!userAgent.empty() && g_agentList.find(userAgent, ((gOptions.read_stream_agentFile(id) && !gOptions.stream_agentFile(id).empty()) ? id : 0))) - { - return -2; - } - - streamData::streamInfo info; - streamData::extraInfo extra; - streamData::getStreamInfo(id, info, extra); - const int _maxUser = gOptions.maxUser(), - maxUsers = ((info.m_streamMaxUser > 0) && (info.m_streamMaxUser < _maxUser) ? info.m_streamMaxUser : _maxUser); - - const size_t num_clients = ste.m_clientData.size(); - const bool over = ((maxUsers && ((int)num_clients >= maxUsers)) || - (_maxUser && ((int)g_totalClients >= _maxUser))); - if (over && !ripClient) - { - return 0; // too many, and we are not allowed to boot anyone - } - - if (over && ripClient) // too many, and we are allowed to try to boot someone... - { - // if total reserved is already at the listener limit then nothing else to do - if (getTotalRipClients(id) < num_clients) - { - // we only allow the new listener to join as long as we can kick someone - if (!_kickRandomNonRipClient(id, true)) - { - return 0; - } - } - else - { - return 0; - } - } - - ste.m_clientData[clientUnique] = new stats::clientData_t(hostName, ipAddr, ripClient, client); - ste.m_peakListeners = max(ste.m_clientData.size(), ste.m_peakListeners); - ++g_totalClients; - - DEBUG_LOG(LOGNAME "System wide listener total now " + tos(g_totalClients)); - - return 1; - } - } - return 0; -} - - -// hacky, to maintain a count in here, should be one in sd -long stats::getUserCount (const streamData::streamID_t id) -{ - long c = 0; - if (id > 0) - { - stackLock sml(g_statLock); - statTableEntry_t &ste = g_streamStatTable[id]; - c = ste.m_clientData.size(); - } - return c; -} - - -void stats::removeClient(const streamData::streamID_t id, const size_t clientUnique) -{ - if ((id > 0) && (g_totalClients > 0)) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.find(clientUnique); - if (i != ste.m_clientData.end()) - { - delete i->second; - ste.m_clientData.erase(clientUnique); - - g_totalClients -= 1; - DEBUG_LOG(LOGNAME "System wide listener total now " + tos(g_totalClients)); - } - } - } - } -} - -// get stats. Some values, like newSessions and newConnects set a flag so that clients are only counted once. -// This is fine for touch reporting, but sometimes we want to fetch this information and, since we are not touching YP, -// do not want to set the flags indicating that things have been counted. The "resetAccumulators" flag controls this. -// Set to true for touch, false otherwise -void stats::getStats(streamData::streamID_t id, statsData_t &data, bool resetAccumulators) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - - data.peakListeners = ste.m_peakListeners; - data.totalStreamHits = ste.m_totalStreamHits; - - if (!ste.m_clientData.empty()) - { - set<utf8> ipTable; - - time_t t = ::time(NULL); - data.connectedListeners = ste.m_clientData.size(); - __uint64 total_listen_time = 0; - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - if (ipTable.find((*i).second->m_ipAddr) == ipTable.end()) - { - ++data.uniqueListeners; - } - ipTable.insert((*i).second->m_ipAddr); - } - - total_listen_time += (t - (*i).second->m_client->getStartTime()); - if (!(*i).second->m_connectCounted) - { - if (resetAccumulators) - { - (*i).second->m_connectCounted = true; - } - ++data.newConnects; - } - - if ((!(*i).second->m_fiveMinuteCumeCounted) && ((t - (*i).second->m_client->getStartTime()) > (5 * 60))) - { - if (resetAccumulators) - { - (*i).second->m_fiveMinuteCumeCounted = true; - } - ++data.newSessions; - } - } - - data.avgUserListenTime = (data.connectedListeners ? (int)(total_listen_time / data.connectedListeners) : 0); - } - } - } -} - -void stats::getFinalStats() throw() -{ - stackLock sml(g_statLock); - - size_t totalPeak = 0; - utf8 msg; - - if (!g_streamStatTable.empty()) - { - for (streamStatTable_t::const_iterator ti = g_streamStatTable.begin(); ti != g_streamStatTable.end(); ++ti) - { - size_t peakListeners = (*ti).second.m_peakListeners; - totalPeak += peakListeners; - msg += (msg.size() > 0 ? ",#" : "#") + tos((*ti).first) + ":" + tos(peakListeners); - } - } - - if (totalPeak > 0) - { - msg += (!g_streamStatTable.empty() ? "," : (utf8)"") + "Total: " + tos(totalPeak); - ILOG(LOGNAME "Peak numbers: " + msg); - } -} - -const streamData::streamIDs_t stats::getActiveStreamIds() throw() -{ - stackLock sml(g_statLock); - - streamData::streamIDs_t activeIds; - - for (streamStatTable_t::const_iterator ti = g_streamStatTable.begin(); ti != g_streamStatTable.end(); ++ti) - { - // we check this to make sure that we're only - // adding 'active' details and skip inactive - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - if (activeIds.find((*ti).first) == activeIds.end()) - { - activeIds.insert((*ti).first); - } - } - } - - return activeIds; -} - -const size_t stats::getTotalUniqueListeners() throw() -{ - stackLock sml(g_statLock); - - size_t uniqueListeners = 0; - - set<utf8> ipTable; - - for (streamStatTable_t::const_iterator ti = g_streamStatTable.begin(); ti != g_streamStatTable.end(); ++ti) - { - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - if (ipTable.find((*i).second->m_ipAddr) == ipTable.end()) - { - ++uniqueListeners; - } - ipTable.insert((*i).second->m_ipAddr); - } - } - } - } - - return uniqueListeners; -} - -const size_t stats::getTotalRipClients(streamData::streamID_t id) throw() -{ - size_t uniqueListeners = 0; - - if (id > 0) - { - streamStatTable_t::const_iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && (*i).second->m_ripClient) - { - ++uniqueListeners; - } - } - } - } - } - - return uniqueListeners; -} - -void stats::updateRipClients(const streamData::streamID_t id, const uniString::utf8& ripAddr, const bool mode) -{ - stackLock sml(g_statLock); - - if (id) - { - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && ((*i).second->m_ipAddr == ripAddr)) - { - (*i).second->m_ripClient = mode; - } - } - } - } - } - else - { - for (streamStatTable_t::iterator i = g_streamStatTable.begin(); i != g_streamStatTable.end(); ++i) - { - statTableEntry_t &ste = (*i).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator c = ste.m_clientData.begin(); c != ste.m_clientData.end(); ++c) - { - if (!(*c).second->m_kicked && ((*c).second->m_ipAddr == ripAddr)) - { - (*c).second->m_ripClient = mode; - } - } - } - } - } -} - -void stats::resetStats(const streamData::streamID_t id) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - // reset peak and stream hits to current client connection level - ste.m_totalStreamHits = ste.m_peakListeners = ste.m_clientData.size(); - } - } -} - -void stats::updatePeak(const streamData::streamID_t id, const size_t peakListeners) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - statTableEntry_t &ste = ((ti != g_streamStatTable.end()) ? (*ti).second : g_streamStatTable[id]); - ste.m_peakListeners = max(peakListeners, ste.m_peakListeners); - } -} - -void stats::updateTriggers(const streamData::streamID_t id, const size_t unique) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && ((*i).first == unique)) - { - ++(*i).second->m_triggers; - break; - } - } - } - } - } -} - -static bool sortCurrentClientDataByTime(const stats::currentClientData_t* a, const stats::currentClientData_t* b) -{ - return (a->m_startTime < b->m_startTime); -} - -// get all client data blocks for stream -void stats::getClientDataForStream(const streamData::streamID_t id, currentClientList_t &client_data) throw() -{ - stackLock sml(g_statLock); - - if (id > 0) - { - streamStatTable_t::const_iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - currentClientData_t* client = new currentClientData_t((*i).second->m_hostName, (*i).second->m_ipAddr, - (*i).second->m_client->getXFF(), (*i).second->m_client->getUserAgent(), - (*i).second->m_client->getReferer(), (*i).second->m_triggers, - (*i).second->m_client->getUnique(), (*i).second->m_client->getStartTime(), - (*i).second->m_client->getGroup(), (*i).second->m_client->getClientType(), - (*i).second->m_fiveMinuteCumeCounted, (*i).second->m_connectCounted, - (*i).second->m_ripClient, (*i).second->m_kicked); - client_data.push_back(client); - } - } - } - } - } - else - { - for (streamStatTable_t::const_iterator i = g_streamStatTable.begin(); i != g_streamStatTable.end(); ++i) - { - const statTableEntry_t &ste = (*i).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - currentClientData_t* client = new currentClientData_t((*i).second->m_hostName, (*i).second->m_ipAddr, - (*i).second->m_client->getXFF(), (*i).second->m_client->getUserAgent(), - (*i).second->m_client->getReferer(), (*i).second->m_triggers, - (*i).second->m_client->getUnique(), (*i).second->m_client->getStartTime(), - (*i).second->m_client->getGroup(), (*i).second->m_client->getClientType(), - (*i).second->m_fiveMinuteCumeCounted, (*i).second->m_connectCounted, - (*i).second->m_ripClient, (*i).second->m_kicked); - client_data.push_back(client); - } - } - } - } - } - - std::sort(client_data.begin(), client_data.end(), sortCurrentClientDataByTime); -} - -void stats::getClientDataForKicking(const streamData::streamID_t id, kickClientList_t &kick_data) throw() -{ - stackLock sml(g_statLock); - - if (id > 0) - { - streamStatTable_t::const_iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - kickClientData_t* client = new kickClientData_t((*i).second->m_client->getUserAgent(), - (*i).second->m_client->getUnique(), - (*i).second->m_kicked); - kick_data.push_back(client); - } - } - } - } - } - else - { - for (streamStatTable_t::const_iterator i = g_streamStatTable.begin(); i != g_streamStatTable.end(); ++i) - { - const statTableEntry_t &ste = (*i).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - kickClientData_t* client = new kickClientData_t((*i).second->m_client->getUserAgent(), - (*i).second->m_client->getUnique(), - (*i).second->m_kicked); - kick_data.push_back(client); - } - } - } - } - } -} - -void stats::catchPreAddClients(const streamData::streamID_t id) -{ - if (id > 0) - { - stackLock sml(g_statLock); - - // make sure the client still exists before calling it - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - // if we find an active listener which has m_group = -1 then - // we need to get the listener to do a listener_add request. - if (!(*i).second->m_kicked && - (*i).second->m_client->m_removeClientFromStats && - ((*i).second->m_client->getGroup() == -1)) - { - // we only want to do this once - // so we'll set it to group = 0 - // and it'll not be done again. - (*i).second->m_client->setGroup(0); - - DEBUG_LOG((*i).second->m_client->m_clientLogString + "Re-authenticating listener for adverts / metrics."); - - // using this to force an attept to check but only for non - // 'local' listener connections which won't get a group id - if ((isRemoteAddress((*i).second->m_client->m_clientAddr) || - isRemoteAddress((*i).second->m_client->m_XFF))) - { - (*i).second->m_client->authForStream((*i).second->m_client->m_streamData); - } - (*i).second->m_client->reportNewListener(); - } - } - } - } - } -} - -// set flag in client so it will bail on next round. This is safe since the client object -// cannot delete itself until calling stats::removeClient() which is protected by the g_statLock -void stats::kickClient(const streamData::streamID_t id, const size_t unique) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - // make sure the client still exists before calling it - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && ((*i).first == unique)) - { - (*i).second->m_kicked = true; - if ((*i).second->m_client) - { - (*i).second->m_client->kickNextRound(); - } - break; - } - } - } - } - } -} - -void stats::kickClient(const streamData::streamID_t id, const uniString::utf8& ipAddr) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - - // make sure the client still exists before calling it - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && ((*i).second->m_ipAddr == ipAddr)) - { - (*i).second->m_kicked = true; - if ((*i).second->m_client) - { - (*i).second->m_client->kickNextRound(); - } - } - } - } - } - } -} - -const bool stats::kickAllClients(const streamData::streamID_t id, const bool allStreams) throw() -{ - bool kicked = false; - if ((id > 0) && !allStreams) - { - stackLock sml(g_statLock); - - // make sure the client still exists before calling it - streamStatTable_t::iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - (*i).second->m_kicked = true; - if ((*i).second->m_client) - { - (*i).second->m_client->kickNextRound(); - kicked = true; - } - } - } - } - } - } - else if (!id && allStreams) - { - stackLock sml(g_statLock); - - for (streamStatTable_t::iterator ti = g_streamStatTable.begin(); ti != g_streamStatTable.end(); ++ti) - { - statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - (*i).second->m_kicked = true; - if ((*i).second->m_client) - { - (*i).second->m_client->kickNextRound(); - kicked = true; - } - } - } - } - } - } - - return kicked; -} - -static bool sortClientDataByTime(const stats::clientData_t &a, const stats::clientData_t &b) -{ - return (a.m_client->getStartTime() < b.m_client->getStartTime()); -} - -const bool stats::kickDuplicateClients(const streamData::streamID_t id) throw() -{ - bool kicked = false; - if (id > 0) - { - stackLock sml(g_statLock); - - // we first spin through all of the connected listeners and work out - // which listener addresses have more than one connection against it - streamStatTable_t::const_iterator ti = g_streamStatTable.find(id); - if (ti != g_streamStatTable.end()) - { - map<utf8, size_t> ipTable; - - const statTableEntry_t &ste = (*ti).second; - if (!ste.m_clientData.empty()) - { - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked) - { - if (ipTable.find((*i).second->m_ipAddr) == ipTable.end()) - { - ipTable[(*i).second->m_ipAddr] = 1; - } - else - { - ++ipTable[(*i).second->m_ipAddr]; - } - } - } - } - - if (!ipTable.empty()) - { - for (map<utf8, size_t>::const_iterator ip = ipTable.begin(); ip != ipTable.end(); ++ip) - { - // we now only look at addresses with multiple clients - // being reported for the address which has been noted - if (ip->second > 1) - { - map<utf8, size_t> agentTable; - - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && (ip->first == (*i).second->m_ipAddr)) - { - const utf8 userAgent = (*i).second->m_client->getUserAgent(); - if (agentTable.find(userAgent) == agentTable.end()) - { - agentTable[userAgent] = 1; - } - else - { - ++agentTable[userAgent]; - } - } - } - - if (!agentTable.empty()) - { - std::vector<clientData_t> data; - for (map<utf8, size_t>::const_iterator ai = agentTable.begin(); ai != agentTable.end(); ++ai) - { - // this should now just leave us with duplicate - // user-agents connected from the same address - if (ai->second > 1) - { - // now we need to process through and get the - // details needed so we can finally kick them - for (statTableEntry_t::clientEntry_t::const_iterator i = ste.m_clientData.begin(); i != ste.m_clientData.end(); ++i) - { - if (!(*i).second->m_kicked && - (ip->first == (*i).second->m_ipAddr) && - (ai->first == (*i).second->m_client->getUserAgent())) - { - data.push_back(*(*i).second); - } - } - } - } - - // now we've got data, we sort by data and then - // process through the final set of data & kick - if (!data.empty()) - { - std::sort(data.begin(), data.end(), sortClientDataByTime); - // remove the newest and kick the remainder - data.pop_back(); - - for (vector<stats::clientData_t>::iterator i = data.begin(); i != data.end(); ++i) - { - if (!(*i).m_kicked) - { - (*i).m_kicked = true; - if ((*i).m_client) - { - (*i).m_client->kickNextRound(); - kicked = true; - } - } - } - } - } - } - } - } - } - } - return kicked; -} - -const bool stats::kickRandomNonRipClient(const streamData::streamID_t id, const bool anyStream) throw() -{ - if (id > 0) - { - stackLock sml(g_statLock); - return _kickRandomNonRipClient(id, anyStream); - } - return false; -} diff --git a/Src/Plugins/DSP/sc_serv3/stats.h b/Src/Plugins/DSP/sc_serv3/stats.h deleted file mode 100644 index d902b112..00000000 --- a/Src/Plugins/DSP/sc_serv3/stats.h +++ /dev/null @@ -1,173 +0,0 @@ -#pragma once -#ifndef stats_H_ -#define stats_H_ - -#include "streamData.h" - -extern uniString::utf8 niceURL(uniString::utf8 srcAddr); - -extern const uniString::utf8 EMPTY_AGENT; - -namespace stats -{ - struct clientData_t - { - uniString::utf8 m_hostName; // holds the hostname (usually only available with namelookups=1) - uniString::utf8 m_ipAddr; - size_t m_triggers; // number of valid advert triggers done for the client - protocol_shoutcastClient* m_client; // reference to the client (mainly for kicking) - bool m_fiveMinuteCumeCounted; // already reported against 5 minute session (cm) - bool m_connectCounted; // already reported against new connects (ht) - bool m_ripClient; // client cannot be autobooted - bool m_kicked; // was ordered to be kicked and will go away soon - - clientData_t(const uniString::utf8 &hostName, const uniString::utf8 &ipAddr, - const bool ripClient, protocol_shoutcastClient* client) throw() - : m_hostName(niceURL(hostName)), m_ipAddr(niceURL(ipAddr)), - m_triggers(0), m_client(client), m_fiveMinuteCumeCounted(false), - m_connectCounted(false), m_ripClient(ripClient), m_kicked(false) {} - }; - - const size_t getNewClientId(); - - // return false if reach maxUsers for that stream or all streams. If ripClient == true, then this client MUST be added, even - // if it means we have to boot someone - const int addClient(const streamData::streamID_t id, const uniString::utf8& hostName, - const uniString::utf8 &ipAddr, const uniString::utf8 &userAgent, - const bool ripClient, const size_t clientUnique, - protocol_shoutcastClient *client); - void removeClient(const streamData::streamID_t id, const size_t clientUnique); - - struct statsData_t - { - size_t connectedListeners; // li - time_t avgUserListenTime; // alt - size_t newSessions; // cm - size_t newConnects; // ht - size_t peakListeners; - size_t uniqueListeners; - size_t totalStreamHits; // total hits against stream since start - - statsData_t() throw() : connectedListeners(0), avgUserListenTime(0), - newSessions(0), newConnects(0), peakListeners(0), - uniqueListeners(0), totalStreamHits(0) {} - }; - - // get stats. Some values, like newSessions and newConnects set a flag so that clients are only counted once. - // This is fine for touch reporting, but sometimes we want to fetch this information and, since we are not touching YP, - // do not want to set the flags indicating that things have been counted. The "resetAccumulators" flag controls this. - // Set to true for touch, false otherwise - void getStats(const streamData::streamID_t id, statsData_t &data, bool resetAccumulators = false) throw(); - - // provides log message when the DNAS is stopped of stream 'peak' values - void getFinalStats() throw(); - - // works out the total number of unique listeners even if connected to different streams - const size_t getTotalUniqueListeners() throw(); - - // works out the active stream ids so we can also catch listeners - // on non-configured streams but are being provided the backup - const streamData::streamIDs_t getActiveStreamIds() throw(); - - // get the current number of listeners on the specified stream - long getUserCount (const streamData::streamID_t id); - - // wsorks out the total number of reserved listeners on the specified stream - const size_t getTotalRipClients(const streamData::streamID_t id) throw(); - - // updates the appropriate clients (by stream) against any changes to the reserved list - void updateRipClients(const streamData::streamID_t id, const uniString::utf8& ripAddr, const bool mode); - - // only resets peakListeners and totalStreamHits currently with peakListeners set to current listeners if there are any - void resetStats(const streamData::streamID_t id) throw(); - - // used only during a YP 'add' to help restore the previous peak level (if applicable) - void updatePeak(const streamData::streamID_t id, const size_t peakListeners) throw(); - - void updateTriggers(const streamData::streamID_t id, const size_t unique) throw(); - - struct currentClientData_t - { - const uniString::utf8 m_hostName; // holds the hostname (usually only available with namelookups=1) - const uniString::utf8 m_ipAddr; - const uniString::utf8 m_XFF; - const uniString::utf8 m_userAgent; - const uniString::utf8 m_referer; - - const size_t m_triggers; // number of valid advert triggers done for the client - const size_t m_unique; // clients' unique id - - const time_t m_startTime; // when connection started, used to implement listenerTime - - const int m_group; // advert group id - const streamData::source_t m_clientType; // stream client type - - const bool m_fiveMinuteCumeCounted; // already reported against 5 minute session (cm) - const bool m_connectCounted; // already reported against new connects (ht) - const bool m_ripClient; // client cannot be autobooted - const bool m_kicked; // was ordered to be kicked and will go away soon - - currentClientData_t(const uniString::utf8 &hostName, const uniString::utf8 &ipAddr, - const uniString::utf8 &XFF, const uniString::utf8 &userAgent, - const uniString::utf8 &referer, const size_t triggers, - const size_t unique, const time_t startTime, - const int group, const streamData::source_t clientType, - const bool fiveMinuteCumeCounted, const bool connectCounted, - const bool ripClient, const bool kicked) throw() - : m_hostName(niceURL(hostName)), m_ipAddr(niceURL(ipAddr)), m_XFF(XFF), - m_userAgent(userAgent), m_referer(referer), m_triggers(triggers), - m_unique(unique), m_startTime(startTime), m_group(group), - m_clientType(clientType), m_fiveMinuteCumeCounted(fiveMinuteCumeCounted), - m_connectCounted(connectCounted), m_ripClient(ripClient), m_kicked(kicked) {} - }; - - typedef std::vector<currentClientData_t*> currentClientList_t; - void getClientDataForStream(const streamData::streamID_t id, currentClientList_t &client_data) throw(); - - - struct kickClientData_t - { - const uniString::utf8 m_userAgent; - const size_t m_unique; // clients' unique id - const bool m_kicked; // was ordered to be kicked and will go away soon - - kickClientData_t(const uniString::utf8 &userAgent, const size_t unique, const bool kicked) throw() - : m_userAgent(userAgent), m_unique(unique), m_kicked(kicked) {} - }; - - typedef std::vector<kickClientData_t*> kickClientList_t; - void getClientDataForKicking(const streamData::streamID_t id, kickClientList_t &kick_data) throw(); - - void catchPreAddClients(const streamData::streamID_t id); - - // kick client if it's still around - void kickClient(const streamData::streamID_t id, const size_t unique) throw(); - void kickClient(const streamData::streamID_t id, const uniString::utf8& ipAddr) throw(); - - // kick all clients currently connected - const bool kickAllClients(const streamData::streamID_t id, const bool allStreams = false) throw(); - - // kick all duplicate clients currently connected - // based on the older first and by the user-agent - const bool kickDuplicateClients(const streamData::streamID_t id) throw(); - - // kick a random nonRip client. return true if successful. If anyStream, then we can boot - // someone from another stream if we have to - const bool kickRandomNonRipClient(const streamData::streamID_t id, const bool anyStream = true) throw(); - - struct uniqueClientData_t - { - time_t m_connectTime; // longest connection time of group - uniString::utf8 m_hostName; // holds the hostname (usually only available with namelookups=1) - uniString::utf8 m_ipAddr; - uniString::utf8 m_XFF; - uniString::utf8 m_userAgent; // either holds a raw or processed list of user agents - uniString::utf8 m_unique; // unique id of the client - size_t m_total; // total number of clients on this - bool m_ripAddr; // if the address is reserved or not - - uniqueClientData_t() throw() : m_connectTime(0), m_total(0), m_ripAddr(false) {} - }; -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/streamData.cpp b/Src/Plugins/DSP/sc_serv3/streamData.cpp deleted file mode 100644 index 6a78b00f..00000000 --- a/Src/Plugins/DSP/sc_serv3/streamData.cpp +++ /dev/null @@ -1,5666 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#include <string.h> -#define strncasecmp _strnicmp -#endif -#include <assert.h> -#include <list> -#include <stdio.h> -#include <fstream> -#include <sstream> -#include "streamData.h" -#include "metadata.h" -#include "stats.h" -#include "aolxml/aolxml.h" -#include "stl/stringUtils.h" -#include "stl/stlx.h" -#include "global.h" -#include "protocol_shoutcastClient.h" -#include "bandwidth.h" -#include "uvox2Common.h" -#include "base64.h" -#include "file/fileUtils.h" -#include "ADTSHeader.h" -#include "MP3Header.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#define DEBUG_LOG(...) do { if (gOptions.streamDataDebug()) DLOG(__VA_ARGS__); } while(0) -#define AD_DEBUG_LOG(...) do { if (gOptions.adMetricsDebug()) DLOG(__VA_ARGS__); } while(0) -#define ADLOGNAME "ADVERT" -#define LOGNAME "STREAMDATA" - -/////////// statics /// - -AOL_namespace::mutex streamData::g_streamMapLock; -set<streamData*> streamData::g_streams; // all the streams, including those that are "dying" -map<streamData::streamID_t, streamData*> streamData::g_streamMap; -map<streamData::streamID_t, time_t> streamData::g_streamUptime; -map<streamData*, int> streamData::g_streamReferenceCounts; -map<streamData*, bool> streamData::g_streamSourceIsConnected; // is the source connected -AOL_namespace::mutex streamData::g_sourceRelayMapLock; -map<streamData::streamID_t, int> streamData::g_streamSourceRelayIsActive; // is the source relay active e.g. connected or trying to connect or needs to die? -AOL_namespace::mutex streamData::g_streamSongHistoryMapLock; -map<streamData::streamID_t, streamData::streamHistory_t> streamData::g_streamSongHistoryMap; -static AOL_namespace::mutex g_streamMessageMapLock; -static std::map<streamData::streamID_t, utf8> g_streamMessageMap; - -// global pool related -AOL_namespace::mutex streamData::adGroups::adContentLock; -list<streamData::specialFileData*> streamData::adGroups::adContentPending; -time_t streamData::adGroups::m_nextDownloadRun; -streamData::adGroups::gpool streamData::adGroups::adData; - -#ifdef LICENCE_FREE - -int streamData::streamInfo::m_allowSSL_global = 1; -int streamData::streamInfo::m_allowAllFormats_global = 1; -int streamData::streamInfo::m_allowBackupURL_global = 1; -int streamData::streamInfo::m_allowMaxBitrate_global = 0; - -#else -// default free version settings if no licence check response -// -int streamData::streamInfo::m_allowSSL_global = 1; -int streamData::streamInfo::m_allowAllFormats_global = 1; -int streamData::streamInfo::m_allowMaxBitrate_global = 0; -int streamData::streamInfo::m_allowBackupURL_global = 1; -#endif - - -// just make sure we drop the collected adverts, helps track memory leakage -streamData::adGroups::gpool::~gpool() -{ - for (; begin() != end(); ) - { - delete begin()->second; - erase (begin()); - } -} - -#if defined(_DEBUG) || defined(DEBUG) -map<streamData::streamID_t, FILE*> streamData::g_streamSaving; -#endif - -static size_t handle_returned_header(void *ptr, size_t size, size_t nmemb, void *stream); -static size_t handle_returned_data(void *ptr, size_t size, size_t nmemb, void *stream); -int xferinfo(void *p, curl_off_t /*dltotal*/, curl_off_t /*dlnow*/, curl_off_t /*ultotal*/, curl_off_t /*ulnow*/); - -class streamData::adGroups::adGroupsRetriever -{ -public: - stringstream ss; - CURL *m_curl; - utf8 post; - streamData::streamID_t m_sid; - char* m_curl_error; - int cleanup; - int loaded; - string last_uuid; - - adGroupsRetriever(const utf8 &url, const streamData::streamID_t sid) : m_curl(0), m_sid(sid), cleanup(0), loaded(0) - { - m_curl_error = new char[CURL_ERROR_SIZE]; - memset(m_curl_error, 0, CURL_ERROR_SIZE); - - streamData *sd = streamData::accessStream(sid); - if (sd) - { - if (!sd->radionomyID().empty() && sd->streamAdvertMode()) - { - m_curl = webClient::setupCurlDefaults(m_curl, ADLOGNAME, (url + "/?radionomyid=" + sd->radionomyID()), 0, 30L, sid); - if (m_curl) - { - const streamData::streamInfo &stream = sd->getInfo(); - - curl_easy_setopt(m_curl, CURLOPT_HEADERFUNCTION, handle_returned_header); - curl_easy_setopt(m_curl, CURLOPT_HEADERDATA, this); - curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, handle_returned_data); - curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &ss); - curl_easy_setopt(m_curl, CURLOPT_ERRORBUFFER, &(m_curl_error[0])); - - // use progress/xfer functions to trap for the server kill case - curl_easy_setopt(m_curl, CURLOPT_NOPROGRESS, 0L); - curl_easy_setopt(m_curl, CURLOPT_XFERINFOFUNCTION, xferinfo); - curl_easy_setopt(m_curl, CURLOPT_XFERINFODATA, (long)sid); - -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (m_curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - - httpHeaderMap_t vars; - vars["tstamp"] = tos(::time(NULL)); - vars["host"] = sd->streamPublicIP(); - vars["path"] = getStreamPath(sid); - vars["radionomyid"] = vars["ref"] = sd->radionomyID(); - vars["srvid"] = stream.m_serverID; - vars["bitrate"] = tos(sd->streamBitrate()); - vars["codec"] = sd->streamContentType(); - vars["server"] = "Shoutcast v" + gOptions.getVersionBuildStrings(); - vars["port"] = tos(g_portForClients); - - post = encodeVariables(vars); - curl_easy_setopt(m_curl, CURLOPT_POSTFIELDSIZE, post.size()); - curl_easy_setopt(m_curl, CURLOPT_COPYPOSTFIELDS, post.c_str()); - last_uuid = sd->advertGroups.lastUUID; - if (last_uuid == "") - AD_DEBUG_LOG ("sending no UUID", ADLOGNAME, sid); - else - AD_DEBUG_LOG ("sending UUID " + tos(last_uuid), ADLOGNAME, sid); - cleanup = 0; - loaded = 1; - } - else - WLOG ("Unable to create link for map", LOGNAME, sid); - } - // some clients may have already connected to the stream before - // it had been publically listed, so for those we need to force - // an update of the stream's information so we have the new lot - else if (sd->m_streamInfo.m_streamPublic || !gOptions.cdn().empty()) - { - int addFailIgnore = 0, errorCode = 0; - if (sd->YP2_addSuccessful(addFailIgnore, errorCode)) - { - loaded = 2; - } - } - sd->releaseStream(); - } - } - - ~adGroupsRetriever() - { - if (m_curl) - { - // incase we're mid-processig then we don't - // want to do this otherwise things go boom - // instead we allow it to remain and it'll - // be cleaned up once the abort is actioned - if (loaded && cleanup) - { - curl_easy_cleanup(m_curl); - } - m_curl = 0; - } - - forgetArray(m_curl_error); - - loaded = cleanup = 0; - } -}; - - -static size_t handle_returned_header(void *ptr, size_t size, size_t nmemb, void *stream) -{ - int amount = (int)(size * nmemb); - size_t remain = amount; - const char *p = (const char*)ptr, *eol = (const char*)memchr (p, '\r', amount); - class streamData::adGroups::adGroupsRetriever *feed = (streamData::adGroups::adGroupsRetriever*)stream; - - if (eol == NULL) - return 0; - - remain = eol - p; - if (remain > 13 && strncasecmp (p, "bluebox-uuid:", 13) == 0) - { - p += 13; - size_t skip = strspn (p, " \t"); - remain -= (13 + skip); - p += skip; - feed->last_uuid = string (p, remain); - DEBUG_LOG ("identified uuid as :" + tos (feed->last_uuid) + ":", ADLOGNAME); - } - bandWidth::updateAmount(bandWidth::ADVERTS, amount); - return amount; -} - -static size_t handle_returned_data(void *ptr, size_t size, size_t nmemb, void *stream) -{ - stringstream *ss = (stringstream*)stream; - size_t length = size * nmemb; - if (ss) - { - ss->write((const char*)ptr, length); - } - - bandWidth::updateAmount(bandWidth::ADVERTS, length); - return length; -} - -int xferinfo(void *p, curl_off_t /*dltotal*/, curl_off_t /*dlnow*/, curl_off_t /*ultotal*/, curl_off_t /*ulnow*/) -{ - long sid = (long)p; - const int killed = iskilled(); - - if (killed || (sid >= 0 && !streamData::isSourceConnected((size_t)sid))) - { - WLOG("[ADVERT sid=" + tos(sid) + "] Aborting data transfer due to the " + - (killed ? "server shutting down." : "stream source disconnecting."), ADLOGNAME, sid); - return -1; - } - return 0; -} - -// assumes the g_streamMapLock is set. Creates a stream based on the config data, installs it into -// the necessary tables and returns the result -streamData* streamData::_createNewStream(const streamSetup& setup) throw(exception) -{ - if (setup.m_sid > 0) - { - streamData *result = new streamData(setup); - if (result) - { - g_streamMap[setup.m_sid] = result; - g_streams.insert(result); - g_streamUptime[setup.m_sid] = ::time(NULL); - g_streamReferenceCounts[result] = 1; - g_streamSourceIsConnected[result] = true; - DEBUG_LOG(setup.m_logString + "Creating new stream for ID " + tos(setup.m_sid), LOGNAME, setup.m_sid); - return result; - } - else - { - DEBUG_LOG(setup.m_logString + "Failed to create new stream for ID " + tos(setup.m_sid)); - } - } - return 0; -} - -/* - Create a type 1 (old shoutcast) stream. A number of things can happen here - 1) Sources are disabled - return NULL - 2) Stream does not exist - create a new one - 3) If the stream exists and a source is connected, return NULL - 4) If the stream exists, but the source is not connected, then check the stream configuration. - a) Compatible, return the streamData - b) Incompatible, boot clients, move stream to dead pool, create a new one -*/ -streamData* streamData::createStream(const streamSetup& setup) throw(exception) -{ - streamData *result = 0; - - if (setup.m_sid > 0) - { - stackLock sml(g_streamMapLock); - - // does the stream exist - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(setup.m_sid); - - if (i == g_streamMap.end()) - { - // case 2) The stream does not exist - result = _createNewStream(setup); - } - else // cases 3 and 4 - { - streamData *sd = (*i).second; - // data structure integrity - assert(g_streamSourceIsConnected.find(sd) != g_streamSourceIsConnected.end()); - assert(g_streams.find(sd) != g_streams.end()); - assert(g_streamReferenceCounts.find(sd) != g_streamReferenceCounts.end()); - assert(g_streamReferenceCounts[sd] > 0); - - if (!g_streamSourceIsConnected[sd]) - { - // case 4 - stream exists and source is not connected - if (sd->isSourceCompatible(setup)) - { - // case 4a - streams exists and is compatible - sd->sourceReconnect(setup); - g_streamSourceIsConnected[sd] = true; - ++g_streamReferenceCounts[sd]; - result = sd; - } - else - { - if (!setup.m_backupURL.empty() && !sd->isBackupStream(setup.m_sid)) - { - sd->sourceReconnect(setup); - g_streamSourceIsConnected[sd] = true; - ++g_streamReferenceCounts[sd]; - result = sd; - } - // case 4b - source is incompatible. Move current stream to the dead pool and create a new one - else - { - DEBUG_LOG(setup.m_logString + "Source has changed. Moving old stream " + - tos(setup.m_sid) + " to dead pool and creating a new one.", LOGNAME, setup.m_sid); - // if you call die on a stream you MUST remove it from the g_streamMap - _moveStreamToDeadPool(setup.m_sid); - result = _createNewStream(setup); - } - } - } - // else, case 3 - source is connected. Do nothing and return default intializer of result (NULL) - else - { - // if we have a backup running and a non-backup trying - // to connect then we should allow it to connect to it - if (!setup.m_backup && sd->isBackupStream(setup.m_sid)) - { - // case 4xxx - source is incompatible. Move current stream to the dead pool and create a new one - sd->setKill((sd->isBackupStream(setup.m_sid) ? 2 : 1)); - sd->sourceReconnect(setup); - g_streamSourceIsConnected[sd] = true; - ++g_streamReferenceCounts[sd]; - result = sd; - } - // otherwise block the source connection from joining - // as we should not override an existing true source. - } - } - } - if (result) - result->m_startTime = ::time(NULL); - return result; -} - -////////////////////////////////////////////////////////////////////////////////////////////////// -// putting a stream, conceptually, into the dead pool requires a specific order of operations -// to avoid structure corruption. This order is different depending on the reference point -// so these calls cover the scenarios -void streamData::_moveStreamToDeadPool(streamData *sd) throw() -{ - if (sd) - { - g_streamMap.erase(sd->ID()); // do this before calling die, since die() clears objects stream ID() - g_streamUptime.erase(sd->ID()); - sd->die(); - } -} - -void streamData::removeRelayStatus(streamID_t ID) -{ - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(__FUNCTION__, LOGNAME, ID); - #endif - stackLock sml(g_sourceRelayMapLock); - - map<streamID_t, int>::iterator r = g_streamSourceRelayIsActive.find(ID); - if (r != g_streamSourceRelayIsActive.end()) - { - g_streamSourceRelayIsActive.erase(r); - } -} - - -void streamData::_moveStreamToDeadPool(map<streamID_t, streamData*>::iterator i) throw() -{ - // if you call die on a stream you MUST remove it from the g_streamMap - (*i).second->die(); - - g_streamUptime.erase((*i).second->m_ID); - g_streamMap.erase(i); -} - -bool streamData::isAllowedType(const int type) -{ - bool mp3; - return isAllowedType(type, mp3); -} - -bool streamData::isAllowedType(const int type, bool& mp3) -{ - mp3 = (type == MP3_DATA); - return (mp3 || (type == AACP_DATA) || (type == AAC_LC_DATA)); -} - -void streamData::_moveStreamToDeadPool(streamData::streamID_t id) throw() -{ - if (id > 0) - { - map<streamID_t, streamData*>::iterator i = g_streamMap.find(id); - if (i != g_streamMap.end()) - { - _moveStreamToDeadPool(i); - } - } -} - -////////////////////////////////////////////////////////////////////////////////////////////// - -// you must hold the g_streamMapLock before calling this. increases the reference count -// on stream with indicated ID. returns stream object -streamData* streamData::_increaseReferenceCount(streamID_t id) -{ - streamData *result = 0; - - if (id > 0) - { - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(id); - - if (i != g_streamMap.end()) - { - assert((*i).second); - map<streamData*, int>::iterator ic = g_streamReferenceCounts.find((*i).second); - assert(ic != g_streamReferenceCounts.end()); - assert((*ic).second); - ++(*ic).second; - result = (*i).second; - } - } - return result; -} - -// you must hold the g_streamMapLock before calling this. Decreases the reference count -// on the stream. Returns stream object if reference count has not reached zero -void streamData::_reduceReferenceCount(const utf8& logString, streamData *sd, const streamID_t id) -{ - if (sd && (id > 0)) - { - map<streamData*, int>::iterator ic = g_streamReferenceCounts.find(sd); - - // integrity checks - assert(ic != g_streamReferenceCounts.end()); - assert(g_streams.find(sd) != g_streams.end()); - assert(g_streamSourceIsConnected.find(sd) != g_streamSourceIsConnected.end()); - - /////////////////// - if (ic != g_streamReferenceCounts.end()) - { - if (--(*ic).second <= 0) - { - // clean it up - if (id) - { - g_streamMap.erase(id); - g_streamUptime.erase(id); - } - - g_streamReferenceCounts.erase(ic); - g_streamSourceIsConnected.erase(sd); - g_streams.erase(sd); - delete sd; - sd = NULL; - - if (id) - { - DEBUG_LOG (logString + "Cleaning up stream as no references remain", LOGNAME, id); - } - } - else - { - DEBUG_LOG (logString + "Stream still has " + tos((*ic).second) + " reference" + ((*ic).second > 1 ? "s" : ""), LOGNAME, id); - } - } - } -} - -void streamData::streamSourceLost(const utf8& logString, streamData *sd, const streamID_t id) -{ - if (sd && (id > 0)) - { - stackLock sml(g_streamMapLock); - - assert(g_streamSourceIsConnected[sd]); - g_streamSourceIsConnected[sd] = false; - _reduceReferenceCount(logString, sd, id); - - // if we are auto dumping our users, then move - // the stream to the dead pool immediately - bool autoDumpUsers = gOptions.stream_autoDumpUsers(id); - if (!gOptions.read_stream_autoDumpUsers(id)) - { - autoDumpUsers = gOptions.autoDumpUsers(); - } - - if (autoDumpUsers) - { - _moveStreamToDeadPool(id); - } - } - - // if there are still listeners but no sources - // then (without this) the listeners will halt - // this will force things to keep things alive - threadedRunner::wakeup(); -} - -void streamData::streamClientLost(const utf8& logString, streamData *sd, const streamID_t id) -{ - if (sd && (id > 0)) - { - stackLock sml(g_streamMapLock); - - _reduceReferenceCount(logString, sd, id); - } -} - -void streamData::streamUpdate(const streamID_t id, const uniString::utf8 &authHash, - const int streamMaxUser, const int streamMaxBitrate, - const int streamMinBitrate) throw() -{ - if (id > 0) - { - stackLock sml(g_streamMapLock); - - bool authChanged = (m_streamInfo.m_authHash != authHash); - if (authChanged && !m_streamInfo.m_authHash.empty()) - { - YP2_remove(); - } - - m_streamInfo.m_authHash = authHash; - m_streamInfo.m_streamMaxBitrate = streamMaxBitrate; - m_streamInfo.m_streamMinBitrate = streamMinBitrate; - m_streamInfo.m_streamMaxUser = streamMaxUser; - - if (authChanged && !authHash.empty()) - { - YP2_add(); - } - } -} - -void streamData::updateSourceIdent(uniString::utf8& sourceIdent, const bool relay) throw() -{ - // attempt to determine the version of the source connected - if (!sourceIdent.empty()) - { - utf8::size_type pos = sourceIdent.find(utf8("<BR>")); - if (pos != utf8::npos) - { - sourceIdent = sourceIdent.substr(0, pos); - } - pos = sourceIdent.find(utf8("Ultravox/2.1 ")); - if (pos != utf8::npos && pos == 0) - { - sourceIdent = sourceIdent.substr(13); - } - - if (!sourceIdent.empty() && ((!relay && m_streamInfo.m_sourceType != SHOUTCAST2) || relay)) - { - if (m_streamInfo.m_sourceIdent.empty() || - (m_streamInfo.m_sourceIdent == utf8("Legacy / Unknown"))) - { - m_streamInfo.m_sourceIdent = sourceIdent; - } - } - } -} - -// Client wants access to the stream. returns null if stream does not exist -// this one is only called by protocol_admincgi in order to allow metadata updates -// from sc_trans. Actual client connects should use the accessStream(streamID_t,bool) -// call, to allow consideration for whether the stream is is actually connected, or -// to allow rejection if yp2 has not returned stream information yet. -streamData* streamData::accessStream(streamID_t id) throw() -{ - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(__FUNCTION__, LOGNAME, id); - #endif - - if (id > 0) - { - try - { - if (g_streamMapLock.timedLock(3000)) - { - streamData *sd = _increaseReferenceCount(id); - g_streamMapLock.unlock(); - return sd; - } - } - catch (const exception &ex) - { - WLOG(utf8("Failed to acquire lock(1): ") + ex.what(), LOGNAME, id); - } - } - return 0; -} - -streamData* streamData::accessStream(streamID_t id, bool &isSourceActive) throw() -{ - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(utf8(__FUNCTION__) + "(2)", LOGNAME, id); - #endif - - if (id > 0) - { - try - { - if (g_streamMapLock.timedLock(3000)) - { - streamData *sd = _increaseReferenceCount(id); - if (sd) - { - assert(g_streamSourceIsConnected.find(sd) != g_streamSourceIsConnected.end()); - isSourceActive = g_streamSourceIsConnected[sd]; - } - g_streamMapLock.unlock(); - return sd; - } - } - catch (const exception &ex) - { - WLOG(utf8("Failed to acquire lock(2): ") + ex.what(), LOGNAME, id); - } - } - - isSourceActive = false; - return 0; -} - -void streamData::releaseStream() -{ - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(__FUNCTION__, LOGNAME, this->ID()); - #endif - - stackLock sml(g_streamMapLock); - - _reduceReferenceCount(utf8(), this, this->ID()); -} -////////// - -bool streamData::isSourceConnected(streamData::streamID_t id) throw() -{ - if ((id > 0) && g_streamMapLock.timedLock(3000)) - { - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(id); - if (i == g_streamMap.end()) - { - g_streamMapLock.unlock(); - return false; - } - - const bool connected = g_streamSourceIsConnected[(*i).second]; - g_streamMapLock.unlock(); - return connected; - } - return false; -} - -// is a relay source active either from trying to connect or connected -// (which also includes backup sources to prevent multiple spawning) -int streamData::isRelayActive(streamData::streamID_t id, bool &noEntry) throw() -{ - if (id > 0) - { - stackLock sml(g_sourceRelayMapLock); - - map<streamID_t,int>::const_iterator i = g_streamSourceRelayIsActive.find(id); - if (i == g_streamSourceRelayIsActive.end()) - { - noEntry = true; - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG("[STREAMDATA sid=" + tos(id) + "] isRelayActive: " + tos(id) + " ~0", LOGNAME, id); - #endif - return 0; - } - - try - { - // only signal active if 1 since 2 is used to signal being stopped - #if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG("[STREAMDATA sid=" + tos(id) + "] isRelayActive: " + tos(id) + " " + tos((id == (*i).first) ? (*i).second : 0), LOGNAME, id); - #endif - return ((id == (*i).first) ? (*i).second : 0); - } - catch(...) - { - } - } - return 0; -} - -int streamData::setRelayActiveFlags (streamData::streamID_t id, bool &noEntry, int flags, int mask) -{ - int state = 0; - string msg; - - if (id <= 0 || (mask == 0 && flags <= 0)) - return -1; - do - { - stackLock sml(g_sourceRelayMapLock); - - if (flags < 0) - { - map<streamID_t, int>::iterator r = g_streamSourceRelayIsActive.find (id); - if (r != g_streamSourceRelayIsActive.end()) - { - state = (*r).second; - flags = state & mask; - msg = " is " + tos (state) + ", flags " + tos(flags) + "/" + tos(mask); - break; // it exists, so skip the setting (flags is nonsensical) and just possible log it - } - g_streamSourceRelayIsActive[id] = 0; // create entry in map with 0 value; - noEntry = true; - return 0; - } - int &v = g_streamSourceRelayIsActive[id]; - - if (mask == 0) - mask = flags; - flags &= mask; // only focus on the requested bits. - if ((v & mask) == flags) - { - state = v; - break; // already set as this, so return -1 - } - msg = " was " + tos (v) + ", flags " + tos(flags) + "/" + tos(mask); - v = (v & ~mask) | (flags & mask); - state = v; - flags = ~state; // invalidate the last test as we have done the change. - - } while (0); - -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG("[STREAMDATA sid=" + tos(id) + "] RelayActiveFlags: " + tos(id) + " " + tos(state) + msg, LOGNAME, id); -#endif - noEntry = false; - if ((state & mask) == flags) - return -1; - return state; -} - -void streamData::setRelayActive(streamData::streamID_t id, int state) throw() -{ - int p; - do - { - if (id <= 0) - return; - - stackLock sml(g_sourceRelayMapLock); - - if (state < 0) - { - map<streamID_t, int>::iterator r = g_streamSourceRelayIsActive.find (id); - if (r != g_streamSourceRelayIsActive.end()) - { - p = state = (*r).second; - break; // it exists, so skip setting it and just report it - } - state = 0; // create entry in map with 0 value; - } - p = g_streamSourceRelayIsActive[id] = state; - } while (0); - -#if defined(_DEBUG) || defined(DEBUG) - string msg = " was " + tos (p); - DEBUG_LOG("[STREAMDATA sid=" + tos(id) + "] setRelayActive: " + tos(id) + " " + tos(state) + msg, LOGNAME, id); -#endif -} - -/////////// are used in main() to facilitate an orderly shutdown that sends the -/////////// necessary remsrv to YP -// send die signal to all streams -void streamData::killAllSources() throw() -{ - stackLock sml(g_streamMapLock); - - // if you call die on a stream you must remove it from the g_streamMap - for_each(g_streams.begin(),g_streams.end(),mem_fun(&streamData::die)); - g_streamMap.clear(); -} - -// total of all streamData objects, including those that are dying -size_t streamData::totalStreams() throw() -{ - if (g_streamMapLock.timedLock(3000)) - { - const size_t total = g_streams.size(); - g_streamMapLock.unlock(); - return total; - } - - return 0; -} - -size_t streamData::totalActiveStreams(size_t &lastSID) throw() -{ - size_t total = 0; - if (totalStreams() > 0) - { - size_t inc = 0; - size_t sid = 0; - do - { - streamInfo info; - extraInfo extra; - sid = enumStreams(inc); - if (getStreamInfo(sid, info, extra)) - { - ++total; - lastSID = sid; - } - ++inc; - } - while (sid); - } - return total; -} - -// enumerate the available number of streams actually present -size_t streamData::enumStreams(const size_t index) throw() -{ - stackLock sml(g_streamMapLock); - - if (index < g_streamMap.size()) - { - map<streamID_t,streamData*>::const_iterator i = g_streamMap.begin(); - size_t inc = 0; - while (inc < index) - { - ++inc; - ++i; - } - return (*i).second->ID(); - } - return 0; -} - -// enumerate the available number of streams to get the stream ids -streamData::streamIDs_t streamData::getStreamIds(const int mode) throw() -{ - streamIDs_t streamIds; - if (totalStreams() > 0) - { - size_t inc = 0; - size_t sid = 0; - do - { - sid = streamData::enumStreams(inc); - ++inc; - if (sid) - { - streamIds.insert(sid); - } - } - while (sid); - } - - if (mode) - { - // now we check through for any known but inactive relays - // and then get them included for being kicked as well - vector<config::streamConfig> relayList(gOptions.getRelayList()); - if (!relayList.empty()) - { - for (vector<config::streamConfig>::const_iterator i = relayList.begin(); i != relayList.end(); ++i) - { - streamIds.insert((*i).m_streamID); - } - } - - if (mode == 2) - { - // this will now do a final check for any listeners which are on - // an un-confiured stream but are being provided a 'backupfile'. - streamData::streamIDs_t activeIds = stats::getActiveStreamIds(); - if (!activeIds.empty()) - { - for (streamData::streamIDs_t::const_iterator i = activeIds.begin(); i != activeIds.end(); ++i) - { - streamIds.insert((*i)); - } - } - } - } - - return streamIds; -} - -void streamData::killStreamSource(const streamID_t id) throw() -{ - if (id > 0) - { - // handle relays / backups a bit differently from normal streams - // since if it's not been able to connect or is backup mode then - // the normal 'isSourceConnected' will not be able to kill it. - if ((!gOptions.stream_relayURL(id).empty() && gOptions.stream_movedUrl(id).empty()) || - streamData::isRelayStream(id) || streamData::isBackupStream(id)) - { - bool noEntry = false, active = ((streamData::isRelayActive(id, noEntry) & 12)); - if (active) - { - ILOG(gOptions.logSectionName() + "Kicking source for stream #" + tos(id) + ".", LOGNAME, id); - - // kick source off system - streamData::killSource(id); - } - } - else if (streamData::isSourceConnected(id)) - { - ILOG(gOptions.logSectionName() + "Kicking source for stream #" + tos(id) + ".", LOGNAME, id); - - // kick source off system - streamData::killSource(id); - } - } -} - -// used by web interface to dump a specific source -void streamData::killSource(const streamID_t id, streamData *sd) throw() -{ - if ((id > 0) && g_streamMapLock.timedLock(3000)) - { - if (sd) - { - g_streamSourceIsConnected[sd] = false; - _reduceReferenceCount(utf8(), sd, sd->ID()); - } - - // force flag a source relay kick if this is called - bool noEntry = false; - if ((isRelayActive(id, noEntry) & 12)) - { - setRelayActiveFlags (id, noEntry, 2); - } - _moveStreamToDeadPool(id); - - g_streamMapLock.unlock(); - } -} - -// you must remove this streamData object from the g_streamMap immediately before or after calling -// this, otherwise you'll corrupt the static structures. -// Reason: die will cause the streamData to be removed from g_streams, but since die() causes ID() to return zero, -// it will not get removed from g_streamMap -void streamData::die() throw() -{ - if (!m_dead) - { - stackLock sml(m_stateLock); - _YP2_remove(); - m_dead = 1; - } -} - -///////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////// -utf8 streamData::getStreamContentType(const streamID_t id) throw() -{ - if (id > 0) - { - stackLock sml(g_streamMapLock); - - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(id); - return (i == g_streamMap.end() ? (utf8)"" : (*i).second->streamContentType()); - } - return ""; -} - -const bool streamData::updateSourceSampleRate(unsigned int& samplerate, const unsigned int read_samplerate) throw() -{ - // we do some extra checking so we make sure we're got - // consecutive frames that are at the same samplerate - // otherwise we can end up with the checking spinning - //DLOG ("samp " + tos(samplerate) + " read " + tos(read_samplerate) + " last" + tos(m_lastStreamSampleRate)); - if (read_samplerate > 0) - { - if ((m_lastStreamSampleRate == 0) || - (m_lastStreamSampleRate == read_samplerate)) - { - // we've got something that matches - m_streamInfo.m_streamSampleRate = samplerate = read_samplerate; - m_lastStreamSampleRate = read_samplerate; - return true; - } - } - return false; -} - -bool streamData::isRelayStream(const streamID_t id) throw() -{ - bool result = false; - if (id > 0) - { - stackLock sml(g_streamMapLock); - - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(id); - if (i != g_streamMap.end()) - { - assert(g_streams.find((*i).second) != g_streams.end()); - result = !(*i).second->m_streamInfo.m_relayURL.empty(); - } - } - return result; -} - -bool streamData::isBackupStream(const streamID_t id) throw() -{ - bool result = false; - if (id > 0) - { - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(id); - if (i != g_streamMap.end()) - { - assert(g_streams.find((*i).second) != g_streams.end()); - // check if there is a backup specified and also if we've been set as being a running backup - result = (!(*i).second->m_streamInfo.m_backupURL.empty() && (*i).second->m_streamInfo.m_backup); - } - } - return result; -} - -bool streamData::getStreamInfo(const streamID_t id, streamInfo &info, extraInfo &extra) throw() -{ - if (id > 0) - { - extra.ypConnected = 0; - - stackLock sml(g_streamMapLock); - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(id); - if (i == g_streamMap.end()) - { - extra.ypErrorCode = 200; - extra.isConnected = false; - extra.isRelay = false; - extra.isBackup = false; - } - else - { - assert(g_streams.find((*i).second) != g_streams.end()); - assert(g_streamSourceIsConnected.find((*i).second) != g_streamSourceIsConnected.end()); - - info = (*i).second->m_streamInfo; - extra.isConnected = g_streamSourceIsConnected[(*i).second]; - extra.isRelay = !(*i).second->m_streamInfo.m_relayURL.empty(); - extra.isBackup = (!(*i).second->m_streamInfo.m_backupURL.empty() && (*i).second->m_streamInfo.m_backup); - - extra.ypErrorCode = info.m_ypResponseCode; - extra.ypConnected = ((*i).second->m_streamInfo.m_streamPublic && (info.m_ypResponseCode == 200)); - - } - } - else - { - extra.ypConnected = 0; - extra.ypErrorCode = 200; - extra.isConnected = false; - extra.isRelay = false; - extra.isBackup = false; - } - - return extra.isConnected; -} - -void streamData::getStreamSongHistory(const streamID_t id, streamHistory_t& songHistory) throw() -{ - if (id > 0) - { - stackLock sml(g_streamSongHistoryMapLock); - map<streamID_t, streamHistory_t>::const_iterator i = g_streamSongHistoryMap.find(id); - if (i != g_streamSongHistoryMap.end()) - { - songHistory = (*i).second; - } - } -} - -bool streamData::getStreamNextSongs(const streamID_t id, uniString::utf8& currentSong, - uniString::utf8& comingSoon, - vector<uniString::utf8>& nextSongs) throw() -{ - bool isConnected = false; - if (id > 0) - { - stackLock sml(g_streamMapLock); - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(id); - if (i != g_streamMap.end()) - { - assert(g_streams.find((*i).second) != g_streams.end()); - assert(g_streamSourceIsConnected.find((*i).second) != g_streamSourceIsConnected.end()); - isConnected = g_streamSourceIsConnected[(*i).second]; - currentSong = (*i).second->m_streamInfo.m_currentSong; - comingSoon = (*i).second->m_streamInfo.m_comingSoon; - nextSongs = (*i).second->m_streamInfo.m_nextSongs; - } - } - return isConnected; -} - -utf8 streamData::getContentType(const streamData::streamInfo &info) throw() -{ - utf8 content; - if (info.m_uvoxDataType == MP3_DATA) - { - content = "MP3"; - } - else if (info.m_uvoxDataType == AACP_DATA || info.m_uvoxDataType == AAC_LC_DATA) - { - content = "HE-AAC"; - } - else if (info.m_uvoxDataType == OGG_DATA) - { - content = "OGG Vorbis"; - } - else - { - content = aolxml::escapeXML(!info.m_contentType.empty() ? info.m_contentType : "unknown"); - if (content == "video/nsv") - { - content = "NSV"; - } - } - return content; -} - -//////////////////////////////////////////////////////////////////////////////////////////////// -/*********************************************************************************************/ -//////////////////////////////////////////////////////////////////////////////////////////////// - -// file names for intro and backup files can have %d in them which should be replace by the bitrate -static uniFile::filenameType parseSpecialName(const uniFile::filenameType &rootName, const size_t bitrate) throw() -{ - uniFile::filenameType result = rootName; - if (!result.empty()) - { - uniFile::filenameType::size_type pos = result.find(uniFile::filenameType("%d")); - if (pos != uniFile::filenameType::npos) - { - result.replace(pos,2,uniFile::filenameType(tos(bitrate))); - } - } - return result; -} - - -int streamData::convertRawToUvox (vector<__uint8> &sc2buffer, const vector<__uint8> &buf, - const int uvoxDataType, const int bitrate, const unsigned int samplerate) throw() -{ - __uint64 frameCount = 0; - int last_size = 0, end = 0; - const int len = (int)buf.size(); - const bool mp3 = (uvoxDataType == MP3_DATA); - - for (int i = 0; (i < (len - 8)) && !iskilled();) - { - unsigned int read_samplerate = 0; - __uint8 asc_header[2] = {0}; - int read_bitrate = 0; - const int found = (mp3 ? getMP3FrameInfo((const char*)&(buf[i]), &read_samplerate, &read_bitrate) : - getADTSFrameInfo((const char*)&(buf[i]), &read_samplerate, asc_header)); - - // need to find frames and that the input is the correct format! - // - // is a bit of a pain for AAC though as we've already done the - // rough bitrate match when the advert / intro / backup was read - // we'll just pass things through as though the bitrate is ok... - if ((found > 0) && (mp3 && bitrate ? (read_bitrate == bitrate) : 1) && - (!mp3 || !samplerate || (samplerate == read_samplerate))) - { - if (!frameCount) - { - end = i; - } - - i += (last_size = found); - - // only count valid full-size frames - if (i <= len) - { - formMessage(&buf[end], last_size, uvoxDataType, sc2buffer); - end += last_size; - ++frameCount; - } - else - { - break; - } - } - else - { - ++i; - } - } - return frameCount; -} - - -// take raw file data and build sc1 and sc2 data buffers -void streamData::specialFileData::updateUvoxData (const int uvoxDataType, - const int bitrate, const unsigned int samplerate) throw() -{ - const vector<__uint8> &buf = m_sc1Buffer; - - m_sc2Buffer.clear(); - if (buf.size() > 0) // can't take subscript of data[0] if siz==0 - { - int frames = convertRawToUvox (m_sc2Buffer, buf, uvoxDataType, bitrate, samplerate); - if (frames) - m_samplerate = samplerate; - m_missing = (frames ? false : true); - m_lastUsed = ::time(NULL); - } -} - -// replace data with collection of uvox packets with given data type -void streamData::specialFileData::replaceData(const vector<__uint8> &data, const int uvoxDataType, - const int bitrate, const unsigned int samplerate) throw() -{ - stackLock sml(m_lock); - - m_sc1Buffer = data; - - updateUvoxData (uvoxDataType, bitrate, samplerate); -} - - -void streamData::specialFileData::release (specialFileData *f) -{ - AD_DEBUG_LOG ("[STREAMDATA] content release " + f->m_description + ", count was " + tos (f->m_refcount)); - if (f->m_refcount > 1) - { - --f->m_refcount; - f->m_lastUsed = ::time (NULL); - return; - } - delete f; -} - - -int streamData::specialFileData::verifyData (const utf8 &logString) -{ - // attempt to strip out any tags from the file - // to increase client connection reliability - - size_t siz = m_sc1Buffer.size(); - // check for ID3v2.x tag - if (siz > 3 && - (m_sc1Buffer[0] == 'I') && - (m_sc1Buffer[1] == 'D') && - (m_sc1Buffer[2] == '3')) - { - int id3len = make28BitValue(&m_sc1Buffer[6]) + 10; - m_sc1Buffer.erase (m_sc1Buffer.begin(), m_sc1Buffer.begin()+id3len); - siz = m_sc1Buffer.size(); - } - - // check for ID3v1.x tag - if (siz > 128 && - (m_sc1Buffer[siz-128] == 'T') && - (m_sc1Buffer[siz-127] == 'A') && - (m_sc1Buffer[siz-126] == 'G')) - { - m_sc1Buffer.resize(siz -= 128); - } - - // check for Lyrics3 tag - if (siz > 20 && - (m_sc1Buffer[siz-9] == 'L') && - (m_sc1Buffer[siz-8] == 'Y') && - (m_sc1Buffer[siz-7] == 'R') && - (m_sc1Buffer[siz-6] == 'I') && - (m_sc1Buffer[siz-5] == 'C') && - (m_sc1Buffer[siz-4] == 'S') && - (m_sc1Buffer[siz-3] == '2') && - (m_sc1Buffer[siz-2] == '0') && - (m_sc1Buffer[siz-1] == '0')) - { - size_t length = 9; - while (length < siz - 10) - { - if ((m_sc1Buffer[siz-length] == 'L') && - (m_sc1Buffer[siz-length+1] == 'Y') && - (m_sc1Buffer[siz-length+2] == 'R') && - (m_sc1Buffer[siz-length+3] == 'I') && - (m_sc1Buffer[siz-length+4] == 'C') && - (m_sc1Buffer[siz-length+5] == 'S') && - (m_sc1Buffer[siz-length+6] == 'B') && - (m_sc1Buffer[siz-length+7] == 'E') && - (m_sc1Buffer[siz-length+8] == 'G') && - (m_sc1Buffer[siz-length+9] == 'I') && - (m_sc1Buffer[siz-length+10] == 'N')) - { - m_sc1Buffer.resize(siz -= length); - break; - } - ++length; - } - } - - // check for Ape tag - if (siz > 8) - { - size_t pos = 0; - while (pos < siz - 8) - { - if (siz > 32 && - (m_sc1Buffer[pos] == 'A') && - (m_sc1Buffer[pos+1] == 'P') && - (m_sc1Buffer[pos+2] == 'E') && - (m_sc1Buffer[pos+3] == 'T') && - (m_sc1Buffer[pos+4] == 'A') && - (m_sc1Buffer[pos+5] == 'G') && - (m_sc1Buffer[pos+6] == 'E') && - (m_sc1Buffer[pos+7] == 'X')) - { - struct HeaderData - { - __uint32 version; - __uint32 size; - __uint32 items; - __uint32 flags; - }; - HeaderData *header = (HeaderData*)&(m_sc1Buffer[pos+8]); - int size = header->size; - int flags = header->flags; - - enum - { - FLAG_HEADER_HAS_HEADER = (1 << 31), - FLAG_HEADER_NO_FOOTER = (1 << 30), - FLAG_HEADER_IS_HEADER = (1 << 29) - }; - - if (!!(flags & FLAG_HEADER_IS_HEADER) && !(flags & FLAG_HEADER_NO_FOOTER)) - { - size += 32; - } - if (!(flags & FLAG_HEADER_IS_HEADER) && !!(flags & FLAG_HEADER_HAS_HEADER)) - { - size += 32; - } - m_sc1Buffer.resize(siz -= size); - break; - } - ++pos; - } - } - int len = (int)m_sc1Buffer.size(); - if (len > 4) - { - parserInfo *parser = NULL; - unsigned syncFrames = 0; - - getFrameInfo (parser, syncFrames, (unsigned char*)&(m_sc1Buffer[0]), len, 0); - if (parser) - { - utf8 msg = logString; - - if (parser->m_reduce) - m_sc1Buffer.resize (len - parser->m_reduce); - msg += " Loaded "; - msg += m_description; - msg += ", "; - msg += tos(m_sc1Buffer.size()); - msg += " bytes, "; - msg += parser->m_description; - if (parser->m_duration < 1) - { - msg += " (frames "; - msg += tos(parser->m_frameCount); - msg += ")"; - } - m_bitrate = parser->m_bitrate; - m_samplerate = parser->m_samplerate; - m_duration = parser->m_duration; - DEBUG_LOG (msg, LOGNAME); - updateUvoxData (parser->getUvoxType(), parser->m_bitrate, parser->m_samplerate); - delete parser; - return 0; - } - if (m_description.empty() == false) - WLOG (logString + " Trouble parsing " + m_description); - - } - m_sc1Buffer.clear(); - return -1; -} - - -int streamData::cleanFileData(uniFile::filenameType fn, vector<__uint8> &buffer, size_t siz, - const int bitrate, const unsigned int samplerate, - const int /*uvoxDataType*/, const utf8& logString, - const utf8& /*description*/, unsigned int &read_samplerate) -{ - // attempt to strip out any tags from the file - // to increase client connection reliability - - // check for ID3v2.x tag - if (siz > 3 && - (buffer[0] == 'I') && - (buffer[1] == 'D') && - (buffer[2] == '3')) - { - int id3len = make28BitValue(&buffer[6]) + 10; - buffer.erase (buffer.begin(), buffer.begin()+id3len); - siz = buffer.size(); - } - - // check for ID3v1.x tag - if (siz > 128 && - (buffer[siz-128] == 'T') && - (buffer[siz-127] == 'A') && - (buffer[siz-126] == 'G')) - { - buffer.resize(siz -= 128); - } - - // check for Lyrics3 tag - if (siz > 20 && - (buffer[siz-9] == 'L') && - (buffer[siz-8] == 'Y') && - (buffer[siz-7] == 'R') && - (buffer[siz-6] == 'I') && - (buffer[siz-5] == 'C') && - (buffer[siz-4] == 'S') && - (buffer[siz-3] == '2') && - (buffer[siz-2] == '0') && - (buffer[siz-1] == '0')) - { - size_t length = 9; - while (length < siz - 10) - { - if ((buffer[siz-length] == 'L') && - (buffer[siz-length+1] == 'Y') && - (buffer[siz-length+2] == 'R') && - (buffer[siz-length+3] == 'I') && - (buffer[siz-length+4] == 'C') && - (buffer[siz-length+5] == 'S') && - (buffer[siz-length+6] == 'B') && - (buffer[siz-length+7] == 'E') && - (buffer[siz-length+8] == 'G') && - (buffer[siz-length+9] == 'I') && - (buffer[siz-length+10] == 'N')) - { - buffer.resize(siz -= length); - break; - } - ++length; - } - } - - // check for Ape tag - if (siz > 8) - { - size_t pos = 0; - while (pos < siz - 8) - { - if (siz > 32 && - (buffer[pos] == 'A') && - (buffer[pos+1] == 'P') && - (buffer[pos+2] == 'E') && - (buffer[pos+3] == 'T') && - (buffer[pos+4] == 'A') && - (buffer[pos+5] == 'G') && - (buffer[pos+6] == 'E') && - (buffer[pos+7] == 'X')) - { - struct HeaderData - { - __uint32 version; - __uint32 size; - __uint32 items; - __uint32 flags; - }; - HeaderData *header = (HeaderData*)&(buffer[pos+8]); - int size = header->size; - int flags = header->flags; - - enum - { - FLAG_HEADER_HAS_HEADER = (1 << 31), - FLAG_HEADER_NO_FOOTER = (1 << 30), - FLAG_HEADER_IS_HEADER = (1 << 29) - }; - - if (!!(flags & FLAG_HEADER_IS_HEADER) && !(flags & FLAG_HEADER_NO_FOOTER)) - { - size += 32; - } - if (!(flags & FLAG_HEADER_IS_HEADER) && !!(flags & FLAG_HEADER_HAS_HEADER)) - { - size += 32; - } - buffer.resize(siz -= size); - break; - } - ++pos; - } - } - - int read_bitrate = 0; - do - { - int len = (int)buffer.size();//, start = 0, end = 0; - if (len > 4) - { - parserInfo *parser = NULL; - unsigned syncFrames = 0; - getFrameInfo (parser, syncFrames, (unsigned char*)&(buffer[0]), len, 0); - if (parser) - { - read_bitrate = parser->m_bitrate; - read_samplerate = parser->m_samplerate; - int ok = true; - utf8 msg = logString; - - if (((read_bitrate == bitrate) || !bitrate) && - ((read_samplerate == samplerate) || !samplerate)) - msg += " Loaded "; - else - { - msg += " Mismatched "; - ok = false; - } - msg += fn; - msg += ", "; - msg += tos(buffer.size()); - msg += " bytes, "; - msg += parser->m_description; - if (parser->m_duration < 1) - { - msg += " (frames "; - msg += tos(parser->m_frameCount); - msg += ")"; - } - delete parser; - if (ok) - { - DEBUG_LOG (msg, LOGNAME); - break; - } - WLOG (msg, LOGNAME); - } - else if (fn.empty() == false) - WLOG (logString + " Trouble parsing " + fn); - } - buffer.clear(); - - } while (0); - - return read_bitrate; -} - -int streamData::specialFileData::loadFromFile(const uniFile::filenameType &name, const int bitrate, - const int /*uvoxDataType*/, const unsigned int samplerate, - const utf8& logString) throw() -{ - stackLock sml(m_lock); - - m_sc1Buffer.clear(); - m_sc2Buffer.clear(); - vector<__uint8> &buffer = m_sc1Buffer; - int read_bitrate = 0; - - uniFile::filenameType fn = parseSpecialName(name, bitrate); - if (!fn.empty()) - { - // KH, fopen etc can take some time if you are dealing with many files at once, in icecast - // I used the lower level open/seek/tell calls in the end. library allocates buffers. - // - FILE *f = uniFile::fopen(fn,"rb"); - if (f) - { - if (!::fseek(f, 0, SEEK_END)) - { - int maxSpecialFileSize = gOptions.maxSpecialFileSize(); - size_t siz = ::ftell(f); - if ((siz > 0) && ((int)siz <= maxSpecialFileSize)) - { - ::fseek(f, 0, SEEK_SET); - buffer.resize (siz); - if (::fread(&(buffer[0]), 1, siz, f) != siz) - { - ELOG(logString + " Error reading " + m_description + " file `" + fn + "'"); - } - else - { - unsigned int read_samplerate = 0; - size_t original_size = buffer.size(); - - verifyData (""); - read_bitrate = m_bitrate; - read_samplerate = m_samplerate; - if (buffer.size() > 0) - { - ILOG(logString + " Loaded " + m_description + " file `" + fn + "' (" + tos(original_size) + " bytes" + - (original_size != buffer.size() ? " - processed down to " + tos(buffer.size()) + " bytes" : "") + ")"); - } - else - { - WLOG(logString + "Skipped " + m_description + " file `" + fn + - "' as it is incompatible with the current stream format. Expected " + - tos(bitrate) + " kbps, got " + (read_bitrate > 0 ? tos(read_bitrate) : "unknown") + - " kbps. Expected " + sampleRateStr(samplerate) + ", got " + sampleRateStr(read_samplerate) + "."); - } - } - } - else - { - ELOG(logString + m_description + " " + fn + " has bad size (" + tos(siz) + ")."); - } - } - else - { - ELOG(logString + "Could not seek to end of " + m_description + " file `" + fn + "'"); - } - ::fclose(f); - } - else - { - ELOG(logString + "Could not open " + m_description + " file `" + - fn + "' (" + errMessage().hideAsString() + ")"); - } - } - return read_bitrate; -} - -void streamData::_setupBuffers(const utf8& logString, const bool re_init) throw() -{ - // load intro and backup files - size_t stream_ID = ID(); - utf8 introFile = gOptions.stream_introFile(stream_ID); - if (!gOptions.read_stream_introFile(stream_ID)) - { - introFile = gOptions.introFile(); - } - - m_introFile.loadFromFile(introFile, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - - - utf8 backupFile = gOptions.stream_backupFile(stream_ID); - if (!gOptions.read_stream_backupFile(stream_ID)) - { - backupFile = gOptions.backupFile(); - } - - m_backupFile.loadFromFile(backupFile, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - -#if 0 - utf8 adTestFile = gOptions.stream_adTestFile(stream_ID); - if (!gOptions.read_stream_adTestFile(stream_ID)) - { - adTestFile = gOptions.adTestFile(); - } - - m_adTestFile.loadFromFile(adTestFile, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - - utf8 adTestFile2 = gOptions.stream_adTestFile2(stream_ID); - if (!gOptions.read_stream_adTestFile2(stream_ID)) - { - adTestFile2 = gOptions.adTestFile2(); - } - - m_adTestFile2.loadFromFile(adTestFile2, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - - utf8 adTestFile3 = gOptions.stream_adTestFile3(stream_ID); - if (!gOptions.read_stream_adTestFile3(stream_ID)) - { - adTestFile3 = gOptions.adTestFile3(); - } - - m_adTestFile3.loadFromFile(adTestFile3, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); - - utf8 adTestFile4 = gOptions.stream_adTestFile4(stream_ID); - if (!gOptions.read_stream_adTestFile4(stream_ID)) - { - adTestFile4 = gOptions.adTestFile4(); - } - - m_adTestFile4.loadFromFile(adTestFile4, m_streamInfo.m_streamBitrate, - m_streamInfo.m_uvoxDataType, - m_streamInfo.m_streamSampleRate, logString); -#endif - ///////////////////////////////////////////// - - // determine configuration of ring buffer - size_t requestedSize = gOptions.fixedBufferSize(); - - if ((gOptions.bufferType() == 1) && (m_streamInfo.m_streamBitrate > 0)) - { - DEBUG_LOG(logString + "Calculating buffer size from time (" + - tos(m_streamInfo.m_streamBitrate) + " kbps for " + - tos(gOptions.adaptiveBufferSize()) + "s)", LOGNAME, stream_ID); - requestedSize = (size_t)((gOptions.adaptiveBufferSize() * m_streamInfo.m_streamBitrate * 1024) / 8); - } - - size_t bufferHardLimit = gOptions.bufferHardLimit(); - requestedSize = min(requestedSize, bufferHardLimit); - - DEBUG_LOG(logString + "Requested fixed size of " + tos(requestedSize), LOGNAME, stream_ID); - // make sure it's a power of two - size_t powerOfTwo = 1; - while (true) - { - size_t n = powerOfTwo * 2; - if (n >= requestedSize) - { - requestedSize = n; - break; - } - else - { - powerOfTwo = n; - } - } - - if (re_init) - { - DEBUG_LOG(logString + "Re-initialising buffers", LOGNAME, stream_ID); - m_sc1_ring_buffer.m_writePtr = m_sc21_ring_buffer.m_writePtr = 0; - } - - DEBUG_LOG(logString + "Using buffer size of " + tos(requestedSize), LOGNAME, stream_ID); - m_sc1_ring_buffer.m_data.resize(requestedSize); - m_sc21_ring_buffer.m_data.resize(requestedSize); - m_sc1_ring_buffer.m_writePtr = m_sc21_ring_buffer.m_writePtr = 0; - m_sc1_ring_buffer.m_ptrMask = m_sc21_ring_buffer.m_ptrMask = (requestedSize - 1); -} - -uniString::utf8 streamData::getYPStreamTitle() throw() -{ - // in order to determine if we should update the title in YP, we should - // get the title based on where a client would be if he/she connected right now - const sc1MetadataAndExtensionInfo md = getSc1Metadata(0xFFFFFFFF); - if (!md.m_songTitle.empty()) - { - const utf8::size_type pos1 = md.m_songTitle.find(utf8("StreamTitle='")), - pos2 = (pos1 == utf8::npos ? utf8::npos : md.m_songTitle.find(utf8("';"),pos1+13)); - - utf8 metadata = stripWhitespace((pos1 == utf8::npos) || (pos2 == utf8::npos) ? (utf8)"" : md.m_songTitle.substr(pos1+13,pos2-pos1-13)); - // we use this to provide a nicer title to the YP when the advert update occurs - int remove_size = 7; - utf8::size_type pos = metadata.find(utf8("Advert:")); - if (pos != 0) - { - pos = metadata.find(utf8("Advert!")); - } - - if (!metadata.empty() && (pos == 0)) - { - // got a first matching block - metadata = metadata.replace(0, remove_size, (utf8)""); - - // look for an end block - pos = metadata.find(utf8("Advert!")); - if (pos == utf8::npos) - { - remove_size = 7; - pos = metadata.find(utf8("Advert:")); - } - else - { - remove_size = 12; - } - - if (pos != utf8::npos) - { - metadata = metadata.replace(pos, remove_size, (utf8)""); - } - - metadata = stripWhitespace(metadata); - } - - return metadata; - } - return (utf8)""; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////// YP2 Messaging /////////////////////////////////////////////////////////////////////////////// -void streamData::_YP2_add() throw() // yp2 -{ - // only allow formats that we support - if (isAllowedType(m_streamInfo.m_uvoxDataType) && - (m_streamInfo.m_avgBitrate > 0) && - (m_streamInfo.m_streamSampleRate > 0)) - { - if ((!m_dead) && m_ID && m_streamInfo.m_streamPublic) - { -#if 0 - // in order to determine if we should update the title in YP, we should - // get the title based on where a client would be if he/she connected right now - const sc1MetadataAndExtensionInfo md = getSc1Metadata(0xFFFFFFFF); - const utf8 songTitle = getYPStreamTitle(); - - yp2::ypInfo info(m_yp2SessionKey, m_ID, m_streamInfo.m_authHash, - m_streamInfo.m_vbr, m_streamInfo.m_streamPublic, - !m_sc21AlbumArtData[0].empty(), !m_sc21AlbumArtData[1].empty()); - - info.bitrate = m_streamInfo.m_avgBitrate; - info.samplerate = m_streamInfo.m_streamSampleRate; - info.peakClientConnections = m_streamInfo.m_streamPeakUser; - info.maxClientConnections = ((m_streamInfo.m_streamMaxUser > 0) && - (m_streamInfo.m_streamMaxUser < gOptions.maxUser()) ? - m_streamInfo.m_streamMaxUser : gOptions.maxUser()); - info.mimeType = m_streamInfo.m_contentType; - info.relayURL = m_streamInfo.m_relayURL; - info.songMetadataForYP2 = (!md.m_songMetadataForYP2.empty() ? stripWhitespace(md.m_songMetadataForYP2) : - (!songTitle.empty() ? "<title seq=\"1\">" + aolxml::escapeXML(songTitle) + "</title>" : "")); - info.sourceIdent = m_streamInfo.m_sourceIdent; - info.sourceUser = m_streamInfo.m_streamUser; - - m_yp2SessionKey = yp2::add(info, m_creating); -#endif - if (m_yp2SessionKey != yp2::INVALID_SESSION_KEY) - { - m_lastTouchTitle.clear(); - } - - if (!m_maxYPInterval) - { - m_maxYPInterval = gOptions.ypReportInterval(); - } - } - } -} - -void streamData::YP2_add() throw() // yp2 -{ - stackLock sml(m_stateLock); - - _YP2_add(); -} - -// check status and update stream info -void streamData::YP2_updateInfo(const yp2::stationInfo &info) throw() -{ - stackLock sml(m_stateLock); - int maxbitrate = info.m_allowMaxBitrate > 0 ? info.m_allowMaxBitrate : m_streamInfo.m_allowMaxBitrate_global; - int allformats = info.m_allowAllFormats < 0 ? m_streamInfo.m_allowAllFormats_global : info.m_allowAllFormats; - - m_streamInfo.m_streamName = info.m_streamTitle; - m_streamInfo.m_radionomyID = info.m_radionomyID; -#if 0 - for (int i = 0; i < 5; i++) - { - m_streamInfo.m_streamGenre[i] = info.m_streamGenre[i]; - } - m_streamInfo.m_streamURL = info.m_broadcasterURL; - m_streamInfo.m_backupServer = info.m_backupServer; - m_streamInfo.m_backupServersList = info.m_backupServersList; - m_streamInfo.m_publicIP = info.m_publicIP; -#endif - if (m_streamInfo.m_ypResponseCode == 0) - metrics::metrics_stream_up (m_ID, m_streamInfo.m_radionomyID, info.m_serverID, gOptions.publicIP(), getStartTime()); - - m_streamInfo.m_advertMode = info.m_advertMode; - m_streamInfo.m_ypResponseCode = info.m_responseCode; - - // use global default if per-stream settings not provided - m_streamInfo.m_allowSSL = info.m_allowSSL < 0 ? m_streamInfo.m_allowSSL_global : info.m_allowSSL; - m_streamInfo.m_allowAllFormats = allformats; - m_streamInfo.m_allowMaxBitrate = maxbitrate; - m_streamInfo.m_allowBackupURL = info.m_allowBackupURL < 0 ? m_streamInfo.m_allowBackupURL_global : info.m_allowBackupURL; - m_streamInfo.m_stationID = info.m_stationID; - m_streamInfo.m_serverID = info.m_serverID; - advertGroups.setType (info.m_advertType); - - if (gOptions.adMetricsDebug()) - { - string s = "using licence attribs, bitrate "; - if (m_streamInfo.m_allowMaxBitrate) - s += tos (m_streamInfo.m_allowMaxBitrate); - else - s += "unrestricted"; - s += ", fmts "; - s += tos (m_streamInfo.m_allowAllFormats); - s += ", ssl "; - s += tos (m_streamInfo.m_allowSSL); - s += ", backup "; - s += tos (m_streamInfo.m_allowBackupURL); - s += ", ad "; - s += tos (m_streamInfo.m_advertMode); - if (m_streamInfo.m_advertMode == 1) - { - s += ", ad mode "; - s += info.m_advertType.hideAsString(); - if (advertGroups.m_type == ADVERT_MAP_PAUSE) // maybe magic as well - { - size_t min_buf = m_streamInfo.m_streamBitrate * 1000 * 300 / 8; // 5 minutes - size_t powerOfTwo = 1; - while (true) - { - size_t n = powerOfTwo * 2; - if (n >= min_buf) - { - min_buf = n; - break; - } - else - { - powerOfTwo = n; - } - } - - if (min_buf > m_sc1_ring_buffer.m_data.size()) - { - m_sc1_ring_buffer.m_data.resize (min_buf); - m_sc21_ring_buffer.m_data.resize(min_buf); - m_sc1_ring_buffer.m_ptrMask = m_sc21_ring_buffer.m_ptrMask = (min_buf - 1); - s += ", resized buffer to "; - s += tos (min_buf); - } - } - } - DLOG (s, LOGNAME, m_ID); - } -} - -bool streamData::YP2_addSuccessful(int &addFailIgnore, int &errorCode) throw() -{ - stackLock sml(m_stateLock); - - yp2::addState_t result = yp2::addStatus(m_yp2SessionKey, addFailIgnore, errorCode); - return (!addFailIgnore ? (result == yp2::ADD_SUCCEEDED) : true); -} - -void streamData::_YP2_remove() throw() -{ - if ((!m_dead) && m_ID && m_streamInfo.m_streamPublic) - { -#if 0 - yp2::ypInfo info(m_yp2SessionKey, m_ID, m_streamInfo.m_authHash, - m_streamInfo.m_vbr, m_streamInfo.m_streamPublic); - - info.streamStartTime = m_startTime; - info.peakClientConnections = m_streamInfo.m_streamPeakUser; - info.maxClientConnections = ((m_streamInfo.m_streamMaxUser > 0) && - (m_streamInfo.m_streamMaxUser < gOptions.maxUser()) ? - m_streamInfo.m_streamMaxUser : gOptions.maxUser()); - - yp2::remove(info); -#endif - pushMetricsYP(); - metrics::metrics_stream_down (m_ID, m_streamInfo.m_radionomyID, - m_streamInfo.m_serverID, gOptions.publicIP(), m_startTime); - } -} - -void streamData::YP2_remove() throw() -{ - stackLock sml(m_stateLock); - - _YP2_remove(); -} - -#if 0 -inline void streamData::YP2_update() throw() -{ - m_stateLock.lock(); - - time_t t = ::time(NULL), elapsed = (t - m_lastYPTime); - if (((m_streamInfo.m_streamPublic || !gOptions.cdn().empty()) && (!m_dead) && m_ID && - // make sure we're looking at min and max intervals to ensure we send updates - // even when playing long mixes otherwise we can potentially drop off the YP. - // - // 2.4.8 we now have a fixed min-interval but if there's been no YP add yet - // then we have a 2sec minimum which is a bit more response whilst allowing - // for failed sources / relay connections to do things so we don't YP spam - (elapsed >= (m_yp2SessionKey ? 10 : 2) || elapsed >= m_maxYPInterval))) - { - // make sure we're added - if (m_yp2SessionKey == 0) - { - _YP2_add(); - } - - if (m_yp2SessionKey) - { - // in order to determine if we should update the title in YP, we should - // get the title based on where a client would be if he/she connected right now - m_stateLock.unlock(); - const uniString::utf8 songTitle = getYPStreamTitle(); - - // its touch time - if ((songTitle != m_lastTouchTitle) || (elapsed >= m_maxYPInterval)) - { - yp2::ypInfo info(m_yp2SessionKey, m_ID, m_streamInfo.m_authHash, - m_streamInfo.m_vbr, m_streamInfo.m_streamPublic, - !m_sc21AlbumArtData[0].empty(), !m_sc21AlbumArtData[1].empty()); - - stats::statsData_t data; - stats::getStats(m_ID, data, true); - - info.numListeners = data.connectedListeners; // li - info.avgUserListenTime = data.avgUserListenTime; // alt - info.numberOfClientsConnectedMoreThanFiveMinutes = data.newSessions; // cm - info.numberOfClientConnectsSinceLastUpdate = data.newConnects; // ht - info.numUniqueListeners = data.uniqueListeners; - - const ringBufferAccess_t startPos = getClientStartPosition(); - const sc1MetadataAndExtensionInfo md = getSc1Metadata((!startPos ? 0xFFFFFFFF : startPos)); - - //info.peakClientConnections = m_streamInfo.m_streamPeakUser; - info.maxClientConnections = ((m_streamInfo.m_streamMaxUser > 0) && - (m_streamInfo.m_streamMaxUser < gOptions.maxUser()) ? - m_streamInfo.m_streamMaxUser : gOptions.maxUser()); - info.songMetadataForYP2 = (!md.m_songMetadataForYP2.empty() ? stripWhitespace(md.m_songMetadataForYP2) : - "<title seq=\"1\">" + aolxml::escapeXML(songTitle) + "</title>"); - info.sourceIdent = m_streamInfo.m_sourceIdent; - info.sourceUser = m_streamInfo.m_streamUser; - info.bitrate = m_streamInfo.m_avgBitrate; - info.samplerate = m_streamInfo.m_streamSampleRate; - info.mimeType = m_streamInfo.m_contentType; - info.relayURL = m_streamInfo.m_relayURL; - - m_stateLock.lock(); - yp2::updateResult ur = yp2::update(info); - - m_maxYPInterval = ur.m_maxYPInterval; - if (ur.m_requestQueued) - { - m_lastYPTime = t; - m_lastTouchTitle = songTitle; - } - m_stateLock.unlock(); - } - return; - } - } - m_stateLock.unlock(); -} -#endif - -int streamData::YP_SrvID(const streamID_t id) throw() -{ - if (id > 0) - { - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(id); - if (i == g_streamMap.end()) - { - return 0; - } - return yp2::getSrvID((*i).second->m_yp2SessionKey); - } - return 0; -} - -int streamData::YP_StnID(const streamID_t id) throw() -{ - if (id > 0) - { - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(id); - if (i == g_streamMap.end()) - { - return 0; - } - return yp2::getStnID((*i).second->m_yp2SessionKey); - } - return 0; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -streamData::streamData(const streamSetup& setup) throw() - : m_ID(setup.m_sid), m_nextYPPush(::time(NULL)+10), - m_maxYPInterval(gOptions.ypReportInterval()), - m_yp2SessionKey(111), m_creating(0), - m_kill(0), m_dead(0), m_adTest(0), m_insertAdvert(false), - m_lastStreamSampleRate(setup.m_sampleRate), - m_lastStreamBitrate(0), m_syncFrameCount(0), - m_introFile("intro"), m_backupFile("backup"), - m_adTestFile("test advert"), m_adTestFile2("test advert"), - m_adTestFile3("test advert"), m_adTestFile4("test advert"), - advertGroups(this), m_parser(NULL) -{ - sourceReconnect(setup); - _setupBuffers(srcAddrLogString(setup.m_srcAddr, setup.m_srcPort, setup.m_sid)); -} - -streamData::~streamData() throw() -{ - DEBUG_LOG("[STREAMDATA sid=" + tos(m_ID) + "] " + __FUNCTION__, LOGNAME, m_ID); - - //YP2_remove(); - - m_sc1_ring_buffer.m_writePtr = m_sc21_ring_buffer.m_writePtr = 0; - delete m_parser; -} - -// sc1 style. Return false if stream is already connected -void streamData::sourceReconnect(const streamSetup& setup) throw() -{ - stackLock sml(m_stateLock); - - const bool uvox = (setup.m_sourceType == SHOUTCAST2), - native = (setup.m_sourceType != HTTP); - - m_streamInfo.m_backup = setup.m_backup; - m_streamInfo.m_streamUser = setup.m_streamUser; - m_streamInfo.m_allowPublicRelay = setup.m_allowPublicRelay; - m_streamInfo.m_streamMaxBitrate = setup.m_maxStreamBitrate; - m_streamInfo.m_streamMinBitrate = setup.m_minStreamBitrate; - m_streamInfo.m_streamMaxUser = setup.m_maxStreamUser; - m_streamInfo.m_streamSampleRate = setup.m_sampleRate; - m_streamInfo.m_authHash = setup.m_authHash; - m_streamInfo.m_vbr = setup.m_vbr; - - m_streamInfo.m_srcAddr = setup.m_srcAddr; - m_streamInfo.m_srcPort = setup.m_srcPort; - - m_streamInfo.m_relayURL = setup.m_relayURL; - m_streamInfo.m_backupURL = setup.m_backupURL; - - if (!uvox) - { - m_streamInfo.m_streamName = mapGet(setup.m_headers, (native ? "icy-name" : "ice-name"), (utf8)""); - m_streamInfo.m_streamGenre[0] = mapGet(setup.m_headers, (native ? "icy-genre" : "ice-genre"), utf8("Misc")); - } - else - { - m_streamInfo.m_streamName = setup.m_config.m_icyName; - m_streamInfo.m_streamGenre[0] = setup.m_config.m_icyGenre; - } - - for (int i = 1; i < 5; i++) - { - m_streamInfo.m_streamGenre[i].clear(); - } - - if (!uvox) - { - m_streamInfo.m_streamBitrate = getStreamBitrate(setup.m_headers); - m_streamInfo.m_streamSampleRate = getStreamSamplerate(setup.m_headers); - m_streamInfo.m_streamURL = mapGet(setup.m_headers, (native ? "icy-url" : "ice-url"), (utf8)"http://www.shoutcast.com"); - // sanity handling to map things to something which the YP2 will definitely like - m_streamInfo.m_contentType = fixMimeType(mapGet(setup.m_headers, "content-type", utf8("audio/mpeg"))); - m_streamInfo.m_streamPublic = mapGet(setup.m_headers, (native ? "icy-pub" : "ice-pub"), false); - } - else - { - m_streamInfo.m_streamBitrate = (setup.m_config.m_avgBitrate / 1000); - m_streamInfo.m_streamURL = setup.m_config.m_icyURL; - m_streamInfo.m_contentType = setup.m_config.m_mimeType; - m_streamInfo.m_streamPublic = (setup.m_config.m_icyPub ? true : false); - } - - // see if there's a per-stream option else revert to master - utf8 pub = toLower(gOptions.stream_publicServer(setup.m_sid)); - if (pub.empty()) - { - pub = toLower(gOptions.publicServer()); - } - if (pub == "always") - { - m_streamInfo.m_streamPublic = true; - } - else if (pub == "never") - { - m_streamInfo.m_streamPublic = false; - } - - m_streamInfo.m_sourceType = setup.m_sourceType; - - if (!uvox) - { - m_streamInfo.m_avgBitrate = m_streamInfo.m_minBitrate = - m_streamInfo.m_maxBitrate = (m_streamInfo.m_streamBitrate * 1000); - } - else - { - m_streamInfo.m_avgBitrate = setup.m_config.m_avgBitrate; - m_streamInfo.m_minBitrate = m_streamInfo.m_maxBitrate = setup.m_config.m_maxBitrate; - } - - if ((m_streamInfo.m_contentType == "audio/ogg" || m_streamInfo.m_contentType == "application/ogg")) - { - m_streamInfo.m_uvoxDataType = OGG_DATA; - m_streamInfo.m_vbr = true; - } - else if ((m_streamInfo.m_contentType == "audio/aac") || (m_streamInfo.m_contentType == "audio/aacp")) - { - m_streamInfo.m_uvoxDataType = AACP_DATA; - } - else - { - m_streamInfo.m_uvoxDataType = MP3_DATA; - } - - // uvox codes for intro and backup files will be wrong if contentType is empty. This is only a problem - // if we are using vanilla uvox 2 which does not send a mime type (uvox 2.1 does, however) - if (m_streamInfo.m_contentType.empty()) - { - WLOG("Content type of stream " + tos(m_ID) + " is empty. Intro and backup files may not work.", LOGNAME, m_ID); - } - - g_streamUptime[m_ID] = ::time(NULL); - delete m_parser; - m_parser = NULL; -} - - -MP3_FrameInfo *streamData::detectMP3 (unsigned int &failureThresh, const unsigned char *buf, unsigned int buflen, unsigned chk) -{ - unsigned loop = chk ? chk : 10000, remain = buflen, frames = 0; - MP3_FrameInfo info, *parser = NULL; - const unsigned char *p = buf; - __uint64 samples = 0; - - if (buflen < 3000) // get sufficient data to check, saves failing part way through - return NULL; - int len = getMP3FrameInfo (p, buflen, info); - // check a few frames to see about consistency - while (len > 0) - { - //DLOG ("loop is " + tos(loop)); - len = info.verifyFrame (p, remain); - if (len <= 0 || len > remain) - break; - samples += info.m_samples; - frames++; - p += len; - remain -= len; - loop--; - // DLOG("Detecting frames, loop " + tos(loop) + ", remain " + tos(remain)); - } - if (samples > 1000) - { - failureThresh += 100; - parser = new MP3_FrameInfo (buf, buflen); - parser->m_inUse = true; - parser->m_description += info.getVersionName(); - parser->m_description += " layer "; - parser->m_description += info.getLayerName(); - parser->m_description += (info.m_mono ? " mono" : " stereo"); - if (chk == 0 && loop && samples && info.m_samplerate) - { - parser->m_frameCount = frames; - parser->m_duration = ((float)samples / info.m_samplerate); - parser->m_description += " duration "; - parser->m_description += tos (parser->m_duration); - parser->m_description += "s"; - } - if (remain && chk == 0 && loop) - { - parser->m_description += ", reduced size by "; - parser->m_description += tos (remain); - parser->m_reduce = remain; - } - } - return parser; -} - -static unsigned long getMSB4 (unsigned long v) -{ - unsigned long m = v; - int c = 0; - - for (; m > 15; c++, m >>= 1) - ; - DEBUG_LOG ("bitrate estimate mark " + tos(m)); - if (m == 0xF) // binary 1111 is not a normal bit pattern, adjust to 1000 - m = 0x10; - if (m == 0xB) // binary 1011 is not a normal bit pattern, adjust to 1100 - m = 0xC; - return c ? m << c : m; -} - -AAC_FrameInfo *streamData::detectAAC (unsigned int &failureThresh, const unsigned char *buf, unsigned int buflen, unsigned chk) -{ - unsigned int loop = chk ? chk : 10000, remain = buflen; - int bytes = 0; - float fcount = 0; - AAC_FrameInfo info, *parser = NULL; - const unsigned char *p = buf; - - if (buflen < 8000) // get sufficient data to check, saves failing part way through - return 0; - int len = getAACFrameInfo (p, buflen, info); - - // check a few frames to see about consistency - while (len > 0) - { - len = info.verifyFrame (p, remain); - if (len == 0 || len > remain) // short - break; - if (len < 0) // failed to match - break; - p += len; - remain -= len; - bytes += (len - 7); // drop the adts frame header - fcount += info.m_blocks; - loop--; - // DLOG("Detecting frames, loop " + tos(loop) + ", remain " + tos(remain)); - } - if (bytes > 1000) - { - parser = new AAC_FrameInfo (buf, buflen); - failureThresh += 100; - parser->m_inUse = true; - info.m_description += stringUtil::tos (info.m_samplerate); - info.m_description += "hz"; - - // increase the average a small amount, just to help rounding, we do tuncate later - int r = (int)((bytes * 1.028 / fcount) * (parser->m_samplerate / 1000.0)) * 8; - - parser->m_bitrate = getMSB4 ((r/1024)); - parser->m_frameCount = fcount; - - parser->m_description += info.getVersionName(); - parser->m_description += ", "; - parser->m_description += info.getAOT(); - parser->m_description += " ("; - parser->m_description += stringUtil::tos (info.m_aot); - parser->m_description += "), "; - parser->m_description += stringUtil::tos (info.m_samplerate); - parser->m_description += "hz, estimated "; - parser->m_description += tos (parser->m_bitrate); - parser->m_description += " kbps"; - if (remain && chk == 0 && loop) - { - parser->m_description += ", reduced size by "; - parser->m_description += tos (remain); - parser->m_reduce = remain; - } - } - return parser; -} - - -int streamData::getFrameInfo (parserInfo *&parser, unsigned &failureThresh, const unsigned char *buf, unsigned int len, unsigned chk) -{ - int ret = 0, loop = 100; - do - { - loop--; - if (parser && parser->m_inUse) - { - ret = parser->verifyFrame (buf, len); - if (ret >= 0) - break; - delete parser; - parser = NULL; - } - if (len < 3000) - return 0; - parser = detectMP3 (failureThresh, buf, len, chk); - if (parser) - continue; - parser = detectAAC (failureThresh, buf, len, chk); - if (parser) - continue; - return len < 12000 ? 0 : -1; - } while (loop); - - // maybe ID3 check? - if (failureThresh > 0) - --failureThresh; - return ret; -} - - -const bool streamData::syncToStream(short unsigned int& remainderSize, __uint8 *remainder, - int amt, int& bitrate, const int type, const char *buf, - const utf8& logString) -{ - unsigned int samplerate = m_streamInfo.m_streamSampleRate; - bool mp3; - if (streamData::isAllowedType(type, mp3)) - { - int end = 0; - - //DLOG ("process block of " + tos (amt)); - for (int i = 0; (i < (amt - 8)) && !iskilled();) - { - unsigned int read_samplerate = 0; - int read_bitrate = 0; - const unsigned char* f = (const unsigned char *)&(buf[i]); - int remain = amt - i; - int restart = m_parser == NULL ? 1 : 0; - - int found = getFrameInfo (m_parser, m_syncFrameCount, f, remain); - - if (found > remain || found == 0) - { - end = i; - // DLOG ("Need more data for " + tos(found) + " , remaining " + tos(remain)); - break; - } - // DLOG ("frame size return " + tos (found)); - - if (m_parser) - { - if (restart) - { - utf8 msg = logString; - - msg += "stream detected "; - msg += m_parser->m_description; - ILOG (msg, LOGNAME, ID()); - } - read_samplerate = m_parser->m_samplerate; - read_bitrate = m_parser->m_bitrate; - } - - // DLOG ("FME: frame size is " + tos (found)); - if (found > 0) - { - if (m_streamInfo.m_streamSampleRate == 0 && read_samplerate) - { - m_streamInfo.m_streamSampleRate = (samplerate = read_samplerate); - } - if (m_streamInfo.m_streamBitrate == 0) - { - // update everything as we'll have no bitrate if we're calling this... - if (read_bitrate == 0 && bitrate > 0) - m_streamInfo.m_streamBitrate = bitrate; - else - m_streamInfo.m_streamBitrate = (bitrate = read_bitrate); - m_streamInfo.m_avgBitrate = m_streamInfo.m_minBitrate = - m_streamInfo.m_maxBitrate = (bitrate * 1000); - - DEBUG_LOG ("No bitrate info provided, assuming stream settings at " + tos(bitrate) + "k", LOGNAME, ID()); - - // we need to kick things back into shape at this point... - _setupBuffers(logString, true); - - _YP2_add(); - } - if (read_bitrate && m_streamInfo.m_streamBitrate && m_streamInfo.m_vbr == false) - { - if (m_lastStreamBitrate) - { - if (m_lastStreamBitrate != read_bitrate) - { - m_streamInfo.m_vbr = true; - DEBUG_LOG ("Detected bitrate change (vBR) from " + tos (m_streamInfo.m_streamBitrate) + " to " + tos (read_bitrate), LOGNAME, ID()); - } - else - { - if (read_bitrate != m_streamInfo.m_streamBitrate) - { - utf8 msg = "expected bitrate of "; - msg += tos (m_streamInfo.m_streamBitrate); - msg += "k, actually found "; - msg += tos(read_bitrate); - msg += "k, will assume that"; - ILOG (msg, LOGNAME, ID()); - m_streamInfo.m_streamBitrate = read_bitrate; - } - } - } - else - m_lastStreamBitrate = read_bitrate; - } -#if defined(_DEBUG) || defined(DEBUG) - writeSc1((const __uint8 *)&buf[end], found, ID()); -#else - writeSc1((const __uint8 *)&buf[end], found); -#endif - end += found; - i += found; - } - else - { - m_syncFrameCount += 50; - if (m_syncFrameCount > 700) // threshold before dropping stream - return true; - - // otherwise we just need to move on and keep - // looking for what is a valid starting frame - const void *p = memchr (f+1, 255, remain-1); - if (p) - { - i = (int)((unsigned char*)p - (unsigned char*)buf); - DEBUG_LOG ("FMK: found marker, searching from " + tos(i) + " in len " + tos(amt) + ", sync " + tos(m_syncFrameCount), LOGNAME, ID()); - } - else - { - end = i = amt; - DEBUG_LOG ("FMK: skipping to end " + tos (i), LOGNAME, ID()); - } - } - } - - amt = (amt - end); - // DLOG ("EOB: remainder " + tos (remainderSize) + ", end " + tos(end) + ", amt " + tos(amt)); - if ((amt > 0)) // && (samplerate > 0)) - { - memcpy(&(remainder[remainderSize]), &buf[end], amt); - remainderSize += amt; - } - } - - return false; -} - -utf8 streamData::getHTML5Player(const size_t sid) throw() -{ - return "<tr><td colspan=\"2\" align=\"center\"><audio " - "id=\"audio_" + tos(sid) + "\" controls preload=\"none\" " - "style=\"width:16em;padding:0;\"><source src=\"" + - getStreamPath(sid, true) + (getStreamContentType(sid) == "video/nsv" ? - ";stream.nsv" : "") + "?type=http&nocache=" + tos(++gFF_fix) + - "\" type='audio/mpeg'></audio></td></tr>"; -} - -utf8 streamData::getStreamMessage(const size_t sid) throw() -{ - stackLock sml(g_streamMessageMapLock); - - map<streamID_t,utf8>::const_iterator i = g_streamMessageMap.find(sid); - if (i != g_streamMessageMap.end()) - { - return (*i).second; - } - return ""; -} - -void streamData::updateStreamMessage(const size_t sid, const uniString::utf8& message) throw() -{ - stackLock sml(g_streamMessageMapLock); - - if (message.empty() || (message == "<clear>")) - { - map<streamID_t,utf8>::iterator i = g_streamMessageMap.find(sid); - if (i != g_streamMessageMap.end()) - { - (*i).second.clear(); - } - } - else - { - g_streamMessageMap[sid] = message; - } -} - -const bool streamData::isSourceCompatible(const streamSetup& setup) const throw() -{ - stackLock sml(m_stateLock); - - if (setup.m_sourceType == SHOUTCAST2) - { - if (m_streamInfo.m_contentType != setup.m_config.m_mimeType) - { - return false; - } - - if (m_streamInfo.m_avgBitrate != setup.m_config.m_avgBitrate) - { - return false; - } - if (m_streamInfo.m_maxBitrate != setup.m_config.m_maxBitrate) - { - return false; - } - if (m_streamInfo.m_minBitrate != setup.m_config.m_maxBitrate) - { - return false; - } - return true; - } - else - { - if (m_streamInfo.m_sourceType == SHOUTCAST2) - { - return false; - } - if (m_streamInfo.m_contentType != mapGet(setup.m_headers, "content-type", utf8("audio/mpeg"))) - { - return false; - } - if (!m_streamInfo.m_streamBitrate || (m_streamInfo.m_streamBitrate != getStreamBitrate(setup.m_headers))) - { - return false; - } - return true; - } -} - -// write data into a ring buffer. if packet_starts is provided, then add an entry to it (and also clean it up as necessary) -static void writeToRingBuffer(const __uint8 *data, int amt, AOL_namespace::rwLock &bufferLock, - streamData::ringBuffer_t &buffer, - deque<streamData::ringBufferAccess_t> *packet_starts = 0) throw() -{ - stackRWLock sl (bufferLock, false); - if (packet_starts) - { - - const streamData::ringBufferAccess_t ptr = buffer.m_writePtr, - bottom = (ptr - buffer.m_data.size()); // warning this could wrap - - // add new entry - packet_starts->push_back(buffer.m_writePtr); - - // cleanup old ones - int remove_count = 0; - for (deque < streamData::ringBufferAccess_t>::const_iterator i = packet_starts->begin(); i != packet_starts->end(); ++i) - { - streamData::ringBufferAccess_t v = (*i); - // edge case, ptr has rolled over, therefore bottom > ptr - if (bottom > ptr) - { - if ((v < bottom) && (v > ptr)) - { - ++remove_count; - } - else - { - break; - } - } - else - { - // normal case - if ((v < bottom) || (v > ptr)) // note: (v > ptr) probably not necessary, but can't hurt - { - ++remove_count; - } - else - { - break; - } - } - } - while ((remove_count--) > 0) - { - packet_starts->pop_front(); - } - } - - size_t remain = amt; - - while (remain > 0) - { - // get masked ring offset - const streamData::ringBufferAccess_t o = (buffer.m_writePtr & buffer.m_ptrMask); - // don't write beyond end of buffer - const size_t amt_to_write = min (remain, (buffer.m_data.size() - o)); - - memcpy(&(buffer.m_data[o]), data, amt_to_write); - // advance pointers - data += amt_to_write; - remain -= amt_to_write; - buffer.m_writePtr += amt_to_write; - } -} - -// data is shoutcast1 format WITH NO METADATA. Insert into the two ring buffers -#if defined(_DEBUG) || defined(DEBUG) -void streamData::writeSc1(const __uint8 *data, const int amt, const streamID_t) -#else -void streamData::writeSc1(const __uint8 *data, const int amt) -#endif -{ - time_t now = ::time(NULL); - if (m_insertAdvert) - { - adTrigger *t = advertGroups.triggers.empty() ? NULL : advertGroups.triggers.front(); - if (t && t->m_playedAt == (time_t)0) - { - writeToRingBuffer((const __uint8*)"SCAdvert", 8, m_sc1StreamLock, m_sc1_ring_buffer); - writeToRingBuffer((const __uint8*)"SCAdvert", 8, m_sc21StreamLock, m_sc21_ring_buffer); - t->m_startPosSC1 = m_sc1_ring_buffer.m_writePtr; - t->m_startPosSC2 = m_sc21_ring_buffer.m_writePtr; - t->m_returnPtrSC1 = m_sc1_ring_buffer.m_writePtr; - t->m_returnPtrSC2 = m_sc21_ring_buffer.m_writePtr; - t->m_type = advertGroups.m_type; - - if (t->m_type == ADVERT_MAP_FIXED || t->m_type == ADVERT_MAP_FLEX) // overlay - { - t->m_returnPtrSC1 += advertGroups.overlaySize (t); - t->m_returnPtrSC2 += advertGroups.overlaySize (t, true); - DLOG ("overlay of ads, returning to " + tos(t->m_returnPtrSC1), LOGNAME, m_ID); - } - else - { - DLOG ("insert of ads, returning to " + tos(t->m_returnPtrSC1), LOGNAME, m_ID); - } - t->m_playedAt = time(NULL); - t->m_duration = m_duration; - - metrics::adSummary summary; - summary.id = t->m_id; - summary.sid = ID(); - summary.path = getStreamPath (ID()); - summary.tstamp = now; - summary.count = stats::getUserCount (ID()); - summary.sd = this; - - metrics::metrics_advert_started (summary); - } - m_insertAdvert = false; - } - - long uptime = now - streamData::getStreamUptime(ID()); - if ((uptime & 7) == 7) // check for some things every 8 seconds - { - advertGroups.purge (m_sc1_ring_buffer); - - if (m_streamInfo.m_allowAllFormats == 0 && m_parser && m_parser->getUvoxType() != MP3_DATA) - { - WLOG ("Format is not MP3, where only MP3 is allowed", "Licence", ID()); - throwEx<runtime_error>(""); - } - if (m_streamInfo.m_allowMaxBitrate && m_streamInfo.m_avgBitrate) - { - int avg = m_streamInfo.m_avgBitrate/1000; - if (avg > (m_streamInfo.m_allowMaxBitrate + 5)) - { - string msg = "Dropping as bitrate needs to be " + tos (m_streamInfo.m_allowMaxBitrate) + "k or less, currently " + tos (avg) +"k"; - WLOG (msg, "Licence", ID()); - throwEx<runtime_error>(""); - } - } - } - - // sc1 - if (amt > 0) - { - int len = amt; - // put into the sc1 buffer - writeToRingBuffer(data, len, m_sc1StreamLock, m_sc1_ring_buffer, &m_sc1_packet_starts); -#if 0 - // TODO would be nice to have this as a more formal thing for debugging and / or backup - if (!g_streamSaving[id]) - { - g_streamSaving[id] = uniFile::fopen("D:\\Dev\\git_radionomy\\SHOUTcast\\sc_serv3\\test_" + tos(id) + (m_streamInfo.m_uvoxDataType == MP3_DATA ? ".mp3" : ".aac"), "wb"); - } - if (g_streamSaving[id]) - { - fwrite(data, 1, amt, g_streamSaving[id]); - } - stackLock sml(m_sc1LimitTriggerLock); - for_each(m_sc1LimitTriggers.begin(), m_sc1LimitTriggers.end(), mem_fun(&pipeDrivenSignal<AOL_namespace::mutex>::set)); -#endif - } - // sc1 - - // sc21 - m_sc21MetadataLock.lock(); - uvoxMetadata_t md = m_sc21MetadataToPutInline; - m_sc21MetadataToPutInline.clear(); - m_sc21MetadataLock.unlock(); - - // const bool trigger = ((amt > 0) || (!md.empty())); - - if (!md.empty()) - { - writeToRingBuffer((const __uint8*)&md[0], (int)md.size(), m_sc21StreamLock, m_sc21_ring_buffer); - } - - int len = amt; - while (len > 0) - { - __uint8 uvoxBuffer[MAX_MESSAGE_SIZE] = {0}; - int left_over = formMessage(data, len, m_streamInfo.m_uvoxDataType, uvoxBuffer); - writeToRingBuffer((const __uint8*)uvoxBuffer, len - left_over + UV2X_OVERHEAD, - m_sc21StreamLock, m_sc21_ring_buffer, &m_sc21_packet_starts); - data += (len - left_over); - len = left_over; - } -#if 0 - if (trigger) - { - stackLock sml(m_sc21LimitTriggerLock); - for_each(m_sc21LimitTriggers.begin(), m_sc21LimitTriggers.end(), - mem_fun(&pipeDrivenSignal<AOL_namespace::mutex>::set)); - } - // sc21 - YP2_update(); -#endif - checkForAdverts(); - pushMetricsYP (false); -} - -void streamData::writeSc21(const vector<__uint8> &data) throw() -{ - if (data.empty()) - { - return; - } - - m_sc21MetadataLock.lock(); - uvoxMetadata_t md = m_sc21MetadataToPutInline; - m_sc21MetadataToPutInline.clear(); - m_sc21MetadataLock.unlock(); - - if (!md.empty()) - { - writeToRingBuffer((const __uint8*)&md[0], (int)md.size(), - m_sc21StreamLock, m_sc21_ring_buffer); - } - - writeToRingBuffer(&(data[0]), (int)data.size(), m_sc21StreamLock, - m_sc21_ring_buffer, &m_sc21_packet_starts); -#if 0 - stackLock sml(m_sc21LimitTriggerLock); - for_each(m_sc21LimitTriggers.begin(), m_sc21LimitTriggers.end(), - mem_fun(&pipeDrivenSignal<AOL_namespace::mutex>::set)); -#endif -} - -static streamData::ringBufferAccess_t _getClientStartPosition (const streamData::ringBuffer_t &/*buffer*/, - deque<streamData::ringBufferAccess_t> &packet_starts, - AOL_namespace::rwLock &streamLock, - streamData::ringBufferAccess_t ptr = 0) throw() -{ - stackRWLock sl (streamLock); - - const deque<streamData::ringBufferAccess_t>::size_type packet_count = packet_starts.size(); - if (packet_count < 6) - { - return 0; - } - - streamData::ringBufferAccess_t avail_range = (packet_starts.back() - packet_starts.front()); - - if (ptr == 0) - { - streamData::ringBufferAccess_t avg = avail_range / packet_count; - size_t pkts = avg ? (256000/avg) : 0; // target about 250k burst - if (pkts) - { - if (pkts + 6 > packet_count) - pkts = packet_count - 6; - return packet_starts [packet_count - pkts]; - } - return packet_starts.front(); - } - deque<streamData::ringBufferAccess_t>::reverse_iterator r = packet_starts.rbegin(), t = r; - if (*r < ptr && (ptr - *r) > 60000) - ILOG ("[ADVERT] Expected transition point still to come, returning early", ADLOGNAME); - for (; r != packet_starts.rend(); ++r) - { - if (*r < ptr) - break; - t = r; - } - // DLOG("start pos, returning " + tos ((long)*t)); - return *t; -} - -const streamData::ringBufferAccess_t streamData::getClientStartPosition(const bool sc2) throw() -{ - return _getClientStartPosition((!sc2 ? m_sc1_ring_buffer : m_sc21_ring_buffer), - (!sc2 ? m_sc1_packet_starts : m_sc21_packet_starts), - (!sc2 ? m_sc1StreamLock : m_sc21StreamLock)); -} - - -streamData::ringBufferAccess_t streamData::getClientStartPosition (ringBufferAccess_t ptr, bool sc2) throw() -{ - return _getClientStartPosition((!sc2 ? m_sc1_ring_buffer : m_sc21_ring_buffer), - (!sc2 ? m_sc1_packet_starts : m_sc21_packet_starts), - (!sc2 ? m_sc1StreamLock : m_sc21StreamLock), ptr); -} - - -const int streamData::getStreamData(streamData::ringBufferAccess_t& amt, const streamData::ringBufferAccess_t& readPtr, - vector<__uint8>& data, const size_t remSize, const bool sc2) throw() /* for readers only */ -{ - stackRWLock sl ((!sc2 ? m_sc1StreamLock : m_sc21StreamLock)); - - const streamData::ringBuffer_t& buffer = (!sc2 ? m_sc1_ring_buffer : m_sc21_ring_buffer); - - amt = (buffer.m_writePtr - readPtr); - if ((amt > 0) && (amt > buffer.m_data.size())) - { - // the pointers are too far apart - underrun - // make the listener handler process a reset - return -1; - } - - const streamData::ringBufferAccess_t offset = (readPtr & buffer.m_ptrMask); - // clamp again so we don't read pass the end of the buffer - // - // if we've got more in remainder than what we're wanting - // to send then we'll prioritise the remainder data first - // before trying to acquire more new data to try to send. - amt = min(amt, min((buffer.m_data.size() - offset), - (streamData::ringBufferAccess_t)max(0, (SEND_SIZE - (int)remSize)))); - - int len = (int)amt; - if (len > 0) - { - const vector<__uint8>::const_iterator pos = buffer.m_data.begin(); - data.insert(data.end(), pos + offset, pos + (offset + len)); - } - - return len; -} - -#if 0 -void streamData::abandonLimitTrigger(pipeDrivenSignal<AOL_namespace::mutex> *t, const bool sc2) throw() -{ - if (!sc2) - { - stackLock sml(m_sc1LimitTriggerLock); - m_sc1LimitTriggers.erase(t); - } - else - { - stackLock sml(m_sc21LimitTriggerLock); - m_sc21LimitTriggers.erase(t); - } -} - -void streamData::_scheduleLimitTrigger(pipeDrivenSignal<AOL_namespace::mutex> *t, const ringBufferAccess_t readPtr, - AOL_namespace::mutex &streamLock, const ringBuffer_t &ringBuffer, - AOL_namespace::mutex &triggerSetLock, - set<pipeDrivenSignal<AOL_namespace::mutex>*> &triggerSet) throw() -{ - bool add_to_set = true; - - streamLock.lock(); - if (ringBuffer.m_writePtr > readPtr) - { - t->set(); - add_to_set = false; - } - streamLock.unlock(); - - stackLock sml(triggerSetLock); - if (add_to_set) - { - triggerSet.insert(t); - } - else - { - triggerSet.erase(t); - } -} - -void streamData::scheduleLimitTrigger(pipeDrivenSignal<AOL_namespace::mutex> *t, - const ringBufferAccess_t readPtr, const bool sc2) throw() -{ - _scheduleLimitTrigger(t, readPtr, (!sc2 ? m_sc1StreamLock : m_sc21StreamLock), - (!sc2 ? m_sc1_ring_buffer : m_sc21_ring_buffer), - (!sc2 ? m_sc1LimitTriggerLock : m_sc21LimitTriggerLock), - (!sc2 ? m_sc1LimitTriggers : m_sc21LimitTriggers)); -} -#endif - -// find the metadata entry that is <= to ptr. -template<typename T> -typename T::value_type::second_type _getMetadata(const T &metadataTable, AOL_namespace::mutex &metadataLock, - const streamData::ringBufferAccess_t ptr) throw() -{ - stackLock sml(metadataLock); - - typename T::value_type::second_type result; - - if (metadataTable.empty()) - { - return result; - } - streamData::ringBufferAccess_t old_entry = metadataTable.front().first; // "oldest" entry - streamData::ringBufferAccess_t new_entry = metadataTable.back().first; // "newest" entry - - if (old_entry <= new_entry) - { - // normal case. older entries have lower pointers than later ones - for (typename T::const_iterator i = metadataTable.begin(); i != metadataTable.end(); ++i) - { - if ((*i).first <= ptr) - { - result = (*i).second; - } - else - { - break; - } - } - } - else - { - // wrap case - typename T::const_iterator i = metadataTable.begin(); - - if (ptr >= old_entry) // "upper half" - { - for (; i != metadataTable.end(); ++i) - { - if (((*i).first <= ptr) && ((*i).first >= old_entry)) - { - result = (*i).second; - } - else - { - break; - } - } - } - else if (ptr > new_entry) // in "gap" - { - result = metadataTable.back().second; - } - else // lower half - { - for (; i != metadataTable.end(); ++i) // skip entries in "upper half" - { - if ((*i).first < old_entry) - { - break; - } - } - for (; i != metadataTable.end(); ++i) - { - if ((*i).first <= ptr) - { - result = (*i).second; - } - else - { - break; - } - } - } - } - return result; -} - -streamData::sc1MetadataAndExtensionInfo streamData::getSc1Metadata(ringBufferAccess_t ptr) throw() -{ - return _getMetadata(m_sc1MetadataTable, m_sc1MetadataLock, ptr); -} - -streamData::uvoxMetadata_t streamData::getSc21Metadata(ringBufferAccess_t ptr) throw() -{ - return _getMetadata(m_sc21MetadataTable, m_sc21MetadataLock, ptr); -} - -streamData::uvoxMetadata_t streamData::getSc21StreamAlbumArt(ringBufferAccess_t ptr) throw() -{ - return _getMetadata(m_sc21StreamAlbumArtTable, m_sc21StreamAlbumArtLock, ptr); -} - -streamData::uvoxMetadata_t streamData::getSc21PlayingAlbumArt(ringBufferAccess_t ptr) throw() -{ - return _getMetadata(m_sc21PlayingAlbumArtTable, m_sc21PlayingAlbumArtLock, ptr); -} - -// remove stale metadata entries by looking for those that are beyond the bottom of the ring buffer. -// HOWEVER, always keep the bottom one so that clients who enter will have some metadata to work with -template<typename METATABLE> -static void _cleanupMetadataEntries(METATABLE &metadataTable, - const streamData::ringBufferAccess_t ptr, - const streamData::ringBufferAccess_t siz) -{ - streamData::ringBufferAccess_t bottom = ptr - siz; // warning this could wrap - int remove_count = -1; // always leave bottom entry - for (typename METATABLE::const_iterator i = metadataTable.begin(); i != metadataTable.end(); ++i) - { - streamData::ringBufferAccess_t v = (*i).first; - // edge case, ptr has rolled over, therefore bottom > ptr - if (bottom > ptr) - { - if ((v < bottom) && (v > ptr)) - { - ++remove_count; - } - else - { - break; - } - } - else - { - // normal case - if ((v < bottom) || (v > ptr)) // note: (v > ptr) probably not necessary, but can't hurt - { - ++remove_count; - } - else - { - break; - } - } - } - - while ((remove_count--) > 0) - { - metadataTable.pop_front(); - } -} - -template<typename METADATA,typename MT> -static void _addMetadata(AOL_namespace::rwLock &streamLock, const streamData::ringBuffer_t &ringBuffer, - AOL_namespace::mutex &metadataLock, METADATA &metadataTable, const MT &md) throw() -{ - // get current position and size of ring buffer - streamLock.lock(); - const streamData::ringBufferAccess_t ptr = ringBuffer.m_writePtr, - siz = ringBuffer.m_data.size(); - streamLock.unlock(); - - // put entry in table - metadataLock.lock(); - metadataTable.push_back(make_pair(ptr, md)); - - // remove any stale entries - _cleanupMetadataEntries(metadataTable, ptr, siz); - metadataLock.unlock(); -} - -bool streamData::validateTitle(uniString::utf8 &m_updinfoSong) throw() -{ - bool allowed = true; - - m_updinfoSong = stripWhitespace(m_updinfoSong); - if (!m_updinfoSong.empty()) - { - // work on lowercase comparison as well as doing a check to see if - // after removing white space + punctuation we have a valid title. - uniString::utf8 m_checkUpdinfoSong = toLower(m_updinfoSong); - - // exclude weird title updates from being accepted - // as no point in giving junk to the user later on - if (m_checkUpdinfoSong.find((utf8)"!doctype") != utf8::npos || - m_checkUpdinfoSong.find((utf8)"<script") != utf8::npos || - m_checkUpdinfoSong.find((utf8)"<html") != utf8::npos || - m_checkUpdinfoSong.find((utf8)"<body") != utf8::npos || - m_checkUpdinfoSong.find((utf8)"<div") != utf8::npos || - m_checkUpdinfoSong.find((utf8)"%] ") != utf8::npos || - m_checkUpdinfoSong.find((utf8)"invalid resource") != utf8::npos || - (m_checkUpdinfoSong.find((utf8)"nextsong") != utf8::npos && - m_checkUpdinfoSong.find((utf8)"sctrans2next") != utf8::npos) || - - m_checkUpdinfoSong.find((utf8)"radio online") != utf8::npos || - - m_checkUpdinfoSong.find((utf8)"get /") == 0 || - m_checkUpdinfoSong.find((utf8)"put /") == 0 || - m_checkUpdinfoSong.find((utf8)"post /") == 0 || - m_checkUpdinfoSong.find((utf8)"head /") == 0 || - m_checkUpdinfoSong.find((utf8)"source /") == 0 || - m_checkUpdinfoSong.find((utf8)"track ") == 0 || - m_checkUpdinfoSong.find((utf8)"track0") == 0 || - m_checkUpdinfoSong.find((utf8)"track1") == 0 || - m_checkUpdinfoSong.find((utf8)"stream ") == 0 || - m_checkUpdinfoSong.find((utf8)"no artist ") == 0 || - m_checkUpdinfoSong.find((utf8)"new artist ") == 0 || - m_checkUpdinfoSong.find((utf8)"line-in ") == 0 || - m_checkUpdinfoSong.find((utf8)"inter_") == 0 || - m_checkUpdinfoSong.find((utf8)"jj mckay - ") == 0 || - m_checkUpdinfoSong.find((utf8)"artist - ") == 0 || - - m_checkUpdinfoSong.find((utf8)"$") == 0 || - m_checkUpdinfoSong.find((utf8)"�") == 0 || - //m_checkUpdinfoSong.find((utf8)"@") == 0 || - m_checkUpdinfoSong.find((utf8)"%") == 0 || - //m_checkUpdinfoSong.find((utf8)"#") == 0 || - m_checkUpdinfoSong.find((utf8)"*") == 0 || - m_checkUpdinfoSong.find((utf8)"+") == 0 || - //m_checkUpdinfoSong.find((utf8)"&") == 0 || - m_checkUpdinfoSong.find((utf8)"[") == 0 || - m_checkUpdinfoSong.find((utf8)"{") == 0 || - m_checkUpdinfoSong.find((utf8)"}") == 0 || - m_checkUpdinfoSong.find((utf8)"(") == 0 || - m_checkUpdinfoSong.find((utf8)")") == 0 || - m_checkUpdinfoSong.find((utf8)"?") == 0 || - m_checkUpdinfoSong.find((utf8)"_") == 0 || - m_checkUpdinfoSong.find((utf8)"~") == 0 || - m_checkUpdinfoSong.find((utf8)"^") == 0 || - m_checkUpdinfoSong.find((utf8)"`") == 0 || - m_checkUpdinfoSong.find((utf8)"�") == 0 || - m_checkUpdinfoSong.find((utf8)"'") == 0 || - m_checkUpdinfoSong.find((utf8)".") == 0 || - m_checkUpdinfoSong.find((utf8)",") == 0 || - m_checkUpdinfoSong.find((utf8)"/") == 0 || - m_checkUpdinfoSong.find((utf8)"!") == 0 || - m_checkUpdinfoSong.find((utf8)":") == 0 || - m_checkUpdinfoSong.find((utf8)";") == 0 || - m_checkUpdinfoSong.find((utf8)"\"") == 0 || - m_checkUpdinfoSong.find((utf8)"- ") == 0 || - m_checkUpdinfoSong.find((utf8)". ") == 0 || - - m_checkUpdinfoSong == utf8("-") || - m_checkUpdinfoSong == utf8("http://") || - m_checkUpdinfoSong == utf8("https://") || - m_checkUpdinfoSong == utf8("auto dj") || - m_checkUpdinfoSong == utf8("ao vivo") || - m_checkUpdinfoSong == utf8("unknown") || - m_checkUpdinfoSong == utf8("test") || - m_checkUpdinfoSong == utf8("dsp") || - m_checkUpdinfoSong == utf8("demo") || - m_checkUpdinfoSong == utf8("line input") || - m_checkUpdinfoSong == utf8("dj mike llama - llama whippin` intro") || - m_checkUpdinfoSong == utf8("preview")) - { - allowed = false; - } - } - else - { - // this allows empty titles (which are sometimes needed) - allowed = m_updinfoSong.empty(); - } - - return allowed; -} - -int streamData::addUvoxMetadataAtCurrentPosition(__uint16 voxMsgType, const vector<__uint8> &data) throw() -{ - // convert uvox metadata to sc21, sc2 and sc1 - utf8 sc21_metadata_s; - vector<__uint8> sc21_albumart_data; - bool albumart = false; - - sc1MetadataAndExtensionInfo sc1_metadata_and_extension_info; - - if (voxMsgType == MSG_METADATA_XML_NEW) // new shoutcast 2 - { - sc21_metadata_s.insert(sc21_metadata_s.end(), data.begin(), data.end()); - utf8 meta(sc21_metadata_s.begin(), sc21_metadata_s.end()); - - // attempt to get the encoder from the metadata i.e. used to identify the source - try - { - m_streamInfo.m_comingSoon.clear(); - m_streamInfo.m_nextSongs.clear(); - m_streamInfo.m_sourceIdent = metadata::get_XX_from_3902("TENC", meta, m_streamInfo.m_sourceIdent); - m_streamInfo.m_nextSongs = metadata::get_nextsongs_from_3902(meta, m_streamInfo.m_nextSongs); - - // these allow for updating of information from a source when a DJ - // is connected e.g. to sc_trans but is not setup to be listed or - // is just sending through a DJ name update for admin tracking, etc - m_streamInfo.m_streamUser = metadata::get_XX_from_3902("DJ", meta, m_streamInfo.m_streamUser); - - int addFailIgnore = 0, errorCode = 0; - if (!m_streamInfo.m_streamPublic || YP2_addSuccessful(addFailIgnore, errorCode)) - { - if (!m_streamInfo.m_streamPublic || addFailIgnore) - { - // only update the stream name from metadata if public or pending a YP update - m_streamInfo.m_streamName = metadata::get_XX_from_3902("TRSN", meta, m_streamInfo.m_streamName); - } - } - } - catch (const exception &ex) - { - ELOG(ex.what()); - // abort nicely if there was an error - return 0; - } - - // attempt to get the next song from the extended information from the metadata - utf8 m_checkComingSoon = metadata::get_XX_from_3902("extension/soon", meta, m_streamInfo.m_comingSoon); - if (!m_checkComingSoon.empty()) - { - if (validateTitle(m_checkComingSoon)) - { - m_streamInfo.m_comingSoon = m_checkComingSoon; - } - else - { - if (!(m_checkComingSoon.find((utf8)"nextsong") != utf8::npos && m_checkComingSoon.find((utf8)"sctrans2next") != utf8::npos)) - { - WLOG("[ADMINCGI sid=" + tos(ID()) + "] Coming soon title rejected - value not allowed: " + m_checkComingSoon, LOGNAME, ID()); - } - m_streamInfo.m_comingSoon.clear(); - } - } - else - { - if (!m_streamInfo.m_comingSoon.empty()) - { - m_streamInfo.m_comingSoon.clear(); - WLOG("[ADMINCGI sid=" + tos(ID()) + "] Coming soon title cleared", LOGNAME, ID()); - } - } - - // clip out any extension data - utf8::size_type pos1 = sc21_metadata_s.find(utf8("<extension>")), // 11 chars - pos2 = sc21_metadata_s.find(utf8("</extension>")); // 12 chars - if ((pos1 != utf8::npos) && (pos2 != utf8::npos)) - { - // got it, clip it out - sc1_metadata_and_extension_info.m_songMetadataForYP2 = - #ifdef XML_DEBUG - "\t" + - #endif - stripWhitespace(sc21_metadata_s.substr(pos1 + 11, pos2 + 12 - pos1 - 11 - 12)); - } - - try - { - utf8 m_checkSongTitle = metadata::convert_3902_to_shoutcast1(sc21_metadata_s, ID()); - if (sc1_metadata_and_extension_info.m_songTitle != m_checkSongTitle) - { - sc1_metadata_and_extension_info.m_songTitle = m_checkSongTitle; - } - } - catch (const exception &ex) - { - ELOG(string("3902 => Shoutcast 1 metadata conversion error. ") + ex.what() + " 3902=" + eol() + sc21_metadata_s, LOGNAME, ID()); - } - - // if we get a title update, if we've not added then do so as we - // changed adding to the YP to wait a while in 2.1+ so that titles - // can be obtained to ensure the listing is showing all information - // - // 2.4.8 disable this as it's causing quick add / removes to the YP - // which is ok if the stream is ok, but if there's issues, it's not - // and that's then also causing lots of METRICS_RESET_URL messages. - /*if (m_yp2SessionKey == 0) - { - _YP2_add(); - }*/ - } - // handling albumart as required for station and stream artwork - else - { - __uint16 aaMsgType = (voxMsgType & 0xF000); - if (aaMsgType & MSG_METADATA_ALBUMART) - { - sc21_albumart_data.insert(sc21_albumart_data.end(), data.begin(), data.end()); - albumart = true; - } - } - - int ret = 0; - // filter things so we're only doing what is needed at the time - if (albumart == false) - { - uvoxMetadata_t sc21_metadata; - - // ultravox 2.1 style xml - try - { - createMetadataPackets(&sc21_metadata_s[0], (int)sc21_metadata_s.size(), MSG_METADATA_XML_NEW, sc21_metadata); - } - catch (const exception &ex) - { - ELOG(ex.what(), LOGNAME, ID()); - } - - if (!sc1_metadata_and_extension_info.m_songTitle.empty()) - { - _addMetadata(m_sc1StreamLock, m_sc1_ring_buffer, m_sc1MetadataLock, m_sc1MetadataTable, sc1_metadata_and_extension_info); - } - if (!sc21_metadata.empty()) - { - _addMetadata(m_sc21StreamLock, m_sc21_ring_buffer, m_sc21MetadataLock, m_sc21MetadataTable, sc21_metadata); - - m_sc21MetadataLock.lock(); - m_sc21MetadataToPutInline = sc21_metadata; - m_sc21MetadataLock.unlock(); - } - - // maintain history - g_streamSongHistoryMapLock.lock(); - - // attempting to use the pre-filled title information based on forum request so - // that 'artist - album - title' from sc_trans appears in the history (not client) - utf8 metadata(sc21_metadata_s.begin(), sc21_metadata_s.end()); - const vector<uniString::utf8> m_nextSong = metadata::get_nextsongs_from_3902(metadata, m_streamInfo.m_nextSongs, true); - const vector<uniString::utf8>::const_iterator nextSong = m_nextSong.begin(); - - utf8 m_checkSongHistory = (((nextSong != m_nextSong.end()) && !(*nextSong).empty()) ? - (*nextSong) : metadata::get_song_title_from_3902(metadata)); - if (validateTitle(m_checkSongHistory)) - { - map<streamID_t, streamHistory_t>::iterator i = g_streamSongHistoryMap.find(ID()); - if (i != g_streamSongHistoryMap.end()) - { - if ((*i).second.empty() || ((*i).second.front().m_title != m_checkSongHistory)) - { - (*i).second.push_front(songHistoryInfo(m_checkSongHistory, metadata)); - } - } - else - { - g_streamSongHistoryMap[ID()].push_front(songHistoryInfo(m_checkSongHistory, metadata)); - } - } - - // do conversions as needed to cope with funky v1 titles from relays for example - map<streamID_t, streamHistory_t>::iterator i = g_streamSongHistoryMap.find(ID()); - if (i != g_streamSongHistoryMap.end()) - { - if (!(*i).second.empty()) - { - utf8 m_checkCurrentSong = metadata::toFixedString((*i).second.front().m_title); - if (validateTitle(m_checkCurrentSong)) - { - if (m_streamInfo.m_currentSong != m_checkCurrentSong) - { - m_streamInfo.m_currentSong = m_checkCurrentSong; - } - } - } - - while ((*i).second.size() > gOptions.getSongHistorySize(ID())) - { - (*i).second.pop_back(); - } - } - g_streamSongHistoryMapLock.unlock(); - - resetAdvertTriggers(m_streamInfo.m_currentSong); - } - else - { - uvoxMetadata_t sc21_albumart; - - // ultravox 2.1 style albumart - try - { - if (!sc21_albumart_data.empty()) - { - createMetadataPackets(&sc21_albumart_data[0], (int)sc21_albumart_data.size(), voxMsgType, sc21_albumart); - } - else - { - // indicates we need to clear the cached data - } - } - catch (const exception &ex) - { - ELOG(ex.what(), LOGNAME, ID()); - } - - // store a copy of the raw image file and mime type - // so it's easier to display on the admin pages, etc - __uint16 ArtType = voxMsgType & 0x0F00; - if (ArtType & MSG_METADATA_PLAYING_ART) - { - m_sc21AlbumArtData[1] = sc21_albumart_data; - m_sc21AlbumArtMime[1] = (voxMsgType & 0x00FF); - } - else - { - m_sc21AlbumArtData[0] = sc21_albumart_data; - m_sc21AlbumArtMime[0] = (voxMsgType & 0x00FF); - } - - if (!sc21_albumart.empty()) - { - // uvox metadata must also be injected into the stream itself - if (ArtType & MSG_METADATA_PLAYING_ART) - { - m_sc21PlayingAlbumArtLock.lock(); - m_sc21PlayingAlbumArtToPutInline = sc21_albumart; - m_sc21PlayingAlbumArtLock.unlock(); - - _addMetadata(m_sc21StreamLock, - m_sc21_ring_buffer, - m_sc21PlayingAlbumArtLock, - m_sc21PlayingAlbumArtTable, - sc21_albumart); - - ret = addSc1MetadataAtCurrentPosition("", m_streamInfo.m_currentSong, - "DNAS/playingart?sid=" + tos(ID()), - m_streamInfo.m_comingSoon); - - // due to how things work, it's easier to do it all this way and - // then directly insert as if it's pass-through but keep a copy - writeToRingBuffer((const __uint8*)&sc21_albumart[0], - (int)sc21_albumart.size(), - m_sc21StreamLock, m_sc21_ring_buffer); - } - else - { - m_sc21StreamAlbumArtLock.lock(); - m_sc21StreamAlbumArtToPutInline = sc21_albumart; - m_sc21StreamAlbumArtLock.unlock(); - - _addMetadata(m_sc21StreamLock, - m_sc21_ring_buffer, - m_sc21StreamAlbumArtLock, - m_sc21StreamAlbumArtTable, - sc21_albumart); - - // if we've got playing artwork then we should skip updating this as it's preferred for the client - // to provide playing artwork first and then the stream branding so it shows playing on joining - if (m_sc21AlbumArtData[1].empty()) - { - ret = addSc1MetadataAtCurrentPosition("", m_streamInfo.m_currentSong, - "DNAS/streamart?sid=" + tos(ID()), - m_streamInfo.m_comingSoon); - } - } - } - else - { - // TODO make sure this is specified if a custom streamart is provided and nothing from the stream - ret = addSc1MetadataAtCurrentPosition("", m_streamInfo.m_currentSong, - (!m_sc21AlbumArtData[0].empty() ? "DNAS/streamart?sid=" + tos(ID()) : ""), - m_streamInfo.m_comingSoon); - } - } - return ret; -} - -void streamData::updateSongHistorySize() throw() -{ - // maintain history - stackLock sml(g_streamSongHistoryMapLock); - - map<streamID_t, streamHistory_t>::iterator i = g_streamSongHistoryMap.find(ID()); - if (i != g_streamSongHistoryMap.end()) - { - while ((*i).second.size() > gOptions.getSongHistorySize(ID())) - { - (*i).second.pop_back(); - } - } -} - -void streamData::updateStreamUser(const uniString::utf8& streamUser) -{ - m_streamInfo.m_streamUser = streamUser; -} - -void streamData::resetStreamAuthhash() -{ - m_streamInfo.m_authHash.clear(); - _YP2_add(); -} - -void streamData::resetAdvertTriggers(const uniString::utf8& m_updinfoSong) -{ - if (m_updinfoSong.empty()) - return; - - unsigned d = 120; // default - const char *p = (const char *)&m_updinfoSong[0]; - char s[2] = ""; - int matched = sscanf (p, "Advert%1[!:-]", s); - - if (matched == 1) - { - if (s[0] == '-') - { - char pattern[6]; - matched = ::sscanf (p+7, "%4[0-9]%1[!:]", pattern, s); - if (matched == 2) - { - d = atoi (pattern); - if (d < 1 || d > 999) - d = 120; - } - else - p = NULL; - } - if (p) p = strchr (p+6, s[0]); - if (p) - { - p++; - //::memmove (tag, p, strlen (p)+1); ?? - AD_DEBUG_LOG("[ADVERT sid=" + tos(ID()) + "] " + "Advert trigger detected.", LOGNAME, ID()); - m_insertAdvert = true; - } - } - m_duration = d; - pushMetricsYP(); -} - -int streamData::addSc1MetadataAtCurrentPosition(const utf8 &logString, const utf8 &sc1_metadata_raw, - const utf8 &sc1_url_raw, const utf8 &sc1_next_raw) throw() -{ - const utf8 m_oldCurrentSong = m_streamInfo.m_currentSong; - const utf8 m_oldCurrentURL = m_streamInfo.m_currentURL; - const utf8 m_oldComingSoon = m_streamInfo.m_comingSoon; - - // maintain history - m_stateLock.lock(); - - m_streamInfo.m_currentSong = sc1_metadata_raw; - m_streamInfo.m_comingSoon = sc1_next_raw; - - if (!sc1_url_raw.empty()) - { - m_streamInfo.m_currentURL = sc1_url_raw; - } - else - { - // this allows us to force artwork through for all of the clients when - // it's not provided by the connected source on the first title update - if (m_sc21AlbumArtData[0].empty() && (!gOptions.m_artworkBody[m_ID].empty() || !gOptions.m_artworkBody[0].empty())) - { - vector<__uint8> sc21_albumart_data; - if (!gOptions.m_artworkBody[m_ID].empty()) - { - sc21_albumart_data.insert(sc21_albumart_data.end(), gOptions.m_artworkBody[m_ID].begin(), gOptions.m_artworkBody[m_ID].end()); - } - else - { - sc21_albumart_data.insert(sc21_albumart_data.end(), gOptions.m_artworkBody[0].begin(), gOptions.m_artworkBody[0].end()); - } - - int voxMsgType = 0x4000; - uvoxMetadata_t sc21_albumart; - if (!sc21_albumart_data.empty()) - { - // try to find the correct mime-type to give the clients a hint - utf8::size_type pos = gOptions.artworkFile().rfind((utf8)"."); - if (pos != utf8::npos) - { - utf8 ext = gOptions.artworkFile().substr(pos + 1, gOptions.artworkFile().size()); - if ((ext == "jpeg") || (ext == "jpg")) - { - voxMsgType = 0x4000; - } - else if (ext == "png") - { - voxMsgType = 0x4001; - } - else if (ext == "bmp") - { - voxMsgType = 0x4002; - } - else if (ext == "gif") - { - voxMsgType = 0x4003; - } - } - - createMetadataPackets(&sc21_albumart_data[0], (int)sc21_albumart_data.size(), voxMsgType, sc21_albumart); - } - - m_sc21AlbumArtData[0] = sc21_albumart_data; - m_sc21AlbumArtMime[0] = (voxMsgType & 0x00FF); - - m_sc21StreamAlbumArtLock.lock(); - m_sc21StreamAlbumArtToPutInline = sc21_albumart; - m_sc21StreamAlbumArtLock.unlock(); - - _addMetadata(m_sc21StreamLock, - m_sc21_ring_buffer, - m_sc21StreamAlbumArtLock, - m_sc21StreamAlbumArtTable, - sc21_albumart); - - m_streamInfo.m_currentURL = "DNAS/streamart?sid=" + tos(ID()); - } - else - { - m_streamInfo.m_currentURL.clear(); - } - } - - // changed in 2.4 so it will allow repeated 'Advert:xx' - // update through since it's needed for advert triggers - // changed in 2.4.8+ so we can provide a 'test' case - bool sameTitle = (m_oldCurrentSong == m_streamInfo.m_currentSong), - sameUrl = (m_oldCurrentURL == m_streamInfo.m_currentURL), - sameNext = (m_oldComingSoon == m_streamInfo.m_comingSoon); - if ((sameTitle && sameUrl && sameNext && - ((m_streamInfo.m_currentSong.find ((utf8)"Advert:") != 0) && - (m_streamInfo.m_currentSong.find ((utf8)"Test Advert:") != 0)))) - { - // if the same then we might as well skip as it won't add anything - // other than filling the song history list with deemed duplicates - m_stateLock.unlock(); - return 0; - } - - DEBUG_LOG(logString + "title: " + tos(sameTitle) + " - url: " + tos(sameUrl) + " - next: " + tos(sameNext), LOGNAME, ID()); - - // convert sc1 metadata to sc21 metadata - utf8 sc21_metadata_s = metadata::toXML_fromFilename(m_streamInfo.m_currentSong, m_streamInfo.m_currentURL, "%N"); - - g_streamSongHistoryMapLock.lock(); - map<streamID_t, streamHistory_t>::iterator i = g_streamSongHistoryMap.find(ID()); - if (i != g_streamSongHistoryMap.end()) - { - (*i).second.push_front(songHistoryInfo(m_streamInfo.m_currentSong, sc21_metadata_s)); - - while ((*i).second.size() > gOptions.getSongHistorySize(ID())) - { - (*i).second.pop_back(); - } - } - else - { - g_streamSongHistoryMap[ID()].push_front(songHistoryInfo(m_streamInfo.m_currentSong, sc21_metadata_s));; - } - g_streamSongHistoryMapLock.unlock(); - - resetAdvertTriggers(m_streamInfo.m_currentSong); - - m_stateLock.unlock(); - - sc1MetadataAndExtensionInfo sc1_metadata_and_extension_info; - sc1_metadata_and_extension_info.m_songTitle = "StreamTitle='" + m_streamInfo.m_currentSong + "';"; - - if (!m_streamInfo.m_comingSoon.empty()) - { - // added in 2.5 (dunno if any client will use it or not) - sc1_metadata_and_extension_info.m_songTitle += "StreamNext='" + m_streamInfo.m_comingSoon + "';"; - } - - if (!m_streamInfo.m_currentURL.empty()) - { - sc1_metadata_and_extension_info.m_songTitle += "StreamUrl='" + m_streamInfo.m_currentURL + "';"; - } - else - { - if (!m_sc21AlbumArtData[1].empty()) - { - m_streamInfo.m_currentURL = "DNAS/playingart?sid=" + tos(ID()); - sc1_metadata_and_extension_info.m_songTitle += "StreamUrl='" + m_streamInfo.m_currentURL + "';"; - } - else - { - // **** TODO **** - - // this allows us to force artwork through for all of the clients when - // it's not provided by the connected source on the first title update - if (m_sc21AlbumArtData[0].empty() && !gOptions.m_artworkBody[0].empty()) - { - m_sc21AlbumArtData[0] = vector<__uint8>(&gOptions.m_artworkBody[0][0], &gOptions.m_artworkBody[0][gOptions.m_artworkBody[0].size()]); - // TODO - //m_sc21AlbumArtMime[0] = (voxMsgType & 0x00FF); - } - - if (!m_sc21AlbumArtData[0].empty()) - { - m_streamInfo.m_currentURL = "DNAS/streamart?sid=" + tos(ID()); - sc1_metadata_and_extension_info.m_songTitle += "StreamUrl='" + m_streamInfo.m_currentURL + "';"; - } - } - } - - uvoxMetadata_t sc21_metadata; - try - { - createMetadataPackets(&sc21_metadata_s[0], (int)sc21_metadata_s.size(), MSG_METADATA_XML_NEW, sc21_metadata); - } - catch(const exception &ex) - { - ELOG(ex.what(), LOGNAME, ID()); - } - - if (!sc1_metadata_and_extension_info.m_songTitle.empty()) - { - _addMetadata(m_sc1StreamLock, m_sc1_ring_buffer, m_sc1MetadataLock, m_sc1MetadataTable, sc1_metadata_and_extension_info); - } - - if (!sc21_metadata.empty()) - { - _addMetadata(m_sc21StreamLock, m_sc21_ring_buffer, m_sc21MetadataLock, m_sc21MetadataTable, sc21_metadata); - } - - // uvox metadata must also be injected into the stream itself - if (!sc21_metadata.empty()) - { - m_sc21MetadataLock.lock(); - m_sc21MetadataToPutInline = sc21_metadata; - m_sc21MetadataLock.unlock(); - } - - return (!sameTitle ? 1 : 0) | (!sameUrl ? 2 : 0) | (!sameNext ? 4 : 0); -} - - -void streamData::pushMetricsYP (bool force) -{ - if (m_dead || m_ID <= 0 || m_streamInfo.m_streamPublic == false) - return; - time_t now = ::time(NULL); - if (force == false && m_nextYPPush > now) - return; - - if (m_parser) - { - metrics::metaInfo meta; - - meta.m_sid = m_ID; - meta.m_audience = -1; - meta.m_private = m_streamInfo.m_streamPublic ? false : true; - meta.m_maxListeners = (m_streamInfo.m_streamMaxUser > 0) ? m_streamInfo.m_streamMaxUser : gOptions.maxUser(); - meta.m_song = m_streamInfo.m_currentSong; - meta.m_format = m_streamInfo.m_contentType; - meta.m_bitrate = m_streamInfo.m_streamBitrate; - meta.m_samplerate = m_streamInfo.m_streamSampleRate; - meta.m_agent = m_streamInfo.m_sourceIdent; - meta.m_publicIP = m_streamInfo.m_publicIP; - meta.m_sourceIP = m_streamInfo.m_srcAddr; - meta.m_version = m_parser->getVersionName(); - metrics::updateMeta (meta); - m_nextYPPush = now + 600; // make it at most 10 mins. - } - else - m_nextYPPush = now + 20; // no data currently retry again in 20 seconds -} - - -void streamData::clearCachedMetadata() throw() -{ - m_sc1MetadataLock.lock(); - m_sc1MetadataTable.clear(); - m_sc1MetadataLock.unlock(); - - m_sc21MetadataLock.lock(); - m_sc21MetadataTable.clear(); - m_sc21MetadataToPutInline.clear(); - m_sc21MetadataLock.unlock(); - - m_sc21StreamAlbumArtLock.lock(); - m_sc21StreamAlbumArtTable.clear(); - m_sc21StreamAlbumArtToPutInline.clear(); - m_sc21StreamAlbumArtLock.unlock(); - - m_sc21PlayingAlbumArtLock.lock(); - m_sc21PlayingAlbumArtTable.clear(); - m_sc21PlayingAlbumArtToPutInline.clear(); - m_sc21PlayingAlbumArtLock.unlock(); - - m_sc21AlbumArtData[0].clear(); - m_sc21AlbumArtData[1].clear(); - - m_sc21AlbumArtMime[0] = 0; - m_sc21AlbumArtMime[1] = 0; -} - -void streamData::clearCachedArtwork(const size_t index) throw() -{ - if (!index) - { - m_sc21StreamAlbumArtLock.lock(); - m_sc21StreamAlbumArtTable.clear(); - m_sc21StreamAlbumArtToPutInline.clear(); - m_sc21StreamAlbumArtLock.unlock(); - } - else - { - m_sc21PlayingAlbumArtLock.lock(); - m_sc21PlayingAlbumArtTable.clear(); - m_sc21PlayingAlbumArtToPutInline.clear(); - m_sc21PlayingAlbumArtLock.unlock(); - } - - m_sc21AlbumArtData[index].clear(); - m_sc21AlbumArtMime[index] = 0; - - addSc1MetadataAtCurrentPosition("", m_streamInfo.m_currentSong, - (!m_sc21AlbumArtData[1].empty() ? "DNAS/playingart?sid=" + tos(ID()) : - !m_sc21AlbumArtData[0].empty() ? "DNAS/streamart?sid=" + tos(ID()) : ""), - m_streamInfo.m_comingSoon); -} - -streamData::streamID_t streamData::getStreamIdFromPath(const uniString::utf8 &url, bool& htmlPage) throw() -{ - // look for an exact match against / which is sid=1 since if - // we've gotten to here then it's unlikely to be non-client. - if ((url == utf8("/")) || (url == utf8("/;")) || url.empty()) - { - return DEFAULT_CLIENT_STREAM_ID; - } - - streamData::streamID_t sid = DEFAULT_CLIENT_STREAM_ID; - config::streams_t streams; - gOptions.getStreamConfigs(streams); - - if (!streams.empty()) - { - for (config::streams_t::const_iterator i = streams.begin(); i != streams.end(); ++i) - { - // look for an exact match against the streampath - if ((*i).second.m_urlPath == url) - { - sid = (*i).first; - break; - } - else - { - // otheriwse look for a streampath with additional paramters on it - // and then attempt to match things back - // e.g. /bob;stream.mp3 or /bob/;stream.mp3 - // note: /bob/bob checking doesn't want to work... - if ((url.find((utf8)";") != utf8::npos) || (url.find((utf8)"/;") != utf8::npos)/* || - (url.find(utf8("/")) != utf8::npos && url.find(utf8("/")) != 0)*/) - { - utf8 param_free = url.substr(0, (*i).second.m_urlPath.size()); - if (!param_free.empty() && (*i).second.m_urlPath == param_free) - { - // we need to treat '/stream' as a special - // case and skip it and action it later on - if (!(param_free == "/stream")) - { - sid = (*i).first; - break; - } - } - } - } - - // otherwise look for the streampath and common values - // which are appended to the end of the path e.g. /; - if (!(*i).second.m_urlPath.empty()) - { - utf8 stream("/stream"); - utf8::size_type pos = url.find((*i).second.m_urlPath), - pos2 = url.find(stream); - - if ((pos != utf8::npos) && (pos == 0) && - // this helps to check for setting /stream as a streampath and it - // causing all streams to be provided as if that stream instead - // of the actually requested / expected stream since it's special - ((pos2 == 0) && ((*i).second.m_urlPath != stream))) - { - utf8 params = url.substr(pos + (*i).second.m_urlPath.size()); - if (!params.empty()) - { - if ((params.find(utf8(";")) == 0) || (params.find(utf8("/")) == 0) || (params.find(utf8("/;")) == 0)) - { - sid = (*i).first; - break; - } - } - } - } - - // and if that fails then we instead base it on /stream/x/ - utf8::size_type pos = url.find((utf8)"/stream/"); - if (pos != utf8::npos) - { - utf8 stream_id = url.substr(8); - // look for the raw stream url and if it's not exact then treat as a stream request - if (!stream_id.empty() && - (stream_id.find((utf8)"/") == utf8::npos) && - (stream_id.find((utf8)";") == utf8::npos)) - { - htmlPage = true; - } - sid = atoi((const char *)stream_id.c_str()); - } - } - } - else - { - // and if that fails then we instead base it on /stream/x/ - utf8::size_type pos = url.find((utf8)"/stream/"); - if (pos != utf8::npos) - { - utf8 stream_id = url.substr(8); - // look for the raw stream url and if it's not exact then treat as a stream request - if (!stream_id.empty() && - (stream_id.find((utf8)"/") == utf8::npos) && - (stream_id.find((utf8)";") == utf8::npos)) - { - htmlPage = true; - } - sid = atoi((const char *)stream_id.c_str()); - } - } - - return sid; -} - -//streamData::streamID_t streamData::getStreamUptime(streamID_t id) throw() -time_t streamData::getStreamUptime(streamID_t ID) throw() -{ - stackLock sml(g_streamMapLock); - - return g_streamUptime[ID]; -} - -streamData::source_t streamData::getClientType(streamData::source_t clientType, const uniString::utf8& userAgent) -{ - if (!userAgent.empty()) - { - if (isUserAgentRelay(userAgent)) - { - clientType = ((streamData::source_t)(clientType | streamData::RELAY)); - } - if ((userAgent.find((utf8)"winampmpeg/") == 0) || (userAgent.find((utf8)"wafa/") == 0)) - { - // this is a specical case and is unlikely to be any 'real' 5.09 - if (userAgent.find(utf8("winampmpeg/5.09")) == utf8::npos) - { - clientType = ((streamData::source_t)(clientType | streamData::WINAMP)); - } - else - { - clientType = ((streamData::source_t)(clientType | streamData::RADIONOMY)); - } - } - if (userAgent.find((utf8)"curl/7.") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::CURL_TOOL)); - } - if (userAgent.find((utf8)"sc_iradio/1.") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::SC_IRADIO)); - } - if (userAgent.find((utf8)"icecast ") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::ICECAST | streamData::RELAY)); - } - if (userAgent.find((utf8)"foobar2000/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::FB2K)); - } - if ((userAgent.find((utf8)"vlc/") == 0) || - (userAgent.find((utf8)" libvlc/") != utf8::npos)) - { - clientType = ((streamData::source_t)(clientType | streamData::VLC)); - } - if ((userAgent.find((utf8)"windows-media-player/") == 0) || - (userAgent.find((utf8)"nsplayer/") == 0)) - { - clientType = ((streamData::source_t)(clientType | streamData::WMP)); - } - if (userAgent.find((utf8)"roku/dvp") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::ROKU)); - } - if (userAgent.find((utf8)"wiimc/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::WIIMC)); - } - if (userAgent.find((utf8)"audiostation/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::SYNOLOGY)); - } - if (userAgent.find((utf8)"itunes/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::ITUNES)); - } - if ((userAgent.find((utf8)"mplayer/") == 0) || - (userAgent.find((utf8)"mplayer ") == 0)) - { - clientType = ((streamData::source_t)(clientType | streamData::MPLAYER)); - } - if (userAgent.find((utf8)"applecoremedia/1.") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::APPLE)); - } - if (userAgent.find((utf8)"psp-internetradioplayer/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::PS)); - } - if (userAgent.find((utf8)"radio toolbox/") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::RADIO_TOOLBOX)); - } - - // rough stream ripper identification - if ((userAgent.find((utf8)"rma/1.0 (compatible; realmedia)") == 0) || - (userAgent.find((utf8)"nullsoft winamp3 version 3.0 (compatible)") == 0)) - { - clientType = ((streamData::source_t)(clientType | streamData::WARNING)); - } - - // rough browser identification - if (userAgent.find((utf8)"mozilla/5.0") == 0) - { - if (userAgent.find((utf8)"trident/") != utf8::npos) // IE - { - clientType = ((streamData::source_t)(clientType | streamData::IE)); - } - else if (userAgent.find((utf8)"chrome/") != utf8::npos) - { - clientType = ((streamData::source_t)(clientType | streamData::CHROME)); - } - else if (userAgent.find((utf8)"safari/") != utf8::npos) - { - clientType = ((streamData::source_t)(clientType | streamData::SAFARI)); - } - else if (userAgent.find((utf8)"firefox/") != utf8::npos) - { - clientType = ((streamData::source_t)(clientType | streamData::FIREFOX)); - } - } - } - return clientType; -} - -streamData::source_t streamData::getClientTypeCompat(streamData::source_t clientType, const uniString::utf8& userAgent) -{ - if (!userAgent.empty()) - { - if ((userAgent.find((utf8)"windows-media-player/") == 0) || - (userAgent.find((utf8)"nsplayer/") == 0)) - { - clientType = ((streamData::source_t)(clientType | streamData::WMP)); - } - if (userAgent.find((utf8)"roku/dvp") == 0) - { - clientType = ((streamData::source_t)(clientType | streamData::ROKU)); - } - } - return clientType; -} - -// Advert related code. -typedef pair<int, streamData::adGroup> idGroup; - -void streamData::adEntry::flush(metrics::adSummary &summary) -{ - if (ad && (summary.sendRest || upper)) - { - summary.count = (int)upper; - summary.name = ad->m_description.c_str(); - summary.failed = ad->m_failed; - summary.missing = ad->m_missing; - - metrics::metrics_advert_stats(summary); - summary.sendRest = true; - } - upper = 0; -} - - -streamData::adEntry::adEntry (specialFileData *d) -{ - upper = 0; - ad = d; - if (d) - { - ++d->m_refcount; - d->m_lastUsed = ::time (NULL); - AD_DEBUG_LOG ("[STREAMDATA] content new, " + d->m_description + " now has " + tos (d->m_refcount)); - } -} - - -streamData::adEntry::adEntry (const adEntry &e) -{ - upper = 0; - ad = e.ad; - ++(e.ad->m_refcount); - e.ad->m_lastUsed = ::time (NULL); - AD_DEBUG_LOG ("[STREAMDATA] content copy, " + e.ad->m_description + " now has " + tos (e.ad->m_refcount)); -} - - -streamData::adGroup::adGroup (adGroup &prev, adTrigger &trig) -{ - m_totalSizeSC1 = m_totalSizeSC2 = 0; - m_trigger = &trig; - - std::deque <adEntry>::iterator it = prev.ads.begin(); - for (; it != prev.ads.end(); ++it) - { - specialFileData *f = it->ad; - ads.push_back (adEntry (f)); - } -} - - -void streamData::adGroup::appendAdvert(streamData::specialFileData &s) -{ - ads.push_back (adEntry (&s)); - m_totalSizeSC1 += s.m_sc1Buffer.size(); - m_totalSizeSC2 += s.m_sc2Buffer.size(); -} - -void streamData::adGroup::flushCounts(metrics::adSummary &summary) -{ - summary.sendRest = false; - summary.tstamp = m_trigger->m_playedAt; - for (std::deque<adEntry>::iterator it = ads.begin(); it != ads.end(); ++it) - { - it->flush(summary); - } -} - -streamData::adGroups::adGroups (streamData *sd) -{ - m_sd = sd; - refcount = 0; - m_recheck = 0; - nextUpdate = ::time(NULL); - m_nextDownloadRun = nextUpdate + 40; - m_type = ADVERT_MAP_FIXED; - skippedAds = 0; - retriever = NULL; -} - - -streamData::adGroups::~adGroups() -{ - while (triggers.empty() == false) // pop each on the triggers list and run release on it - { - adTrigger *trig = *triggers.begin(); - triggers.pop_front(); - releaseTrigger (trig); - } - if (retriever) - { - delete retriever; - retriever = NULL; - } -} - - -void streamData::adGroups::setType (const uniString::utf8 &s) -{ - if (s == "flex") - m_type = ADVERT_MAP_FLEX; - else if (s == "pause") - m_type = ADVERT_MAP_PAUSE; - else - m_type = ADVERT_MAP_FIXED; -} - - -#if 0 -streamData::adGroup *streamData::adGroups::insertAdTestFile(const streamData::streamID_t sid, streamData *sd) -{ - streamData::adGroup *ret = NULL; - for (int i = 0; i < 4; i++) - { - specialFileData *f = new specialFileData("test advert"); - if (f) - { - vector<__uint8> v; - sd->getAdTestFile(i).getSc1Data(v); - if (!v.empty()) - { - const int uvoxDataType = sd->streamUvoxDataType(); - unsigned int read_samplerate = sd->streamSampleRate(), samplerate = read_samplerate; - // if the bitrate is not known, setting -1 will reject things - // as we cannot be sure well insert ok if using '0' otherwise - const int read_bitrate = cleanFileData("", v, v.size(), sd->streamBitrate(), samplerate, uvoxDataType, - "[ADVERT sid=" + tos(sid) + "] ", "advert", read_samplerate); - - if (!v.empty()) - { - f->replaceData(v, uvoxDataType, read_bitrate, read_samplerate); - AD_DEBUG_LOG("[ADVERT sid=" + tos(sid) + "] Adding to group TEST"); - ret = addToGroup(-2, f); - } - else - { - delete f; - WLOG("[ADVERT sid=" + tos(sid) + "] Skipping test advert - " - "does not match the current stream format. Got " + - tos(read_bitrate) + " kbps, " + sampleRateStr(samplerate) + - " (stream) vs " + tos(sd ? sd->streamBitrate() : -1) + - " kbps, " + sampleRateStr(read_samplerate) + " (test advert)"); - } - } - } - } - - return ret; -} -#endif - -bool streamData::adGroups::attachGroupQueue (adGroupAccess &ac) -{ - if (ac.m_groupQueue == NULL && ac.inAdvertMode() == false) - { - stackLock sml(m_lock); - - adGroupMap_t::iterator it = mapping.find (ac.group); - adGroupQueue *q; - - if (it == mapping.end()) - { - q = new adGroupQueue(); - mapping [ac.group] = q; - } - else - q = (*it).second; - q->listeners++; - ac.m_groupQueue = q; - return true; - } - return false; -} - - -void streamData::adGroups::detachGroupQueue (adGroupAccess &ac) -{ - if (ac.m_groupQueue) - { - stackLock sml(m_lock); - - adGroupQueue *q = ac.m_groupQueue; - adGroup *run = ac.cached_ref; - - q->listeners--; - AD_DEBUG_LOG ("drop from group " + tos(ac.group) + " referenced, listeners now " + tos(q->listeners), ADLOGNAME, m_sd->ID()); - if (run) - { - // admetrics - releaseTrigger (run->m_trigger); - } - ac.m_groupQueue = NULL; - ac.cached_ref = NULL; - } - else - AD_DEBUG_LOG ("no group queue referenced from listener", ADLOGNAME, m_sd->ID()); -} - -streamData::adGroup *streamData::adGroups::findGroup(adGroupAccess &ac, ringBufferAccess_t pos) -{ - adGroupQueue *q = ac.m_groupQueue; - list <adGroup *>::iterator it = q->queue.begin(); - - for (; it != q->queue.end(); ++it) - { - adGroup *g = *it; - if (g->m_trigger == NULL) return NULL; // should not happen - ringBufferAccess_t tpos = g->m_trigger->getStartPos (ac.m_sc2); - - if (pos == tpos) // found it - return g; - if (pos > tpos) // past it, jump out - break; - } - return NULL; -} - -#if 0 -streamData::adGroup *streamData::adGroups::findGroup(const streamData::streamID_t sid, const int id) -{ - // PSA = -1, TEST = -2 - if (mapping && ((id > 0) || (id == -2))) - { - map<int, adGroup>::iterator search = mapping->find(id); - if (search == mapping->end()) - { - // if there's no test group, we now - streamData::adGroup *ret = NULL; - if (id == -2) - { - streamData *sd = streamData::accessStream(sid); - if (sd) - { - ret = insertAdTestFile(sid, sd); - sd->releaseStream(); - } - } - return ret; - } - return &search->second; - } - // if there's no mapping, we need to create one for the test case - else if (!mapping && (id == -2)) - { - streamData::adGroup *ret = NULL; - mapping = new map<int, adGroup>; - if (mapping) - { - streamData *sd = streamData::accessStream(sid); - if (sd) - { - ret = insertAdTestFile(sid, sd); - sd->releaseStream(); - } - } - return ret; - } - return NULL; -} -#endif - -void streamData::adGroups::purge (ringBuffer_t &buffer) -{ - if ((m_recheck & 31) == 0) - { - // drop reference when off the ring buffer, loop in case there are a few to purge - while (triggers.empty() == false) - { - adTrigger *t = triggers.back(); - if (t== NULL) - DLOG ("purge trigger NULL"); - if (t && (t->m_playedAt || triggers.size() > 1)) - { - size_t sz = buffer.m_data.size(); - //DLOG ("trig " + t->m_id + ", played " + tos((long)t->m_playedAt) + ", ret " + tos((long)t->m_returnPtrSC1) + ", wptr " + tos((long)(buffer.m_writePtr)) + ", sz " + tos(sz)); - if (buffer.m_writePtr < sz) // for early cases of stream start - break; - if (t->m_returnPtrSC1 < (buffer.m_writePtr - sz)) - { - AD_DEBUG_LOG ("trigger " + t->m_id + " reference off the ring buffer", ADLOGNAME, m_sd->ID()); - triggers.remove (t); - releaseTrigger (t); - continue; - } - } - break; - } - } - if ((m_recheck & 255) == 0) - { - // DLOG("rechecking for group purge"); - purgeGroups(); - } - ++m_recheck; -} - - -void streamData::adGroups::createNewTrigger (const string &reqID) -{ - string id; - if (reqID == "") - { - stringstream s; - s << tos(time_now_ms()); - id = s.str(); - } - else - id = reqID; - - adTrigger *trig = new adTrigger (id, m_sd->ID()); - triggers.push_front (trig); -} - - -size_t streamData::adGroups::overlaySize (adTrigger *trigger, bool sc2) -{ - int gn = 0; - - if (trigger == NULL) abort(); - if (sc2) // assume sc2 is done after sc1 - return trigger->m_maxSizeSC2; - - adGroupMap_t::iterator it = mapping.begin(); - for (gn = 0; gn < 8 && it != mapping.end(); ++gn, ++it) // check so many group queues for filled adverts - { - adGroupQueue *q = it->second; - - for (list<adGroup*>::iterator it = q->queue.begin(); it != q->queue.end(); ++it) - { - adGroup *g = *it; - if (g->m_trigger == trigger) - { - if (trigger->m_playedAt == 0) - { - g->recalculateTotalSize(); - } - break; - } - } - } - if (trigger->m_maxSizeSC1) - ILOG ("Trigger " + tos(trigger->m_id) + " size is " + tos(trigger->m_maxSizeSC1) + "/" + tos(trigger->m_maxSizeSC2), ADLOGNAME, m_sd->ID()); - return trigger->m_maxSizeSC1; -} - - -streamData::adGroup *streamData::adGroups::addToGroup (const string &id, const int grp, specialFileData *f) -{ - - if ((f == NULL) || !grp) - { - return NULL; - } - std::map<size_t, adGroupQueue *>::iterator it = mapping.find (grp); - adGroupQueue *q; - if (it == mapping.end()) - { - AD_DEBUG_LOG ("new queue " + tos(grp) + " on " + id, ADLOGNAME, m_sd->ID()); - mapping [grp] = q = new adGroupQueue(); - } - else - q = it->second; - adTrigger *cur = NULL; //, *prev = NULL; - cur = triggers.empty() ? NULL : triggers.front(); - - if (cur == NULL || cur->m_id != id) - { - //prev = cur; - createNewTrigger (id); - if (cur && cur->m_playedAt == 0) - { - triggers.remove (cur); - releaseTrigger (cur); - return addToGroup (id, grp, f); - } - } - else - if (cur->m_playedAt) - { - AD_DEBUG_LOG ("Trigger " + id + " has already started, skipping", ADLOGNAME, m_sd->ID()); - return NULL; - } - - cur = triggers.front(); - - adGroup *g = q->queue.empty() ? NULL : q->queue.front(); - - if (g && g->m_trigger != cur) - g = NULL; - if (g == NULL || g->m_trigger->m_playedAt) - { - g = new adGroup; - g->m_trigger = cur; - q->queue.push_front (g); - } - g->appendAdvert(*f); - - if (cur->m_maxSizeSC1 < g->m_totalSizeSC1) - cur->m_maxSizeSC1 = g->m_totalSizeSC1; - if (cur->m_maxSizeSC2 < g->m_totalSizeSC2) - cur->m_maxSizeSC2 = g->m_totalSizeSC2; - - return NULL; -} - -#if 0 -void streamData::adGroups::queueNewSet(const streamID_t sid, adGroups *qGroups) -{ - stackLock sml(m_lock); - if (qGroups) - { - if (queuedGroups) - { - AD_DEBUG_LOG("[ADVERT sid=" + tos(sid) + "] Replacing queued advert set"); - delete queuedGroups; - } - queuedGroups = qGroups; - if (queuedGroups->mapping && queuedGroups->adData) - { - const size_t group_size = queuedGroups->mapping->size(), - adverts_size = queuedGroups->adData->size(); - ILOG("[ADVERT sid=" + tos(sid) + "] Updated adverts: queued " + - tos(group_size) + " group" + (group_size != 1 ? "s" : "") + ", " + - tos(adverts_size) + " advert" + (adverts_size != 1 ? "s" : "") + ", " + - tos((queuedGroups->skippedAds > 0 ? queuedGroups->skippedAds : 0)) + - " advert file" + (queuedGroups->skippedAds != 1 ? "s" : "") + " skipped," - " next update in " + tos(queuedGroups->nextUpdate - ::time(NULL)) + " seconds."); - } - } -} -#endif - -#if 0 -void streamData::adGroups::flushGroupCounts(const streamData::streamID_t sid) -{ - if (mapping.empty() == false) - { - streamData *sd = streamData::accessStream (sid); - if (sd == NULL) - return; - - if (sd->radionomyID().empty() && sd->streamAdvertMode()) - { - metrics::adSummary summary; - - summary.sid = sid; - summary.path = getStreamPath(sid); - summary.tstamp = playedAt; - summary.sd = sd; - - for (adGroupMap_t::iterator it = mapping.begin(); it != mapping.end(); ++it) - { - summary.group = (*it).first; - (*it).second->flushStats (summary); - } - } - sd->releaseStream(); - } -} -#endif - -#if 0 -// if the increase is set to false then we require the sid -void streamData::adGroups::join(const bool increase, const streamData::streamID_t sid, const bool testing) -{ - stackLock sml(m_lock); - if (increase) - { - if ((refcount == 0) && (playedAt == 0)) - { - AD_DEBUG_LOG("[ADVERT sid=" + tos(sid) + "] Starting " + (testing ? "test " : "") + "advert run"); - playedAt = ::time(NULL); - } - ++refcount; - } - else - { - --refcount; - if (refcount == 0) - { - AD_DEBUG_LOG("[ADVERT sid=" + tos(sid) + "] End of " + (testing ? "test " : "") + "advert run"); - if (!testing) - { - flushGroupCounts(sid); - nextUpdate = 1; // force new download of adverts - } - playedAt = 0; - } - } -} -#endif - -streamData::adTrigger::~adTrigger () -{ - AD_DEBUG_LOG ("Trigger destroyed, " + m_id, ADLOGNAME, m_sid); -} - - -void streamData::adGroups::releaseTrigger (adTrigger *trigger) -{ - if (trigger == NULL) return; - - AD_DEBUG_LOG ("trigger " + trigger->m_id + " had count " + tos(trigger->m_inUse), ADLOGNAME, trigger->m_sid); - if (trigger->m_inUse > 1) - { - --trigger->m_inUse; - return; - } - if (trigger->m_playedAt) - flushStats (trigger); - - adGroupMap_t::iterator it = mapping.begin(); - unsigned int num = 0; - - while (it != mapping.end()) - { - size_t grp_num = it->first; - adGroupQueue *q = it->second; - - ++it; - if (q->queue.empty()) - continue; - - adGroup *g = q->queue.back(); - if (g->m_trigger == trigger) // should be true - { - q->queue.pop_back(); - AD_DEBUG_LOG ("deleting from group " + tos(grp_num) + " matching trigger " + tos(trigger->m_id), ADLOGNAME, trigger->m_sid); - delete g; - ++num; - } - else - AD_DEBUG_LOG ("trigger unexpected " + tos(g->m_trigger->m_id), ADLOGNAME, trigger->m_sid); - } - ILOG ("trigger " + tos(trigger->m_id) + " dropped with " + tos(num) + " populated groups", ADLOGNAME, trigger->m_sid); - delete trigger; -} - - -void streamData::adGroups::purgeGroups() -{ - adGroupMap_t::iterator it = mapping.begin(); - - while (it != mapping.end()) - { - size_t grp_num = it->first; - adGroupQueue *q = it->second; - - if (q->listeners == 0) - { - adGroupMap_t::iterator to_go = it; - adGroupQueue *q = to_go->second; - ++it; - AD_DEBUG_LOG ("Purging group " + tos (grp_num), ADLOGNAME, m_sd->ID()); - mapping.erase (to_go); - delete q; - continue; - } - // DLOG ("[ADVERT] purge group " + tos(grp_num) + "still has " + tos (q->listeners)); - ++it; - } -} - - -streamData::adGroupQueue::~adGroupQueue() -{ - list<adGroup*>::iterator it = queue.begin(); - - AD_DEBUG_LOG ("[ADVERT] queue destroyed, blocks remaining " + tos(queue.size())); - for (; it != queue.end(); ++it) - { - AD_DEBUG_LOG ("[ADVERT] Deleting group"); - delete *it; - } -} - - -void streamData::adGroupQueue::flushStats (metrics::adSummary &summary, adTrigger *trigger) -{ - for (list<adGroup*>::iterator it = queue.begin(); it != queue.end(); ++it) - { - adGroup *g = *it; - if (g->m_trigger == trigger && g->m_trigger->m_inUse <= 1) - { - summary.id = g->m_trigger->m_id; - g->flushCounts (summary); - break; - } - } -} - - -int streamData::adGroup::recalculateTotalSize () -{ - std::deque <adEntry>::iterator it = ads.begin(); - int missing = 0; - - m_totalSizeSC1 = 0; - m_totalSizeSC2 = 0; - for (;it != ads.end(); ++it) - { - adEntry &e = *it; - if (e.ad == NULL || e.ad->m_missing) - { - ++missing; - continue; - } - m_totalSizeSC1 += e.ad->m_sc1Buffer.size(); - m_totalSizeSC2 += e.ad->m_sc2Buffer.size(); - } - if (m_trigger) - { - bool updated = false; - if (m_trigger->m_maxSizeSC1 < m_totalSizeSC1) - { - m_trigger->m_maxSizeSC1 = m_totalSizeSC1; - updated = true; - } - if (m_trigger->m_maxSizeSC2 < m_totalSizeSC2) - { - m_trigger->m_maxSizeSC2 = m_totalSizeSC2; - updated = true; - } - if (updated) - AD_DEBUG_LOG ("Group size is " + tos(m_totalSizeSC1) + "/" + tos(m_totalSizeSC2), ADLOGNAME, m_trigger->m_sid); - } - return missing; -} - - -void streamData::adGroups::flushStats (adTrigger *trigger) -{ - adGroupMap_t::iterator it = mapping.begin(); - metrics::adSummary summary; - - summary.sid = m_sd->ID(); - summary.path = getStreamPath(summary.sid); - summary.sd = m_sd; - - //DLOG ("FLUSHing stats for metrics"); - for (; it != mapping.end(); ++it) - { - adGroupQueue *q = it->second; - - summary.group = (*it).first; - q->flushStats (summary, trigger); - } -} - - -streamData::adGroup *adGroupAccess::getGroup(streamData::streamID_t, streamData::adGroups &, const bool) -{ - if (cached_ref) - return cached_ref; // avoids the traversal of map - if (m_groupQueue == NULL) - return NULL; - - return cached_ref; -} - - -bool adGroupAccess::foundNextAdvert (const streamData::streamID_t sid, streamData::adGroups &/*groups*/, streamData::adGroup &g) -{ - do - { - if (idx >= (int)g.ads.size()) - break; - streamData::adEntry *e = &g.ads[idx]; - if (e == NULL || e->ad == NULL) - { - AD_DEBUG_LOG("Listener on group " + (group == -2 ? "TEST" : tos(group)) + - ", idx " + tos(idx) + ", content missing", ADLOGNAME, sid); - idx++; - continue; - } - utf8 msg = "Listener (grp "; - msg += tos (group); - msg += ", idx "; - msg += tos (idx); - msg += ", ad dura "; - msg += tos(e->ad->m_duration); - msg += ", rem "; - msg += tos(m_duration); - msg += ")"; - AD_DEBUG_LOG (msg, LOGNAME, sid); - - unsigned ad_dur = (unsigned)(e->ad->m_duration+0.5); - if (g.m_trigger->m_type == ADVERT_MAP_FIXED && ad_dur > m_duration) - { - idx++; - continue; - } - if (g.m_trigger->m_type == ADVERT_MAP_FLEX) - m_duration -= ad_dur; - ++g.ads [idx].upper; - return true; - } while (1); - return false; -} - - -bool adGroupAccess::anotherAd(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing) -{ - streamData::adGroup *g = getGroup(sid, groups, testing); - if ((g == NULL) || g->ads.empty()) - { - cached_ref = NULL; - return false; - } - - offset = 0; - int total = (int)g->ads.size(); - - ++idx; - if (idx < total) - { - stackLock sml(groups.m_lock); - if (foundNextAdvert (sid, groups, *g)) - { - return true; - } - } - return false; -} - -const bool adGroupAccess::inAdvertMode() const -{ - return (cached_ref) ? true : false; -} - -void adGroupAccess::setGroup (size_t id) -{ - group = id; - m_grpChanged = true; -} - -void adGroupAccess::changedGroup (streamData::adGroups &groups) -{ - if (m_grpChanged == false || inAdvertMode()) - return; - - if (m_groupQueue) - groups.detachGroupQueue (*this); - groups.attachGroupQueue (*this); - m_grpChanged = false; -} - - -bool adGroupAccess::haveAdverts(const streamData::streamID_t sid, streamData::adGroups &groups, streamData::ringBufferAccess_t pos) -{ - if (m_groupQueue == NULL) - return false; - - streamData::adGroup *g = groups.findGroup (*this, pos), *prev = cached_ref; - - if ((g == NULL) || (g->ads.size() == 0)) - { - return false; - } - idx = 0; - - cached_ref = g; - stackLock sml(groups.m_lock); - ++g->m_trigger->m_inUse; - m_duration = g->m_trigger->m_duration; - if (m_duration == 0) - m_duration = 3600; - if (prev) - groups.releaseTrigger (prev->m_trigger); - if (foundNextAdvert (sid, groups, *g)) - return true; - return false; -} - -streamData::specialFileData *adGroupAccess::getAd(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing) -{ - streamData::adGroup *g = getGroup(sid, groups, testing); - do - { - if (g == NULL) break; - if (idx < 0 || idx >= (int)g->ads.size()) break; - - streamData::adEntry *e = &g->ads[idx]; - return e->ad; - } while (1); - return NULL; -} - -void adGroupAccess::stopAdRun(const streamData::streamID_t, streamData::adGroups &groups, const bool) -{ - if (cached_ref) - { - if (cached_ref->m_trigger) - groups.releaseTrigger (cached_ref->m_trigger); - cached_ref = NULL; - } -} - -// routine to catch whatever conditions will trigger an advert -// -void streamData::checkForAdverts() -{ - // only fire if it's a public stream and the stream has been added to the YP - // otherwise we're not going to have the radionomyid from the authhash info. - if (!iskilled() && (m_streamInfo.m_streamPublic) && - (!m_dead) && m_ID && m_streamInfo.m_advertMode && - (m_streamInfo.m_avgBitrate > 0) && (m_streamInfo.m_streamSampleRate > 0)) - { - advertGroups.checkForNewAdverts(targetSpotUrl(), ID()); - } -} - -void streamData::adGroups::checkForNewAdverts(const uniString::utf8& url, const streamData::streamID_t sid) -{ - time_t now = ::time (NULL); - bool start_map_retrieval = false; - do - { - stackLock sml (adContentLock); - if (m_nextDownloadRun && m_nextDownloadRun <= now) - { - m_nextDownloadRun = 0; - SimpleThread (streamData::adGroups::runAdDownload, NULL); - } - - // in this case, we should just skip until things - // have been processed. when processed then we - // can step through and that will allow updates. - if (nextUpdate == 0) - { - if (retriever && retriever->cleanup) - break; - return; - } - else if (nextUpdate <= now) - { - nextUpdate = 0; // disable while this starts up - start_map_retrieval = true; - break; - } - return; - } while (0); - - if (start_map_retrieval) - { - loadGroups(url, sid); - return; - } - AD_DEBUG_LOG("Cleanup advert map thread", ADLOGNAME, sid); - delete retriever; - retriever = NULL; -} - -uniString::utf8 streamData::getAdvertGroup() -{ - if (m_streamInfo.m_advertMode) - { - utf8 groups = "Ad setup is correct, but no adverts / groups are currently assigned to this stream."; - // only fire if it's a public stream and the stream has been added to the YP - // otherwise we're not going to have the radionomyid from the authhash info. - if ((m_streamInfo.m_streamPublic) && (!m_dead) && m_ID && m_streamInfo.m_advertMode) - { - groups = advertGroups.getAdvertGroup(); - } - else - { - if (m_dead) - { - return "Ads cannot be provided without an active stream source."; - } - else - { - return "Stream is not configured properly for ads.<br><br>" - "Check that the authhash for this stream is correct, " - "and contact support if the condition persists."; - } - } - return groups; - } - - // otherwise, we have to assume that we've - // been able to get something or it's just - // not configured and so need to register. - return "This stream is not configured for adverts.<br><br>" + - utf8(m_streamInfo.m_radionomyID.empty() ? "Please <a target=\"blank\" href=\"https://radiomanager.shoutcast.com\"><b>register</b></a> your stream for the DNAS+ service" : - "Please <a target=\"blank\" href=\"https://radiomanager.shoutcast.com\"><b>upgrade</b></a> your stream to the DNAS+ service") + - " to enable advert support."; -} - -bool streamData::knownAdvertGroup(const streamData::streamID_t &sid, const int group) -{ - if (sid > 0) - { - map<streamID_t,streamData*>::const_iterator i = g_streamMap.find(sid); - if (i == g_streamMap.end()) - { - return false; - } - adGroups &gps = (*i).second->advertGroups; - stackLock sml (gps.m_lock); - return ((*i).second->advertGroups.findQueue (group) != NULL); - - } - return false; -} - - -streamData::adGroupQueue *streamData::adGroups::findQueue (int grp) -{ - std::map<size_t, adGroupQueue *>::iterator it = mapping.find (grp); - adGroupQueue *q = NULL; - if (it != mapping.end()) - q = it->second; - return q; -} - - -utf8 streamData::adGroups::getAdvertGroup() -{ - stackLock sml(m_lock); - - utf8 groups; - unsigned count = 0; - for (adGroupMap_t::const_iterator it = mapping.begin(); it != mapping.end(); ++it, ++count) - { - groups += (count ? ", " : "The following advert groups are currently in use:<br><br><b>") + tos((*it).first); - } - - if (count) - { - groups += "</b>"; - } - else - groups += "Ad setup is correct, but no adverts / groups are currently assigned to this stream."; - - if (skippedAds > 0) - { - groups += "<br><br>There are adverts retrieved which do not match the current stream format.<br>" - "These will not be played to avoid breaking stream playback."; - } - return groups; -} - - -struct ad_dload_info -{ - stringstream ss; - int respcode; - int type; - size_t length; - - ad_dload_info() { respcode = 0; length = 0; type = 0; } -}; - - -static size_t handle_ad_dload_header (void *ptr, size_t size, size_t nmemb, void *stream) -{ - ad_dload_info *info = (ad_dload_info*)stream; - size_t length = size * nmemb; - char *s = (char*)ptr; - - do - { - if (length == 0) break; - - s [length] = 0; - - if (length > 12 && strncmp (s, "HTTP", 4) == 0) - { - unsigned int resp = 0; - char eol[5] = ""; - if (sscanf (s, "%*8s %u %4[^\r]", &resp, eol) == 2 && strcmp (eol, "OK") == 0 && resp > 99 && resp < 600) - info->respcode = resp; - break; - } - if (length > 12 && strncasecmp (s, "content-type:", 13) == 0) - { - char content[40]; - if (sscanf (s+14, " %40[^\r ]", content) == 1) - { - if (strcmp (content, "audio/aac") == 0) - info->type = AAC_LC_DATA; - else if (strcmp (content, "audio/aacp") == 0) - info->type = AACP_DATA; - else if (strcmp (content, "audio/mpeg") == 0) - info->type = MP3_DATA; - else if (strcmp (content, "application/octet-stream") == 0) - { - AD_DEBUG_LOG("[ADVERT] ad download has default mime, assuming aac"); - info->type = AACP_DATA; - } - else - { - WLOG ("[ADVERT] ad download has unexpected mime " + utf8(content)); - return 0; - } - break; - } - } - } while (0); - return length; -} - - -static size_t handle_ad_dload_body (void *ptr, size_t size, size_t nmemb, void *stream) -{ - ad_dload_info *info = (ad_dload_info*)stream; - size_t length = size * nmemb; - if (info->ss) - { - info->ss.write ((const char*)ptr, length); - info->length += length; - } - - bandWidth::updateAmount (bandWidth::ADVERTS, length); - return length; -} - - -THREAD_FUNC streamData::adGroups::runAdDownload (void* /*arg*/) -{ - int purged = 0, retry = 0, added = 0, count = 0; - CURL *curl = NULL; - ad_dload_info info; - char curl_error [CURL_ERROR_SIZE]; - - curl = webClient::setupCurlDefaults (curl, "[ADVERT] ", "", 4, 20L); - if (curl == NULL) - { - // set retry time - m_nextDownloadRun = ::time(NULL) + 25; - return NULL; - } - curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, handle_ad_dload_header); - curl_easy_setopt (curl, CURLOPT_HEADERDATA, &info); - curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, handle_ad_dload_body); - curl_easy_setopt (curl, CURLOPT_WRITEDATA, &info); - curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, &(curl_error[0])); - - // use progress/xfer functions to trap for the server kill case - curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 0L); - curl_easy_setopt (curl, CURLOPT_XFERINFOFUNCTION, xferinfo); - curl_easy_setopt (curl, CURLOPT_XFERINFODATA, (long)-1); - -#ifdef CURLOPT_PASSWDFUNCTION - curl_easy_setopt (curl, CURLOPT_PASSWDFUNCTION, my_getpass); -#endif - // limit to 200 in one run and assume 6 retries is not a good sign and likely to stall things - while (count < 200 && retry < 6) - { - specialFileData *f; - if (1) - { - // grab the oldest - stackLock sml (adContentLock); - if (iskilled() || adContentPending.empty()) - break; - list<specialFileData*>::iterator it = adContentPending.begin(); - f = *it; - adContentPending.pop_front(); - } - ++count; - if (f->m_url == "") - { - ILOG ("[Advert] download requested but no url specified " + f->m_description); - specialFileData::release (f); - continue; - } - // clear old data - memset (curl_error, 0, CURL_ERROR_SIZE); - info.respcode = 0; - info.length = 0; - info.type = 0; - info.ss.str (string()); - - curl_easy_setopt (curl, CURLOPT_URL, f->m_url.c_str()); - int ret = curl_easy_perform (curl); - if (ret != CURLE_OK) - { - // assume a timeout, add to the end for checking later - if (f->m_retried < 2) - { - ++f->m_retried; - ILOG("[ADVERT] failed to get " + f->m_description + ", will retry"); - ++retry; - stackLock sml (adContentLock); - adContentPending.push_back (f); - continue; - } - ILOG ("[ADVERT] retried " + f->m_description + " several times, skipping"); - } - else if (info.respcode == 200 && info.length && info.type) - { - // ok, we have something that initially looks like something - vector<__uint8> &v = f->m_sc1Buffer; - v.reserve (info.ss.tellp()); - std::copy (std::istreambuf_iterator<char>( info.ss ), std::istreambuf_iterator<char>(), std::back_inserter(v)); - - //unsigned int read_samplerate = 0; - - f->verifyData("[ADVERT]"); - - // now we either have nothing left or something valid - if (v.size() > 0) - { - string e = " (" + tos (info.length); - if (info.length != v.size()) - e += " bytes, processed down to " + tos(v.size()); - - added++; - specialFileData::release (f); // from content pending not pool - ILOG("[ADVERT] Loaded advert " + f->m_description + e + " bytes), referenced " + tos(f->getRefcount())); - continue; - } - ILOG ("[ADVERT] no useful data returned for " + f->m_description + " so flag for removal"); - } else { - ELOG("[ADVERT] failed to get " + f->m_description + ", resp " + tos(info.respcode) + ", len " + tos(info.length) + ", type " + tos (info.type)); - } - f->m_failed = true; - // missing content, need to remove from pool - ++purged; - specialFileData::release (f); // from content pending - stackLock sml (adContentLock); - adData.erase (f->m_description); // drop entry from pool - specialFileData::release (f); // actually release pool reference - } - if (added || purged || retry) - ILOG("[ADVERT] downloaded " + tos(added) + ", purged " + tos(purged) + ", to be retried " + tos(retry)); - curl_easy_cleanup (curl); - - time_t expire_advert = ::time(NULL) - 5400; // adverts untouched for 90 mins are dropped - stackLock sml (adContentLock); - - unsigned expired_ads = 0; - - map<string, specialFileData*>::iterator it = adData.begin(); - while (it != adData.end()) - { - specialFileData *f = it->second; - map<string, specialFileData*>::iterator to_go = it; - ++it; - if (f->getRefcount() == 1 && f->m_lastUsed < expire_advert) - { - DLOG ("[ADVERT] ad " + f->m_description + " unused, dropping"); - adData.erase (to_go); // drop entry from pool - specialFileData::release (f); // actually release pool reference - ++expired_ads; - } - } - if (expired_ads) - ILOG("[ADVERT] " + tos(expired_ads) + " advert(s) expired from pool"); - - if (m_nextDownloadRun == 0) - m_nextDownloadRun = ::time(NULL) + ((count < 200) ? (retry ? 20 : 60) : 2); - - return NULL; -} - - -THREAD_FUNC streamData::adGroups::process(void* arg) -{ - streamData *sd = 0; - try - { - adGroupsRetriever*& m_retriever = reinterpret_cast<adGroupsRetriever*&>(arg); - if (!iskilled() && m_retriever && m_retriever->loaded && m_retriever->m_curl && - streamData::isSourceConnected(m_retriever->m_sid)) - { - AD_DEBUG_LOG ("Trying to retrieve updated advert map", ADLOGNAME, m_retriever->m_sid); - memset(m_retriever->m_curl_error, 0, CURL_ERROR_SIZE); - CURL *curl = (!iskilled() ? m_retriever->m_curl : NULL); - - struct curl_slist *list = NULL; - std::string uuid; - if (m_retriever->last_uuid != "") - { - uuid = "Last-BlueBox-UUID: " + m_retriever->last_uuid; - list = curl_slist_append (list, uuid.c_str()); - curl_easy_setopt (curl, CURLOPT_HTTPHEADER, list); - } - CURLcode ret = (!iskilled() ? curl_easy_perform(curl) : CURLE_FAILED_INIT); - - if (list) - curl_slist_free_all (list); - - map<string, bool> skipped; - int duration = 60; // default retry interval - bool error = false; - string id; - - stringstream s; - s << tos(time_now_ms()); - id = s.str(); - - sd = streamData::accessStream (m_retriever->m_sid); - do - { - if (ret != CURLE_OK) - { - if (ret != CURLE_ABORTED_BY_CALLBACK) - { - ELOG ("Advert map retrieval failed with code: " + - tos(ret) + " [" + (m_retriever->m_curl_error[0] ? - m_retriever->m_curl_error : curl_easy_strerror(ret)) + "]", ADLOGNAME, m_retriever->m_sid); - } - else - { - curl = 0; // abort this attempt - if (sd) - { - sd->releaseStream(); - sd = 0; - } - break; - } - - // better to retry in 1 minute than wait 20 minutes for connection - // failure issues, etc especially if could not connect on startup - duration = 60; - break; - } - - string tag; - - map<string, specialFileData*> &fileContents = sd->advertGroups.adData; - - string line1; - while (!iskilled() && getline(m_retriever->ss, line1)) - { - line1 = stripWhitespace(line1); - if (line1.empty()) - { - error = true; - AD_DEBUG_LOG("Blank line detected for tag", ADLOGNAME, m_retriever->m_sid); - break; - } - - if (gOptions.adMetricsDebug()) - { - string outp = line1.substr (0, 40); - if (line1.length() > 40) - outp += "..."; - AD_DEBUG_LOG("Retrieved line: " + outp, ADLOGNAME, m_retriever->m_sid); - } - - stringstream line(line1); - line >> tag; - if (tag == "NextCall") - { - line >> duration; - if (duration < 5) - { - duration = 120; // filter out silly values. - } - continue; - } - if (tag == "ID") - { - line >> id; - continue; - } - if (tag == "G") - { - int group = 0; - string name; - line >> group >> name; - // add to group if name exists in map - map<string, specialFileData*>::const_iterator it = fileContents.find(name); - if (it != fileContents.end()) - { - specialFileData *f = it->second; - if (f->m_failed == false) - { - sd->advertGroups.addToGroup (id, group, f); - continue; - } - } - if (skipped.find(name) == skipped.end()) - { - WLOG("Missing advert ref " + name + " on group " + tos(group), ADLOGNAME, m_retriever->m_sid); - } - continue; - } - if (tag == "AdURL") - { - string name, url; - line >> name; - AD_DEBUG_LOG("Parse groups: ref " + name, ADLOGNAME, m_retriever->m_sid); - if (line.fail() || name[0] == '\0') - continue; - - line >> url; - if (url.empty() == false) - { - stackLock sml (adContentLock); - - map<string, specialFileData*>::const_iterator map_it = fileContents.find(name); - if (map_it != fileContents.end()) - continue; // already loaded - - std::list<specialFileData*>::iterator it = adContentPending.begin(); - - for (; it != adContentPending.end(); ++it) - { - if ((*it)->m_description == name) - { - if ((*it)->m_missing) - AD_DEBUG_LOG("found " + tos(name) + " waiting for retrieval", ADLOGNAME, m_retriever->m_sid); - break; - } - } - if (it != adContentPending.end()) - continue; // already scheduled to be downloaded - - specialFileData *f = new specialFileData (name, url); - if (f) - { - f->increaseRefcount(); // referenced now in the 2 following places - fileContents [name] = f; - adContentPending.push_back (f); - } - } - } - if (tag == "Ad") - { - bool process_file = true; - string name, b64; - line >> name; - AD_DEBUG_LOG("Parse groups: ref " + name, ADLOGNAME, m_retriever->m_sid); - if (line.fail() || name[0] == '\0') - continue; - -// we should allow for replacing an existing advert eventually - line >> b64; - stackLock sml (adContentLock); - - map<string, specialFileData*>::const_iterator it = fileContents.find(name); - if (it != fileContents.end()) - { - process_file = false; - } - - if (line.fail()) - { - stringstream enc; -#if 1 // one line per base64 encoded advert - if (getline(m_retriever->ss, line1) && process_file) - { - enc << line1; - } -#else // multiple lines for base64 content but terminates on blank line - while (getline (ss, line1)) - { - if (line1 == "") - { - break; // End of base64 block - } - //AD_DEBUG_LOG("[ADVERT sid=" + tos(SID) + "] Read " + tos(line1.size())); - if (process_file) - { - enc << line1; - } - } -#endif - b64 = enc.str(); - line.clear(); - } - if (!b64.empty()) - { - specialFileData *f = new specialFileData(name); - if (f) - { - vector<__uint8> v = base64::decode(b64); - size_t original_size = v.size(); - - - int uvoxDataType = (sd ? sd->streamUvoxDataType() : MP3_DATA), - bitrate = (sd ? sd->streamBitrate() : -1); - unsigned int read_samplerate = (sd ? sd->streamSampleRate() : 0), - samplerate = read_samplerate; - // if the bitrate is not known, setting -1 will reject things - // as we cannot be sure well insert ok if using '0' otherwise - int read_bitrate = cleanFileData("", v, v.size(), bitrate, samplerate, uvoxDataType, - "[ADVERT sid=" + tos(m_retriever->m_sid) + "] ", "advert", read_samplerate); - if (!v.empty()) - { - f->replaceData(v, uvoxDataType, read_bitrate, read_samplerate); - AD_DEBUG_LOG("Retrieved advert of length " + - tos(original_size) + " bytes" + (original_size != v.size() ? " (processed down to " + - tos(v.size()) + " bytes)" : ""), ADLOGNAME, m_retriever->m_sid); - fileContents [name] = f; - } - else - { - delete f; - AD_DEBUG_LOG("Skipping advert - does not match the current stream format. Got " + - tos(read_bitrate) + " kbps, " + sampleRateStr(read_samplerate) + - " vs " + tos(bitrate) + " kbps, " + sampleRateStr(samplerate), ADLOGNAME, m_retriever->m_sid); - - // this is a special case for when there is no advert - // group but we're getting generic fillers (which we - // cannot use as we don't know who it's intended for) - if (name.find("completions") == string::npos) - { - skipped[name] = true; - } - } - } - } - continue; - } - } - - // if we've got configured 'test' files then we - // add them in at this stage though we have the - // means to load them on-demand if not done now - if (!sd) - { - sd = streamData::accessStream(m_retriever->m_sid); - } - if (!skipped.empty()) - { - AD_DEBUG_LOG("Skipped " + tos(skipped.size()) + " adverts not matching the current stream format", ADLOGNAME, m_retriever->m_sid); - } - } while (iskilled()); - - if (!curl) - { - // abort as there's nothing we can do - // that won't otherwise make a crash - return 0; - } - else - { - stackLock sml (adContentLock); - sd->advertGroups.skippedAds = (!error ? (int)skipped.size() : -1); - AD_DEBUG_LOG("Advert update interval: " + tos(duration), ADLOGNAME, m_retriever->m_sid); - sd->advertGroups.nextUpdate = ::time(NULL) + duration; - sd->advertGroups.lastUUID = m_retriever->last_uuid; - time_t now = ::time(NULL); - if (m_nextDownloadRun && m_nextDownloadRun > (now + 6)) - m_nextDownloadRun = now + 4; - - m_retriever->cleanup = 1; - } - sd->releaseStream(); - sd = 0; - } - } - catch (...) - { - adGroupsRetriever*& m_retriever = reinterpret_cast<adGroupsRetriever*&>(arg); - if (m_retriever) - { - m_retriever->cleanup = 1; - } - - if (sd) - { - sd->releaseStream(); - } - } - return 0; -} - -void streamData::adGroups::loadGroups(const utf8& url, const streamData::streamID_t sid) -{ - if (sid > 0) - { - stackLock sml(m_lock); - - if (retriever) - { - if (retriever->cleanup == 0) - { - AD_DEBUG_LOG("Retriever thread already in progress", ADLOGNAME, sid); - nextUpdate = ::time(NULL) + 30; // re-check every so often - return; - } - - delete retriever; - retriever = NULL; - } - - retriever = new adGroupsRetriever(url, sid); - if (retriever && (retriever->loaded == 1) && (retriever->cleanup == 0) && isSourceConnected(sid)) - { - SimpleThread(streamData::adGroups::process, retriever); - } - else - { - if (retriever) - { - // re-check every so often, but if we needed to re-pull - // the stream's information then force a quicker check - nextUpdate = ::time(NULL) + (!retriever->loaded ? 10 : 1); - delete retriever; - retriever = NULL; - } - else - { - nextUpdate = ::time(NULL) + 30; // re-check every so often - } - } - } -} - - -streamData::adTrigger::adTrigger(const string &id, streamID_t sid) -{ - m_inUse = 1; - m_sid = sid; - m_id = id; - m_type = ADVERT_MAP_FIXED; - m_playedAt = (time_t)0; - m_returnPtrSC1 = m_returnPtrSC2 = 0; - m_maxSizeSC1 = m_maxSizeSC2 = 0; -} - - -streamData::adTrigger::adTrigger(const char *id, streamID_t sid) -{ - m_inUse = 1; - m_sid = sid; - m_id = string(id); - m_playedAt = (time_t)0; - m_type = ADVERT_MAP_FIXED; - m_returnPtrSC1 = m_returnPtrSC2 = 0; - m_maxSizeSC1 = m_maxSizeSC2 = 0; -} - -streamData::ringBufferAccess_t streamData::adTrigger::getStartPos (bool sc2) -{ - return sc2 ? m_startPosSC2 : m_startPosSC1; -} - - -bool operator==(const streamData::adTrigger &lhs, const streamData::adTrigger &rhs) -{ - return (lhs.m_id == rhs.m_id); -} - diff --git a/Src/Plugins/DSP/sc_serv3/streamData.h b/Src/Plugins/DSP/sc_serv3/streamData.h deleted file mode 100644 index cbad5b29..00000000 --- a/Src/Plugins/DSP/sc_serv3/streamData.h +++ /dev/null @@ -1,906 +0,0 @@ -#pragma once -#ifndef streamData_H_ -#define streamData_H_ - -#include <map> -#include <stdexcept> -#include "threadedRunner.h" -#include "unicode/uniString.h" -#include "threading/thread.h" -#include "yp2.h" -#include <deque> -#include "uvox2Common.h" -#include "auth.h" -#include "MP3Header.h" -#include "ADTSHeader.h" - -/* - This class encapsulates all the data for a stream. It also includes - static methods to manage the collection of streams -*/ -using namespace std; - -#define BUF_SIZE 16384 -#define SEND_SIZE 8192 - -class adGroupAccess; - -class streamData -{ -public: - friend class protocol_shoutcastClient; - friend class protocol_shoutcast1Client; - friend class protocol_shoutcast2Client; - friend class protocol_HTTPClient; - friend class protocol_flvClient; - friend class protocol_m4aClient; - -#if defined(_DEBUG) || defined(DEBUG) - friend class protocol_relay_uvox; - friend class protocol_relay_shoutcast; -#endif - -#define ADVERT_MAP_FIXED 0 -#define ADVERT_MAP_FLEX 1 -#define ADVERT_MAP_PAUSE 2 -#define ADVERT_MAP_MAGIC 3 - - class specialFileData; - class adEntry; - class adGroup; - - typedef enum - { - UNKNOWN = 0x0, - SHOUTCAST1 = 0x1, - SHOUTCAST2 = 0x2, - HTML5 = 0x4, - RELAY = 0x8, - WINAMP = 0x10, - ICECAST = 0x20, - VLC = 0x40, - FB2K = 0x80, - WMP = 0x100, - ITUNES = 0x200, - IE = 0x400, - CHROME = 0x800, - SAFARI = 0x1000, - FIREFOX = 0x2000, - SC_CDN_MASTER = 0x4000, - SC_CDN_SLAVE = 0x8000, - ROKU = 0x10000, - APPLE = 0x20000, - MPLAYER = 0x40000, - WARNING = 0x80000, - PS = 0x100000, - RADIO_TOOLBOX = 0x200000, - SC_IRADIO = 0x400000, - FLV = 0x800000, - M4A = 0x1000000, - HTTP = 0x2000000, - RADIONOMY = 0x4000000, - CURL_TOOL = 0x8000000, - SYNOLOGY = 0x10000000, - WIIMC = 0x20000000 - } source_t; - - typedef size_t streamID_t; - typedef std::set<streamData::streamID_t> streamIDs_t; - typedef uintptr_t ringBufferAccess_t; // we use power of 2 and mask trick to access ring buffer - // because of this, all related variables must have same type - struct ringBuffer_t - { - std::vector<__uint8> m_data; - ringBufferAccess_t m_writePtr; - ringBufferAccess_t m_ptrMask; // must be same type as m_sc1_write_ptr - - ringBuffer_t() : m_writePtr(0), m_ptrMask(0) {} - }; - - struct songHistoryInfo - { - uniString::utf8 m_title; // general title (or is empty) - uniString::utf8 m_metadata; // full metadata (if provided) - time_t m_when; // when it was played - - explicit songHistoryInfo(const uniString::utf8 &title, const uniString::utf8 &metadata) throw() : - m_title(title), m_metadata(metadata), m_when(::time(NULL)) {} - }; - typedef std::deque<songHistoryInfo> streamHistory_t; - - struct extraInfo - { - int ypConnected; - int ypErrorCode; - uniString::utf8 ypErrorMsg; - uniString::utf8 ypErrorMsgExtra; - bool isConnected; - bool isRelay; - bool isBackup; - - extraInfo() : ypConnected(0), ypErrorCode(200), isConnected(false), isRelay(false), isBackup(false) {} - }; - - struct streamInfo - { - uniString::utf8 m_streamUser; - uniString::utf8 m_streamName; - uniString::utf8 m_streamGenre[5]; - uniString::utf8 m_streamLogo; - uniString::utf8 m_streamURL; - uniString::utf8 m_radionomyID; - uniString::utf8 m_contentType; - int m_streamBitrate; // in kilobits - bool m_streamPublic; - bool m_vbr; // if it's vbr content and we need to bitrate match - bool m_backup; // signals if this a backup source being used - bool m_allowPublicRelay; - int m_streamSampleRate; // in Hz - int m_avgBitrate; // in bits - int m_maxBitrate; // in bits - int m_minBitrate; // in bits - source_t m_sourceType; - //size_t m_streamPeakUser; - int m_streamMaxUser; - int m_streamMaxBitrate; - int m_streamMinBitrate; - int m_uvoxDataType; // sc2 attributes - uniString::utf8 m_relayURL; // set if we are a relay (used in reporting) - uniString::utf8 m_backupURL; // set if we have a backup url for the source - uniString::utf8 m_srcAddr; // where is the source coming from - uniString::utf8 m_backupServer; - - // for yp2 - uniString::utf8 m_authHash; - uniString::utf8 m_publicIP; // the public IP address of the DNAS if returned by the YP - uniString::utf8 m_stationID; - uniString::utf8 m_serverID; - uniString::utf8 m_authUrl; // overriden url - uniString::utf8 m_advertsUrl; // overriden url - uniString::utf8 m_audienceUrl; // overriden url - uniString::utf8 m_tuneinAirApiUrl; // overriden url - uniString::utf8 m_targetSpotUrl; // overriden url - std::vector<uniString::utf8> m_backupServersList; - - uniString::utf8 m_currentURL; // used by v1 sources to set StreamUrl='%s'; in v1 metadata - uniString::utf8 m_currentSong; - uniString::utf8 m_comingSoon; - uniString::utf8 m_sourceIdent; - std::vector<uniString::utf8> m_nextSongs; - - static int m_allowSSL_global; - static int m_allowAllFormats_global; - static int m_allowMaxBitrate_global; - static int m_allowBackupURL_global; - - int m_allowSSL; - int m_allowAllFormats; - int m_allowMaxBitrate; - int m_allowBackupURL; - - int m_ypResponseCode; - int m_advertMode; - u_short m_srcPort; - - streamInfo() : m_streamBitrate(0), m_streamPublic(false), m_vbr(false), m_backup(false), - m_allowPublicRelay(true), m_streamSampleRate(0), m_avgBitrate(0), - m_maxBitrate(0), m_minBitrate(0), m_sourceType(streamData::SHOUTCAST1), - m_streamMaxUser(0), m_streamMaxBitrate(0), - m_streamMinBitrate(0), m_uvoxDataType(MP3_DATA), m_authUrl(DNAS_AUTH_URL), - m_advertsUrl(METRICS_ADVERTS_URL), m_audienceUrl(METRICS_AUDIENCE_URL), - m_targetSpotUrl(TARGETSPOT_URL), - #ifdef LICENCE_FREE - m_allowSSL(1), m_allowAllFormats(1), m_allowMaxBitrate(0), m_allowBackupURL(1), - #else - m_allowSSL(1), m_allowAllFormats(1), m_allowMaxBitrate(0), m_allowBackupURL(1), - #endif - m_advertMode(0), m_srcPort(0) {} - }; - - struct uvoxConfigData_t //(uvox2 and uvox21) - { - uniString::utf8 m_mimeType; - int m_avgBitrate; // in bits - int m_maxBitrate; // in bits - // buffer size stuff is not actually used in streamData, but is here for completeness. - // note that protocol_relay_uvox does not set these (and pretty much can't anyhow) - int m_desiredBufferSize; // in kilobytes, as requested by broadcaster - int m_minimumBufferSize; // in kilobytes, as requested by broadcaster - ///////////// - int m_icyPub; - uniString::utf8 m_icyName; - uniString::utf8 m_icyGenre; - uniString::utf8 m_icyURL; - - uniString::utf8 toLogString() const throw() - { - return "mimeType=" + m_mimeType + stringUtil::eol() + - "avgBitrate=" + stringUtil::tos(m_avgBitrate) + stringUtil::eol() + - "maxBitrate=" + stringUtil::tos(m_maxBitrate) + stringUtil::eol() + - "desiredBufferSize=" + stringUtil::tos(m_desiredBufferSize) + stringUtil::eol() + - "minimumBufferSize=" + stringUtil::tos(m_minimumBufferSize) + stringUtil::eol() + - "icyName=" + m_icyName + stringUtil::eol() + - "icyGenre=" + m_icyGenre + stringUtil::eol() + - "icyURL=" + m_icyURL + stringUtil::eol() + - "icyPub=" + stringUtil::tos(m_icyPub); - } - - uvoxConfigData_t() : m_avgBitrate(0), m_maxBitrate(0), m_desiredBufferSize(0), m_minimumBufferSize(0), m_icyPub(0) {} - }; - - struct streamSetup - { - const uniString::utf8& m_logString; - const uniString::utf8& m_srcAddr; - const uniString::utf8& m_authHash; - const uniString::utf8& m_streamUser; - const uniString::utf8& m_relayURL; - const uniString::utf8& m_backupURL; - - const source_t m_sourceType; - const streamID_t m_sid; - - const int m_srcPort; - const int m_maxStreamUser; - const int m_maxStreamBitrate; - const int m_minStreamBitrate; - const bool m_allowPublicRelay; - const bool m_backup; - const unsigned int m_sampleRate; - const bool m_vbr; - - httpHeaderMap_t m_headers; - uvoxConfigData_t m_config; - - streamSetup(const uniString::utf8 &logString, const uniString::utf8 &srcAddr, - const uniString::utf8 &authHash, const uniString::utf8 &streamUser, - const uniString::utf8 &relayURL, const uniString::utf8 &backupURL, - const source_t sourceType, const streamID_t sid, const int srcPort, - const int maxStreamUser, const int maxStreamBitrate, - const int minStreamBitrate, const bool allowPublicRelay, - const bool backup, const unsigned int sampleRate, - const bool vbr, httpHeaderMap_t headers) throw() - : m_logString(logString), m_srcAddr(srcAddr), m_authHash(authHash), - m_streamUser(streamUser), m_relayURL(relayURL), m_backupURL(backupURL), - m_sourceType(sourceType), m_sid(sid), m_srcPort(srcPort), - m_maxStreamUser(maxStreamUser), m_maxStreamBitrate(maxStreamBitrate), - m_minStreamBitrate(minStreamBitrate), m_allowPublicRelay(allowPublicRelay), - m_backup(backup), m_sampleRate(sampleRate), m_vbr(vbr), m_headers(headers) {} - - streamSetup(const uniString::utf8 &logString, const uniString::utf8 &srcAddr, - const uniString::utf8 &authHash, const uniString::utf8 &streamUser, - const uniString::utf8 &relayURL, const uniString::utf8 &backupURL, - const source_t sourceType, const streamID_t sid, const int srcPort, - const int maxStreamUser, const int maxStreamBitrate, - const int minStreamBitrate, const bool allowPublicRelay, - const bool backup, const unsigned int sampleRate, - const bool vbr, uvoxConfigData_t& config) throw() - : m_logString(logString), m_srcAddr(srcAddr), m_authHash(authHash), - m_streamUser(streamUser), m_relayURL(relayURL), m_backupURL(backupURL), - m_sourceType(sourceType), m_sid(sid), m_srcPort(srcPort), - m_maxStreamUser(maxStreamUser), m_maxStreamBitrate(maxStreamBitrate), - m_minStreamBitrate(minStreamBitrate), m_allowPublicRelay(allowPublicRelay), - m_backup(backup), m_sampleRate(sampleRate), m_vbr(vbr), m_config(config) {} - }; - - typedef pair<string, streamData::specialFileData*> adGroupEntry; // is the strings needed here? - - class adGroups; - class specialFileData - { - friend class adEntry; - friend class adGroups; - - private: - unsigned int m_refcount; - mutable AOL_namespace::mutex m_lock; - std::vector<__uint8> m_sc1Buffer; - std::vector<__uint8> m_sc2Buffer; - void _replaceData(const std::vector<__uint8> &data, const int uvoxDataType, - const int bitrate, const unsigned int samplerate) throw(); - - public: - const std::string m_description; - const std::string m_url; // these could be offloaded into separate object, only apply initially - int m_samplerate; - int m_bitrate; - float m_duration; - bool m_failed; - bool m_missing; - unsigned m_retried; - time_t m_lastUsed; - - explicit specialFileData(const std::string &description, const std::string &url = "") throw() : m_description(description), m_url(url) - { - m_failed = false; - m_missing = (url == "" ? false : true); - m_refcount = 1; - m_retried = 0; - m_samplerate = 0; - m_duration = 0; - m_lastUsed = (time_t)0; - } - ~specialFileData() throw() { m_lock.lock(); m_sc1Buffer.clear(); m_sc2Buffer.clear(); m_lock.unlock(); /*if (m_refcount > 1) abort();*/ } - - int loadFromFile(const uniFile::filenameType &name, const int bitrate, const int uvoxDataType, - const unsigned int samplerate, const uniString::utf8& logString) throw(); - int verifyData (const uniString::utf8& logString); - - void getSc1Data(std::vector<__uint8> &v) const throw() { stackLock sml(m_lock); v = m_sc1Buffer; } - void getSc2Data(std::vector<__uint8> &v) const throw() { stackLock sml(m_lock); v = m_sc2Buffer; } - - void updateUvoxData(const int uvoxDataType, const int bitrate, const unsigned int samplerate) throw(); - void replaceData(const std::vector<__uint8> &data, const int uvoxDataType, - const int bitrate, const unsigned int samplerate) throw(); - bool gotData(void) const throw() { stackLock sml(m_lock); return (!m_sc2Buffer.empty() && !m_sc1Buffer.empty()); } - unsigned int getRefcount () { return m_refcount; } - void increaseRefcount () { stackLock sml(m_lock); ++m_refcount; } - - static void release (specialFileData *f); - - friend class adGroup; - friend class protocol_shoutcastClient; - friend class protocol_shoutcast1Client; - friend class protocol_shoutcast2Client; - friend class protocol_HTTPClient; - friend class protocol_flvClient; - friend class protocol_m4aClient; - }; - - static int cleanFileData(uniFile::filenameType fn, vector<__uint8> &buffer, size_t siz, - const int bitrate, const unsigned int samplerate, - const int uvoxDataType, const uniString::utf8& logString, - const uniString::utf8& description, unsigned int &read_samplerate); - - class adTrigger; - class adGroupQueue; - - class adEntry - { - public: - size_t upper; - specialFileData *ad; - - ~adEntry() { if (ad) ad->release(ad); } - - explicit adEntry(specialFileData *d); - adEntry (const adEntry &e); - void flush(metrics::adSummary &summary); - }; - - class adGroup - { - friend class streamData::adGroups; - friend class streamData::adGroupQueue; - friend class adGroupAccess; - - adTrigger *m_trigger; - size_t m_totalSizeSC1; - size_t m_totalSizeSC2; - public: - std::deque <adEntry> ads; - adGroup() { m_totalSizeSC1 = m_totalSizeSC2 = 0; m_trigger = NULL; } - adGroup(adGroup &, adTrigger &); - ~adGroup() {;} - - void appendAdvert (specialFileData &d); - void flushCounts (metrics::adSummary &summary); - int recalculateTotalSize (); - }; - - class adGroupQueue - { - friend class adGroups; - void flushStats (metrics::adSummary &summary, adTrigger *); - public: - unsigned int listeners; - list <adGroup*> queue; - - adGroupQueue() { listeners = 0; } - ~adGroupQueue(); - - }; - - class adTrigger - { - friend class adGroupQueue; - public: - unsigned long m_inUse; - long m_type; // fixed/flex etc - streamData::ringBufferAccess_t m_startPosSC1; - streamData::ringBufferAccess_t m_startPosSC2; - streamData::ringBufferAccess_t m_returnPtrSC1; - streamData::ringBufferAccess_t m_returnPtrSC2; - time_t m_playedAt; - streamID_t m_sid; - string m_id; - size_t m_maxSizeSC1; - size_t m_maxSizeSC2; - unsigned m_duration; - - adTrigger(const char *id, streamID_t sid); - adTrigger(const string &id, streamID_t sid); - ~adTrigger(); - ringBufferAccess_t getStartPos (bool sc2 = true); - friend bool operator==(const streamData::adTrigger &lhs, const streamData::adTrigger &rhs); - }; - - typedef std::map<size_t, adGroupQueue*> adGroupMap_t; - - class adGroups - { - friend class adGroupAccess; - - static AOL_namespace::mutex adContentLock; - // a global map with a custom destructor - static struct gpool : map<string, specialFileData*> - { ~gpool(); } adData; // global pool - static list<specialFileData*> adContentPending; // downloading to global pool - - static time_t m_nextDownloadRun; - - streamData *m_sd; - string lastUUID; // last update marker - unsigned m_recheck; // serial count - - adGroup *findGroup (adGroupAccess &ac, ringBufferAccess_t pos); - void flushStats (adTrigger *trigger); - public: - class adGroupsRetriever; - adGroupsRetriever *retriever; - mutable AOL_namespace::mutex m_lock; - streamData::ringBufferAccess_t m_returnPtrSC1; - streamData::ringBufferAccess_t m_returnPtrSC2; - - adGroupMap_t mapping; - std::list<adTrigger*> triggers; - - unsigned refcount; // prevent update to groups if in use - int skippedAds; // used to help track stream mis-matches - time_t nextUpdate; - long m_type; // fixed/flex etc - - adGroups (streamData *sd); - ~adGroups(); - - bool attachGroupQueue (adGroupAccess &ac); - void detachGroupQueue (adGroupAccess &ac); - - void createNewTrigger (const string &reqID); - void purge (streamData::ringBuffer_t &buffer); - void purgeGroups(); - void duplicateTrigger (const string &id); - void setType (const uniString::utf8 &s); - size_t overlaySize (adTrigger *t, bool sc2 = false); - - adGroup *addToGroup(const string &id, const int grp, specialFileData *f); - - void loadGroups(const uniString::utf8& url, const streamData::streamID_t sid); - adGroupQueue *findQueue (int grp); - void checkForNewAdverts(const uniString::utf8& url, const streamData::streamID_t sid); - uniString::utf8 getAdvertGroup(); - void queueNewSet(const streamData::streamID_t id, adGroups *newgroups); - void flushGroupCounts(const streamData::streamID_t sid); - void releaseTrigger (adTrigger *trigger); - - static THREAD_FUNC process(void* arg); - static THREAD_FUNC runAdDownload(void* arg); - }; - -private: - // streams fall into two groups. Those which are active and usable, and those which are "dead". - // dead streams are those which are going away due to a media type change or a uvox terminate stream message. - // since the clients cannot go away instantaneously, they are considered "dying" until all references counts go - // to zero. Streams that are not dying (including those without a source) are cross referenced in the g_streamMap - // table - static AOL_namespace::mutex g_streamMapLock; - static std::set<streamData*> g_streams; // all the streams, including those that are "dying" - static std::map<streamID_t, streamData*> g_streamMap; // maps stream IDs to stream objects (active only) - static std::map<streamID_t, time_t> g_streamUptime; // tracks per-stream uptime (active only) - static std::map<streamData*, int> g_streamReferenceCounts; - static std::map<streamData*, bool> g_streamSourceIsConnected; // is the source connected - static AOL_namespace::mutex g_sourceRelayMapLock; - static std::map<streamData::streamID_t, int> g_streamSourceRelayIsActive; // is the source relay active e.g. connected or trying to connect or needs to die? - static AOL_namespace::mutex g_streamSongHistoryMapLock; - static std::map<streamID_t, streamHistory_t> g_streamSongHistoryMap; -#if defined(_DEBUG) || defined(DEBUG) - static map<streamData::streamID_t, FILE*> g_streamSaving; -#endif - // note: the "source is connected" concept was originally in the streamData object itself.To avoid races, that - // flag must be manipulated under the g_streamMapLock. This was confusing, I've moved the flag to the set of tables - // above that clearly require that lock to be in place - - // create a new stream object with the given config data and install it in the static global tables above - static streamData* _createNewStream(const streamSetup& setup) throw(std::exception); - - static void _reduceReferenceCount(const uniString::utf8& logString, streamData* sd, const streamID_t id); - // return null if stream does not exist - static streamData* _increaseReferenceCount(const streamID_t ID); - - static void _moveStreamToDeadPool(const streamID_t ID) throw(); - static void _moveStreamToDeadPool(streamData *sd) throw(); - static void _moveStreamToDeadPool(std::map<streamID_t,streamData*>::iterator i) throw(); - -public: - static void removeRelayStatus(streamID_t ID); - - static source_t getClientType(source_t clientType, const uniString::utf8& userAgent); - static source_t getClientTypeCompat(source_t clientType, const uniString::utf8& userAgent); - - static bool isAllowedType(const int type); - static bool isAllowedType(const int type, bool& mp3); - - static int convertRawToUvox (vector<__uint8> &sc2buffer, const vector<__uint8> &buf, - const int uvoxDataType, const int bitrate, const unsigned int samplerate) throw(); - - - // permanently stop all sources in preparation for shutdown - static void killAllSources() throw(); - static void killStreamSource(const streamID_t id) throw(); - static void killSource(const streamID_t id, streamData *sd = 0) throw(); - static streamIDs_t getStreamIds(const int mode = 0) throw(); - static size_t totalStreams() throw(); // returns total number of streamData objects including those that are dying - static size_t totalActiveStreams(size_t &lastSID) throw(); // returns total number of active streamData objects - static streamID_t enumStreams(const size_t index) throw(); // will enumerate the available streams - static streamID_t getStreamIdFromPath(const uniString::utf8 &url, bool& htmlPage) throw(); - - // Called by sources. create a stream from a type 1 (original shoutcast/http/icecast) - // source. If stream exists and is compatible then returns existing stream - // otherwise it creates a new one. Returns null if the stream already has a source - // this will fetch an existing stream for a source if it exists, or create it if it does not or the source is incompatible - static streamData* createStream(const streamSetup& setup) throw(std::exception); - ////////////////////////////////// - - // when the source goes away - static void streamSourceLost(const uniString::utf8& logString, streamData *sd, const streamID_t id); - // when a client goes away - static void streamClientLost(const uniString::utf8& logString, streamData *sd, const streamID_t id); - - // called by clients to get access to a stream. Null if stream does not exist - // isSourceActive flag is false if the source went away or if we are using yp2 and - // the yp2::add() function hasn't returned yet. - static streamData* accessStream(const streamID_t ID) throw(); - static streamData* accessStream(const streamID_t ID, bool &isSourceActive) throw(); - // ensure this is called after calling accessStream(..) otherwise we end up - // with references to the objects kept which isn't good for larger streams - void releaseStream(); - - static bool isSourceConnected(const streamID_t id) throw(); - - static int isRelayActive(const streamID_t id, bool &noEntry) throw(); - static void setRelayActive(const streamID_t id, int state) throw(); - static int setRelayActiveFlags (streamID_t id, bool &noEntry, int flags, int mask = 0); - - // get a streams content type, return empty string if not found or not set - static uniString::utf8 getStreamContentType(const streamID_t ID) throw(); - - // get all relevant info about the stream - static bool getStreamInfo(const streamID_t id, streamInfo &info, extraInfo &extra) throw(); - - static void getStreamSongHistory(const streamID_t id, streamHistory_t& songHistory) throw(); - - static bool getStreamNextSongs(const streamID_t id, uniString::utf8& currentSong, - uniString::utf8& comingSoon, - std::vector<uniString::utf8>& nextSongs) throw(); - - static time_t getStreamUptime(const streamID_t ID) throw(); - - static bool validateTitle(uniString::utf8 &m_updinfoSong) throw(); - - - static uniString::utf8 getContentType(const streamData::streamInfo &info) throw(); - - //////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////// END OF STATICS ////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////// -private: - ///////////////////////////////////////////////////////////////////////////////////////// - mutable AOL_namespace::mutex m_stateLock; - streamInfo m_streamInfo; - - const streamID_t m_ID; - time_t m_startTime; // when the stream started; - //// yp reporting state - time_t m_nextYPPush; // time we should send another push if not earlier - time_t m_maxYPInterval; // max seconds between reports - uniString::utf8 m_lastTouchTitle; // last title sent via tchsrv - yp2::yp2SessionKey m_yp2SessionKey; - //// - int m_creating; // 1 if in auto-creation state and 2 if completed or was an error - int m_kill; // 1 or 2 if we need to kill ourselves i.e. when using backup sources - short m_dead; - short m_adTest; // 1 if the advert trigger is for testing only - - bool m_insertAdvert; - unsigned m_duration; // for flexbreak; - // hole - - unsigned int m_lastStreamSampleRate; // in Hz (used for tracking samplerates - // to ensure we've got a 'good' match - int m_lastStreamBitrate; // used to detect vbr streams vs cbr/cbr - unsigned m_syncFrameCount; // used to see if we're failing to sync - - //////////////////// end variables covered by state lock /////////////////////////////// - - specialFileData m_introFile; - specialFileData m_backupFile; - specialFileData m_adTestFile; - specialFileData m_adTestFile2; - specialFileData m_adTestFile3; - specialFileData m_adTestFile4; - - ////////////////////////////////////////////////////// - // shoutcast1 ring buffer - AOL_namespace::rwLock m_sc1StreamLock; - AOL_namespace::rwLock m_sc21StreamLock; - - ringBuffer_t m_sc1_ring_buffer; - ringBuffer_t m_sc21_ring_buffer; // data is uvox encoded - -public: - adGroups advertGroups; - - void checkForAdverts(); - uniString::utf8 getAdvertGroup(); - static bool knownAdvertGroup(const streamData::streamID_t &sid, const int group); - -private: - // where are the start of packets - std::deque<ringBufferAccess_t> m_sc1_packet_starts;// not really important for sc1 - std::deque<ringBufferAccess_t> m_sc21_packet_starts; - ///////////////////////////////////////////////////////////// - - // the metadata table for sc1 stores metadata changes and the point in the - // buffer where they occur. The metadata is stored in the outgoing format - // a.k.a StreamTitle=.....; - // - // we also store nextTrack and comingSoon info in this table. It's a bit of a hack, but - // the code that updates yp2 uses this table to get the track title since it is quicker - // to search than the potential binary gunk that makes up uvox data. -public: - struct sc1MetadataAndExtensionInfo - { - uniString::utf8 m_songTitle; // this is in native shoutcast 1 stream format - uniString::utf8 m_songMetadataForYP2; // xml to be inserted directly into yp2 request - }; - -private: - AOL_namespace::mutex m_sc1MetadataLock; - typedef std::deque<std::pair<ringBufferAccess_t,sc1MetadataAndExtensionInfo> > sc1MetadataTable_t; - sc1MetadataTable_t m_sc1MetadataTable; - - // note that metadata for uvox style streams cannot be the utf8 type directly, because the utf8 type - // does sanity checks for valid utf8 codes. The metadata could just be binary junk and we must - // accept that. Instead, we use a vector of utf8::value_type which at least makes conversion to utf8 - // classes easier -public: - typedef std::vector<uniString::utf8::value_type> uvoxMetadata_t; - -private: - AOL_namespace::mutex m_sc21MetadataLock; - typedef std::deque<std::pair<ringBufferAccess_t,uvoxMetadata_t> > sc21MetadataTable_t; - sc21MetadataTable_t m_sc21MetadataTable; - uvoxMetadata_t m_sc21MetadataToPutInline; // metadata that must be put inline asap - - AOL_namespace::mutex m_sc21StreamAlbumArtLock; - AOL_namespace::mutex m_sc21PlayingAlbumArtLock; - typedef std::deque<std::pair<ringBufferAccess_t,uvoxMetadata_t> > sc21AlbumArtTable_t; - sc21AlbumArtTable_t m_sc21StreamAlbumArtTable; - uvoxMetadata_t m_sc21StreamAlbumArtToPutInline; // albumart that must be put inline asap - sc21AlbumArtTable_t m_sc21PlayingAlbumArtTable; - uvoxMetadata_t m_sc21PlayingAlbumArtToPutInline; // albumart that must be put inline asap - std::vector<__uint8> m_sc21AlbumArtData[2]; - size_t m_sc21AlbumArtMime[2]; -#if 0 - // limit triggers - AOL_namespace::mutex m_sc1LimitTriggerLock; - std::set<pipeDrivenSignal<AOL_namespace::mutex>*> m_sc1LimitTriggers; - - AOL_namespace::mutex m_sc21LimitTriggerLock; - std::set<pipeDrivenSignal<AOL_namespace::mutex>*> m_sc21LimitTriggers; - - static void _scheduleLimitTrigger(pipeDrivenSignal<AOL_namespace::mutex> *t, const ringBufferAccess_t readPtr, - AOL_namespace::mutex &streamLock, const ringBuffer_t &ringBuffer, - AOL_namespace::mutex &triggerSetLock, - std::set<pipeDrivenSignal<AOL_namespace::mutex>*> &triggerSet) throw(); -#endif - void _setupBuffers(const uniString::utf8& logString, const bool re_init = false) throw(); - - const bool updateSourceSampleRate(unsigned int& samplerate, const unsigned int read_samplerate) throw(); - - void YP2_add() throw(); - void _YP2_add() throw(); - void YP2_remove() throw(); - void _YP2_remove() throw(); - void YP2_update() throw(); - - // you must remove this streamData object from the g_streamMap immediately before or after calling - // this, otherwise you'll corrupt the static structures. - // Reason: die will cause the streamData to be removed from g_streams, but since die() causes ID() to return zero, - // it will not get removed from g_streamMap - void die() throw(); - - parserInfo *m_parser; - -public: - explicit streamData(const streamSetup& setup) throw(); // create shoutcast 1 - - void streamUpdate(const streamID_t ID, const uniString::utf8 &authHash, const int streamMaxUser, - const int streamMaxBitrate, const int streamMinBitrate) throw(); - - ~streamData() throw(); - - void sourceReconnect(const streamSetup& setup) throw(); // reconnect as shoutcast 1 - - static MP3_FrameInfo *detectMP3 (unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk); - int detectMP3 (MP3_FrameInfo *&parser, unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk); - - static AAC_FrameInfo *detectAAC (unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk); - int detectAAC (parserInfo *&parser, unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk); - - static int getFrameInfo (parserInfo *&parser, unsigned int &failureThresh,const unsigned char *buf, unsigned int len, unsigned chk = 6); - - const bool syncToStream(short unsigned int& remainderSize, __uint8 *remainder, - int amt, int& bitrate, const int type, const char *buf, - const uniString::utf8& logString); - - const bool isSourceCompatible(const streamSetup& setup) const throw(); // is this configuration compatible with the existing stream - - static uniString::utf8 getHTML5Player(const size_t sid) throw(); - static uniString::utf8 getStreamMessage(const size_t sid) throw(); - static void updateStreamMessage(const size_t sid, const uniString::utf8& message) throw(); - - const streamID_t ID() const { return (m_dead ? 0 : m_ID); } - const time_t getStartTime() const { return m_startTime; } - const streamInfo &getInfo() const { return m_streamInfo; } - const uniString::utf8& streamName() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamName; } - const uniString::utf8& streamGenre() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[0]; } - const uniString::utf8& streamGenre2() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[1]; } - const uniString::utf8& streamGenre3() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[2]; } - const uniString::utf8& streamGenre4() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[3]; } - const uniString::utf8& streamGenre5() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamGenre[4]; } - const uniString::utf8& streamURL() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamURL; } - const uniString::utf8& radionomyID() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_radionomyID; } - const uniString::utf8& streamContentType() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_contentType; } - const int streamBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamBitrate; } - const bool streamPublic() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamPublic; } - const bool streamIsVBR() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_vbr; } - const bool allowPublicRelay() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_allowPublicRelay; } - const int streamSampleRate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamSampleRate; } - const int streamAvgBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_avgBitrate; } - const int streamActualMaxBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_maxBitrate; } - const int streamUvoxDataType() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_uvoxDataType; } - const uniString::utf8& streamBackupServer() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_backupServer; } - const std::vector<uniString::utf8>& streamBackupServers() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_backupServersList; } - const uniString::utf8& streamPublicIP() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_publicIP; } - const uniString::utf8& streamAuthhash() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_authHash; } - const int streamMaxUser() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamMaxUser; } - const int streamMaxBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamMaxBitrate; } - const int streamMinBitrate() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_streamMinBitrate; } - - const int streamAdvertMode() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_advertMode; } - const uniString::utf8& authUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_authUrl; } - const uniString::utf8& advertsUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_advertsUrl; } - const uniString::utf8& audienceUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_audienceUrl; } - const uniString::utf8& tuneinAirApiUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_tuneinAirApiUrl; } - const uniString::utf8& targetSpotUrl() const throw() { stackLock sml(m_stateLock); return m_streamInfo.m_targetSpotUrl; } - - const std::vector<__uint8>& streamAlbumArt() const throw() { stackLock sml(m_stateLock); return m_sc21AlbumArtData[0]; } - const std::vector<__uint8>& streamPlayingAlbumArt() const throw() { stackLock sml(m_stateLock); return m_sc21AlbumArtData[1]; } - - const size_t streamAlbumArtMime() const throw() { stackLock sml(m_stateLock); return m_sc21AlbumArtMime[0]; } - const size_t streamPlayingAlbumArtMime() const throw() { stackLock sml(m_stateLock); return m_sc21AlbumArtMime[1]; } - - // streamSetMimeType is only used by uvox 2 since the determination must be delayed until the first data packet - void streamSetMimeType(const uniString::utf8 &mt) throw() { stackLock sml(m_stateLock); m_streamInfo.m_contentType = mt; } - - static bool isRelayStream(const streamID_t id) throw(); - static bool isBackupStream(const streamID_t id) throw(); - const int isDead() const throw() { stackLock sml(m_stateLock); return m_dead; } - void setKill(int kill) throw() { stackLock sml(m_stateLock); m_kill = kill; } - const int isKill() const throw() { stackLock sml(m_stateLock); return m_kill; } - - void updateSongHistorySize() throw(); - void pushMetricsYP (bool force = true); - - void updateSourceIdent(uniString::utf8& sourceIdent, const bool relay = false) throw(); - - // write data into ring buffers (sc1 and sc2) - #if defined(_DEBUG) || defined(DEBUG) - void writeSc1(const __uint8 *data, const int amt, const streamID_t id); - #else - void writeSc1(const __uint8 *data, const int amt); - #endif - void writeSc21(const std::vector<__uint8> &data) throw(); // data is exactly one uvox data packet or packet of uvox passthru metadata. - // passthru metadata is treated just like regular data, but we obviously - // can't pass it to the sc1 buffers since there is no analog for that in sc1 - - const int getStreamData(streamData::ringBufferAccess_t& amt, const streamData::ringBufferAccess_t& readPtr, - std::vector<__uint8>& data, const size_t remSize, const bool sc2 = false) throw(); /* for readers only */ - - // make sure streamData is not holding a reference to this. - void abandonLimitTrigger(pipeDrivenSignal<AOL_namespace::mutex> *t, const bool sc2 = false) throw(); - void scheduleLimitTrigger(pipeDrivenSignal<AOL_namespace::mutex> *t, const ringBufferAccess_t readPtr, const bool sc2 = false) throw(); - - // add shoutcast1 metadata at current position. This is just the string - int addSc1MetadataAtCurrentPosition(const uniString::utf8& logString, const uniString::utf8& sc1_metadata_raw, - const uniString::utf8& sc1_url_raw, const uniString::utf8& sc1_next_raw) throw(); - int addUvoxMetadataAtCurrentPosition(__uint16 voxMsgType,const std::vector<__uint8> &data) throw(); - - // get metadata that is appropriate for the indicated position - sc1MetadataAndExtensionInfo getSc1Metadata(const ringBufferAccess_t) throw(); - uvoxMetadata_t getSc21Metadata(const ringBufferAccess_t) throw(); - uvoxMetadata_t getSc21StreamAlbumArt(const ringBufferAccess_t) throw(); - uvoxMetadata_t getSc21PlayingAlbumArt(const ringBufferAccess_t) throw(); - // - void clearCachedMetadata() throw(); // clear all metadata that is in caches - void clearCachedArtwork(const size_t index) throw(); // clears specific artwork - // - void resetAdvertTriggers(const uniString::utf8& m_updinfoSong); - - // get good places for a client to start - const ringBufferAccess_t getClientStartPosition(const bool sc2 = false) throw(); - ringBufferAccess_t getClientStartPosition(ringBufferAccess_t ptr, bool sc2) throw(); - - specialFileData& getIntroFile() throw() { return m_introFile; } - specialFileData& getBackupFile() throw() { return m_backupFile; } - specialFileData& getAdTestFile(const int num) throw() - { - switch (num) - { - case 1: return m_adTestFile2; - case 2: return m_adTestFile3; - case 3: return m_adTestFile4; - default: return m_adTestFile; - } - } - - static int YP_SrvID(const streamID_t id) throw(); - static int YP_StnID(const streamID_t id) throw(); - - void updateStreamUser(const uniString::utf8& streamUser); - void resetStreamAuthhash(); - - // get the current title (if there is one) for touches/updates/tunein air api/etc - uniString::utf8 getYPStreamTitle() throw(); - - void YP2_updateInfo(const yp2::stationInfo &info) throw(); - bool YP2_addSuccessful(int &addFailIgnore, int &errorCode) throw(); -}; - -// advert related - -class adGroupAccess -{ - friend class streamData::adGroups; - size_t group; - int idx; - bool m_sc2; // use until the data buffer duplication is fixed - bool m_grpChanged; - streamData::adGroup *cached_ref; - streamData::adGroupQueue *m_groupQueue; - - bool foundNextAdvert (const streamData::streamID_t sid, streamData::adGroups &groups, streamData::adGroup &g); - streamData::adGroup *getGroup(streamData::streamID_t sid, streamData::adGroups &groups, const bool testing); - -public: - size_t offset; - size_t total_processed; - time_t start_time; - unsigned m_duration; - - explicit adGroupAccess(bool sc2 = false, int id = 0) { group = id; m_sc2 = sc2; idx = 0; cached_ref = NULL; offset = 0; m_grpChanged = false; m_groupQueue = NULL; } - - void setGroup (size_t id); - size_t getGroup() const { return group; } - const bool inAdvertMode() const; - - void changedGroup (streamData::adGroups &groups); - bool haveAdverts(const streamData::streamID_t sid, streamData::adGroups &groups, streamData::ringBufferAccess_t pos); - streamData::specialFileData *getAd(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing); - bool anotherAd(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing); - void stopAdRun(const streamData::streamID_t sid, streamData::adGroups &groups, const bool testing); - const streamData::adTrigger *getCurrentTrigger () const { return cached_ref ? cached_ref->m_trigger : NULL; } -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/threadedRunner.cpp b/Src/Plugins/DSP/sc_serv3/threadedRunner.cpp deleted file mode 100644 index c2e5d94d..00000000 --- a/Src/Plugins/DSP/sc_serv3/threadedRunner.cpp +++ /dev/null @@ -1,1135 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <algorithm> -#include "threadedRunner.h" -#include <openssl/ssl.h> -#include "global.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include "protocol_HTTPStyle.h" -#include "protocol_HTTPSource.h" -#include "protocol_shoutcastSource.h" -#include "protocol_FlashPolicyServer.h" -#include "protocol_uvox2Source.h" -#include "uvox2Common.h" -#include "banList.h" -#include "ripList.h" -#ifdef _MSC_VER -#define MSG_DONTWAIT 0 -#else -#include <netinet/tcp.h> -#include <sys/resource.h> -#ifndef EPOLLRDHUP -#define EPOLLRDHUP 0x2000 -#endif -#endif - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#define LOGNAME "[THREADRUNNER] " -#define DEBUG_LOG(...) do { if (gOptions.threadRunnerDebug()) DLOG(__VA_ARGS__); } while (0) - -#ifndef SSL_OP_NO_COMPRESSION -#define SSL_OP_NO_COMPRESSION 0 -#endif - -// make standard string for logging address -inline utf8 addrLogString(const utf8 &addr, const u_short port, const utf8 &xff) throw() -{ - const bool use_xff = (gOptions.useXFF() && !xff.empty()); - return (use_xff ? xff : addr) + ":" + tos(port) + (use_xff ? " (xff)" : ""); -} - -// make standard string for logging src address -utf8 srcAddrLogString(const utf8 &addr, const u_short port, const size_t sid) throw() -{ - return "[SRC " + addrLogString(addr, port) + (sid > 0 ? " sid=" + tos(sid) : "") + "] "; -} -// make standard string for loggin dst address -utf8 dstAddrLogString(const utf8 &addr, const u_short port, const utf8 &xff, const size_t sid) throw() -{ - return "[DST " + addrLogString(addr, port, xff) + (sid > 0 ? " sid=" + tos(sid) : "") + "] "; -} -// make standard string for logging unknown address -utf8 recvAddrLogString(const utf8 &addr, const u_short port) throw() -{ - return "[RECV " + addrLogString(addr, port) + "] "; -} -// make standard string for socket error -string socketErrString(int err) throw() { return "err=" + socketOps::errMsg(err) + "(" + tos(err) + ")"; } - -static AOL_namespace::mutex sm_globalRunnerLock; -static set<threadedRunner*> sm_runners; - -SSL_CTX *threadedRunner::m_sslCtx = NULL; -AOL_namespace::mutex *threadedRunner::m_sslMutexes = NULL; - -static bool cmp(threadedRunner* a, threadedRunner* b) throw() -{ - return (a->sizeOfRunList() < b->sizeOfRunList()); -} - -bool threadedRunner::scheduleRunnable(runnable *r) throw() -{ - if (r) - { - stackLock sml(sm_globalRunnerLock); - - // diagnostics. Print load - if (gOptions.threadRunnerDebug()) - { - utf8 msg = LOGNAME; - for (set<threadedRunner*>::const_iterator i = sm_runners.begin(); i != sm_runners.end(); ++i) - { - msg += ((i == sm_runners.begin() ? "Thread " : ", thread ") + (*i)->threadNumber() + " amt=" + tos((*i)->sizeOfRunList())); - } - DEBUG_LOG(msg); - } - - // find least busy - set<threadedRunner*>::const_iterator which = min_element(sm_runners.begin(), sm_runners.end(), cmp); - if ((which != sm_runners.end()) && (*which)->addRunnable(r)) - { - return true; - } - - // didn't work... schedule anywhere - DEBUG_LOG(LOGNAME "Schedule failure, trying any thread"); - for (set<threadedRunner*>::const_iterator i = sm_runners.begin(); i != sm_runners.end(); ++i) - { - if ((*i)->addRunnable(r)) - { - return true; - } - } - } - return false; -} - -void threadedRunner::wakeup() throw() -{ - stackLock sml(sm_globalRunnerLock); - - for (set<threadedRunner*>::const_iterator i = sm_runners.begin(); i != sm_runners.end(); ++i) - { - (*i)->wakeupRunnable(); - } -} - -uniString::utf8 threadedRunner::getRunnabledetails() throw() -{ - stackLock sml(sm_globalRunnerLock); - - utf8 details; - for (set<threadedRunner*>::const_iterator i = sm_runners.begin(); i != sm_runners.end(); ++i) - { - details += (i != sm_runners.begin() ? "<br>" : (utf8)"") + "Thread #" + - (*i)->threadNumber() + ": <b>" + tos((*i)->sizeOfRunList()) + - "</b><div style=\"padding-left:1em;\">"; - - map<utf8, size_t> runners; - (*i)->enumRunnables(runners); - for (map<utf8, size_t>::const_iterator r = runners.begin(); r != runners.end(); ++r) - { - details += (r != runners.begin() ? "<br>" : "") + (*r).first + " - " + tos((*r).second); - } - details += "</div>"; - } - return details; -} - -threadedRunner::threadedRunner() throw() : m_stop(false), m_threadNumber((const short)(sm_runners.size() + 1)) -{ - stackLock sml(sm_globalRunnerLock); - sm_runners.insert(this); -} - -threadedRunner::~threadedRunner() throw() -{ - stackLock sml(sm_globalRunnerLock); - sm_runners.erase(this); -} - -// main loop of thread -const unsigned threadedRunner::operator()() throw() -{ - unsigned result = 1; - - try - { - m_lock.lock(); - while (!m_stop) - { - m_lock.unlock(); - - std::set<size_t> readSet, writeSet; - int timeout = -1; - - // run everyone (as long as not scheduled) and get their status information, etc - set<runnable*>::const_iterator i = m_runList.begin(); - while (i != m_runList.end()) - { - runnable::timeSliceResult &tsr = (*i)->m_result; - __uint64 now = time_now_ms(); - - // if we're indicated as being scheduled then we - // need to skip doing anything else and look at - // checking if it's ok to process or not, etc - if (tsr.m_scheduleTime) - { - if (now < tsr.m_scheduleTime) - { - int time_diff = (int)(tsr.m_scheduleTime - now); - if (timeout == -1) - { - timeout = time_diff; - } - else - { - timeout = min(timeout, time_diff); - } - ++i; - continue; - } - else - { - // we clear this as we're reached time - // but not the rest as we want what was - // set to now be used in the processing - tsr.m_scheduleTime = 0; - } - } - - // make sure to reset otherwise it gets weird but - // we're only going to do this if we are able to - // run the runnable now (i.e. it's not scheduled) - tsr.reset(now); - - bool exception_occured = false; - try - { - (*i)->timeSlice(); - } - catch (const exception &ex) - { - exception_occured = true; - utf8 what = ex.what(); - if (!what.empty()) - { - ELOG(ex.what()); - } - } - - if (tsr.m_done || exception_occured) - { - set<runnable*>::const_iterator to_go = i; - DEBUG_LOG(LOGNAME "Removing " + (*i)->name() + " [done: " + tos(tsr.m_done) + ", exception: " + tos(exception_occured) + "]"); - removeRunnable(*to_go); - ++i; - m_runList.erase (to_go); - continue; - } - if (!tsr.m_runImmediately) - { - if (!tsr.m_scheduleTime) - { -update_sets: - if (tsr.m_readSet) - { - // filter out anything with an invalid socket - if ((*i)->m_socket != socketOps::cINVALID_SOCKET) - { - readSet.insert(readSet.end(), (*i)->m_socket); - } - if (tsr.m_customSocket != socketOps::cINVALID_SOCKET) - { - readSet.insert(readSet.end(), tsr.m_customSocket); - } - } - - if (tsr.m_writeSet) - { - // filter out anything with an invalid socket - if ((*i)->m_socket != socketOps::cINVALID_SOCKET) - { - writeSet.insert(writeSet.end(), (*i)->m_socket); - } - if (tsr.m_customSocket != socketOps::cINVALID_SOCKET) - { - writeSet.insert(writeSet.end(), tsr.m_customSocket); - } - } - - if (tsr.m_timeout != -1) - { - if (timeout == -1) - { - timeout = tsr.m_timeout; - } - else - { - timeout = min(timeout, tsr.m_timeout); - } - } - } - else - { - // if this is to be scheduled then we'll do a - // quick check to see if we're already after - // that time and if it isn't (which is how it - // should be) then we'll abort, else allow it - // and we get the time again to account for - // the time it's taken to process the runnable - now = time_now_ms(); - if (now < tsr.m_scheduleTime) - { - int time_diff = (int)(tsr.m_scheduleTime - now); - if (timeout == -1) - { - timeout = time_diff; - } - else - { - timeout = min(timeout, time_diff); - } - } - else - { - // we clear this as we're reached time - // but not the rest as we want what was - // set to now be used in the processing - tsr.m_scheduleTime = 0; - timeout = 50; - goto update_sets; - } - } - ++i; - } - } // for - - // delete the old guys, no lock required here, only we add to this set - int released = 0; - while (true) - { - set<runnable*>::const_iterator it = m_runnablesToRemove.begin(); - if (it == m_runnablesToRemove.end()) - break; - if (++released > 300) - { - timeout &= 15; // prevent a large stall but force a quick retry - break; - } - stlx::delete_fntr<runnable> (*it); - m_runnablesToRemove.erase (it); - } - - readSet.insert (m_signal.test()); - if (timeout < 0) - timeout = 60000; - int n = socketOps::socketSelect(readSet, writeSet, timeout); - - m_lock.lock(); - - // add the new guys, requires lock as set can be added from elsewhere - m_runList.insert(m_runnablesToAdd.begin(), m_runnablesToAdd.end()); - m_runnablesToAdd.clear(); - - if (n > 0) - m_signal.clear(); - } - m_lock.unlock(); - result = 0; - } - catch (const exception &ex) - { - ELOG(LOGNAME + string(ex.what())); - } - catch (...) - { - ELOG(LOGNAME "Unknown exception"); - } - - // delete runnables in run list, and those that are queued to be added - m_lock.lock(); - for_each(m_runnablesToAdd.begin(), m_runnablesToAdd.end(), stlx::delete_fntr<runnable>); - m_lock.unlock(); - - for_each(m_runList.begin(), m_runList.end(), stlx::delete_fntr<runnable>); - - return result; -} - -const size_t threadedRunner::sizeOfRunList() throw() -{ - stackLock sml(m_lock); - const size_t result = (m_runList.size() + m_runnablesToAdd.size()); - const size_t subtr = m_runnablesToRemove.size(); - return (subtr > result ? 0 : result - subtr); -} - -const bool threadedRunner::addRunnable(runnable* r) throw() -{ - if (!r) - { - return false; - } - - stackLock sml(m_lock); - if (m_stop) - { - return false; - } - - m_runnablesToAdd.insert(r); - m_signal.set(); - DEBUG_LOG(LOGNAME "Adding " + r->name() + " to thread " + tos(m_threadNumber)); - - return true; -} - -const bool threadedRunner::removeRunnable(runnable *r) throw() -{ - if (!r) - { - return false; - } - - m_runnablesToRemove.insert(r); - m_signal.set(); - DEBUG_LOG(LOGNAME "Removing " + r->name() + " from thread " + tos(m_threadNumber)); - return true; -} - -void threadedRunner::enumRunnables(map<utf8, size_t>& runners) throw() -{ - stackLock sml(m_lock); - - for (set<runnable*>::const_iterator i = m_runList.begin(); i != m_runList.end(); ++i) - { - const utf8::size_type pos = (*i)->name().find((utf8)"protocol_"); - if (pos != utf8::npos) - { - ++runners[(*i)->name().substr(pos + 9, (*i)->name().length())]; - } - else - { - ++runners[(*i)->name()]; - } - } -} - -void threadedRunner::wakeupRunnable() throw() -{ - if (m_lock.timedLock(1000)) - { - m_signal.set(); - m_lock.unlock(); - } -} - -void threadedRunner::stop() throw() -{ - stackLock sml(m_lock); - m_stop = true; - m_signal.set(); -} - -/////////////////////////// -#ifdef LOGNAME -#undef LOGNAME -#endif -#define LOGNAME "[MICROSERVER] " - -#ifdef DEBUG_LOG -#undef DEBUG_LOG -#endif -#define DEBUG_LOG(x) { if (gOptions.microServerDebug()) DLOG((x)); } - -microServer::microServer(const string &listenAddr, const u_short listenPort, - const AllowableProtocols_t protocols, - const ListenTypes_t types) throw(exception) - : m_protocols(protocols) -{ - try - { - m_socket = socketOps::createTCPSocketTHROW(); - #ifndef _WIN32 - { - int bflag = 1; - setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, &bflag, sizeof(bflag)); - #if (defined PLATFORM_LINUX || defined PLATFORM_ARMv6 || defined PLATFORM_ARMv7) - int wait = 1; - setsockopt(m_socket, IPPROTO_TCP, TCP_DEFER_ACCEPT, &wait, sizeof(wait)); - #endif - #ifdef PLATFORM_BSD - struct accept_filter_arg af = {"dataready", ""}; - setsockopt(m_socket, SOL_SOCKET, SO_ACCEPTFILTER, &af, sizeof(af)); - #endif - } - #endif - socketOps::bindTHROW(m_socket, listenPort, listenAddr); - socketOps::listenTHROW(m_socket); - socketOps::setNonblockTHROW(m_socket, true); - - bindMessage(types, listenPort); - } - catch (const exception &ex) - { - socketOps::forgetTCPSocket(m_socket); - string error = ex.what(); - throw runtime_error(LOGNAME "Error opening port " + tos(listenPort) + " because " + toLower(error)); - } -} - -void microServer::bindMessage(const ListenTypes_t types, const u_short listenPort) throw() -{ - string message = "Listening for connections on port "; - - if ((types & microServer::L_SOURCE) && (types & microServer::L_CLIENT)) - { - message = "Listening for source and client connections on port "; - } - else if ((types & microServer::L_FLASH)) - { - message = "Listening for flash policy server connection on port "; - } - else if ((types & microServer::L_SOURCE)) - { - message = "Listening for legacy source connections on port "; - } - else if ((types & microServer::L_SOURCE2)) - { - message = "Listening for source connections on port "; - } - else if ((types & microServer::L_CLIENT_ALT)) - { - message = "Listening for client connections on alternate port "; - } - else if ((types & microServer::L_CLIENT)) - { - message = "Listening for client connections on port "; - } - ILOG(LOGNAME + message + tos(listenPort)); -} - -void microServer::updateProtocols(AllowableProtocols_t protocols, ListenTypes_t types, const u_short listenPort) throw() -{ - m_protocols = protocols; - bindMessage(types, listenPort); -} - -microServer::~microServer() throw() -{ - string addr; - u_short port = 0; - socketOps::getsockname(m_socket, addr, port); - socketOps::forgetTCPSocket(m_socket); - if (!iskilled()) - { - ELOG(LOGNAME "Unexpected stop detected for listening for connections on port " + tos(port)); - ELOG(LOGNAME "This should not happen and prevents the DNAS from working correctly."); - ELOG(LOGNAME "DNAS restart is required. If this keeps happening, enable all debugging options and provide the logs to Shoutcast support."); - } - else - { - DEBUG_LOG(LOGNAME "Stopped listening for connections on port " + tos(port)); - } -} - -void microServer::timeSlice() throw(exception) -{ - static int repeated = 0; - - // don't allow any new connections when the server is stopping - if (!iskilled()) - { - try - { - string addr; - u_short port = 0; - - socketOps::tSOCKET newSock = socketOps::acceptTHROW(m_socket, addr, port, true); - if (newSock != socketOps::cSOCKET_ERROR) - { - socketOps::getpeername(newSock, addr, port); - - string hostName = addr; - if (gOptions.nameLookups()) - { - if (socketOps::addressToHostName(addr, port, hostName)) - { - hostName = addr; - } - } - - socketOps::setNonblockTHROW(newSock, true); - DEBUG_LOG(LOGNAME "Connection received from " + addr + ":" + tos(port)); - threadedRunner::scheduleRunnable(new microConnection(newSock, hostName, addr, port, m_protocols)); - repeated = 0; - } - } - catch (const tagged_error &ex) - { - ELOG(ex.what()); - } - catch (const exception &ex) - { - string msg = ex.what(); - if (!msg.empty()) - { - if (msg.find("Could not call") == 0) - { - // serious error, log unless repeated and delay a retry - if ((repeated & 255) == 0) - ELOG(LOGNAME + msg); - ++repeated; - m_result.schedule (1000); - return; - } - ELOG(LOGNAME + msg); - } - } - - m_result.read(); - return; - } - - m_result.done(); -} - -/////////////////////////////////////////////////// -microConnection::microConnection(const socketOps::tSOCKET s, const string &hostName, const string &addr, - const u_short port, const microServer::AllowableProtocols_t protocols) throw() - : runnable(s), m_srcHostName(hostName), - m_srcAddress(addr), m_srcPort(port), - m_protocols(protocols) -{ -} - -microConnection::~microConnection() throw() -{ - socketOps::forgetTCPSocket(m_socket); -} - -void microConnection::timeSlice() throw(exception) -{ - time_t cur_time; - const int autoDumpTime = ::detectAutoDumpTimeout(cur_time, m_lastActivityTime, (recvAddrLogString(m_srcAddress, m_srcPort) + - "Got timeout waiting for data"), gOptions.microServerDebug()); - - const int maxHeaderLineSize = gOptions.maxHeaderLineSize(); - const bool flash_policy = !!(m_protocols & P_FLASHPOLICYFILE); - bool uvox_checked = false; - runnable *runnable = NULL; - - char buf[MAX_MESSAGE_SIZE] = {0}; - // if we've got a 1.x source connection then only handle - // on a per-byte basis, for everything else, try getting - // a few bytes so we can use that as a guide on how then - // to try to process things a bit quicker than per-byte. - // int amt = (!(m_protocols & P_SHOUTCAST1SOURCE) ? UV2X_HDR_SIZE : 1); - int amt = (m_ssl) ? 1 : 4096; - ssize_t rval = 0; - - while (true) - { - if (iskilled() || (size_t)amt > sizeof(buf)) - { - m_result.done(); - return; - } - - int flags = (m_lineBuffer.size() || m_ssl) ? 0 : MSG_PEEK; // use PEEK initially as SSL requires bytes in the socket - if ((rval = recv (buf, amt, flags|MSG_DONTWAIT)) < 1) - { - if (rval == 0) - { - throwEx<runtime_error>((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Remote socket closed while waiting for data.") : (utf8)"")); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - throwEx<runtime_error>((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Socket error while waiting for data. " + socketErrString(rval)) : (utf8)"")); - } - - m_result.schedule(); - m_result.read(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - } - - m_lineBuffer.insert (m_lineBuffer.end(), buf, buf + rval); - int lineSize = (int)m_lineBuffer.size(); - - if (lineSize > maxHeaderLineSize) - { - throwEx<runtime_error>((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Protocol header line is too large - exceeds " + tos(maxHeaderLineSize) + - " bytes") : (utf8)"")); - } - if (m_ssl == NULL && flags && (m_lineBuffer [0] == 0x16)) // SSLv3 / TLSv1.x ? - { - if (threadedRunner::m_sslCtx == NULL) - { - throwEx<runtime_error>((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Remote socket closed, no SSL configured.") : (utf8)"")); - } - if (lineSize < 6) - { - m_result.schedule(); - m_result.read(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return; - } - if ((m_lineBuffer [1] == 0x3) && (m_lineBuffer [5] == 0x1)) - { - DLOG ("detected ssl request, checking further"); - m_ssl = SSL_new (threadedRunner::m_sslCtx); - SSL_set_accept_state (m_ssl); - SSL_set_fd (m_ssl, (int)m_socket); - SSL_set_mode (m_ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER|SSL_MODE_ENABLE_PARTIAL_WRITE); - m_lineBuffer.clear(); - continue; - } - } - utf8::size_type nl = m_lineBuffer.find ((unsigned char)'\n'); - if (nl != utf8::npos) - { - rval = lineSize = (int)nl+1; // 0 offset - if (flags) m_lineBuffer.erase (lineSize); // truncate line to maintain parsing - } - - if (flags) - ::recv (m_socket, buf, rval, MSG_DONTWAIT); // pull bytes from input, passed any PEEK requirement - - if ((lineSize > 0) && (lineSize < UV2X_HDR_SIZE) && (m_lineBuffer [lineSize - 1] != '\n')) - { - if (m_lineBuffer[0] == UVOX2_SYNC_BYTE) - { - // if it looks like it might be a uvox - // frame then grab more on the next go - amt = 3; - } - else - { - // no point in doing any of the checks - // if there is not enough data to view - // e.g. we need to see a valid newline - amt = 1; - } - - m_lastActivityTime = ::time(NULL); - continue; - } - if ((lineSize >= UV2X_HDR_SIZE) && (uvox_checked == false)) - { - // look at first uvox packet to see if we're running uvox 2 or uvox 2.1 - // NOTE: This is a protocol change. We need to add a new packet to 2.1 so request cipher key - const uv2xHdr *voxhdr = reinterpret_cast<const uv2xHdr*>(m_lineBuffer.c_str()); - if ((voxhdr->sync == UVOX2_SYNC_BYTE) && - (ntohs(voxhdr->msgType) == (u_short)MSG_CIPHER)) - { - const int wanted = (ntohs(voxhdr->msgLen) + UV2X_OVERHEAD); - if (wanted == lineSize) - { - // we have uvox 2.1 - if (m_protocols & P_SHOUTCAST2SOURCE) // only if allowed - { - runnable = new protocol_uvox2Source (*this, (const __uint8 *)m_lineBuffer.c_str(), lineSize); - } - break; - } - amt = min(MAX_MESSAGE_SIZE, (wanted - lineSize)); - m_lastActivityTime = ::time(NULL); - continue; - } - // if we've got enough and there's no sync - // byte then there's not point to re-check. - uvox_checked = true; - } - - if ((lineSize > 0) && (m_lineBuffer[lineSize - 1] == '\n')) - { - // look at start of line, if it's a GET or POST or some standard HTTP thing, then we - // have either a web request or a client connection request. If that is missing, then - // we have to assume it's a shoutcast source, and we have just received the password. - // - // this should be enough to detect absolute and relative requests made to the server - // if there's no / for absolute paths then we'll reject the request as a bad access. - if ((m_lineBuffer.find((utf8)"GET /") == 0) || - (m_lineBuffer.find((utf8)"GET h") == 0) || - (m_lineBuffer.find((utf8)"POST /") == 0) || - (m_lineBuffer.find((utf8)"POST h") == 0) || - (m_lineBuffer.find((utf8)"HEAD /") == 0) || - (m_lineBuffer.find((utf8)"HEAD h") == 0)) - { - if (m_protocols & (P_SHOUTCAST1CLIENT | - P_SHOUTCAST2CLIENT | - P_WEB | P_WEB_SETUP)) - { - runnable = new protocol_HTTPStyle (*this, stripWhitespace(m_lineBuffer).hideAsString()); - } - break; - } - else // assume shoutcast source, and this is the password (though do some checks to sanitise) - { - // and now look for invalid HTTP requests and - // reject them as the earlier handling should - // allow valid relative and absolute requests - if (lineSize > 5) - { - if ((m_lineBuffer.find((utf8)"GET ") == 0) || - (m_lineBuffer.find((utf8)"POST ") == 0) || - (m_lineBuffer.find((utf8)"SOURCE ") == 0) || - (m_lineBuffer.find((utf8)"PUT ") == 0) || - (m_lineBuffer.find((utf8)"HEAD ") == 0)) - { - throwEx<runtime_error>((gOptions.microServerDebug() ? (recvAddrLogString(m_srcAddress, m_srcPort) + - "Invalid HTTP request detected - only valid relative and absolute paths are allowed.") : (utf8)"")); - } - } - - // if we appear to have a 'PUT' or 'SOURCE' request then we'll need to - // do some different handling in-order to get the correct details before - // we can then actually process the stream as a valid (icecast?) source - if (((m_lineBuffer.find((utf8)"SOURCE ") == 0) || - (m_lineBuffer.find((utf8)"PUT ") == 0)) && - ((m_lineBuffer.find((utf8)"HTTP/1.") != utf8::npos) || - (m_lineBuffer.find((utf8)"ICE/1.") != utf8::npos))) - { - runnable = new protocol_HTTPSource (*this, stripWhitespace(m_lineBuffer).hideAsString()); - } - else - { - runnable = new protocol_shoutcastSource (*this, stripWhitespace(m_lineBuffer)); - } - } - break; - } - if (flash_policy && (m_lineBuffer.find((utf8)"<policy-file-request/>") == 0)) - { - runnable = new protocol_FlashPolicyServer (m_socket, dstAddrLogString(m_srcHostName, m_srcPort)); - break; - } - amt = 1; - m_lastActivityTime = ::time(NULL); - } // while - - if (runnable) - { - threadedRunner::scheduleRunnable (runnable); - } - m_result.done(); - return; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -// return 0 if line is ready, or a timeout in seconds for next select call if we are still waiting -// lineBuffer and lastActivityTime are updated by this call -const bool runnable::getHTTPStyleHeaderLine(const size_t sid, utf8 &lineBuffer, const utf8 &logMsgPrefix, int maxLineLength) throw(exception) -{ - time_t cur_time; - const int autoDumpTime = ::detectAutoDumpTimeout (cur_time, m_lastActivityTime, - (logMsgPrefix + "Timeout waiting for data"), gOptions.microServerDebug(), sid); - - const int maxHeaderLineSize = maxLineLength > 0 ? maxLineLength : gOptions.maxHeaderLineSize(); - int count = 0; - bool ret = true; - - while (true) - { - int rval = 0; - char buf[2] = {0}; - if ((rval = recv(buf, 1, 0x0)) < 1) - { - if (rval == 0) - { - if (gOptions.microServerDebug()) - ELOG (logMsgPrefix + "Remote socket closed while waiting for data.", LOGNAME, sid); - throwEx<runtime_error>((utf8)""); - } - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - if (gOptions.microServerDebug()) - ELOG (logMsgPrefix + "Socket error while waiting for data. " + socketErrString(rval), LOGNAME, sid); - throwEx<runtime_error>((utf8)""); - } - - // if we've read something then it's likely to be from a POST response - if (lineBuffer.empty() == false) - { - ret = false; - if (count) break; - } - - // try again but wait a bit - // so we don't overload it. - m_result.schedule(30); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return false; - } - ++count; - - lineBuffer.insert (lineBuffer.end(), buf, buf + rval); - - const int lineSize = (int)lineBuffer.size(); - if (lineSize == maxLineLength) break; - if (lineSize > maxHeaderLineSize) - { - ELOG (logMsgPrefix + "Protocol header line is too large - exceeds " - + tos(maxHeaderLineSize) + " bytes", LOGNAME, sid); - throwEx<runtime_error> ((utf8)""); - } - if ((lineSize > 0) && lineBuffer [lineSize - 1] == '\n') - { - break; - } - } - m_result.run(); - m_lastActivityTime = ::time(NULL); - return ret; -} - -// send a hunk of data out a socket - returns true if send is complete, -// outBuffer and outBufferSize should be initially set to point to the -// data and the size of the data - these values are moved and updated. -const bool runnable::sendDataBuffer(const size_t sid, const uniString::utf8::value_type *&outBuffer, - int &outBufferSize, const uniString::utf8 &logMsgPrefix) throw(std::exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(logMsgPrefix + __FUNCTION__ + " " + tos(outBufferSize)); -#endif - - if (outBufferSize > 0) // done - { - time_t cur_time; - const int autoDumpTime = ::detectAutoDumpTimeout(cur_time, m_lastActivityTime, - (logMsgPrefix + "Timeout waiting to send data"), - gOptions.microServerDebug(), sid); - - int rval = send ((const char *)outBuffer, outBufferSize, 0); - if (rval == 0) - { - throwEx<std::runtime_error>((gOptions.microServerDebug() ? (logMsgPrefix + - "Remote socket closed while sending data") : - (uniString::utf8)"")); - } - else if (rval < 0) - { - rval = socketOps::errCode(); - if (rval != SOCKETOPS_WOULDBLOCK) - { - throwEx<std::runtime_error>((gOptions.microServerDebug() ? ((( - #ifdef _WIN32 - rval == WSAECONNABORTED || rval == WSAECONNRESET - #else - rval == ECONNABORTED || rval == ECONNRESET || rval == EPIPE - #endif - ) ? (uniString::utf8)"" : logMsgPrefix + - "Socket error while waiting to send data. " + - socketErrString(rval))) : (uniString::utf8)"")); - } - - // try again but wait a bit - // so we don't overload it. - m_result.schedule(); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - return false; - } - - // move pointers - outBufferSize -= rval; - outBuffer += rval; - - // update time - m_lastActivityTime = ::time(NULL); - m_result.timeout((autoDumpTime - (int)(cur_time - m_lastActivityTime))); - - if (outBufferSize == 0) // done - { - m_result.schedule(); - return true; - } - m_result.schedule (160); - return false; - } - - m_result.write(); - m_result.schedule(); - m_result.timeoutSID(sid); - return true; -} - - -runnable::runnable (runnable &r) throw() -{ - m_socket = r.m_socket; - m_ssl = r.m_ssl; - m_lastActivityTime = ::time (NULL); - // the following are handed off to this sub-protocol, so make sure they cannot affect them - r.m_socket = socketOps::cINVALID_SOCKET; - r.m_ssl = NULL; -} - - -ssize_t runnable::recv (void *buf, size_t len, int flags) -{ - if (m_ssl) - { - ssize_t bytes = SSL_read (m_ssl, buf, len); - int code = SSL_get_error (m_ssl, bytes); - // char err[128]; - - switch (code) - { - case SSL_ERROR_NONE: - case SSL_ERROR_ZERO_RETURN: - break; - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_WRITE: - return -1; - default: - bytes = 0; - } - return bytes; - } - return (ssize_t)::recv (m_socket, (char*)buf, len, flags); -} - - -ssize_t runnable::send(const void *buf, size_t len, int flags) -{ - if (m_ssl) - { - ssize_t bytes = SSL_write (m_ssl, buf, len); - int code = SSL_get_error (m_ssl, bytes); - // char err[128]; - - switch (code) - { - case SSL_ERROR_NONE: - case SSL_ERROR_ZERO_RETURN: - break; - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_WRITE: - return -1; - default: - return -1; - } - return bytes; - } - return (ssize_t)::send(m_socket, (char*)buf, len, flags); -} - -// This pick the dump time for sources, as there is no general class for that yet, unlike listeners -int runnable::detectAutoDumpTimeout (time_t &cur_time, const size_t streamID, const utf8 &msg) throw(runtime_error) -{ - const int autoDumpTime = gOptions.stream_autoDumpSourceTime(streamID); - - cur_time = ::time(NULL); - if ((autoDumpTime > 0) && ((cur_time - m_lastActivityTime) >= autoDumpTime)) - { - WLOG (msg, LOGNAME, streamID); - throwEx<runtime_error>(""); - } - return autoDumpTime; -} - - -unsigned long threadedRunner::SSL_idFunction (void) -{ - return threadedRunner::getCurrentThreadID(); -} - -void threadedRunner::SSL_lockingFunction (int mode, int n, const char * /*file*/, int /*line*/) -{ - if (mode & CRYPTO_LOCK) - m_sslMutexes[n].lock(); - else - m_sslMutexes[n].unlock(); -} - - -void threadedRunner::SSL_shutdown () -{ -#if !defined(WIN32) && OPENSSL_VERSION_NUMBER < 0x10000000 - CRYPTO_set_id_callback (NULL); -#endif - CRYPTO_set_locking_callback (NULL); - if (m_sslCtx) - { - ::SSL_CTX_free (m_sslCtx); - m_sslCtx = NULL; - } - if (m_sslMutexes) - delete [] m_sslMutexes; - m_sslMutexes = NULL; -} - -void threadedRunner::SSL_init () -{ - SSL_load_error_strings(); - SSL_library_init (); - utf8 cert_file = gOptions.sslCertificateFile(); - utf8 key_file = gOptions.sslCertificateKeyFile(); - - do { - if (cert_file == "") break; - - CRYPTO_set_id_callback (&threadedRunner::SSL_idFunction); -#if !defined(WIN32) && OPENSSL_VERSION_NUMBER < 0x10000000 - CRYPTO_set_locking_callback (&threadedRunner::SSL_lockingFunction); -#endif - - m_sslMutexes = new AOL_namespace::mutex [CRYPTO_num_locks()]; - if (m_sslMutexes == NULL) - break; - - m_sslCtx = ::SSL_CTX_new (::SSLv23_server_method()); - - long ssl_opts = ::SSL_CTX_get_options (m_sslCtx); - ::SSL_CTX_set_options (m_sslCtx, ssl_opts|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_COMPRESSION); - - if (::SSL_CTX_use_certificate_chain_file (m_sslCtx, (char*)cert_file.c_str()) <= 0) - { - WLOG ("[MAIN] Invalid certificate file " + cert_file); - break; - } - - utf8 &pkfile = key_file.empty() ? cert_file : key_file; - if (::SSL_CTX_use_PrivateKey_file (m_sslCtx, (char*)pkfile.c_str(), SSL_FILETYPE_PEM) <= 0) - { - WLOG ("[MAIN] Invalid private key file " + pkfile); - break; - } - if (! SSL_CTX_check_private_key (m_sslCtx)) - { - WLOG ("[MAIN] Invalid, private key does not match public key, " + pkfile); - break; - } - ILOG ("[MAIN] SSL keys installed"); - return; - - } while (0); - if (m_sslCtx) - { - WLOG ("[MAIN] failed to set up SSL, " + utf8(::ERR_reason_error_string (::ERR_peek_last_error()))); - ::SSL_CTX_free (m_sslCtx); - m_sslCtx = NULL; - } - CRYPTO_set_id_callback (NULL); - CRYPTO_set_locking_callback (NULL); - if (m_sslMutexes) - delete [] m_sslMutexes; - m_sslMutexes = NULL; -} diff --git a/Src/Plugins/DSP/sc_serv3/threadedRunner.h b/Src/Plugins/DSP/sc_serv3/threadedRunner.h deleted file mode 100644 index 155b8983..00000000 --- a/Src/Plugins/DSP/sc_serv3/threadedRunner.h +++ /dev/null @@ -1,428 +0,0 @@ -#pragma once -#ifndef threadedRunner_H_ -#define threadedRunner_H_ - -#include "openssl/ssl.h" -#include "openssl/err.h" -#include "threading/thread.h" -#include "webNet/socketOps.h" -#include "unicode/uniString.h" -#include "stl/stringUtils.h" -#include <set> -#include <queue> -#include <map> -#include <stdexcept> -#include "global.h" - -#ifdef _MSC_VER -#define ssize_t int -#endif -/* - -threadedRunner - (and everything that is related to it). - -Based my work on the webNet module and the microServer class (in sc_trans), it -seems to me that there is a generic model that underlies all of this. At the top level -is a thread which manages a pool of objects (runnables). These runnables offer up -sets of sockets which the threadRunner incorporates into a select() call. When the select -exists, the runnables associated with the sockets are called. - -This makes good sense for a server like senario, where you have connections that must -wait for read/write ability on a socket. This can, however, be extended to any object -that must wait for something. Using a pipe, you can simulate wait events that can also -offer up a socket like object. You can then create an object that fits this model that -is waiting for messages or some other type of signal. - -*/ - -// class that has a mutex's interface but does nothing -class nullLock { public: static void lock() throw(){} static void unlock() throw(){}}; - -// implements a signal based on a pipe. Access to set/clear should be locked, -// but since this class is usually included in another class that already has a lock, we -// make the lock optional by templatizing it. Pass AOL_namespace::mutex as the LOCKABLE parameter -// if you want locking, otherwise pass nullLock. -#pragma pack(push, 1) -template<typename LOCKABLE> -class pipeDrivenSignal -{ -private: - int m_signalPipe[3]; - LOCKABLE m_lock; - -public: - pipeDrivenSignal() throw(std::exception) - { - m_signalPipe[0] = -1; - m_signalPipe[1] = -1; - m_signalPipe[2] = 0; - if (pgpipe(m_signalPipe)) - { - if (socketOps::errCode()) - { - #ifdef _WIN32 - throw std::runtime_error("[MICROSERVER] Could not create signal pipe " - "[Too many file handles have been opened, " - "code: " + stringUtil::tos(socketOps::errCode()) + - " - reason: " + socketOps::errMsg() + "]"); - #else - throw std::runtime_error("[MICROSERVER] Could not create signal pipe " - "[Increase the open files (ulimit -n) limit, " - "code: " + stringUtil::tos(socketOps::errCode()) + - " - reason: " + socketOps::errMsg() + "]"); - #endif - } - else - { - throw std::runtime_error(""); - } - } - socketOps::setNonblock (m_signalPipe[0], true); - socketOps::setNonblock (m_signalPipe[1], true); - } - - ~pipeDrivenSignal() throw() - { - if (m_signalPipe[0] != -1) - { - pipeclose(m_signalPipe[0]); - m_signalPipe[0] = -1; - } - - if (m_signalPipe[1] != -1) - { - pipeclose(m_signalPipe[1]); - m_signalPipe[1] = -1; - } - - m_signalPipe[2] = 0; - } - - // set the signal - void set() throw() - { - if (m_signalPipe[1] != -1) - { - static char buf[2] = {19, 64}; // any data will do - pipewrite(m_signalPipe[1], buf, 1); - } - } - - // clear the signal - void clear() throw() - { - if (m_signalPipe[0] != -1) - { - // clear pipe - char buf[35]; - piperead(m_signalPipe[0], buf, sizeof(buf)); - } - } - - // return file descriptor to test with select(). This is a read descriptor - const int test() const throw() - { - return m_signalPipe[0]; - } -}; -#pragma pack(pop) - -// make standard string for socket error -extern std::string socketErrString(int err) throw(); - -// abstract base for classes than can be run by the threadRunner class -class runnable -{ - friend class threadedRunner; -public: - #pragma pack(push, 1) - struct timeSliceResult - { - bool m_readSet; // read socket for poll(..) / select(..) call - bool m_writeSet; // write socket for poll(..) / select(..) call - bool m_done; // runnable is done and can be dispose - bool m_runImmediately; // must be re-run immediately - int m_timeout; // must be run after an interval of time regardless. if zero, then no timeout - // if not set (-1) then will pick an appropriate timeout to keep it ticking over - __uint64 m_scheduleTime; // time from which we're going to allow this to run. if zero thnn no scheduling - __uint64 m_currentTime; // time at which the runnable is being tried - - socketOps::tSOCKET m_customSocket; // used for providing a custom case if needed - - timeSliceResult() throw() : m_readSet(false), m_writeSet(false), m_done(false), - m_runImmediately(false), m_timeout(-1), - m_scheduleTime(0), m_currentTime(0), - m_customSocket(socketOps::cINVALID_SOCKET) {} - - ~timeSliceResult() throw() - { - reset(0); - } - - void reset(__uint64 current_ms) throw() - { - m_customSocket = socketOps::cINVALID_SOCKET; - m_readSet = false; - m_writeSet = false; - m_done = false; - m_runImmediately = false; - m_timeout = -1; - m_scheduleTime = 0; - m_currentTime = current_ms; - } - - void done() throw() - { - m_done = true; - } - - void run() throw() - { - m_runImmediately = true; - } - - void read(socketOps::tSOCKET customSocket = socketOps::cINVALID_SOCKET) throw() - { - m_readSet = true; - m_customSocket = customSocket; - } - - void write() throw() - { - m_writeSet = true; - } - - const int timeout(int sec, int ms_sec = 0) - { - m_timeout = (sec > 0 ? (sec * 1000) : 0) + - (ms_sec > 0 ? ms_sec : 0); - return sec; - } - - const int timeoutSID(const size_t sid = 1) - { - int sec = gOptions.getAutoDumpTime(sid); - m_timeout = (sec > 0 ? (sec * 1000) : 0); - return sec; - } - - const __uint64 schedule(int ms_sec = 10) - { - // get the current time and schedule on from - // there so the usage just adds the duration - return (m_scheduleTime = time_now_ms() + (ms_sec > 0 ? ms_sec : 0)); - } - }; - #pragma pack(pop) - - virtual void timeSlice() throw(std::exception) = 0; // you override this to take action - virtual uniString::utf8 name() const throw() = 0; // object name for diagnostics - - explicit runnable (runnable &r) throw(); - - explicit runnable(socketOps::tSOCKET socket = socketOps::cINVALID_SOCKET) throw() - : m_ssl(NULL), m_socket(socket), m_lastActivityTime(::time(NULL)) {} - - virtual ~runnable() throw() { if (m_ssl) { SSL_shutdown (m_ssl); SSL_free (m_ssl); } } - - // utility to read an HTTP style header line off a socket. Used in most protocols - // returns zero if lineBuffer is ready, otherwise it returns a timeout in seconds that - // should be used to wait in a select - const bool getHTTPStyleHeaderLine(const size_t sid, uniString::utf8 &lineBuffer, - const uniString::utf8 &logMsgPrefix, int maxLineLength = 0) throw(std::exception); - - // send a hunk of data out a socket - returns true if send is complete, - // outBuffer and outBufferSize should be initially set to point to the - // data and the size of the data - these values are moved and updated. - const bool sendDataBuffer(const size_t sid, const uniString::utf8::value_type *&outBuffer, - int &outBufferSize, const uniString::utf8 &logMsgPrefix) throw(std::exception); - - ssize_t send (const void *buf, size_t len, int flags = 0); - ssize_t recv (void *buf, size_t len, int flags = 0); - - virtual int detectAutoDumpTimeout (time_t &cur_time, const size_t streamID, const uniString::utf8 &msg) throw(runtime_error); - -protected: - timeSliceResult m_result; // for tracking response - SSL *m_ssl; // SSL handler - socketOps::tSOCKET m_socket; // we'll need this for read / write handling so - // is easier to hold a copy of it here than do - // it at the higher class levels - time_t m_lastActivityTime; // for tracking timeouts -}; - -#pragma pack(push, 1) -class threadedRunner : public Vthread -{ -///// static for managing collection of these guys -private: - pipeDrivenSignal<nullLock> m_signal; // we must add/remove runnables, or stop, or some other sort of message - bool m_stop; // if true then this thread must shut down - const short m_threadNumber; // for diagnostics only - - // list of runnables to be added or removed from this thread controller - std::set<runnable*> m_runnablesToAdd; - std::set<runnable*> m_runnablesToRemove; - std::set<runnable*> m_runList; // things to run - - AOL_namespace::mutex m_lock; - - friend class microConnection; - - static SSL_CTX *m_sslCtx; - static AOL_namespace::mutex *m_sslMutexes; - static unsigned long SSL_idFunction (void); - static void SSL_lockingFunction (int mode, int n, const char *file, int line); - - const unsigned operator()() throw(); - - // add new runnables to the thread. returns false if the runnable could not be queued to this thread object - // False usually means that the thread is going away and can no longer accept runnables - const bool addRunnable(runnable*) throw(); - - // these runnables will be removed at the next opportunity (does not happen immediately) - // false means the runnable was not associated with that thread - const bool removeRunnable(runnable*) throw(); - - void enumRunnables(map<uniString::utf8, size_t>& runners) throw(); - - void wakeupRunnable() throw(); - -public: - threadedRunner() throw(); - virtual ~threadedRunner() throw(); - - static bool scheduleRunnable(runnable *r) throw(); - - static uniString::utf8 getRunnabledetails() throw(); - - static void wakeup() throw(); - - void stop() throw(); - const size_t sizeOfRunList() throw(); - const uniString::utf8 threadNumber() const throw() { return stringUtil::tos(m_threadNumber); } // for diagnostics only - - static bool isSSLCapable() { return m_sslCtx ? true : false; } - static void SSL_init (); - static void SSL_shutdown (); -}; -#pragma pack(pop) - -// microserver is a runnable object that implements basic server functionality. -// it listens on a socket. When a connection occurs it creates a microConnection -// object to handle it -class microServer: public runnable -{ -public: - // what stuff we will accept - typedef u_short AllowableProtocols_t; - #define P_WEB 1 - #define P_SHOUTCAST1CLIENT 2 - #define P_SHOUTCAST2CLIENT 4 - #define P_SHOUTCAST1SOURCE 8 - #define P_SHOUTCAST2SOURCE 16 - #define P_FLASHPOLICYFILE 64 - #define P_WEB_SETUP 128 - - // what stuff we will listen for - typedef enum { - L_MISC = 0, - L_CLIENT = 1, - L_SOURCE = 2, - L_FLASH = 4, - L_SOURCE2 = 8, - L_CLIENT_ALT = 16 - } ListenTypes_t; - -private: - AllowableProtocols_t m_protocols; - - void bindMessage(const ListenTypes_t types, const u_short listenPort) throw(); - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "microServer"; } - -public: - microServer(const std::string &listenAddr, const u_short listenPort, const AllowableProtocols_t protocols, const ListenTypes_t types) throw(std::exception); - void updateProtocols(AllowableProtocols_t protocols, ListenTypes_t types, const u_short listenPort) throw(); - virtual ~microServer() throw(); -}; - -// this class receives a connection and starts processing it until it knows -// what to do with it. When it has figured that out, it creates a protocol object -// and forwards all commands to that object from now on. -class microConnection: public runnable -{ - friend class protocol_HTTPStyle; - friend class protocol_uvox2Source; - friend class protocol_HTTPSource; - friend class protocol_shoutcastSource; - -private: - std::string m_srcHostName; - std::string m_srcAddress; - uniString::utf8 m_lineBuffer; - const u_short m_srcPort; - const microServer::AllowableProtocols_t m_protocols; // what protocols I accept - -protected: - virtual void timeSlice() throw(std::exception); - virtual uniString::utf8 name() const throw() { return "microConnection"; } - -public: - microConnection(const socketOps::tSOCKET s, const std::string &hostName, - const std::string &addr, const u_short port, - const microServer::AllowableProtocols_t protocols) throw(); - virtual ~microConnection() throw(); -}; - -///////////// Utilities that are used often in related components ///////////////////////// - -// common base used for kicking clients and general bookkeeping -class clientProtocol -{ -protected: - clientProtocol() throw() {} - virtual ~clientProtocol() throw(){} - -public: - virtual void kickNextRound() throw() {} - virtual void setGroup(int /*group*/) throw() {} -}; - -// make standard string for loggin address -extern uniString::utf8 addrLogString(const uniString::utf8 &addr, const u_short port, const uniString::utf8 &xff = "") throw(); -// make standard string for logging src address -extern uniString::utf8 srcAddrLogString(const uniString::utf8 &addr, const u_short port, const size_t sid = 0) throw(); -// make standard string for loggin dst address -extern uniString::utf8 dstAddrLogString(const uniString::utf8 &addr, const u_short port, const uniString::utf8 &xff = "", const size_t sid = 0) throw(); - -// get value from map. Return default if doesn't exist -template<typename T> inline T stringToType(const uniString::utf8 &s) throw(); -template<> inline uniString::utf8 stringToType(const uniString::utf8 &s) throw() { return s; } -template<> inline int stringToType(const uniString::utf8 &s) throw() { return atoi((const char *)s.c_str()); } -template<> inline u_short stringToType(const uniString::utf8 &s) throw() { return (u_short)atoi((const char *)s.c_str()); } -template<> inline std::string stringToType(const uniString::utf8 &s) throw() { return s.hideAsString(); } -template<> inline bool stringToType(const uniString::utf8 &s) throw() -{ - if (s.empty()) - { - return false; - } - uniString::utf8::value_type v = *(s.begin()); - if (v == 'f' || v == 'F' || v == 'n' || v == 'N' || v == '0') - { - return false; - } - return true; -} - -template<typename T> -inline T mapGet(const httpHeaderMap_t &m, const uniString::utf8 &key, const T deflt) throw() -{ - httpHeaderMap_t::const_iterator i = m.find(key); - return (i == m.end() ? deflt : stringToType<T>((*i).second)); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/updater.cpp b/Src/Plugins/DSP/sc_serv3/updater.cpp deleted file mode 100644 index 3833f88e..00000000 --- a/Src/Plugins/DSP/sc_serv3/updater.cpp +++ /dev/null @@ -1,354 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <stdio.h> -#include "updater.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" -#include "aolxml/aolxml.h" -#include "bandwidth.h" -#include "services/stdServiceImpl.h" -#include "./versions.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -static AOL_namespace::mutex g_UpdaterLock; -static updater *g_Updater = 0; - -#define DEBUG_LOG(...) do { if (gOptions.yp2Debug()) DLOG(__VA_ARGS__); } while (0) - -/////////////////////////////////////////////////////////////////////////////////////////// - -void updater::updaterBandWidthSent(webClient::request r) throw() -{ - // this effectively works out the size in the same manner - // as webclient::toRequest(..) does to build the request. - size_t total = r.m_content.size() + r.m_contentType.size() + - // 'POST' or 'GET' with '?' on the front - (r.m_method == webClient::request::POST ? 4 : 3) + - 64 + r.m_addr.size() + g_userAgent.size() + - (!r.m_content.empty() ? r.m_content.size() : 0); - - for (httpHeaderMap_t::const_iterator i = r.m_queryVariables.begin(); i != r.m_queryVariables.end(); ++i) - { - if (i != r.m_queryVariables.begin()) - { - ++total; - } - total += urlUtils::escapeURI_RFC3986((*i).first).size(); - if (!(*i).second.empty()) - { - total += 1 + urlUtils::escapeURI_RFC3986((*i).second).size(); - } - } - - if (!r.m_XFF.empty()) - { - total += 18 + r.m_XFF.size(); - } - - if ((r.m_method == webClient::request::POST) && r.m_content.empty()) - { - total += 48; - } - else if (!r.m_contentType.empty()) - { - total += 15 + r.m_contentType.size(); - } - - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, total); -} - -void updater::updaterBandWidthReceived(const response r) throw() -{ - size_t total = r.m_body.size(); - - for (httpHeaderMap_t::const_iterator i = r.m_headers.begin(); i != r.m_headers.end(); ++i) - { - total += (*i).first.size() + 1 + (*i).second.size() + eol().size(); - } - - bandWidth::updateAmount(bandWidth::PRIVATE_WEB, total); -} - -size_t updater::requestsInQueue() throw() -{ - stackLock sml(g_UpdaterLock); - - return (g_Updater ? g_Updater->queueEntries() : 0); -} - -updater::updater() throw() : webClient(UPDATER_LOGNAME) -{ - stackLock sml(g_UpdaterLock); - - g_Updater = this; - m_running = false; -} - -updater::~updater() throw() -{ - stackLock sml(g_UpdaterLock); - - g_Updater = 0; -} - -/////////// response handling ////////////// -// handle response. retry_exceptions do just that. otherwise retry occurs in yptimeout seconds - -void updater::response_updater(const request & /*q*/, const response &r) throw(exception) -{ - FILE *f = uniFile::fopen(g_Updater->m_verInfo.fn, "wb"); - if (f) - { - if (fwrite(&(r.m_body[0]),1,r.m_body.size(),f) == r.m_body.size()) - { - ILOG(UPDATER_LOGNAME "Downloaded update to `" + g_Updater->m_verInfo.fn + "' [" + tos(r.m_body.size()) + " bytes]"); - g_Updater->m_verInfo.downloaded = 1; - g_Updater->m_verInfo.needsUpdating = 0; - } - else - { - ILOG(UPDATER_LOGNAME "Error saving the update to `" + g_Updater->m_verInfo.fn + "' [" + tos(r.m_body.size()) + " bytes]"); - g_Updater->m_verInfo.fn.clear(); - g_Updater->m_verInfo.needsUpdating = 1; - } - ::fclose(f); - } - else - { - FILE *f = uniFile::fopen(g_Updater->m_verInfo.fn_alt, "wb"); - if (f) - { - if (fwrite(&(r.m_body[0]),1,r.m_body.size(),f) == r.m_body.size()) - { - g_Updater->m_verInfo.fn = g_Updater->m_verInfo.fn_alt; - ILOG(UPDATER_LOGNAME "Downloaded update to `" + g_Updater->m_verInfo.fn + "' [" + tos(r.m_body.size()) + " bytes]"); - g_Updater->m_verInfo.downloaded = 1; - g_Updater->m_verInfo.needsUpdating = 0; - } - else - { - ILOG(UPDATER_LOGNAME "Error saving the update to `" + g_Updater->m_verInfo.fn_alt + "' [" + tos(r.m_body.size()) + " bytes]"); - g_Updater->m_verInfo.fn.clear(); - g_Updater->m_verInfo.fn_alt.clear(); - g_Updater->m_verInfo.needsUpdating = 1; - } - ::fclose(f); - } - else - { - ELOG(UPDATER_LOGNAME "Error creating file: " + errMessage()); - g_Updater->m_verInfo.fn.clear(); - g_Updater->m_verInfo.fn_alt.clear(); - g_Updater->m_verInfo.needsUpdating = 1; - } - } -} - -void updater::gotResponse(const request &q, const response &r) throw(exception) -{ - stackLock sml(m_serverMapLock); - - DEBUG_LOG(UPDATER_LOGNAME + string(__FUNCTION__) + eol() + - "Response body=[" + eol() + utf8(r.m_body.begin(),r.m_body.end()) + "]" + - eol() + "Response code=[" + tos(r.m_resultCode) + "]"); - - updaterBandWidthReceived(r); - response_updater(q, r); - m_running = false; -} - -void updater::gotFailure(const request &/*q*/) throw(std::exception) -{ - stackLock sml(g_UpdaterLock); - - DEBUG_LOG(UPDATER_LOGNAME + string(__FUNCTION__)); - m_running = false; -} - -void updater::updateVersion() throw() -{ - if (g_Updater) - { - // make sure we've got it and also an url - if (g_Updater->m_verInfo.needsUpdating && !g_Updater->m_verInfo.url.empty() && - !g_Updater->m_verInfo.fn.empty() && !g_Updater->m_verInfo.fn_alt.empty()) - { - try - { - g_Updater->pvt_downloadUpdate(); - } - catch(...) - { - } - } - } -} - -void updater::pvt_downloadUpdate() throw(exception) -{ - if (!m_running) - { - m_running = true; - ILOG(UPDATER_LOGNAME "Preparing to download update package..."); - - // build request - webClient::request r; - r.m_method = webClient::request::GET; - - config::streamConfig::urlObj downloadUrl(g_Updater->m_verInfo.url.hideAsString()); - - r.m_addr = downloadUrl.server(); - r.m_port = downloadUrl.port(); - r.m_path = downloadUrl.path(); - r.m_nonBlocking = 1; - - updaterBandWidthSent(r); - queueRequest(r); - } -} - -bool updater::getNewVersion(verInfo &ver) throw() -{ - stackLock sml(g_UpdaterLock); - - if (g_Updater) - { - // double-check that we've got things correctly - // before we provide the current update status. - bool ret = g_Updater->setNewVersion(g_Updater->m_verInfo, true); - ver = g_Updater->m_verInfo; - return ret; - } - return false; -} - -bool updater::setNewVersion(verInfo &ver, bool no_lock) throw() -{ - if (!no_lock) - { - stackLock sml(g_UpdaterLock); - } - - if (g_Updater) - { - if (g_Updater->m_verInfo.ver != ver.ver || - g_Updater->m_verInfo.url != ver.url || - g_Updater->m_verInfo.log != ver.log) - { - g_Updater->m_verInfo = ver; - - if (!g_Updater->m_verInfo.ver.empty()) - { - const std::vector<uniString::utf8> newVerStr = tokenizer(g_Updater->m_verInfo.ver,'.'), - curVerStr = tokenizer(gOptions.getVersionBuildStrings(),'.'); - int newVer[] = {newVerStr[0].toInt(), newVerStr[1].toInt(), newVerStr[2].toInt(), newVerStr[3].toInt()}, - curVer[] = {curVerStr[0].toInt(), curVerStr[1].toInt(), curVerStr[2].toInt(), curVerStr[3].toInt()}; - - g_Updater->m_verInfo.needsUpdating = 0; - - // look to compare from major to minor parts of the version strings - // 2.x.x.x vs 3.x.x.x - if (newVer[0] > curVer[0]) - { - g_Updater->m_verInfo.needsUpdating = 1; - } - // 2.0.x.x vs 2.2.x.x - else if ((newVer[0] == curVer[0]) && (newVer[1] > curVer[1])) - { - g_Updater->m_verInfo.needsUpdating = 1; - } - // 2.0.0.x vs 2.0.1.x - else if ((newVer[0] == curVer[0]) && (newVer[1] == curVer[1]) && (newVer[2] > curVer[2])) - { - g_Updater->m_verInfo.needsUpdating = 1; - } - // 2.0.0.29 vs 2.0.0.30 - else if ((newVer[0] == curVer[0]) && (newVer[1] == curVer[1]) && (newVer[2] == curVer[2]) && (newVer[3] > curVer[3])) - { - g_Updater->m_verInfo.needsUpdating = 1; - } - - if (g_Updater->m_verInfo.needsUpdating) - { - #ifdef _WIN32 - g_Updater->m_verInfo.fn = gStartupDirectory + "sc_serv_update_" SERV_UPDATE_NAME "_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".exe"; - wchar_t m_fileName[MAX_PATH] = {0}; - uniString::utf32 u32("%temp%\\sc_serv_update_" SERV_UPDATE_NAME "_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".exe"); - std::wstring u16; - u32.toUtf16(u16); - ExpandEnvironmentStringsW(u16.c_str(), m_fileName, MAX_PATH); - g_Updater->m_verInfo.fn_alt = utf32(m_fileName).toUtf8(); - #else - g_Updater->m_verInfo.fn = gStartupDirectory + "sc_serv_update_" SERV_UPDATE_NAME"_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".tar.gz"; - g_Updater->m_verInfo.fn_alt = "/tmp/sc_serv_update_" SERV_UPDATE_NAME"_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".tar.gz"; - #endif - - g_Updater->m_verInfo.downloaded = uniFile::fileExists(g_Updater->m_verInfo.fn); - // if the main file cannot be found, look for the alternate file - if (!g_Updater->m_verInfo.downloaded) - { - g_Updater->m_verInfo.downloaded = uniFile::fileExists(g_Updater->m_verInfo.fn_alt); - if (g_Updater->m_verInfo.downloaded) - { - g_Updater->m_verInfo.fn = g_Updater->m_verInfo.fn_alt; - } - } - } - - ULOG(string(YP2_LOGNAME) + "A new DNAS version is now available: " + g_Updater->m_verInfo.ver); - ULOG(string(YP2_LOGNAME) + "The suggested download for your setup is: " + g_Updater->m_verInfo.url); - ULOG(string(YP2_LOGNAME) + "See " + g_Updater->m_verInfo.log + " for more information about this update and alternative download links"); - - if (!g_Updater->m_verInfo.downloaded && !g_Updater->m_verInfo.fn.empty() && !g_Updater->m_verInfo.fn_alt.empty()) - { - g_Updater->updateVersion(); - } - } - } - else - { - std::vector<uniString::utf8> newVerStr = tokenizer(g_Updater->m_verInfo.ver,'.'); - if (newVerStr.size() == 4) - { - int newVer[] = {newVerStr[0].toInt(), newVerStr[1].toInt(), newVerStr[2].toInt(), newVerStr[3].toInt()}; - - #ifdef _WIN32 - g_Updater->m_verInfo.fn = gStartupDirectory + "sc_serv_update_" SERV_UPDATE_NAME "_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".exe"; - wchar_t m_fileName[MAX_PATH] = {0}; - uniString::utf32 u32("%temp%\\sc_serv_update_" SERV_UPDATE_NAME "_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".exe"); - std::wstring u16; - u32.toUtf16(u16); - ExpandEnvironmentStringsW(u16.c_str(), m_fileName, MAX_PATH); - g_Updater->m_verInfo.fn_alt = utf32(m_fileName).toUtf8(); - #else - g_Updater->m_verInfo.fn = gStartupDirectory + "sc_serv_update_" SERV_UPDATE_NAME"_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".tar.gz"; - g_Updater->m_verInfo.fn_alt = "/tmp/sc_serv_update_" SERV_UPDATE_NAME"_" + tos(newVer[0]) + "_" + tos(newVer[1]) + "_" + tos(newVer[2]) + "_" + tos(newVer[3]) + ".tar.gz"; - #endif - - g_Updater->m_verInfo.downloaded = uniFile::fileExists(g_Updater->m_verInfo.fn); - // if the main file cannot be found, look for the alternate file - if (!g_Updater->m_verInfo.downloaded) - { - g_Updater->m_verInfo.downloaded = uniFile::fileExists(g_Updater->m_verInfo.fn_alt); - if (g_Updater->m_verInfo.downloaded) - { - g_Updater->m_verInfo.fn = g_Updater->m_verInfo.fn_alt; - } - } - g_Updater->m_verInfo.needsUpdating = 1; - - if (!g_Updater->m_verInfo.downloaded && !g_Updater->m_verInfo.fn.empty()) - { - g_Updater->updateVersion(); - } - } - } - - return (!g_Updater->m_verInfo.ver.empty() && (g_Updater->m_verInfo.needsUpdating || (g_Updater->m_verInfo.downloaded && !g_Updater->m_verInfo.fn.empty()))); - } - return false; -} diff --git a/Src/Plugins/DSP/sc_serv3/updater.h b/Src/Plugins/DSP/sc_serv3/updater.h deleted file mode 100644 index 26e53502..00000000 --- a/Src/Plugins/DSP/sc_serv3/updater.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once -#ifndef download_H_ -#define download_H_ - -#include "webClient.h" -#include "webNet/urlUtils.h" -#include "yp2.h" - -#define UPDATER_LOGNAME "[UPDATER] " -class updater: public webClient -{ -public: - struct verInfo - { - int needsUpdating; - int downloaded; - uniString::utf8 ver; - uniString::utf8 url; - uniString::utf8 log; - uniString::utf8 info; - uniString::utf8 message; - uniString::utf8 slimmsg; - uniFile::filenameType fn; - uniFile::filenameType fn_alt; - verInfo() : needsUpdating(0), downloaded(0) {} - }; - - updater() throw(); - ~updater() throw(); - - // used in main during shutdown to wait for request queue to clear out - static size_t requestsInQueue() throw(); - - static bool getNewVersion(verInfo &ver) throw(); - static bool setNewVersion(verInfo &ver, bool no_lock = false) throw(); - -private: - AOL_namespace::mutex m_serverMapLock; - - verInfo m_verInfo; - bool m_running; - - virtual uniString::utf8 name() const throw() { return "updater"; } - - virtual void gotResponse(const request &q, const response &r) throw(std::exception); - virtual void gotFailure(const request &q) throw(std::exception); - - static void response_updater(const request &q,const response &r) throw(std::exception); - void failure_updater(const request &q) throw(); - - static void updaterBandWidthSent(webClient::request r) throw(); - static void updaterBandWidthReceived(const response r) throw(); - - void pvt_downloadUpdate() throw(std::exception); - static void updateVersion() throw(); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/uvox2Common.cpp b/Src/Plugins/DSP/sc_serv3/uvox2Common.cpp deleted file mode 100644 index a24df4f0..00000000 --- a/Src/Plugins/DSP/sc_serv3/uvox2Common.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#else -#include <arpa/inet.h> -#include <sys/types.h> -#endif - -#include <string.h> -#include <stdio.h> -#include "uvox2Common.h" -#include "stl/stringUtils.h" -#include <sstream> -#include <iomanip> -#include <assert.h> - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -// from wikipedia. Slightly modified to be 32/64 bit clean -static void XTEA_encipher(__uint32* v, __uint32* k, unsigned int num_rounds = 32) -{ - __uint32 v0 = v[0], v1 = v[1], sum = 0; - for (unsigned int i = 0; i < num_rounds; i++) - { - v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); - sum += 0x9E3779B9; - v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]); - } - v[0] = v0; - v[1] = v1; -} - -static void XTEA_decipher(__uint32* v, __uint32* k, unsigned int num_rounds = 32) -{ - __uint32 v0 = v[0], v1 = v[1], sum = 0x9E3779B9 * num_rounds; - for (unsigned int i = 0; i < num_rounds; i++) - { - v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]); - sum -= 0x9E3779B9; - v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); - } - v[0] = v0; - v[1] = v1; -} -///// - -static __uint32 fourCharsToLong(__uint8 *s) -{ - __uint32 l = 0; - l |= s[0]; l <<= 8; - l |= s[1]; l <<= 8; - l |= s[2]; l <<= 8; - l |= s[3]; - return l; -} - -static void longToFourChars(__uint32 l, __uint8 *r) -{ - r[3] = l & 0xff; l >>= 8; - r[2] = l & 0xff; l >>= 8; - r[1] = l & 0xff; l >>= 8; - r[0] = l & 0xff; l >>= 8; -} - -#define XTEA_KEY_PAD 0 -#define XTEA_DATA_PAD 0 - -string XTEA_encipher(const __uint8* c_data, const size_t c_data_cnt, - const __uint8* c_key, const size_t c_key_cnt) throw() -{ - vector<__uint8> key(c_key, c_key + c_key_cnt); - vector<__uint8> data(c_data, c_data + c_data_cnt); - - // key is always 128 bits - while (key.size() < 16) - { - key.push_back(XTEA_KEY_PAD); // pad key with zero - } - __uint32 k[4] = {fourCharsToLong(&key[0]), fourCharsToLong(&key[4]), - fourCharsToLong(&key[8]), fourCharsToLong(&key[12])}; - - // data is multiple of 64 bits - size_t siz = data.size(); - while (siz % 8) - { - ++siz; - data.push_back(XTEA_DATA_PAD); - } // pad data with zero - - ostringstream oss; - for (size_t x = 0; x < siz; x += 8) - { - __uint32 v[2] = {fourCharsToLong(&data[x]), fourCharsToLong(&data[x+4])}; - XTEA_encipher(v, k); - oss << setw(8) << setfill('0') << hex << v[0]; - oss << setw(8) << setfill('0') << hex << v[1]; - // hex values. uvox uses colon as seperator so - // we can't use chars for fear of collision - } - - return oss.str(); -} - -utf8 XTEA_decipher(const __uint8* c_data, const size_t c_data_cnt, - const __uint8* c_key, const size_t c_key_cnt) throw() -{ - utf8 result; - - vector<__uint8> key(c_key, c_key + c_key_cnt); - vector<__uint8> data(c_data, c_data + c_data_cnt); - - // key is always 128 bits - while (key.size() < 16) - { - key.push_back(XTEA_KEY_PAD); // pad key with zero - } - __uint32 k[4] = {fourCharsToLong(&key[0]), fourCharsToLong(&key[4]), - fourCharsToLong(&key[8]), fourCharsToLong(&key[12])}; - - // data is multiple of 16 hex digits - size_t siz = data.size(); - //assert(!(siz % 16)); // should never happen if data is good - while (siz % 16) - { - ++siz; - data.push_back('0'); - } // pad data with zero - - for (size_t x = 0; x < siz; x += 16) - { - __uint32 v[2]; - sscanf((const char *)&data[x], "%8x", &v[0]); - sscanf((const char *)&data[x+8], "%8x", &v[1]); - - XTEA_decipher(v, k); - __uint8 ur[5] = {0}; - longToFourChars(v[0], ur); - result += ur; - longToFourChars(v[1], ur); - result += ur; - } - return result; -} - -// take data and create a uvox message appended to "v". Limit by MAX_PAYLOAD_SIZE. -// return amount of data UNconsumed -int formMessage(const __uint8 *data, const int len, const int type, vector<__uint8> &v) throw(runtime_error) -{ - if (len > MAX_PAYLOAD_SIZE) - { - throw runtime_error(string(__FUNCTION__) + " message payload " + tos(len) + " is too big"); - } - - const int amt = min(len, MAX_PAYLOAD_SIZE); - uv2xHdr hdr2 = {UVOX2_SYNC_BYTE, 0, (u_short)htons(type), (u_short)htons((u_short)amt)}; - v.insert(v.end(), (const __uint8 *)(&hdr2), ((const __uint8 *)(&hdr2)) + sizeof(hdr2)); - v.insert(v.end(), data, data + amt); - v.push_back(UV2X_EOM); - return (len - amt); -} - -// similar to above, except it writes data into a buffer pointed to by v -int formMessage(const __uint8 *data, const int len, const int type, __uint8 *v) throw(runtime_error) -{ - if (len > MAX_PAYLOAD_SIZE) - { - throw runtime_error(string(__FUNCTION__) + " message payload " + tos(len) + " is too big"); - } - - const int amt = min(len, MAX_PAYLOAD_SIZE); - uv2xHdr hdr2 = {UVOX2_SYNC_BYTE, 0, (u_short)htons(type), (u_short)htons((u_short)amt)}; - memcpy(v, &hdr2, sizeof(hdr2)); - v += sizeof(hdr2); - memcpy(v, data, amt); - v += amt; - v[0] = UV2X_EOM; - return (len - amt); -} - -// load vector v up with metadata packets. -void createMetadataPackets(const __uint8 *data, const int _len, const int type, - vector<__uint8> &v, const __uint16 metadataID) throw(runtime_error) -{ - const int amtPerPacket = (MAX_PAYLOAD_SIZE - UV2X_META_HDR_SIZE); - - // subdivide and load - __uint16 total_segments = (__uint16)(_len / amtPerPacket) + ((_len % amtPerPacket) ? 1 : 0), segment = 1; - int len = _len; - while (len > 0) - { - uv2xMetadataHdr h = {(u_short)htons(metadataID), (u_short)htons(total_segments), (u_short)htons(segment)}; - const int amt = min(len, amtPerPacket); - vector<__uint8> m((const __uint8 *)&h, ((const __uint8 *)&h) + sizeof(h)); - m.insert(m.end(), data, data + amt); - formMessage(&m[0], (int)m.size(), type, v); - data += amt; - len -= amt; - ++segment; - } -} diff --git a/Src/Plugins/DSP/sc_serv3/uvox2Common.h b/Src/Plugins/DSP/sc_serv3/uvox2Common.h deleted file mode 100644 index 648a368e..00000000 --- a/Src/Plugins/DSP/sc_serv3/uvox2Common.h +++ /dev/null @@ -1,116 +0,0 @@ -#pragma once -#ifndef uvox2Common_H_ -#define uvox2Common_H_ - -#include "unicode/uniString.h" - -std::string XTEA_encipher(const __uint8* c_data, const size_t c_data_cnt, const __uint8* c_key, const size_t c_key_cnt) throw(); -uniString::utf8 XTEA_decipher(const __uint8* c_data, const size_t c_data_cnt, const __uint8* c_key, const size_t c_key_cnt) throw(); - -#pragma pack(push,1) - -struct uv2xHdr -{ // uvox2 message - __uint8 sync; - __uint8 qos; - __uint16 msgType; - __uint16 msgLen; -}; - -struct uv2xMetadataHdr -{ /* uvox 2 metadata header */ - __uint16 id; /* ID (cookie) identifying a metadata package */ - __uint16 span; /* Span of messages in the metadata package being assembled */ - __uint16 index;/* Index of the message in the metadata package being assembled */ -}; - -#pragma pack(pop) - -static const int MAX_MESSAGE_SIZE = (16 * 1024); -static const int MAX_CIPHER_KEY_SIZE = 256; - -static const char UV2X_EOM = 0; -static const int UV2X_HDR_SIZE = sizeof(uv2xHdr); -static const int UV2X_OVERHEAD = (UV2X_HDR_SIZE + 1); /* header+end_of_msg */ -static const int UV2X_META_HDR_SIZE = sizeof(uv2xMetadataHdr); -static const int MAX_PAYLOAD_SIZE = MAX_MESSAGE_SIZE - UV2X_OVERHEAD; - -#define UVOX2_SYNC_BYTE 0X5A - -static const int MSG_AUTH = 0x1001; -static const int MSG_BROADCAST_SETUP = 0x1002; -static const int MSG_NEGOTIATE_BUFFER_SIZE = 0x1003; -static const int MSG_STANDBY = 0x1004; -static const int MSG_TERMINATE = 0x1005; -static const int MSG_FLUSH_CACHED_METADATA = 0x1006; -static const int MSG_LISTENER_AUTHENTICATION= 0x1007; -static const int MSG_MAX_PAYLOAD_SIZE = 0x1008; -static const int MSG_CIPHER = 0x1009; // cipher request for uvox 2.1 -static const int MSG_MIME_TYPE = 0x1040; -static const int MSG_FILE_TRANSFER_BEGIN = 0x1050; -static const int MSG_FILE_TRANSFER_DATA = 0x1051; - -static const int MSG_BROADCAST_INTERRUPTION = 0x2001; -static const int MSG_BROADCAST_TERMINATE = 0x2002; - -static const int MSG_ICYNAME = 0x1100; -static const int MSG_ICYGENRE = 0x1101; -static const int MSG_ICYURL = 0x1102; -static const int MSG_ICYPUB = 0x1103; - -static const int MSG_METADATA_CONTENTINFO = 0x3000; -static const int MSG_METADATA_URL = 0x3001; -//static const int MSG_METADATA_XML = 0x3901; -static const int MSG_METADATA_XML_NEW = 0x3902; - -// only id the start of the album art type as it's variable -static const int MSG_METADATA_ALBUMART = 0x4000; -static const int MSG_METADATA_STATION_ART = 0x0000; -static const int MSG_METADATA_PLAYING_ART = 0x0100; -/* - 0x4 0x0xx Station logo - 0x4 0x1xx Album art - - 00 = image/jpeg - 01 = image/png - 02 = image/bmp - 03 = image/gif -*/ - -static const int MSG_METADATA_TIMEREMAINING = 0x5001; - -static const int MP3_DATA = 0x7000; -static const int VLB_DATA = 0x8000; -static const int AAC_LC_DATA = 0x8001; -static const int AACP_DATA = 0x8003; -static const int OGG_DATA = 0x8004; - -/// these are the same -static const int MAX_METADATA_SEGMENTS = 32; -#define MAX_METADATA_FRAGMENTS 32 -/////// - -static const int MAX_METADATA_TIME(300); // five minutes - -// take data and create a uvox message appended to "v". Limit by MAX_PAYLOAD_SIZE. -// return amount of data UNconsumed -int formMessage(const __uint8 *data, const int len, const int type, std::vector<__uint8> &v) throw(std::runtime_error); - -// similar to above, except it writes data into a buffer pointed to by v -int formMessage(const __uint8 *data, const int len, const int type, __uint8 *v) throw(std::runtime_error); - -// this one also returns actual full message size in msgSize -inline int formMessage(const std::string &dataIn, const int type, __uint8 *v, int &msgSize) throw(std::runtime_error) -{ - msgSize = (int)(dataIn.size() + 1); // include null - - int amt_left = formMessage((const __uint8 *)dataIn.c_str(), msgSize /* include null */, type, v); - msgSize += UV2X_OVERHEAD; - return amt_left; -} - -// load vector v up with metadata packets. -void createMetadataPackets(const __uint8 *data, const int len, const int type, - std::vector<__uint8> &v, const __uint16 metadataID = 1) throw(std::runtime_error); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/versions.h b/Src/Plugins/DSP/sc_serv3/versions.h deleted file mode 100644 index bd4fbbbc..00000000 --- a/Src/Plugins/DSP/sc_serv3/versions.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#ifndef versions_H_ -#define versions_H_ - -#define SERV_OSNAME "posix" - -#ifdef _WIN32 - #undef SERV_OSNAME - #ifndef _WIN64 - #define SERV_OSNAME "win32" - #define SERV_UPDATE_NAME "win32" - #else - #define SERV_OSNAME "win64" - #define SERV_UPDATE_NAME "win64" - #endif -#endif - -#ifdef __APPLE_CC__ - #undef SERV_OSNAME - #define SERV_OSNAME "mac" -#endif - -#ifdef PLATFORM_LINUX - #undef SERV_OSNAME - #ifndef __LP64__ - #define SERV_OSNAME "posix(linux x86)" - #define SERV_UPDATE_NAME "linux_x86" - #else - #define SERV_OSNAME "posix(linux x64)" - #define SERV_UPDATE_NAME "linux_x64" - #endif -#endif - -#ifdef PLATFORM_BSD - #undef SERV_OSNAME - #define SERV_OSNAME "posix(bsd)" - #define SERV_UPDATE_NAME "bsd" -#endif - -#ifdef PLATFORM_ARMv6 - #undef SERV_OSNAME - #define SERV_OSNAME "armv6(rpi)" - #define SERV_UPDATE_NAME "rpi" -#endif - -#ifdef PLATFORM_ARMv7 - #undef SERV_OSNAME - #define SERV_OSNAME "armv7(rpi2)" - #define SERV_UPDATE_NAME "rpi2" -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/w3cLog.cpp b/Src/Plugins/DSP/sc_serv3/w3cLog.cpp deleted file mode 100644 index a81cf7b4..00000000 --- a/Src/Plugins/DSP/sc_serv3/w3cLog.cpp +++ /dev/null @@ -1,319 +0,0 @@ -#include "w3cLog.h" -#include "webNet/urlUtils.h" -#include "threading/thread.h" -#include "global.h" -#include "file/fileUtils.h" -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" -#include <stdio.h> - -#ifndef _WIN32 -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <fcntl.h> -#endif - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -std::map<size_t,FILE *> s_w3cFileHandle; - -static AOL_namespace::mutex s_w3cLock; - -void w3cLog::open(const uniFile::filenameType &fn, size_t streamID) throw() -{ - rotate_log(fn, streamID); - - stackLock sml(s_w3cLock); - - if (!s_w3cFileHandle[streamID]) - { - s_w3cFileHandle[streamID] = uniFile::fopen(fn,"wb"); - if (!s_w3cFileHandle[streamID]) - { - ELOG("[W3C] Could not open file " + fn + " (" + errMessage() + ")"); - } - else - { - header(s_w3cFileHandle[streamID]); - } - } -} - -void w3cLog::header(FILE *w3cFileHandle) throw() -{ - // output header like done in the v1 DNAS for tool compatibility - utf8 version = gOptions.getVersionBuildStrings(); - utf8 s = "#Software: SHOUTcast" + eol() + "#Version: " + version + eol() + - "#Fields: c-ip c-dns date time cs-uri-stem c-status cs(User-Agent) sc-bytes x-duration avgbandwidth" + eol(); - size_t amt = ::fwrite(s.c_str(), 1, s.size(), w3cFileHandle); - if (amt != s.size()) - { - ELOG("[W3C] Write error"); - } - ::fflush(w3cFileHandle); -} - -void w3cLog::close(size_t streamID) throw() -{ - stackLock sml(s_w3cLock); - - if (s_w3cFileHandle[streamID]) - { - ::fclose(s_w3cFileHandle[streamID]); - s_w3cFileHandle[streamID] = 0; - } -} - -inline uniFile::filenameType make_backup_log(const uniFile::filenameType &filename, int which) throw() -{ - // 2.4.8+ we now ensure that this is giving a 'full path' to avoid issues - return fileUtil::getFullFilePath((fileUtil::stripSuffix(filename) + "_" + - tobs<uniFile::filenameType>(which) + "." + - fileUtil::getSuffix(filename))); -} - -uniFile::filenameType make_archive_log() throw() -{ -#ifdef _WIN32 - SYSTEMTIME sysTime = {0}; - ::GetLocalTime(&sysTime); - wchar_t d[100] = {0}, t[100] = {0}; - ::GetDateFormatW(LOCALE_SYSTEM_DEFAULT,0,&sysTime,_T("yyyy'_'MM'_'dd"),d,99); - ::GetTimeFormatW(LOCALE_SYSTEM_DEFAULT,0,&sysTime,_T("HH'_'mm'_'ss"),t,99); - return tos((const wchar_t *)d) + "_" + tos((const wchar_t *)t); -#else - char buf[256] = {0}; - struct tm ttm; - time_t ttt; - ::time(&ttt); - ::strftime(buf, 255, "%Y_%m_%d_%H_%M_%S", ::localtime_r(&ttt, &ttm)); - return buf; -#endif -} - -void w3cLog::rotate_log(const uniFile::filenameType &fn, size_t streamID) throw() -{ - stackLock sml(s_w3cLock); - - if (s_w3cFileHandle[streamID]) - { - ::fclose(s_w3cFileHandle[streamID]); - s_w3cFileHandle[streamID] = 0; - } - - int numFileBackups = gOptions.logRotates(); - for (int x = numFileBackups; x > 0; --x) - { - uniFile::filenameType dest = make_backup_log(fn, x); - // archive the log file about to be removed into a gz file - if (x > 0 && x == gOptions.logRotates()) - { - #ifdef _WIN32 - uniFile::filenameType archive = dest; - utf8::size_type pos = archive.rfind(utf8("_" + tos(numFileBackups))); - if ((pos != utf8::npos) && (uniFile::fileSize(dest) > 0)) - { - archive = (dest.substr(0, pos) + utf8("_" + make_archive_log() + "_w3c.gz")); - - HANDLE m_archive = ::CreateFileW(archive.toWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (m_archive != INVALID_HANDLE_VALUE) - { - DWORD written(0); - utf8 out; - z_stream m_stream = {0}; - - FILE* m_logFile = uniFile::fopen(dest, "rb"); - if (m_logFile != NULL) - { - bool started = false; - while (!feof(m_logFile)) - { - std::vector<uniString::utf8::value_type> m_logFileBuffer; - const size_t BUFSIZE(1024*16); - m_logFileBuffer.clear(); - m_logFileBuffer.resize(BUFSIZE + 1); - size_t amt = fread(&(m_logFileBuffer[0]), 1, BUFSIZE, m_logFile); - if (amt > 0) - { - out = utf8(&(m_logFileBuffer[0]), amt); - if (started == false) - { - compressDataStart(out, &m_stream, (Bytef*)"sc_w3c.log\0"); - started = true; - } - else - { - compressDataCont(out, &m_stream); - } - ::WriteFile(m_archive, out.c_str(), (DWORD)out.size(), &written, NULL); - } - } - - if (out.size() > 0) - { - compressDataFinish(out, &m_stream); - } - ::WriteFile(m_archive, out.c_str(), (DWORD)out.size(), &written, NULL); - - compressDataEnd(&m_stream); - - ::fclose(m_logFile); - forgetHandleInvalid(m_archive); - - // no need to keep any 0-byte files - // this is just incase of weirdness - if (!uniFile::fileSize(archive)) - { - uniFile::unlink(archive); - } - } - else - { - forgetHandleInvalid(m_archive); - uniFile::unlink(archive); - } - } - } - #else - uniFile::filenameType archive = dest; - utf8::size_type pos = archive.rfind(utf8("_" + tos(numFileBackups))); - if ((pos != utf8::npos) && (uniFile::fileSize(dest) > 0)) - { - archive = (dest.substr(0, pos) + utf8("_" + make_archive_log() + "_w3c.gz")); - int m_archive = ::open(archive.hideAsString().c_str(), O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (m_archive != -1) - { - utf8 out; - z_stream m_stream = {0}; - FILE* m_logFile = uniFile::fopen(dest, "rb"); - if (m_logFile != NULL) - { - bool started = false; - while (!feof(m_logFile)) - { - std::vector<uniString::utf8::value_type> m_logFileBuffer; - const size_t BUFSIZE(1024*16); - m_logFileBuffer.clear(); - m_logFileBuffer.resize(BUFSIZE + 1); - size_t amt = fread(&(m_logFileBuffer[0]), 1, BUFSIZE, m_logFile); - if (amt > 0) - { - out = utf8(&(m_logFileBuffer[0]), amt); - if (started == false) - { - compressDataStart(out, &m_stream, (Bytef*)"sc_w3c.log\0"); - started = true; - } - else - { - compressDataCont(out, &m_stream); - } - ::write(m_archive, out.c_str(), out.size()); - } - } - - if (out.size() > 0) - { - compressDataFinish(out, &m_stream); - } - - ::write(m_archive, out.c_str(), out.size()); - - compressDataEnd(&m_stream); - - ::fclose(m_logFile); - ::close(m_archive); - - // no need to keep any 0-byte files - // this is just incase of weirdness - if (!uniFile::fileSize(archive)) - { - uniFile::unlink(archive); - } - } - else - { - ::close(m_archive); - uniFile::unlink(archive); - } - } - } - #endif - } - - uniFile::unlink(dest); - #ifdef _WIN32 - ::MoveFileW(((x - 1) ? make_backup_log(fn, (x - 1)).toWString().c_str() : fn.toWString().c_str()), dest.toWString().c_str()); - #else - ::rename(((x - 1) ? make_backup_log(fn, (x - 1)).hideAsString().c_str() : fn.hideAsString().c_str()), dest.hideAsString().c_str()); - #endif - } - - s_w3cFileHandle[streamID] = uniFile::fopen(fn,"wb"); - if (!s_w3cFileHandle[streamID]) - { - ELOG("[W3C] Could not open file " + fn); - } - else - { - header(s_w3cFileHandle[streamID]); - } -} - -void w3cLog::log(const size_t streamID, const uniString::utf8 &ipAddr, - const uniString::utf8 &hostName, const uniString::utf8 &songName, - const uniString::utf8 &userAgent, __uint64 bytesSent, - time_t timeInSeconds, int bitrate) -{ - // to prevent some of the stats / logs getting skewed - // then we filter out the SHOUTcast site 'test' users - if (isUserAgentOfficial(toLower(userAgent))) - { - return; - } - - stackLock sml(s_w3cLock); - - FILE *w3cFileHandle = s_w3cFileHandle[streamID]; - if (!w3cFileHandle && streamID) - { - w3cFileHandle = s_w3cFileHandle[0]; - } - - if (!w3cFileHandle) - { - return; - } - - static time_t last_t; - static utf8 w3c_buf; - time_t t = ::time(NULL); - if (last_t != t) - { - struct tm lt = {0}; - ::localtime_s(<, &t); - - char buf[1024] = {0}; - snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d", - (lt.tm_year % 100) + 2000, lt.tm_mon + 1, - lt.tm_mday, lt.tm_hour, lt.tm_min, lt.tm_sec); - w3c_buf = buf; - } - - // http://forums.shoutcast.com/showthread.php?t=355063 - // http://forums.shoutcast.com/showthread.php?t=358805 - utf8 s = ipAddr + " " + hostName + " " + w3c_buf + " /stream?title=" + - (songName.empty() ? utf8("Unknown") : urlUtils::escapeURI_RFC3986(songName)) + - " 200 " + urlUtils::escapeURI_RFC3986(userAgent) + " " + tos(bytesSent) + " " + - tos(timeInSeconds) + " " + tos(bitrate) + eol(); - - size_t amt = ::fwrite(s.c_str(), 1, s.size(), w3cFileHandle); - if (amt != s.size()) - { - ELOG("[W3C] Write error"); - } - ::fflush(w3cFileHandle); -} diff --git a/Src/Plugins/DSP/sc_serv3/w3cLog.h b/Src/Plugins/DSP/sc_serv3/w3cLog.h deleted file mode 100644 index 13ab6a0f..00000000 --- a/Src/Plugins/DSP/sc_serv3/w3cLog.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -#ifndef w3cLog_H_ -#define w3cLog_H_ - -#include "unicode/uniString.h" -#include "unicode/uniFile.h" - -class w3cLog -{ -public: - static void open(const uniFile::filenameType &fn, const size_t streamID = 0) throw(); - static void header(FILE *w3cFileHandle) throw(); - static void close(const size_t streamID) throw(); - static void rotate_log(const uniFile::filenameType &fn, const size_t streamID = 0) throw(); - static void log(const size_t streamID, const uniString::utf8 &ipAddr, const uniString::utf8 &hostName, - const uniString::utf8 &songName, const uniString::utf8 &userAgent, __uint64 bytesSent, - time_t timeInSeconds, const int bitrate); -}; - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/webClient.cpp b/Src/Plugins/DSP/sc_serv3/webClient.cpp deleted file mode 100644 index 3006d6b9..00000000 --- a/Src/Plugins/DSP/sc_serv3/webClient.cpp +++ /dev/null @@ -1,619 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif - -#include <stdio.h> -#include "webClient.h" -#include "webNet/urlUtils.h" -#include "stl/stringUtils.h" -#include "file/fileUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; -using namespace uniString; - -#define DEBUG_LOG(...) do { if (gOptions.webClientDebug()) DLOG(__VA_ARGS__); } while (0) - -////////////////// utils - -static utf8 toLogString(const webClient::request &r) throw() -{ - // using this to ensure the default YP connection is via HTTPS - // though if there is a config issue then attempt to handle it - // by reverting to the pre-HTTPS mode so we can still work-ish - const bool https = ((r.m_addr == DEFAULT_YP_ADDRESS) && uniFile::fileExists(gOptions.m_certPath)); - if (r.m_port == 80) - { - return utf8(https ? "https://" : "http://") + r.m_addr + r.m_path; - } - else - { - return utf8(https ? "https://" : "http://") + r.m_addr + ":" + tos(r.m_port) + r.m_path; - } -} - -utf8 encodeVariables(const httpHeaderMap_t &m) throw() -{ - utf8 result; - - if (!m.empty()) - { - for (httpHeaderMap_t::const_iterator i = m.begin(); i != m.end(); ++i) - { - if (i != m.begin()) - { - result += "&"; - } - result += urlUtils::escapeURI_RFC3986((*i).first) + "="; - if (!(*i).second.empty()) - { - result += urlUtils::escapeURI_RFC3986((*i).second); - } - } - } - return result; -} - -static utf8 toLogString(const httpHeaderMap_t &m) throw() -{ - utf8 result = "headers=[" + eol(); - for (httpHeaderMap_t::const_iterator i = m.begin(); i != m.end(); ++i) - { - result += " " + (*i).first + " : " + (*i).second + eol(); - } - result += "]" + eol(); - return result; -} - -static utf8 toLogString(const webClient::response &r) throw() -{ - utf8 result = "code=" + tos(r.m_resultCode) + " reason=" + r.m_resultText + eol(); - result += toLogString(r.m_headers); - result += "body=[" + eol(); - result += r.m_body + eol() + "]"; - return result; -} - -//////////////////////// - -webClient::webClient(const uniString::utf8 &logPrefix) throw() - : m_logPrefix(logPrefix), m_state(&webClient::state_Idle), - m_nextState(0), m_nonBlockingID(0), m_response() -{ - m_curl_error = new char[CURL_ERROR_SIZE]; - memset(m_curl_error, 0, CURL_ERROR_SIZE); -} - -webClient::~webClient() throw() -{ - for (curlMap_t::const_iterator i = m_curl.begin(); i != m_curl.end(); ++i) - { - if (i->second != NULL) - { - curl_easy_cleanup(i->second); - } - } - for (curlHeadersMap_t::const_iterator i = m_curl_headers.begin(); i != m_curl_headers.end(); ++i) - { - if (i->second != NULL) - { - curl_slist_free_all(i->second); - } - } - m_curl.clear(); - forgetArray(m_curl_error); -} - -/////////////////////////////////////////////////////////////////// - -void webClient::queueRequest(const request &req) throw() -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - stackLock sml(m_requestQueueLock); - - m_requestQueue.push(req); - m_requestSignal.set(); -} - -void webClient::timeSlice() throw(exception) -{ - try - { - if (this->m_state) - { - return (this->*m_state)(); - } - } - catch (const webClient::retry_exception &ex) - { - // increase failure counter - m_requestQueueLock.lock(); - if (!m_requestQueue.empty()) - { - ++m_requestQueue.front().m_retryCounter; - } - m_requestQueueLock.unlock(); - - m_state = &webClient::state_Wait; - m_nextState = &webClient::state_SendRequest; - m_lastActivityTime = ::time(NULL); - m_result.timeout(gOptions.ypTimeout()); - - utf8 what = ex.what(); - WLOG(((what.find(m_logPrefix) == utf8::npos) ? m_logPrefix : "") + - what + (!what.empty() ? " - " : "") + - "Retrying in " + tos(gOptions.ypTimeout()) + " seconds."); - } - catch (const exception &ex) - { - // increase failure counter - m_requestQueueLock.lock(); - if (!m_requestQueue.empty()) - { - ++m_requestQueue.front().m_retryCounter; - } - m_requestQueueLock.unlock(); - - m_state = &webClient::state_Wait; - m_nextState = &webClient::state_SendRequest; - m_lastActivityTime = ::time(NULL); - m_result.timeout(gOptions.ypTimeout()); - - utf8 what = ex.what(); - ELOG(((what.find(m_logPrefix) == utf8::npos) ? m_logPrefix : "") + - what + (!what.empty() ? " - " : "") + - "Restarting in " + tos(gOptions.ypTimeout()) + " seconds."); - } - catch(...) - { - ELOG(m_logPrefix + "Fatal error. Cannot recover."); - throw; - } -} - -// waiting for a request to be queued -void webClient::state_Idle() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - stackLock sml(m_requestQueueLock); - m_requestSignal.clear(); - if (m_requestQueue.empty()) - { - m_result.schedule(1000); - m_result.read(m_requestSignal.test()); - m_result.timeout(gOptions.ypTimeout()); - } - else - { - m_result.run(); - m_state = &webClient::state_SendRequest; - } -} - -// TODO can we instead change this to be scheduled? -void webClient::state_Wait() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - time_t t = ::time(NULL); - stackLock sml(m_requestQueueLock); - if (t < m_lastActivityTime) // rollover? - { - m_lastActivityTime = t; - } - - if (m_state != m_nextState) - { - m_state = m_nextState; - // this is needed to ensure that we'll not - // block on some of the YP async requests. - m_result.timeout(0, 10); - } - else - { - // we'll add this back to be tested for... - m_result.schedule (50); - m_result.timeout((gOptions.ypTimeout() - (int)(t - m_lastActivityTime))); - } -} - -size_t webClient::ParseReplyHeaders(void *buffer, size_t size, size_t count, FILE *stream) throw(runtime_error) -{ - webClient *client = reinterpret_cast<webClient*>(stream); - if (!client) - { - throwEx<runtime_error>("ParseReplyHeaders parameter failure"); - } - - utf8 s = stripWhitespace(utf8((char*)buffer, (size * count))); - if (!s.empty()) - { - DEBUG_LOG(client->m_logPrefix + "HTTP header: " + s); - - if (client->m_response.m_resultCode == 0) // waiting for first line or something other than HTTP/1.1 100 Continue - { - utf8::size_type pos = s.find(utf8(" ")); - if (pos == utf8::npos) - { - throwEx<runtime_error>(client->m_logPrefix + "Badly formed HTTP response [" + s + "]"); - } - s = stripWhitespace(s.substr(pos)); - pos = s.find(utf8(" ")); - if (pos == utf8::npos) - { - throwEx<runtime_error>(client->m_logPrefix + "Badly formed HTTP response [" + s + "]"); - } - client->m_response.m_resultCode = utf8(s.substr(0,pos)).toInt(); - if (client->m_response.m_resultCode != 100) - { - s = stripWhitespace(s.substr(pos)); - client->m_response.m_resultText = s; - } - else - { - client->m_response.m_resultCode = 0; - } - } - else - { - // header lines - utf8::size_type pos = s.find(utf8(":")); - if (pos == utf8::npos) - { - throwEx<runtime_error>(client->m_logPrefix + "Badly formed HTTP header line [" + s + "]"); - } - if ((int)client->m_response.m_headers.size() > gOptions.maxHeaderLineCount()) - { - throwEx<runtime_error>(client->m_logPrefix + "Badly formed HTTP response. Max header lines exceeded."); - } - - utf8 key = toLower(stripWhitespace(s.substr(0,pos))); - utf8 value = stripWhitespace(s.substr(pos+1)); - // allow empty values. (for urls and what-not) - if (key.empty()) - { - throwEx<runtime_error>(client->m_logPrefix + "Bad HTTP header string [" + s + "]"); - } - client->m_response.m_headers[key] = value; - } - } - - size_t received = (size * count); - client->m_response.m_received += received; - return received; -} - -size_t webClient::GetBody(void *buffer, size_t size, size_t count, FILE *stream) -{ - webClient *client = reinterpret_cast<webClient*>(stream); - size_t received = (size * count); - unsigned char *arr = (unsigned char *)buffer; - - if (gOptions.webClientDebug()) - { - // skip outputting the DNAS download updates - DLOG(client->m_logPrefix + "HTTP body: " + arr); - } - client->m_requestQueueLock.lock(); - client->m_response.m_body.insert(client->m_response.m_body.end(), arr, &arr[received]); - client->m_lastActivityTime = ::time(NULL); - - client->m_response.m_received += received; - client->m_requestQueueLock.unlock(); - return received; -} - -void webClient::gotCurlRespose() -{ - this->m_nextState = &webClient::state_RequestComplete; - this->m_lastActivityTime = ::time(NULL); -} - -// will still need to set certain aspects like the error buffer or any of the header / processing options -CURL* webClient::setupCurlDefaults(CURL* oldCurl, const char *logPrefix, const utf8& requestUrl, - const int timeout, const int connnectTimeout, size_t SID) -{ - CURL *curl = (oldCurl == NULL ? curl_easy_init() : oldCurl); - if (curl) - { - if (requestUrl != utf8("")) - { - if (oldCurl) - { - curl_easy_reset(curl); - DEBUG_LOG ("Recycling curl handle for: " + requestUrl, logPrefix, SID); - } - else - { - DEBUG_LOG ("Creating new curl handle for: " + requestUrl, logPrefix, SID); - } - curl_easy_setopt(curl, CURLOPT_URL, requestUrl.hideAsString().c_str()); - } - - curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); - curl_easy_setopt(curl, CURLOPT_USERAGENT, g_userAgent.c_str()); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, (timeout == -1 ? gOptions.ypTimeout() : timeout)); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, (connnectTimeout == -1 ? 3L : connnectTimeout)); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(curl, CURLOPT_MAXREDIRS, gOptions.maxHTTPRedirects()); - curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, ""); - -/*#if defined(_DEBUG) || defined(DEBUG) - if (gOptions.webClientDebug()) - { - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - } -#endif*/ - - // this is needed (mainly for the Windows builds) so things will work with SSL and also - // self-signed certificates as we appear to be using (as CURLOPT_SSL_VERIFYPEER = FALSE - // is an absolute no-no due to the man in the middle attack which it allows to succeed. - //DEBUG_LOG(logPrefix + "Certificate path: `" + gOptions.m_certPath + "'"); - if (!gOptions.m_certPath.empty()) - { - curl_easy_setopt(curl, CURLOPT_CAINFO, gOptions.m_certPath.hideAsString().c_str()); - } - else - { - WLOG ("Certificate path is invalid - cacert.pem location not known", logPrefix, SID); - } - } - return curl; -} - -// build the entire web request, and send it -void webClient::state_SendRequest() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - do - { - m_requestQueueLock.lock(); - - if (m_requestQueue.empty()) - { - // queue is empty, move to idle state - m_requestSignal.clear(); - m_state = &webClient::state_Idle; - m_requestQueueLock.unlock(); - break; - } - // construct request - request &r = m_requestQueue.front(); // leave it in the queue until request succeeds - struct curl_slist *header = m_curl_headers[r.m_sid]; - - if (r.m_retryCounter < gOptions.ypMaxRetries()) - { - m_curl_path.clear(); - m_curl_path = toLogString(r); - - if (r.m_method == webClient::request::GET && !r.m_queryVariables.empty()) - { - m_curl_path += utf8("?") + encodeVariables(r.m_queryVariables); - } - - // create or re-use the handle as needed (doing a reset to avoid some quirks with authhash vs general YP usage) - CURL* curl = setupCurlDefaults(m_curl[r.m_sid], (char *)m_logPrefix.c_str(), m_curl_path); - if (curl) - { - if (r.m_method == webClient::request::POST) - { - utf8 contentType = ""; - if (r.m_content.empty()) - { - utf8 u8 = encodeVariables(r.m_queryVariables); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, u8.size()); - curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, &u8[0]); - } - else - { - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, r.m_content.size()); - curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, &r.m_content[0]); - } - if (r.m_contentType.empty() == false) - { - string contentType = "Content-Type:" + r.m_contentType.hideAsString(); - header = curl_slist_append (header, contentType.c_str()); - } - } - else - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); - - utf8 m_XFF = ""; - if (!r.m_XFF.empty()) - { - m_XFF = "X-Forwarded-For:" + r.m_XFF; - header = curl_slist_append(header, m_XFF.hideAsString().c_str()); - } - - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header); - - // send it, then get ready to receive the reply - m_lastActivityTime = ::time(NULL); - m_response.clear(); - r.m_content.clear(); - - DEBUG_LOG(m_logPrefix + "Request URL: " + m_curl_path); - curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, &this->ParseReplyHeaders); - curl_easy_setopt(curl, CURLOPT_HEADERDATA, this); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &this->GetBody); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, this); - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, &(m_curl_error[0])); - - if (r.m_nonBlocking) - { - m_nonBlockingID = r.m_sid; - m_curl_headers[r.m_sid] = header; - m_curl[r.m_sid] = curl; - - m_state = m_nextState = &webClient::state_Wait; - m_requestQueueLock.unlock(); - SimpleThread (webClient::process, this); - } - else - { - m_requestQueueLock.unlock(); - CURLcode ret = curl_easy_perform(curl); - m_requestQueueLock.lock(); - if (ret != CURLE_OK) - { - getCurlError(curl, ret); - } - else - { - m_state = &webClient::state_RequestComplete; - } - - if (header) - { - curl_slist_free_all(header); - m_curl_headers[r.m_sid] = NULL; - } - m_requestQueueLock.unlock(); - } - } - break; - } - ELOG(m_logPrefix + "Request [" + toLogString(r) + "] failed. Retries exceeded."); - gotFailure(r); - m_requestQueue.pop(); - m_requestQueueLock.unlock(); - } while (0); - - m_result.run(); -} - -void webClient::getCurlError(CURL* curl, const CURLcode ret) throw(exception) -{ - if (!m_requestQueue.empty()) - { - webClient::request &r = m_requestQueue.front(); - r.m_received = 0; - if (curl) - { - curl_easy_getinfo(curl, CURLINFO_REQUEST_SIZE, &r.m_received); - curl_easy_cleanup(curl); - } - m_curl[r.m_sid] = NULL; - - ELOG(m_logPrefix + "Request [" + toLogString(r) + "] failed, code: " + tos(ret) + - " [" + (m_curl_error[0] ? m_curl_error : curl_easy_strerror(ret)) + "]"); - gotFailure(r); - m_requestQueue.pop(); - - m_lastActivityTime = ::time(NULL); - m_state = m_nextState = &webClient::state_Idle; - } -} - -THREAD_FUNC webClient::process(void* arg) -{ - try - { - webClient* m_client = reinterpret_cast<webClient*>(arg); - if (m_client) - { - if (!iskilled()) - { - m_client->m_requestQueueLock.lock(); - - CURL* curl = m_client->getCurlHandle(); - m_client->m_requestQueueLock.unlock(); - - CURLcode ret = (curl ? curl_easy_perform(curl) : CURLE_READ_ERROR); - if (!iskilled()) - { - stackLock sml(m_client->m_requestQueueLock); - - if (ret != CURLE_OK) - { - m_client->getCurlError(curl, ret); - } - else - { - m_client->gotCurlRespose(); - } - - m_client->clearCurlHeader(); - } - } - } - } - catch (...) - { - } - return 0; -} - -// need to let things run in the background so sit and spin and wait... -void webClient::state_Send() throw(std::exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - SimpleThread(webClient::process, this); - - m_state = m_nextState = &webClient::state_Wait; - m_result.run(); -} - -// request complete. Issue virtual callback, pop request, then move to idle -// state and wait for next request -void webClient::state_RequestComplete() throw(exception) -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - m_requestQueueLock.lock(); - if (!m_requestQueue.empty()) - { - request &r = m_requestQueue.front(); - m_requestQueueLock.unlock(); - gotResponse(r, m_response); // could throw - - m_requestQueueLock.lock(); - m_requestQueue.pop(); - } - - m_lastActivityTime = ::time(NULL); - m_state = m_nextState = &webClient::state_Idle; - m_result.run(); - m_requestQueueLock.unlock(); -} - -// this method should be overridden. The base class here just dumps diagnostics -// throw an exception if you want to treat the result as a retryable error -void webClient::gotResponse(const request &/*q*/, const response &r) throw(exception) -{ - DEBUG_LOG(m_logPrefix + toLogString(r)); -} - -void webClient::gotFailure(const request &q) throw(exception) -{ - DEBUG_LOG(m_logPrefix + toLogString(q)); -} - -const size_t webClient::queueEntries() throw() -{ -#if defined(_DEBUG) || defined(DEBUG) - DEBUG_LOG(m_logPrefix + __FUNCTION__); -#endif - - stackLock sml(m_requestQueueLock); - - return !m_requestQueue.empty(); -} diff --git a/Src/Plugins/DSP/sc_serv3/webClient.h b/Src/Plugins/DSP/sc_serv3/webClient.h deleted file mode 100644 index 1a3d178a..00000000 --- a/Src/Plugins/DSP/sc_serv3/webClient.h +++ /dev/null @@ -1,153 +0,0 @@ -#pragma once -#ifndef webClient_H_ -#define webClient_H_ - -#include "threadedRunner.h" -#include "curl/curl.h" -#include <stdio.h> - -// runnable that provides generic web client functionality to a single host -// you can subclass this to provide specific behaviour -#pragma pack(push, 1) -class webClient: public runnable -{ -public: - struct request - { - typedef enum { GET,POST } method_t; - - uniString::utf8 m_addr; - uniString::utf8 m_path; - - // content - std::vector<__uint8> m_content; - uniString::utf8 m_contentType; - - // used for the setting the 'X-Forwarded-For' header field which - // is a bit of a fiddle to allow destip to be different so the YP - // can test an alternative external IP from that it auto detects - uniString::utf8 m_XFF; - - httpHeaderMap_t m_queryVariables; - method_t m_method; - - int m_port; - size_t m_sid; - int m_retryCounter; - - int m_userData_i; - - size_t m_received; // size of data got - int m_nonBlocking; // do on an additional thread e.g. the YP add needs - // this else it blocks the YP test exists connetion - - // two random pieces of user data - unsigned m_userData_u; - void* m_userData_p; - - request() : m_path(uniString::utf8("/")), m_method(GET), m_port(80), - m_sid(0), m_retryCounter(0), m_userData_i(0), m_received(0), - m_nonBlocking(0), m_userData_u(0), m_userData_p(0) {} - }; - - struct response - { - uniString::utf8 m_resultText; - uniString::utf8 m_body; // body of response - httpHeaderMap_t m_headers; // response headers - size_t m_resultCode; // HTTP result code - size_t m_received; // size of data got - - response() : m_resultCode(0), m_received(0) {} - - void clear() throw() - { - m_resultCode = 0; - m_received = 0; - m_headers.clear(); - m_body.clear(); - m_resultText.clear(); - } - }; - - static size_t ParseReplyHeaders(void *buffer, size_t size, size_t count, FILE *stream) throw(std::runtime_error); - static size_t GetBody(void *buffer, size_t size, size_t count, FILE *stream); - - CURL* getCurlHandle(const size_t SID = 0) { return m_curl[(!SID ? m_nonBlockingID : SID)]; } - void clearCurlHeader(const size_t SID = 0) - { - size_t id = (!SID ? m_nonBlockingID : SID); - struct curl_slist *header = m_curl_headers[id]; - if (header) - { - curl_slist_free_all(header); - m_curl_headers[id] = 0; - } - } - void gotCurlRespose(); - void getCurlError(CURL* curl, const CURLcode ret) throw(std::exception); - - static CURL* setupCurlDefaults(CURL* oldCurl, const char *logPrefix, const uniString::utf8& requestUrl, - const int timeout = -1, const int connnectTimeout = -1, size_t SID = 0); - - static THREAD_FUNC process(void* arg); - -protected: - class retry_exception : public std::runtime_error - { - public: - explicit retry_exception(const uniString::utf8 &msg) : runtime_error(msg.hideAsString()){} - }; - -private: - typedef void (webClient::*state_t)(); - const uniString::utf8 m_logPrefix; - - state_t m_state; - state_t m_nextState; - - // curl specific parts - typedef std::map<size_t, CURL*> curlMap_t; - curlMap_t m_curl; - - size_t m_nonBlockingID; - uniString::utf8 m_curl_path; - - typedef std::map<size_t, struct curl_slist*> curlHeadersMap_t; - curlHeadersMap_t m_curl_headers; - - response m_response; - char* m_curl_error; - - AOL_namespace::mutex m_requestQueueLock; - std::queue<request> m_requestQueue; - pipeDrivenSignal<nullLock> m_requestSignal; - - void state_Idle() throw(std::exception); - void state_Wait() throw(std::exception); - void state_ResolveServer() throw(std::exception); - void state_Connect() throw(std::exception); - void state_ConnectWait() throw(std::exception); - void state_Send() throw(std::exception); - void state_Get() throw(std::exception); - void state_SendRequest() throw(std::exception); - void state_RequestComplete() throw(std::exception); - - virtual void timeSlice() throw(std::exception); - -protected: - explicit webClient(const uniString::utf8 &logPrefix) throw(); - virtual ~webClient() throw(); - - void queueRequest(const request &req) throw(); - // throw to treat as an error and retry entire request - virtual void gotResponse(const request &q, const response &r) throw(std::exception); // called when response is received - virtual void gotFailure(const request &q) throw(std::exception); // called when retries are exhausted - - const size_t queueEntries() throw(); -}; -#pragma pack(pop) - -uniString::utf8 encodeVariables(const httpHeaderMap_t &m) throw(); - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp b/Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp deleted file mode 100644 index 59587b39..00000000 --- a/Src/Plugins/DSP/sc_serv3/webNet/socketOps.cpp +++ /dev/null @@ -1,716 +0,0 @@ -#ifdef _WIN32 -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0601 -#include "socketOps.h" -#include <Ws2tcpip.h> -#include <Mswsock.h> -#include <map> -#include "stl/stringUtils.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace stringUtil; - -static std::map<int,std::string> s_errMsgs; - -const SOCKET socketOps::cINVALID_SOCKET = INVALID_SOCKET; -const SOCKET socketOps::cSOCKET_ERROR = (SOCKET)SOCKET_ERROR; - -class win32_socket_init -{ -public: - ~win32_socket_init() { ::WSACleanup(); } - win32_socket_init() - { - WORD wVersion = MAKEWORD( 1, 1 ); - WSADATA wsaData = {0}; - - ::WSAStartup(wVersion, &wsaData); - - s_errMsgs[WSAEINTR] = "Interrupted function call: A blocking operation was interrupted by a call to WSACancelBlockingCall."; - s_errMsgs[WSAEFAULT] = "Bad address: The system detected an invalid pointer address in attempting to use a pointer argument of a call."; - s_errMsgs[WSAEINVAL] = "Invalid argument: Some invalid argument was supplied."; - s_errMsgs[WSAEMFILE] = "Too many open descriptors: No more socket descriptors are available."; - s_errMsgs[WSAEWOULDBLOCK] = "Call would block: Non-blocking call will block."; - s_errMsgs[WSAEINPROGRESS] = "Operation now in progress: A blocking operation is currently executing."; - s_errMsgs[WSAEALREADY] = "Operation already in progress: An operation was attempted on a nonblocking socket with an operation already in progress."; - s_errMsgs[WSAENOTSOCK] = "Socket operation on non socket: An operation was attempted on something that is not a socket."; - s_errMsgs[WSAEDESTADDRREQ] = "Destination address required: A required address was omitted from an operation on a socket."; - s_errMsgs[WSAEMSGSIZE] = "Message too long: A message sent on a datagram socket was larger than the internal message buffer."; - s_errMsgs[WSAEPROTOTYPE] = "The specified protocol is the wrong type for this socket."; - s_errMsgs[WSAENOPROTOOPT] = "Bad Protocol option."; - s_errMsgs[WSAEPROTONOSUPPORT] = "The specified protocol is not supported."; - s_errMsgs[WSAESOCKTNOSUPPORT] = "The specified socket type is not supported in this address family."; - s_errMsgs[WSAEOPNOTSUPP] = "Socket operation not supported."; - s_errMsgs[WSAEPFNOSUPPORT] = "Protocol family not supported."; - s_errMsgs[WSAEAFNOSUPPORT] = "The specified address family is not supported"; - s_errMsgs[WSAEADDRINUSE] = "Address already in use."; - s_errMsgs[WSAEADDRNOTAVAIL] = "Cannot assign requested address."; - s_errMsgs[WSAENETDOWN] = "A network subsystem or the associated service provider has failed"; - s_errMsgs[WSAENETUNREACH] = "Nework is unreachable."; - s_errMsgs[WSAENETRESET] = "Network dropped connection on reset."; - s_errMsgs[WSAECONNABORTED] = "Software caused connection abort."; - s_errMsgs[WSAECONNRESET] = "Connection reset by peer."; - s_errMsgs[WSAENOBUFS] = "No buffer space is available. The socket cannot be created."; - s_errMsgs[WSAEISCONN] = "Socket is already connected."; - s_errMsgs[WSAENOTCONN] = "Socket is not connected."; - s_errMsgs[WSAESHUTDOWN] = "Cannot send after socket shutdown."; - s_errMsgs[WSAETIMEDOUT] = "Connection timed out."; - s_errMsgs[WSAECONNREFUSED] = "Connection refused."; - s_errMsgs[WSAEHOSTDOWN] = "Host is down."; - s_errMsgs[WSAEHOSTUNREACH] = "No route to host."; - s_errMsgs[WSAEPROCLIM] = "Too many processes."; - } -}; - -static win32_socket_init win32_socket_init_force; - -std::string socketOps::errMsg(int errCode) throw() -{ - std::map<int,std::string>::const_iterator i = s_errMsgs.find(errCode); - return (i == s_errMsgs.end() ? "error code " + tos(errCode) : (*i).second); -} - -int socketOps::errCode() throw() { return ::WSAGetLastError(); } - -#else - -#include <poll.h> -#include "socketOps.h" -#include "stl/stringUtils.h" -#include <string.h> - -using namespace std; -using namespace stringUtil; - -const int socketOps::cINVALID_SOCKET = -1; -const int socketOps::cSOCKET_ERROR = -1; - -int socketOps::errCode() throw() { return errno; } - -std::string socketOps::errMsg(int errCode) throw() -{ - std::string result = "error code " + tos(errCode); - - char *e = strerror(errCode); - if (e) - { - result = e; - } - return result; -} -#endif - -std::string socketOps::endpoint::toString() const throw() -{ - return m_address + ":" + tos(m_port); -} - -socketOps::tSOCKET socketOps::createTCPSocket() throw() -{ - return ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); -} - -socketOps::tSOCKET socketOps::createTCPSocketTHROW() throw(std::runtime_error) -{ - tSOCKET result = socketOps::createTCPSocket(); - if (result == socketOps::cINVALID_SOCKET) - { - throw std::runtime_error("socketOps::createTCPSocketTHROW() - Could not create socket because " + socketOps::errMsg()); - } - return result; -} - -int socketOps::setNonblock(const socketOps::tSOCKET s, bool nonBlock) throw() -{ -#ifdef _WIN32 - unsigned long i = (nonBlock ? 1 : 0); - return ioctlsocket(s, FIONBIO, &i); -#else - int flags, err; - - if ((flags = fcntl(s, F_GETFL, 0)) == socketOps::cSOCKET_ERROR) - { - return flags; - } - - if (nonBlock) - { - flags |= O_NONBLOCK; - } - else - { - flags &= ~O_NONBLOCK; - } - - if ((err = fcntl(s, F_SETFL, flags)) == socketOps::cSOCKET_ERROR) - { - return err; - } - return 0; -#endif -} - -void socketOps::setNonblockTHROW(const socketOps::tSOCKET s, const bool nonblock) throw(std::runtime_error) -{ - int err = socketOps::setNonblock(s, nonblock); - if (err == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error("socketOps::setNonblockTHROW() - Could not get socket flags because " + socketOps::errMsg()); - } -} - -void socketOps::closeTCPSocket(socketOps::tSOCKET s) throw() -{ -#ifdef _WIN32 - ::shutdown(s, SD_BOTH); - ::closesocket(s); -#else - ::shutdown(s, SHUT_RDWR); - ::close(s); -#endif -} - -void socketOps::forgetTCPSocket(tSOCKET &s) throw() -{ - if (s != socketOps::cINVALID_SOCKET) - { - socketOps::closeTCPSocket(s); - s = socketOps::cINVALID_SOCKET; - } -} - -int socketOps::connect(const socketOps::tSOCKET s, const std::string &address, const u_short port) throw() -{ - unsigned long iaddr = inet_addr(address.c_str()); - struct sockaddr_in addr = {0}; - - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - memcpy(&(addr.sin_addr), &iaddr, 4); - - return ::connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr)); -} - -int socketOps::connect(tSOCKET s,const endpoint &e) throw() -{ - return socketOps::connect(s, e.m_address, e.m_port); -} - -void socketOps::connectTHROW(const socketOps::tSOCKET s, const std::string &address, const u_short port) throw(std::runtime_error) -{ - if (socketOps::connect(s, address, port) == socketOps::cSOCKET_ERROR) - { - int err = socketOps::errCode(); -#ifdef _WIN32 - if ((err == WSAEINPROGRESS) || (err == WSAEWOULDBLOCK)) -#else - if ((err == EINPROGRESS) || (err == EWOULDBLOCK) || (err == ECONNABORTED) || (err == EINTR)) -#endif - return; - - throw std::runtime_error("Could not connect to " + address + ":" + tos(port) + " because " + socketOps::errMsg()); - } -} - -void socketOps::connectTHROW(tSOCKET s, const endpoint &e) throw(std::runtime_error) -{ - if (socketOps::connect(s, e) == socketOps::cSOCKET_ERROR) - { - int err = socketOps::errCode(); -#ifdef _WIN32 - if ((err == WSAEINPROGRESS) || (err == WSAEWOULDBLOCK)) -#else - if ((err == EINPROGRESS) || (err == EWOULDBLOCK) || (err == ECONNABORTED) || (err == EINTR)) -#endif - return; - - throw std::runtime_error("Could not connect to " + e.toString() + " because " + socketOps::errMsg()); - } -} - -socketOps::nonBlockConnect_t socketOps::nonBlockingConnectWait(const socketOps::tSOCKET s, std::string &errorString) throw() -{ - try - { -#ifdef _WIN32 - // non-blocking connects suck - fd_set rset, wset, eset; - struct timeval tval; - - FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&eset); - FD_SET(s,&rset); - FD_SET(s,&wset); - FD_SET(s,&eset); - - tval.tv_sec = 0; - tval.tv_usec = 1; - - int n = ::select(((int)s)+1,&rset,&wset,&eset,&tval); - - // if n == 0 then we timed out, and must stay in this state - if (n == 0) - { - return socketOps::NBC_INPROGRESS; - } - - if (n < 0) // fatal select error - { - try - { - errorString = socketOps::errMsg(); - } - catch(...) - { - errorString = "Impossible connection failure. (1)"; - } - return socketOps::NBC_ERROR; - } - - // detecting when a non-blocking connect is ready (or has errored) - // is highly platform dependent. Microsoft docs specify one way, Stevens - // (2nd edition page 411) specifies another way to cover various Unix flavors - if (FD_ISSET(s,&eset)) - { - errorString = "Connection failure."; - return socketOps::NBC_ERROR; - } - else if (FD_ISSET(s,&wset)) - { - return socketOps::NBC_CONNECTED; - } - else - { - errorString = "Impossible connection failure. (2)"; - return socketOps::NBC_ERROR; - } -#else - struct pollfd check; - int val = -1; - socklen_t size = sizeof val; - check.fd = s; - check.events = POLLOUT; - switch (poll (&check, 1, 0)) - { - case 0: - { - return socketOps::NBC_INPROGRESS; - } - default: - { - if (getsockopt (s, SOL_SOCKET, SO_ERROR, (void*) &val, &size) == 0) - { - if (val == 0) - { - return socketOps::NBC_CONNECTED; - } - errno = val; - } - // fall thru - } - case -1: - { - if (errno == EINTR) - { - return socketOps::NBC_INPROGRESS; - } - throw std::runtime_error(""); - } - } -#endif - } - catch(...) - { -#ifdef _WIN32 - errorString = "Impossible connection failure. (3)"; -#else - errorString = "Connection failure."; -#endif - return socketOps::NBC_ERROR; - } -} - -socketOps::tSOCKET socketOps::bind(tSOCKET s, u_short port, const std::string &address) throw() -{ - struct sockaddr_in servaddr = {0}; - servaddr.sin_family = AF_INET; - - if (address == "") - { - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - } - else - { - unsigned long iaddr = inet_addr(address.c_str()); - memcpy(&(servaddr.sin_addr), &iaddr, 4); - } - - servaddr.sin_port = htons(port); - return ::bind(s, (const sockaddr *)&servaddr, sizeof(servaddr)); -} - -socketOps::tSOCKET socketOps::bind(tSOCKET s, const socketOps::endpoint &e) throw() -{ - return socketOps::bind(s,e.m_port,e.m_address); -} - -void socketOps::bindTHROW(tSOCKET s, u_short port, const std::string &address) throw(std::runtime_error) -{ - if (socketOps::bind(s,port,address) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error("Could not bind to " + (!address.empty() ? address + ":" : "") + tos(port) + " because " + socketOps::errMsg()); - } -} - -void socketOps::bindTHROW(tSOCKET s,const endpoint &e) throw(std::runtime_error) -{ - if (socketOps::bind(s,e) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error("Could not bind to " + e.toString() + " because " + socketOps::errMsg()); - } -} - -int socketOps::accept(tSOCKET s, std::string &address, u_short &port) throw() -{ - struct sockaddr_in client_addr = {0}; -#ifdef _WIN32 - int len = sizeof(client_addr); -#else - socklen_t len = sizeof(client_addr); -#endif - - socketOps::tSOCKET sC = ::accept(s, (sockaddr*)&client_addr, &len); - if (sC != socketOps::cSOCKET_ERROR) - { - port = ntohs(client_addr.sin_port); - address = inet_ntoa(client_addr.sin_addr); - } - return (int)sC; -} - -int socketOps::accept(tSOCKET s,endpoint &e) throw() -{ - return socketOps::accept(s,e.m_address,e.m_port); -} - -int socketOps::acceptTHROW(tSOCKET s, std::string &address, u_short &port, bool nonblocking) throw(std::runtime_error) -{ - socketOps::tSOCKET sC = socketOps::accept(s, address, port); - if (sC == socketOps::cSOCKET_ERROR) - { - if (!nonblocking) - { - throw std::runtime_error(socketOps::errMsg()); - } - - int e = socketOps::errCode(); -#ifdef _WIN32 - if ((e == WSAEINPROGRESS) || (e == WSAEWOULDBLOCK)) - { - return (int)socketOps::cSOCKET_ERROR; - } -#else - if ((e == EWOULDBLOCK) || (e == ECONNABORTED) || (e == EINTR)) - { - return socketOps::cSOCKET_ERROR; - } -#endif - throw std::runtime_error("Could not call accept() on socket because " + socketOps::errMsg(e)); - } - - return (int)sC; -} - -int socketOps::acceptTHROW(tSOCKET s, endpoint &e, bool nonblocking) throw(std::runtime_error) -{ - return socketOps::acceptTHROW(s, e.m_address, e.m_port, nonblocking); -} - -void socketOps::listenTHROW(tSOCKET s, int backlog) throw(std::runtime_error) -{ - if (::listen(s, backlog) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error("Could not call listen() on socket because " + socketOps::errMsg()); - } -} - -int socketOps::getsockname(tSOCKET s, std::string &address, u_short &port) throw() -{ - sockaddr_in in4 = {0}; -#ifdef _WIN32 - int in4len = sizeof(in4); -#else - socklen_t in4len = sizeof(in4); -#endif - - int result = ::getsockname(s,(sockaddr*)&in4,&in4len); - if (result != socketOps::cSOCKET_ERROR) - { - port = ntohs(in4.sin_port); - address = inet_ntoa(in4.sin_addr); - } - return result; -} - -int socketOps::getsockname(tSOCKET s,endpoint &e) throw() -{ - return socketOps::getsockname(s, e.m_address, e.m_port); -} - -void socketOps::getsocknameTHROW(tSOCKET s, endpoint &e) throw(std::runtime_error) -{ - if (socketOps::getsockname(s, e) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -void socketOps::getsocknameTHROW(tSOCKET s, std::string &address, u_short &port) throw(std::runtime_error) -{ - if (socketOps::getsockname(s, address, port) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -int socketOps::getpeername(tSOCKET s, std::string &address, u_short &port) throw() -{ - address = ""; - port = 0; - sockaddr_in in4 = {0}; -#ifdef _WIN32 - int in4len = sizeof(in4); -#else - socklen_t in4len = sizeof(in4); -#endif - - int result = ::getpeername(s, (sockaddr*)&in4,&in4len); - if (result != socketOps::cSOCKET_ERROR) - { - port = ntohs(in4.sin_port); - address = inet_ntoa(in4.sin_addr); - } - return result; -} - -int socketOps::getpeername(tSOCKET s, endpoint &e) throw() -{ - return socketOps::getpeername(s, e.m_address, e.m_port); -} - -void socketOps::getpeernameTHROW(tSOCKET s, endpoint &e) throw(std::runtime_error) -{ - if (socketOps::getpeername(s, e) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -void socketOps::getpeernameTHROW(tSOCKET s, std::string &address, u_short &port) throw(std::runtime_error) -{ - if (socketOps::getpeername(s, address, port) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -// accepts IPv4 or IPv6 -int socketOps::addressToHostName(const std::string &address, u_short port, std::string &hostname) throw() -{ - struct addrinfo *result/*, hints = {AI_PASSIVE | AI_CANONNAME, AF_INET, SOCK_STREAM}*/; - - std::string portS = tos(port); - int err = ::getaddrinfo(address.c_str(),portS.c_str(),0,&result); - if ((!err) && result) - { - char h[NI_MAXHOST + 1] = {0}; - err = ::getnameinfo(result->ai_addr, (int)result->ai_addrlen, h, NI_MAXHOST, 0, 0, 0); - hostname = h; - ::freeaddrinfo(result); - } - return err; -} - -int socketOps::addressToHostName(const endpoint &e, std::string &hostname) throw() -{ - return socketOps::addressToHostName(e.m_address, e.m_port, hostname); -} - -void socketOps::addressToHostNameTHROW(const std::string &address, u_short port, std::string &hostname) throw(std::runtime_error) -{ - if (socketOps::addressToHostName(address, port, hostname) == socketOps::cSOCKET_ERROR) - { - throw std::runtime_error(socketOps::errMsg()); - } -} - -void socketOps::addressToHostNameTHROW(const endpoint &e, std::string &hostname) throw(std::runtime_error) -{ - socketOps::addressToHostNameTHROW(e.m_address, e.m_port, hostname); -} - -int socketOps::hostNameToAddress(std::string &address, const std::string &hostname, u_short port) throw(std::runtime_error) -{ - struct addrinfo *result, hints = {AI_PASSIVE | AI_CANONNAME, AF_INET, SOCK_STREAM}; - address = ""; - - std::string portS = tos(port); - int err = ::getaddrinfo(hostname.c_str(), (port ? portS.c_str() : 0), &hints, &result); - if ((!err) && result) - { - address = ::inet_ntoa(((sockaddr_in*)(result->ai_addr))->sin_addr); - if (!address.empty() && address.find("0.") == 0) - { - address = ""; - } - ::freeaddrinfo(result); - } - return err; -} - -std::string socketOps::hostNameToAddress(const std::string &hostname, u_short port) throw(std::runtime_error) -{ - std::string address; - hostNameToAddress(address, hostname, port); - return address; -} - -std::string socketOps::hostNameToAddressTHROW(const std::string &hostname, u_short port) throw(std::runtime_error) -{ - std::string address; - if (hostNameToAddress(address, hostname, port)) - { - throw std::runtime_error(socketOps::errMsg()); - } - return address; -} - -#ifdef _WIN32 -LPFN_WSAPOLL fnWSAPoll = NULL; -typedef unsigned long nfds_t; - -static void add_to_fd_set_fntr(const socketOps::tSOCKET s, fd_set *fdset) throw() -{ - FD_SET(s, fdset); -} -#else -#define fnWSAPoll poll -#endif - -#include <stdio.h> -int socketOps::socketSelect(std::set<size_t> &readSockets, std::set<size_t> writeSockets, const int timeout) throw() -{ - //ELOG("socketSelect: " + tos(readSet.size()) + " - " + tos(writeSet.size()) + " - " + tos(timeout)); - -#ifdef _WIN32 - if (!fnWSAPoll) - { - fd_set readSet; - fd_set writeSet; - fd_set excepSet; - FD_ZERO(&readSet); - FD_ZERO(&writeSet); - FD_ZERO(&excepSet); - for_each(readSockets.begin(), readSockets.end(), std::bind2nd(std::ptr_fun(add_to_fd_set_fntr), &readSet)); - for_each(writeSockets.begin(), writeSockets.end(), std::bind2nd(std::ptr_fun(add_to_fd_set_fntr), &writeSet)); - for_each(readSockets.begin(), readSockets.end(), std::bind2nd(std::ptr_fun(add_to_fd_set_fntr), &excepSet)); - for_each(writeSockets.begin(), writeSockets.end(), std::bind2nd(std::ptr_fun(add_to_fd_set_fntr), &excepSet)); - - // as we're workig in milliseconds then we need to convert to - // provide select the timeout that is wanted as a timeval - struct timeval tm = {(timeout / 1000), ((timeout % 1000) * 1000)}; - // The Windows version ignores the first arg, no need to calculate it - return ::select(0, &readSet, &writeSet, &excepSet, &tm); - } -#endif - - size_t i = 0; - nfds_t length = (nfds_t)(readSockets.size() + writeSockets.size()); - std::vector <struct pollfd> dataSet (length); - - for (std::set<size_t>::iterator it = readSockets.begin(); it != readSockets.end(); ++it) - { - dataSet[i].events = POLLIN; - dataSet[i++].fd = *it; - } - - for (std::set<size_t>::iterator it = writeSockets.begin(); it != writeSockets.end(); ++it) - { - dataSet[i].events = POLLOUT; - dataSet[i++].fd = *it; - } - - return fnWSAPoll (&dataSet[0], length, timeout); -} - -#ifdef _WIN32 -/*------------------------------------------------------------------------- - * - * This is a replacement version of pipe for Win32 which allows - * returned handles to be used in select(). Note that read/write calls - * must be replaced with recv/send. - * - * - *------------------------------------------------------------------------- - */ - -int pgpipe(int handles[2]) -{ - SOCKET s = {0}; - struct sockaddr_in serv_addr = {0}; - int len = sizeof(serv_addr); - - handles[0] = handles[1] = (int)INVALID_SOCKET; - - if ((s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) - { - return -1; - } - - serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(0); - serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - - if (::bind(s, (SOCKADDR *)&serv_addr, len) == SOCKET_ERROR) - { - ::closesocket(s); - return -1; - } - - if (::listen(s, 1) == SOCKET_ERROR) - { - ::closesocket(s); - return -1; - } - - if (::getsockname(s, (SOCKADDR *)&serv_addr, &len) == SOCKET_ERROR) - { - ::closesocket(s); - return -1; - } - - if ((handles[1] = (int)::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) - { - ::closesocket(s); - return -1; - } - - if (::connect(handles[1], (SOCKADDR *)&serv_addr, len) == socketOps::cSOCKET_ERROR) - { - ::closesocket(s); - return -1; - } - - if ((handles[0] = (int)::accept(s, (SOCKADDR *)&serv_addr, &len)) == INVALID_SOCKET) - { - ::closesocket(handles[1]); - handles[1] = (int)INVALID_SOCKET; - ::closesocket(s); - return -1; - } - - ::closesocket(s); - return 0; -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/webNet/socketOps.h b/Src/Plugins/DSP/sc_serv3/webNet/socketOps.h deleted file mode 100644 index 10ea2124..00000000 --- a/Src/Plugins/DSP/sc_serv3/webNet/socketOps.h +++ /dev/null @@ -1,182 +0,0 @@ -#pragma once -#ifndef _socketOps_H_ -#define _socketOps_H_ - -#ifdef _WIN32 -#include <winsock2.h> -#else -#include <poll.h> -#include <string.h> -#include <netdb.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <unistd.h> -#include <fcntl.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <errno.h> -#endif -#include <set> -#include "stl/stringUtils.h" -#include <string> -#include <stdexcept> -#include <vector> -#include <functional> -#include <algorithm> - -using namespace std; - -/* - socketOps namespace - - Encased in this namespace is a collection of constants, types and functions - to help bridge the gap between Win32 and Unix socket implementations, and also - to simplify some socket coding. - - Since the Win32 and Unix berkeley socket implementations are extremely similar, I - felt that a collection of helper functions were of more use, and more flexible, than - full blown socket wrapper classes. -*/ - -namespace socketOps -{ -#ifdef _WIN32 - typedef SOCKET tSOCKET; - extern const SOCKET cINVALID_SOCKET; - extern const SOCKET cSOCKET_ERROR; - //#define EINPROGRESS WSAEINPROGRESS - //#define EWOULDBLOCK WSAEWOULDBLOCK - #define SOCKETOPS_WOULDBLOCK WSAEWOULDBLOCK -#else - typedef int tSOCKET; - extern const int cINVALID_SOCKET; - extern const int cSOCKET_ERROR; - #define WSAEINPROGRESS EINPROGRESS - #define WSAEWOULDBLOCK EWOULDBLOCK - #define SOCKETOPS_WOULDBLOCK EWOULDBLOCK -#endif - - // socket endpoint - struct endpoint - { - std::string m_address; - u_short m_port; - - endpoint() : m_port(0) {} - endpoint(const std::string &address, u_short port) : m_address(address), m_port(port) {} - - bool operator==(const endpoint &e) const throw() - { - return ((m_address == e.m_address) && (m_port == e.m_port)); - } - - bool operator<(const endpoint &e) const throw() - { - if (m_address < e.m_address) return true; - if (m_address > e.m_address) return false; - if (m_port < e.m_port) return true; - if (m_port > e.m_port) return false; - return false; - } - - std::string toString() const throw(); // for messages - }; - - std::string errMsg(int code) throw(); - int errCode() throw(); - inline std::string errMsg() throw() { return socketOps::errMsg(socketOps::errCode()); } - - // createTCPSocket: creates a standard TCP/IP stream socket. The "throw" version - // will throw an exception if an error occurs instead of returning cSOCKET_ERROR - tSOCKET createTCPSocket() throw(); - tSOCKET createTCPSocketTHROW() throw(std::runtime_error); - - // setNonblock: non blocking is set different under unix and windows. These calls - // hide the different. First version returns the typical cSOCKET_ERROR when - // there is a problem. Second will throw an exception instead - int setNonblock(tSOCKET s,bool nonblock) throw(); - void setNonblockTHROW(tSOCKET s,bool nonblock) throw(std::runtime_error); - - // closeTCPSocket: does a blocking shutdown() and close() - void closeTCPSocket(tSOCKET s) throw(); - void forgetTCPSocket(tSOCKET &s) throw(); // similar, but checks s first and then clear it - - // connect: connects are the same across platforms. These just simplify the calls - // addresses for these calls most be #.#.#.# - int connect(tSOCKET s, const std::string &address, u_short port) throw(); - int connect(tSOCKET s, const endpoint &e) throw(); - void connectTHROW(tSOCKET s, const std::string &address, u_short port) throw(std::runtime_error); - void connectTHROW(tSOCKET s, const endpoint &e) throw(std::runtime_error); - - // bind: binds are the same across platforms. These just simplify the calls - tSOCKET bind(tSOCKET s, u_short port, const std::string &address = "") throw(); - tSOCKET bind(tSOCKET s, const endpoint &e) throw(); - void bindTHROW(tSOCKET s, u_short port, const std::string &address = "") throw(std::runtime_error); - void bindTHROW(tSOCKET s, const endpoint &e) throw(std::runtime_error); - - // note: for non-blocking accepts, the various "errno" errors can be different - // under different OS's. If you use the calls that do not throw exception you - // will have to handle these differences yourself. If you call the ones that - // throw, I try to handle it for you. In these calls, if the nonblocking parameter - // is true, the call will return cSOCKET_ERROR if accept has nothing to do (returns - // EWOULDBLOCK or similar). If a REAL error occurs, then it throws an exception. - int accept(tSOCKET s, endpoint &e) throw(); - int accept(tSOCKET s, std::string &address, u_short &port) throw(); - int acceptTHROW(tSOCKET s, endpoint &e, bool nonblocking) throw(std::runtime_error); - int acceptTHROW(tSOCKET s, std::string &address, u_short &port, bool nonblocking) throw(std::runtime_error); - - // listen: helper func that throws an exception instead of returning an error code - void listenTHROW(tSOCKET s, int backlog = SOMAXCONN) throw(std::runtime_error); - - // waiting on a non-blocking connect call is messy. Use this call to avoid - // the muck - typedef enum { NBC_ERROR, NBC_INPROGRESS, NBC_CONNECTED } nonBlockConnect_t; - nonBlockConnect_t nonBlockingConnectWait(tSOCKET s, std::string &error) throw(); - - int socketSelect(std::set<size_t> &readSockets, std::set<size_t> writeSockets, const int timeout) throw(); - - int getsockname(tSOCKET s, endpoint &e) throw(); - int getsockname(tSOCKET s, std::string &address, u_short &port) throw(); - void getsocknameTHROW(tSOCKET s, endpoint &e) throw(std::runtime_error); - void getsocknameTHROW(tSOCKET s, std::string &address, u_short &port) throw(std::runtime_error); - - int getpeername(tSOCKET s, endpoint &e) throw(); - int getpeername(tSOCKET s, std::string &address, u_short &port) throw(); - void getpeernameTHROW(tSOCKET s, endpoint &e) throw(std::runtime_error); - void getpeernameTHROW(tSOCKET s, std::string &address, u_short &port) throw(std::runtime_error); - - int addressToHostName(const endpoint &e, std::string &hostname) throw(); - int addressToHostName(const std::string &address, u_short port, std::string &hostname) throw(); - void addressToHostNameTHROW(const endpoint &e, std::string &hostname) throw(std::runtime_error); - void addressToHostNameTHROW(const std::string &address, u_short port, std::string &hostname) throw(std::runtime_error); - - int hostNameToAddress(std::string &address, const std::string &hostname, u_short port = 0) throw(std::runtime_error); - std::string hostNameToAddress(const std::string &hostname, u_short port = 0) throw(std::runtime_error); - std::string hostNameToAddressTHROW(const std::string &hostname, u_short port = 0) throw(std::runtime_error); -} - -#ifdef _WIN32 -/*------------------------------------------------------------------------- - * - * This is a replacement version of pipe for Win32 which allows - * returned handles to be used in select(). Note that read/write calls - * must be replaced with recv/send. - * - * - *------------------------------------------------------------------------- - */ -int pgpipe(int handles[2]); -#endif - -#ifndef _WIN32 -#define pgpipe(a) pipe(a) -#define piperead(a,b,c) read(a,b,c) -#define pipewrite(a,b,c) write(a,b,c) -#define pipeclose(a) { ::shutdown(a,2); ::close(a);} -#else -#define piperead(a,b,c) recv(a,b,c,0) -#define pipewrite(a,b,c) send(a,b,c,0) -#define pipeclose(a) { ::shutdown(a,SD_BOTH); ::closesocket(a); } -#endif - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp b/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp deleted file mode 100644 index 75c0d492..00000000 --- a/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.cpp +++ /dev/null @@ -1,240 +0,0 @@ -#include "urlUtils.h" -#include "stl/stringUtils.h" -#include <set> -#include <ctype.h> -#ifdef _WIN32 -#include <crtdbg.h> -#define snprintf _snprintf -#define unused_attribute -#else -#include <stdio.h> -#include <string.h> -#include <assert.h> -#define _ASSERTE assert -#define unused_attribute __attribute__((unused)) -#endif - -using namespace std; -using namespace stringUtil; - -static string gExcluded = " <>#%\"{}|\\^[]`"; -static string gReserved = ";/?:@&=+$,"; -static string gMark = "-_.!~*'()"; -static string gDigit = "0123456789"; -static string gLowAlpha = "abcdefghijklmnopqrstuvwxyz"; -static string gHiAlpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -static string gUnreserved_RFC3986 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~"; -static string gReserved_RFC3986 = "!*'();:@&=+$,/?%#[]"; - -template<class T> -static set<T> setunion(const set<T> &s1, const set<T> &s2) -{ - set<T> result(s1); - result.insert(s2.begin(), s2.end()); - return result; -} - -static set<char> gSetExcluded(gExcluded.begin(), gExcluded.end()); -static set<char> gSetReserved(gReserved.begin(), gReserved.end()); -static set<char> gSetExcludedAndReserved(setunion(gSetExcluded, gSetReserved)); -static set<char> gSetMark(gMark.begin(), gMark.end()); -static set<char> gSetLowAlpha(gLowAlpha.begin(), gLowAlpha.end()); -static set<char> gSetHiAlpha(gHiAlpha.begin(), gHiAlpha.end()); -static set<char> gSetDigit(gDigit.begin(), gDigit.end()); -static set<char> gSetAlpha(setunion(gSetLowAlpha, gSetHiAlpha)); -static set<char> gSetAlphanum(setunion(gSetAlpha, gSetDigit)); -static set<char> gSetUnreserved(setunion(gSetAlphanum, gSetMark)); -static set<char> gSetUnreserved_RFC3986(gUnreserved_RFC3986.begin(), gUnreserved_RFC3986.end()); -static set<char> gSetReserved_RFC3986(gReserved_RFC3986.begin(), gReserved_RFC3986.end()); - -//////////////////////////////////////////////// -////////// Escaping Funcs ////////////////////// -/////////////////////////////////////////////// - -// convert a character to its hex representation -static string escapeChar(__uint8 c) throw() -{ - char buf[8] = {0}; - int len unused_attribute = snprintf(buf, sizeof(buf), "%%%02X", (int)c); - _ASSERTE(len == 3); - return buf; -} - -// convert the char if it's in the set -static string escapeIfInSet(char c,const set<char> &st) throw() -{ - return (st.find(c) == st.end() ? string(1, c) : escapeChar(c)); -} - -static string escapeIfNotInSet(char c, const set<char> &st) throw() -{ - return (st.find(c) == st.end() ? escapeChar(c) : string(1, c)); -} - -template<typename ESC,typename STYPE> -static string escapeString(const STYPE &s, const set<char> &st, ESC func) throw() -{ - string result; - for (typename STYPE::const_iterator i = s.begin(); i != s.end(); ++i) - { - result += func(*i,st); - } - return result; -} - -string urlUtils::escape(const std::string &s) throw() -{ - return escapeString(s, gSetExcludedAndReserved, escapeIfInSet); -} - -string urlUtils::escapeURI_RFC3986(const uniString::utf8 &s) throw() -{ - return escapeString(s, gSetUnreserved_RFC3986, escapeIfNotInSet); -} - -///////////////////////////////////////////////////// -//////////// Unescaping funcs ////////////////////// -//////////////////////////////////////////////////// - -// convert %xx to a character -inline char unescapeSequence(const string &s) throw() -{ - _ASSERTE(s.size() == 3); - _ASSERTE(s[0] == '%' && isxdigit(s[1]) && isxdigit(s[2])); - unsigned int v = 0; - sscanf(s.c_str(), "%%%02x", &v); - return (char)v; -} - -uniString::utf8 urlUtils::unescapeString(const string &s) throw() -{ - string result; - string escTok; - int ccnt(0); - - for (string::const_iterator i = s.begin(); i != s.end(); ++i) - { - bool escChar(false); - switch (ccnt) - { - case 0: - { - escChar = ((*i) == '%'); - break; - } - case 1: - { - escChar = (isxdigit(*i) ? true : false); - break; - } - case 2: - { - escChar = (isxdigit(*i) ? true : false); - break; - } - } - - if (escChar) - { - escTok += (*i); - ++ccnt; - } - else - { - result += escTok; - ccnt = 0; - if ((*i) == '+') - { - result += " "; - } - else - { - result += (*i); - } - } - if (ccnt == 3) - { - result += unescapeSequence(escTok); - escTok = ""; - ccnt = 0; - } - } - - result += escTok; - return uniString::utf8(result); -} - -//////////////////////////////////////////// -/////////// Classes //////////////////////// -string urlUtils::urlQueryEntry::escape() const throw() -{ - string result(escapeString(m_entry.first, gSetExcludedAndReserved, escapeIfInSet)); - - if (!m_entry.second.empty()) - { - result += "=" + escapeString(m_entry.second, gSetExcludedAndReserved, escapeIfInSet); - } - - return result; -} - -urlUtils::urlQueryEntry urlUtils::urlQueryEntry::parse(const string &s) throw() -{ - urlUtils::urlQueryEntry result; - - if (!s.empty()) - { - string::size_type pos = s.find("="); - result.m_entry.first = unescapeString(s.substr(0,pos)); - result.m_entry.second = (pos == string::npos ? "" : unescapeString(s.substr(pos+1))); - } - - return result; -} - -string urlUtils::urlQuery::escape() const throw() -{ - string result; - - for (vector<urlQueryEntry>::const_iterator i = m_query.begin(); i != m_query.end(); ++i) - { - result += (*i).escape(); - if (i + 1 != m_query.end()) - { - result += "&"; - } - } - - return result; -} - -urlUtils::urlQuery urlUtils::urlQuery::parse(const std::string &sin) throw() -{ - urlUtils::urlQuery result; - parse(sin, result); - return result; -} - -void urlUtils::urlQuery::parse(const std::string &sin, urlQuery &q) throw() -{ - q.clear(); - string s(sin); - - while (s != "") - { - if (!s.empty()) - { - string::size_type pos = s.find("&"); - q.m_query.push_back(urlUtils::urlQueryEntry::parse(s.substr(0, pos))); - if (pos == string::npos) - { - break; - } - s = s.substr(pos + 1); - } - else - { - break; - } - } -} diff --git a/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h b/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h deleted file mode 100644 index 0dfa344e..00000000 --- a/Src/Plugins/DSP/sc_serv3/webNet/urlUtils.h +++ /dev/null @@ -1,196 +0,0 @@ -#pragma once -#ifndef _urlUtils_H_ -#define _urlUtils_H_ - -#include <string.h> -#include <stdlib.h> -#include <string> -#include <vector> -#include <stdexcept> -#include "unicode/uniString.h" -#include "stl/stringUtils.h" - -//*************************************************************************// -/* urlUtils - - Collection of classes to help create properly escaped URLs, and to - parse out and convert escaped URLs (see RFC 2396). - - 1) Creating a properly escaped url - - Create an urlBuilder object. Add the query data to it. Call escape() to - retrieve the entire URL as a properly escaped string. - - urlBuilder ub("http",urlAuthority("127.0.0.1","80","neil%%%radisch"),"/this/is/a/test"); - ub.addQueryEntry(urlQueryEntry("full name","Neil Mark Radisch")); - ub.addQueryEntry(urlQueryEntry("flag","")); - ub.addQueryEntry(urlQueryEntry("wierd_stuff","!@#$%^&&&===\"\'*()")); - cout << ub.escape() << endl; // print escaped url to screen - - 2) Parse out query data from an escaped url - - These utilities do not parse out a complete url. They were designed - to work in conjunction with the mclib webserver utility which - takes care of parsing out everything up to the query string. As such, - the parsing here is limited to the query. - - urlQuery uq(urlQuery::parse(getEscapedQueryString())); // parse the query string - // now walk through the results and print to screen - for (urlQuery::const_iterator i = uq.begin(); i != uq.end(); ++i) - { - cout << "key = " << (*i).getKey() << endl; - cout << "value = " << (*i).getValue() << endl; - cout << endl; - } -*/ -//*************************************************************************// - -namespace urlUtils { - - class urlQueryEntry - { - std::pair<uniString::utf8, uniString::utf8> m_entry; - public: - urlQueryEntry(){} - template<typename KEY, typename VALUE> // can be string or utf8 - urlQueryEntry(const KEY &key, const VALUE &value) - :m_entry(key, value){} - urlQueryEntry(const urlQueryEntry &uqe) - :m_entry(uqe.m_entry){} - urlQueryEntry& operator = (const urlQueryEntry &uqe) - { m_entry = uqe.m_entry; return *this; } - bool operator == (const urlQueryEntry &uqe) const throw() { return m_entry == uqe.m_entry; } - - // set with unescaped data - template<typename KEY,typename VALUE> // string or utf8 - void set(const KEY &key, const VALUE &value) - { m_entry = std::pair<uniString::utf8, uniString::utf8>(key, value); } - - // return query as escaped string - std::string escape() const throw(); - - // parse from escaped data - static urlQueryEntry parse(const std::string &s) throw(); - - // get unescaped values - std::pair<uniString::utf8, uniString::utf8> get() const throw() { return m_entry; } - uniString::utf8 getKey() const throw() { return m_entry.first; } - uniString::utf8 getValue() const throw() { return m_entry.second; } - }; - - class urlQuery - { - std::vector<urlQueryEntry> m_query; - public: - typedef std::vector<urlQueryEntry>::iterator iterator; - typedef std::vector<urlQueryEntry>::const_iterator const_iterator; - - urlQuery(){} - bool operator==(const urlQuery &uq) const throw() { return m_query == uq.m_query; } - - void addQueryEntry(const urlQueryEntry &uqe) { m_query.push_back(uqe); } - void addQueryEntry(const std::string &key, const std::string &value) { m_query.push_back(urlQueryEntry(key, value)); } - void addQueryEntry(const uniString::utf8 &key, const uniString::utf8 &value) { m_query.push_back(urlQueryEntry(key, value)); } - std::string escape() const throw(); - bool empty() const throw() { return m_query.empty(); } - size_t size() const throw() { return m_query.size(); } - urlQueryEntry& operator[](size_t index) { return m_query[index]; } - iterator begin() throw() { return m_query.begin(); } - iterator end() throw() { return m_query.end(); } - const_iterator begin() const throw() { return m_query.begin(); } - const_iterator end() const throw() { return m_query.end(); } - void clear() throw() { m_query.clear(); } - - static urlQuery parse(const std::string &s) throw(); - static void parse(const std::string &s, urlQuery &q) throw(); - - void parseString(const std::string &s) throw() { parse(s,*this); } - - urlQuery::const_iterator findKey(const uniString::utf8 &key) const throw() - { - for (std::vector<urlQueryEntry>::const_iterator i = m_query.begin(); i != m_query.end(); ++i) - { - if ((*i).getKey() == key) - return i; - } - return m_query.end(); - } - - bool hasKey(const uniString::utf8 &key) const throw() { return (findKey(key) != m_query.end()); } - - template<typename T> - T keyValue(const uniString::utf8 &key,const T &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? (*i).getValue() : deflt); - } - template<typename T> - T keyValue(const uniString::utf8 &key) const throw() - { - return keyValue(key,T()); - } - }; - - template<> - inline bool urlQuery::keyValue(const uniString::utf8 &key, const bool &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - if (i == m_query.end()) - { - return deflt; - } - - uniString::utf8 v = (*i).getValue(); - while (!v.empty() && stringUtil::safe_is_space(v[0])) - { - v = v.substr(1); - } - if (v.empty()) - { - return deflt; - } - return (v[0] == 't' || v[0] == 'T' || v[0] == '1' || v[0] == 'y' || v[0] == 'Y'); - } - - template<> - inline int urlQuery::keyValue(const uniString::utf8 &key, const int &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? atoi((const char *)(*i).getValue().c_str()) : deflt); - } - - template<> - inline long urlQuery::keyValue(const uniString::utf8 &key, const long &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? atol((const char *)(*i).getValue().c_str()) : deflt); - } - - template<> - inline unsigned int urlQuery::keyValue(const uniString::utf8 &key, const unsigned int &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? (unsigned int)atol((const char *)(*i).getValue().c_str()) : deflt); - } - -#ifdef _WIN32 - template<> - inline __int64 urlQuery::keyValue(const uniString::utf8 &key, const __int64 &deflt) const throw() - { - urlQuery::const_iterator i = findKey(key); - return (i != m_query.end() ? _atoi64((const char *)(*i).getValue().c_str()) : deflt); - } -#endif - - template<> - inline bool urlQuery::keyValue<bool>(const uniString::utf8 &key) const throw() - { - return keyValue(key, false); - } - - std::string escape(const std::string &s) throw(); - uniString::utf8 unescapeString(const std::string &s) throw(); - std::string escapeURI_RFC3986(const uniString::utf8 &s) throw(); -} - -#endif diff --git a/Src/Plugins/DSP/sc_serv3/yp2.cpp b/Src/Plugins/DSP/sc_serv3/yp2.cpp deleted file mode 100644 index 8e7fd5d0..00000000 --- a/Src/Plugins/DSP/sc_serv3/yp2.cpp +++ /dev/null @@ -1,1233 +0,0 @@ -#ifdef _WIN32 -#include <winsock2.h> -#endif -#include <assert.h> -#include "cpucount.h" -#include "yp2.h" -#include "updater.h" -#include "stl/stringUtils.h" -#include "file/fileUtils.h" -#include "aolxml/aolxml.h" -#include "bandwidth.h" -#include "streamData.h" -#include "stats.h" -#include "metadata.h" -#include "services/stdServiceImpl.h" - -using namespace std; -using namespace uniString; -using namespace stringUtil; - -static AOL_namespace::mutex g_YP2Lock; -static yp2 *gYP2 = 0; -extern int auth_enabled; - -// for production we don't need to prettify the xml for the YP -#ifdef XML_DEBUG -#define EOL "\n" -#else -#define EOL "" -#endif - -#define DEBUG_LOG(...) do { if (gOptions.yp2Debug()) DLOG(__VA_ARGS__); } while (0) - -#define ADD_CMD 0 -#define REM_CMD 1 -#define UPD_CMD 2 - -#define REQUEST_KEY m_userData_u -#define REQUEST_CMD m_userData_i -#define REQUEST_USR m_userData_p - -uniString::utf8 yp2::logString(const yp2::yp2SessionKey &key) throw() { return "key=" + tos(key); } - -yp2::stationInfo::stationInfo() throw() : m_updateFrequency(gOptions.ypReportInterval()), m_advertMode(0) -{ - m_allowSSL = -1; - m_allowAllFormats = -1; - m_allowMaxBitrate = 0; - m_allowBackupURL = -1; -} - - -/////////////////////////////////////////////////////////////////////////////////////////// -void yp2::updateYPBandWidthSent(webClient::request r) throw() -{ - // this effectively works out the size in the same manner - // as webclient::toRequest(..) does to build the request. - size_t total = r.m_content.size() + r.m_contentType.size() + - // 'POST' or 'GET' with '?' on the front - (r.m_method == webClient::request::POST ? 4 : 3) + - 64 + r.m_addr.size() + g_userAgent.size() + - (!r.m_content.empty() ? r.m_content.size() : 0); - - for (httpHeaderMap_t::const_iterator i = r.m_queryVariables.begin(); i != r.m_queryVariables.end(); ++i) - { - if (i != r.m_queryVariables.begin()) - { - ++total; - } - total += urlUtils::escapeURI_RFC3986((*i).first).size(); - if (!(*i).second.empty()) - { - total += 1 + urlUtils::escapeURI_RFC3986((*i).second).size(); - } - } - - if (!r.m_XFF.empty()) - { - total += 18 + r.m_XFF.size(); - } - - if ((r.m_method == webClient::request::POST) && r.m_content.empty()) - { - total += 48; - } - else if (!r.m_contentType.empty()) - { - total += 15 + r.m_contentType.size(); - } - - bandWidth::updateAmount(bandWidth::YP_SENT, total); -} - -size_t yp2::requestsInQueue() throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->queueEntries() : 0); -} - -yp2::yp2() throw() : webClient(YP2_LOGNAME) -{ - stackLock sml(g_YP2Lock); - - gYP2 = this; - m_addFailed = false; - m_ignoreAdd = false; - m_errorCode = 200; - m_errorMsg = ""; - m_errorMsgExtra = ""; - m_sessionKeyCounter = 1; -} - -yp2::~yp2() throw() -{ - stackLock sml(g_YP2Lock); - - gYP2 = 0; -} - -void yp2::getAddUpdateBody(webClient::request& r, const ypInfo& info, const bool update) throw() -{ - r.m_method = webClient::request::POST; - r.m_addr = gOptions.ypAddr(); - r.m_port = gOptions.ypPort(); - r.m_path = gOptions.ypPath(); - r.m_nonBlocking = 1; - r.m_contentType = "text/xml;charset=utf-8"; - r.REQUEST_KEY = info.key; - r.REQUEST_CMD = (!update ? ADD_CMD : UPD_CMD); - r.REQUEST_USR = reinterpret_cast<void*>(info.streamPublic); - r.m_sid = (!info.sid ? DEFAULT_CLIENT_STREAM_ID : info.sid); - r.m_XFF = metrics::metrics_verifyDestIP(gOptions); - - utf8 id; - if (update) - { - yp2_server_state &yp2ss = m_serverMap[info.key]; - id = ("<id>" + yp2ss.m_serverID.escapeXML() + "</id>"); - } - - const utf8 xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" EOL\ - "<yp version=\"2\">" EOL\ - "<cmd op=\"" + utf8(!update ? "add" : "update") + "\" seq=\"1\">" EOL\ - "<tstamp>" + tos(::time(NULL)) + "</tstamp>" EOL\ - "<url>" EOL\ - "<port>" + tos(g_portForClients) + "</port>" EOL\ - "<path>" + getStreamPath(info.sid).escapeXML() + "</path>" EOL\ - "<sid>" + tos(r.m_sid) + "</sid>" EOL\ - "<alt>" + gOptions.m_usedAlternatePorts + "</alt>" EOL\ - "</url>" EOL\ - + ((!info.streamPublic && !gOptions.cdn().empty()) ? "<cdn>1</cdn>" : "") + EOL\ - "<bitrate>" + tos(info.bitrate) + "</bitrate>" EOL\ - "<samplerate>" + tos(info.samplerate) + "</samplerate>" EOL\ - "<vbr>" + tos(info.vbr) + "</vbr>" EOL\ - "<mimetype>" + info.mimeType.escapeXML() + "</mimetype>" EOL\ - + (update ? id : "") + EOL\ - "<sa>" + tos(info.streamArtwork) + "</sa>" EOL\ - "<pa>" + tos(info.playingArtwork) + "</pa>" EOL\ - "<peak>" + tos(info.peakClientConnections) + "</peak>" EOL\ - "<maxclients>" + (info.maxClientConnections > 0 ? tos(info.maxClientConnections) : "unlimited") + "</maxclients>" EOL\ - "<authhash>" + info.authhash.escapeXML() + "</authhash>" EOL\ - "<dj>" + info.sourceUser.escapeXML() + "</dj>" EOL\ - "<source>" + (!info.sourceIdent.empty() ? info.sourceIdent.escapeXML() : "Legacy / Unknown") + "</source>" EOL\ - "<dnas>" + gOptions.getVersionBuildStrings().c_str() + "/" SERV_OSNAME"</dnas>" EOL\ - "<cpu>" + tos(gOptions.getCPUCount()) + "/" + tos(cpucount()) + "</cpu>" EOL\ - + (!info.relayURL.empty() ? "<relayurl>" + info.relayURL.escapeXML() + "</relayurl>" : "") + EOL\ - + (update ? "<stats>" EOL\ - "<listeners>" + tos(info.numListeners) + "</listeners>" EOL\ - "<uniquelisteners>" + tos(info.numUniqueListeners) + "</uniquelisteners>" EOL\ - "<avglistentime>" + tos(info.avgUserListenTime) + "</avglistentime>" EOL\ - "<newsessions>" + tos(info.numberOfClientsConnectedMoreThanFiveMinutes) + "</newsessions>" EOL\ - "<connects>" + tos(info.numberOfClientConnectsSinceLastUpdate) + "</connects>" EOL\ - "</stats>" : "") + EOL\ - + (!info.songMetadataForYP2.empty() ? METADATA + EOL + - info.songMetadataForYP2 + EOL + E_METADATA : "") + EOL\ - "</cmd>" EOL"</yp>"; - - r.m_content.insert(r.m_content.end(), xml.begin(), xml.end()); - updateYPBandWidthSent(r); - - if (!update) - { - yp2_server_state &yp2ss = m_serverMap[info.key]; - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " add for " + logString(info.key) + - " [" + tos(yp2ss.m_addRetries) + "]" + eol() + xml); - - ++yp2ss.m_addRetries; - yp2ss.m_addState = ADD_PENDING; - yp2ss.m_lastOperationTime = ::time(NULL); - - queueRequest((yp2ss.m_lastRequest = r)); - } - else - { - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " " + logString(info.key) + eol() + xml); - queueRequest(r); - } -} - -/* - It is called before each update to confirm that the connection to yp is still good. - Normally this wouldn't really be necessary, but if yp goes down, we want to re-establish - without having to restart sc_serv -*/ -yp2::yp2SessionKey yp2::pvt_add(ypInfo& info) throw(exception) -{ - if (info.key == INVALID_SESSION_KEY) - { - info.key = m_sessionKeyCounter; - while (++m_sessionKeyCounter == INVALID_SESSION_KEY) {;} - } - - stackLock sml(m_serverMapLock); - - if (gOptions.yp2Debug()) - { - // either is okay since this is called continuouslly - serverMap_t::const_iterator i = m_serverMap.find(info.key); - if (i == m_serverMap.end()) - { - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " No entry for " + logString(info.key)); - } - } - - yp2_server_state &yp2ss = m_serverMap[info.key]; - yp2ss.m_authHash = info.authhash; - yp2ss.m_sessionKey = info.key; - yp2ss.m_streamID = info.sid; - - assert(yp2ss.m_addState != ADD_REMOVEISSUED); - - bool must_delay_add = false; - if (yp2ss.m_addState == ADD_FAILED) - { - must_delay_add = true; - - static time_t ADD_RETRY_INTERVAL(gOptions.ypTimeout()); - time_t t = ::time(NULL); - if (t < yp2ss.m_lastOperationTime) // rollover compensation - { - yp2ss.m_lastOperationTime = t; - } - if (t - yp2ss.m_lastOperationTime >= ADD_RETRY_INTERVAL) - { - must_delay_add = false; - } - } - - // if state is NONE (just created) or failed, we try again - if (((yp2ss.m_addState == ADD_NONE) || (yp2ss.m_addState == ADD_FAILED) || - (yp2ss.m_addState == UPDATE_FAILED)) && (!must_delay_add)) - { - webClient::request r; - getAddUpdateBody(r, info, false); - return info.key; - } - return INVALID_SESSION_KEY; -} - -/* - remove() is called when a stream is destroyed, and this can lead to a number of cases - that interact with add - - 1) ADD_NONE - no problem here. Nothing has been done, nothing needs to be done. just remove table entry - 2) ADD_FAILED - again no problem. remove table entry - 3) ADD_SUCCEDED - again no problem. Send remove to yp(). Response function will remove table entry - 4) ADD_PENDING - This is trouble. We cannot queue a remove() because we don't have the - serverID yet. We also don't know what will happen with the pending add. - To deal with this we transition to the ADD_REMOVEISSUED state. - If add() succeeds and finds this state, we assume that - remove() occured, and then we post the actual remove to yp. If the subsequent add fails, it must - remove the table entry -*/ -void yp2::pvt_queue_remove(const ypInfo& info) throw() -{ - if (info.key != INVALID_SESSION_KEY) - { - webClient::request r; - r.m_method = webClient::request::POST; - r.m_addr = gOptions.ypAddr(); - r.m_port = gOptions.ypPort(); - r.m_path = gOptions.ypPath(); - r.m_nonBlocking = 0; - r.m_contentType = "text/xml;charset=utf-8"; - r.REQUEST_KEY = info.key; - r.REQUEST_CMD = REM_CMD; - r.REQUEST_USR = reinterpret_cast<void*>(info.streamPublic); - r.m_sid = (!info.sid ? DEFAULT_CLIENT_STREAM_ID : info.sid); - - yp2_server_state &yp2ss = m_serverMap[info.key]; - assert(yp2ss.m_sessionKey == info.key); - - utf8 cdn = ((!info.streamPublic && !gOptions.cdn().empty()) ? "<cdn>1</cdn>" EOL : ""); - utf8 xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" EOL\ - "<yp version=\"2\">" EOL\ - "<cmd op=\"remove\" seq=\"1\">" EOL\ - "<tstamp>" + tos(::time(NULL)) + "</tstamp>" EOL\ - "<url>" EOL\ - "<port>" + tos(g_portForClients) + "</port>" EOL\ - "<path>" + getStreamPath(info.sid).escapeXML() + "</path>" EOL\ - "<sid>" + tos(r.m_sid) + "</sid>" EOL\ - "<alt>" + gOptions.m_usedAlternatePorts + "</alt>" EOL\ - "</url>" EOL\ - + cdn +\ - "<id>" + yp2ss.m_serverID.escapeXML() + "</id>" EOL\ - + (info.peakClientConnections != (size_t)-1 ? "<peak>" + tos(info.peakClientConnections) + "</peak>" : "") + EOL\ - + (info.maxClientConnections != (size_t)-1 ? "<maxclients>" + - (info.maxClientConnections > 0 ? tos(info.maxClientConnections) : "unlimited") + "</maxclients>" : "") + EOL\ - "<authhash>" + info.authhash.escapeXML() + "</authhash>" EOL\ - "</cmd>" EOL\ - "</yp>"; - - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " " + logString(info.key) + eol() + xml); - - r.m_content.insert(r.m_content.end(),xml.begin(),xml.end()); - - updateYPBandWidthSent(r); - queueRequest(r); - } -} - -void yp2::pvt_remove(ypInfo& info) throw(exception) -{ - assert(info.key != INVALID_SESSION_KEY); - - stackLock sml(m_serverMapLock); - - serverMap_t::iterator i = m_serverMap.find(info.key); - if (i == m_serverMap.end()) - { - throwEx<runtime_error>("Internal error. " + logString(info.key) + - " does not exist in server map."); - } - - yp2_server_state &yp2ss = (*i).second; - - assert(yp2ss.m_authHash == info.authhash); - assert(yp2ss.m_sessionKey == info.key); - - metrics::metrics_stream_down (yp2ss.m_streamID, yp2ss.m_stationInfo.m_radionomyID, - yp2ss.m_serverID, yp2ss.m_stationInfo.m_publicIP, info.streamStartTime); - - switch (yp2ss.m_addState) - { - case ADD_NONE: - case ADD_FAILED: - case UPDATE_FAILED: - { - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " erasing map entry for key=" + tos(info.key)); - m_serverMap.erase(info.key); - break; - } - - case ADD_PENDING: - { - yp2ss.m_addState = ADD_REMOVEISSUED; - break; - } - - case ADD_SUCCEEDED: - { - if (yp2ss.m_serverID.empty()) - { - throwEx<runtime_error>("Internal error. serverID for " + - logString(info.key) + " is empty."); - } - - DEBUG_LOG(YP2_LOGNAME "Sending remove for " + (*i).second.logString()); - pvt_queue_remove(info); - break; - } - - case ADD_REMOVEISSUED: - default: - { - throwEx<runtime_error>(YP2_LOGNAME + string(__FUNCTION__) + " Internal error. Bad state"); - break; - } - } -} - -// only send an update if everything is ok (ADD_SUCCEEDED) -yp2::updateResult yp2::pvt_update(const ypInfo& info) throw(exception) -{ - assert(info.key != INVALID_SESSION_KEY); - - stackLock sml(m_serverMapLock); - - serverMap_t::const_iterator i = m_serverMap.find(info.key); - if (i == m_serverMap.end()) - { - throwEx<runtime_error>("Internal error. " + logString(info.key) + " does not exist in server map."); - } - - yp2::updateResult result; - if ((*i).second.m_addState == ADD_SUCCEEDED) - { - if ((*i).second.m_serverID.empty()) - { - throwEx<runtime_error>("Internal error. serverID for " + logString(info.key) + " is empty."); - } - - webClient::request r; - getAddUpdateBody(r, info, true); - result.m_requestQueued = 1; - } - else - { - // tinkered this after build 10 to prevent a mass of debug spam when we have an - // add fail so we will keep a track of the previous state and if it's different - assert(m_serverMap.find(info.key) != m_serverMap.end()); - yp2_server_state &yp2ss = m_serverMap[info.key]; - assert(yp2ss.m_sessionKey == info.key); - - static time_t ADD_RETRY_INTERVAL(gOptions.ypTimeout()); - time_t t = ::time(NULL); - if (t - yp2ss.m_lastOperationTime >= ADD_RETRY_INTERVAL) - { - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " add still pending for " + logString(info.key) + - " [" + tos((int)(*i).second.m_addState) + "] [" + tos((*i).second.m_addRetries)+ "]"); - - webClient::request r = yp2ss.m_lastRequest; - yp2ss.m_lastOperationTime = t; - ++yp2ss.m_addRetries; - - r.m_addr = gOptions.ypAddr(); - r.m_port = gOptions.ypPort(); - r.m_path = gOptions.ypPath(); - - r.m_XFF = metrics::metrics_verifyDestIP(gOptions); - - yp2ss.m_addState = ADD_PENDING; - yp2ss.m_lastOperationTime = ::time(NULL); - - updateYPBandWidthSent(r); - queueRequest((yp2ss.m_lastRequest = r)); - result.m_requestQueued = 1; - return result; - } - } - - result.m_maxYPInterval = (*i).second.m_stationInfo.m_updateFrequency; - - return result; -} - -yp2::addState_t yp2::pvt_addStatus(yp2SessionKey key, int &addFailIgnore, int &errorCode) throw() -{ - stackLock sml(m_serverMapLock); - - serverMap_t::const_iterator i = m_serverMap.find(key); - bool updateFail = false; - // if the YP cannot be resolved then allow clients to connect by faking a success - if (i != m_serverMap.end() && ((*i).second.m_addState == ADD_SUCCEEDED || (*i).second.m_addState == UPDATE_FAILED)) - { - updateFail = ((*i).second.m_addState == UPDATE_FAILED); - } - // allow clients if there was a YP failure or it's down for maintenance - addFailIgnore = (updateFail ? 2 : m_addFailed || (m_errorCode == YP_MAINTENANCE_CODE)); - errorCode = m_errorCode; - - return (i != m_serverMap.end() ? (*i).second.m_addState : ADD_NONE); -} - -/////////// response handling ////////////// -// handle response. retry_exceptions do just that. otherwise retry occurs in yptimeout seconds - -// what kind of response we get is unimportant, but we will log it if it's an error -void yp2::response_remove(const request &q, const response &r) throw(exception) -{ - yp2SessionKey key = q.REQUEST_KEY; - - serverMap_t::const_iterator i = m_serverMap.find(key); - if (i == m_serverMap.end()) - { - throwEx<runtime_error>("Internal error in " + string(__FUNCTION__) + - " serverMap entry missing for " + logString(key)); - } - - const yp2_server_state &yp2ss = (*i).second; - size_t streamID = yp2ss.m_streamID; - - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " Erasing serverMap entry for " + logString(key)); - assert(m_serverMap.find(key) != m_serverMap.end()); - m_serverMap.erase(key); - - aolxml::node *n = 0; - - try - { - n = aolxml::node::parse(&(r.m_body[0]),r.m_body.size()); - - int code = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 200); - utf8 msg = aolxml::subNodeText(n, "/yp/resp/status/statustext", (utf8)""); - if (code != 200) - { - throwEx<runtime_error>("Remove error. " + logString(key) + - " code=" + tos(code) + " text=" + msg); - } - else - { - int error = aolxml::subNodeText(n, "/yp/resp/error/code", -1); - if (error != -1) - { - ELOG(YP2_LOGNAME "De-listing stream #" + tos(streamID) + " failed. YP2 error code is " + - tos(error) + " [" + aolxml::subNodeText(n, "/yp/resp/error/message", (utf8)"") + "]"); - utf8 detailed = aolxml::subNodeText(n, "/yp/resp/error/messagedetail", (utf8)""); - if (!detailed.empty()) - { - ELOG(YP2_LOGNAME + detailed); - } - } - else - { - if (q.REQUEST_USR) - { - ILOG(YP2_LOGNAME "Stream #" + tos(streamID) + " has been removed from the Shoutcast Directory."); - } - } - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } - - forget(n); -} - -void updateDetail(aolxml::node *n, string path, utf8 &original) -{ - utf8 value = aolxml::subNodeText(n, path, (utf8)""); - if (!value.empty()) - { - original = value; - DEBUG_LOG ("changing setting " + path + " to " + value); - } -} - -// we generally don't care about the result here (from a state machine standpoint), except that -// a bad serverID error means we should probably re-add ourselves. We rely on the fact that streamData -// will initiate an add before every touch if things have failed, so we enter a failed state -void yp2::response_update(const request &q, const response &r) throw(exception) -{ - yp2SessionKey key = q.REQUEST_KEY; - - assert(m_serverMap.find(key) != m_serverMap.end()); - yp2_server_state &yp2ss = m_serverMap[key]; - assert(yp2ss.m_sessionKey == key); - - aolxml::node *n = 0; - - try - { - // we must check our state, to avoid going berserk if we've queued up a lot of updates - // and they are failing. This will cause addState to transition to ADD_FAILED, which causes - // "add" to be reposted and state to become ADD_PENDING. In this situation we don't want our - // queued updates to fail because that will force the state to ADD_FAILED which will queue up - // even more "adds" - if (yp2ss.m_addState == yp2::ADD_SUCCEEDED) - { - m_errorCode = 200; - m_errorMsg = ""; - m_errorMsgExtra = ""; - - n = aolxml::node::parse(&(r.m_body[0]),r.m_body.size()); - int code = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 200); - utf8 msg = aolxml::subNodeText(n, "/yp/resp/status/statustext", (utf8)""); - if (code != 200) - { - throwEx<runtime_error>("Update error. " + logString(key) + - " code=" + tos(code) + " msg=" + msg); - } - - int error = aolxml::subNodeText(n, "/yp/resp/error/code", -1); - if (error != -1) - { - ELOG(YP2_LOGNAME "Updating listing details for stream #" + tos(yp2ss.m_streamID) + - " failed. YP2 error code is " + tos(error) + " [" + - aolxml::subNodeText(n, "/yp/resp/error/message", (utf8)"") + "]"); - utf8 detailed = aolxml::subNodeText(n, "/yp/resp/error/messagedetail", (utf8)""); - if (!detailed.empty()) - { - ELOG(YP2_LOGNAME + detailed); - } - - yp2ss.m_addState = UPDATE_FAILED; - } - else - { - updateDetail(n, "/yp/resp/id", yp2ss.m_serverID); - updateDetail(n, "/yp/resp/stnid", yp2ss.m_stationID); - - yp2ss.m_stationInfo.m_updateFrequency = aolxml::subNodeText(n, "/yp/resp/updatefreq", yp2ss.m_stationInfo.m_updateFrequency); - - updateDetail(n, "/yp/resp/backupserver", yp2ss.m_stationInfo.m_backupServer); - yp2ss.m_stationInfo.m_backupServersList.clear(); - aolxml::node::nodeList_t nodes = aolxml::node::findNodes(n,"/yp/resp/backupservers/server"); - if (!nodes.empty()) - { - for (aolxml::node::nodeList_t::const_iterator b = nodes.begin(); b != nodes.end(); ++b) - { - yp2ss.m_stationInfo.m_backupServersList.push_back((*b)->pcdata()); - } - } - else - { - yp2ss.m_stationInfo.m_backupServersList.clear(); - } - updateDetail(n, "/yp/resp/publicip", yp2ss.m_stationInfo.m_publicIP); - updateDetail(n, "/yp/resp/station/name", yp2ss.m_stationInfo.m_streamTitle); - updateDetail(n, "/yp/resp/station/genre", yp2ss.m_stationInfo.m_streamGenre[0]); - updateDetail(n, "/yp/resp/station/genre2", yp2ss.m_stationInfo.m_streamGenre[1]); - updateDetail(n, "/yp/resp/station/genre3", yp2ss.m_stationInfo.m_streamGenre[2]); - updateDetail(n, "/yp/resp/station/genre4", yp2ss.m_stationInfo.m_streamGenre[3]); - updateDetail(n, "/yp/resp/station/genre5", yp2ss.m_stationInfo.m_streamGenre[4]); - updateDetail(n, "/yp/resp/station/logo", yp2ss.m_stationInfo.m_streamLogo); - updateDetail(n, "/yp/resp/station/url", yp2ss.m_stationInfo.m_broadcasterURL); - updateDetail(n, "/yp/resp/station/callsign", yp2ss.m_stationInfo.m_radionomyID); - yp2ss.m_stationInfo.m_advertMode = aolxml::subNodeText(n, "/yp/resp/station/admode", yp2ss.m_stationInfo.m_advertMode); - yp2ss.m_stationInfo.m_allowSSL = aolxml::subNodeText(n, "/yp/resp/station/allowssl", -1); - yp2ss.m_stationInfo.m_allowMaxBitrate = aolxml::subNodeText(n, "/yp/resp/station/allowmaxbitrate", 0); - yp2ss.m_stationInfo.m_allowBackupURL = aolxml::subNodeText(n, "/yp/resp/station/allowbackupurl", -1); - yp2ss.m_stationInfo.m_allowAllFormats = aolxml::subNodeText(n, "/yp/resp/station/allowallformats", -1); - - if (q.REQUEST_USR) - { - ILOG(YP2_LOGNAME "Updating listing details for stream #" + tos(yp2ss.m_streamID) + " succeeded."); - } - - // we get notified of updated DNAS via this on add and update (for long running instances) - updater::verInfo m_verInfo; - updater::getNewVersion(m_verInfo); - m_verInfo.ver = aolxml::subNodeText(n, "/yp/resp/dnas/ver", m_verInfo.ver); - m_verInfo.url = aolxml::subNodeText(n, "/yp/resp/dnas/url", m_verInfo.url); - m_verInfo.log = aolxml::subNodeText(n, "/yp/resp/dnas/log", m_verInfo.log); - m_verInfo.info = aolxml::subNodeText(n, "/yp/resp/dnas/info", m_verInfo.info); - m_verInfo.message = aolxml::subNodeText(n, "/yp/resp/dnas/msg", m_verInfo.message); - m_verInfo.slimmsg = aolxml::subNodeText(n, "/yp/resp/dnas/slim", m_verInfo.slimmsg); - updater::setNewVersion(m_verInfo); - - // YP overridable urls for anything to do with metrics, adverts, etc - updateDetail(n, "/yp/resp/meu", yp2ss.m_stationInfo.m_metrics_audience_url); - updateDetail(n, "/yp/resp/adu", yp2ss.m_stationInfo.m_metrics_adverts_url); - updateDetail(n, "/yp/resp/mer", yp2ss.m_stationInfo.m_metrics_reset_url); - updateDetail(n, "/yp/resp/aut", yp2ss.m_stationInfo.m_metrics_auth_url); - updateDetail(n, "/yp/resp/air", yp2ss.m_stationInfo.m_tunein_air_api_url); - updateDetail(n, "/yp/resp/tsu", yp2ss.m_stationInfo.m_targetspot_url); - - // this will ensure that the info from the update - // is set asap as this is needed for advert mode. - streamData *sd = streamData::accessStream(yp2ss.m_streamID); - if (sd) - { - sd->YP2_updateInfo(yp2ss.m_stationInfo); - sd->releaseStream(); - } - } - } - } - catch (const exception &) - { - m_errorCode = aolxml::subNodeText(n, "/yp/resp/error/code", -1); - if (m_errorCode != -1) - { - m_errorMsg = aolxml::subNodeText(n, "/yp/resp/error/message", (utf8)""); - m_errorMsgExtra = aolxml::subNodeText(n, "/yp/resp/error/messagedetail", (utf8)""); - } - else - { - m_errorCode = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 400); - m_errorMsg = aolxml::subNodeText(n, "/yp/resp/status/statustext", utf8("Generic Error")); - m_errorMsgExtra = ""; - } - - ELOG(YP2_LOGNAME "Updating listing details for stream #" + tos(yp2ss.m_streamID) + " failed. YP2 error code is " + - tos(m_errorCode) + " [" + m_errorMsg + "]"); - if (!m_errorMsgExtra.empty()) - { - ELOG(YP2_LOGNAME + m_errorMsgExtra); - } - - yp2ss.m_addState = UPDATE_FAILED; - } - - forget(n); -} - -/* - We have a special case if state of ADD_REMOVEISSUED. The streamData object called - yp2::remove() while the add was still pending. If we fail, then it doesn't matter, but if - we succeed, we have to post the remove command to yp to make sure we clean up after ourselves -*/ -void yp2::response_add(const request &q, const response &r) throw(exception) -{ - yp2SessionKey key = q.REQUEST_KEY; - - serverMap_t::iterator i = m_serverMap.find(key); - if (i == m_serverMap.end()) - { - throwEx<runtime_error>("Internal error in " + string(__FUNCTION__) + - " serverMap entry missing for " + logString(key)); - } - - yp2_server_state &yp2ss = (*i).second; - aolxml::node *n = 0; - - try - { - n = aolxml::node::parse(&(r.m_body[0]),r.m_body.size()); - - int code = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 200); - utf8 msg = aolxml::subNodeText(n, "/yp/resp/status/statustext", (utf8)""); - - if (code != 200) - { - throwEx<runtime_error>("Add error. " + logString(key) + - " code=" + tos(code) + " text=" + msg); - } - - // success case. Again there are two scenarios. If the serverMap state is ADD_REMOVEISSUED - // then remove() was called. We need to repost the remove since yp2::remove() won't actually - // issue it when the add has not succeeded. Otherwise, life is normal - if (yp2ss.m_addState != ADD_REMOVEISSUED) - { - aolxml::subNodeTextTHROW(n, "/yp/resp/id", yp2ss.m_serverID); - aolxml::subNodeTextTHROW(n, "/yp/resp/stnid", yp2ss.m_stationID); - - yp2ss.m_stationInfo.m_updateFrequency = aolxml::subNodeText(n, "/yp/resp/updatefreq", yp2ss.m_stationInfo.m_updateFrequency); - yp2ss.m_stationInfo.m_backupServer = aolxml::subNodeText(n, "/yp/resp/backupserver", (utf8)""); - yp2ss.m_stationInfo.m_backupServersList.clear(); - aolxml::node::nodeList_t nodes = aolxml::node::findNodes(n, "/yp/resp/backupservers/server"); - if (!nodes.empty()) - { - for (aolxml::node::nodeList_t::iterator b = nodes.begin(); b != nodes.end(); ++b) - { - yp2ss.m_stationInfo.m_backupServersList.push_back((*b)->pcdata()); - } - } - yp2ss.m_stationInfo.m_publicIP = aolxml::subNodeText(n, "/yp/resp/publicip", (utf8)""); - aolxml::subNodeTextTHROW(n, "/yp/resp/station/name", yp2ss.m_stationInfo.m_streamTitle); - aolxml::subNodeTextTHROW(n, "/yp/resp/station/genre", yp2ss.m_stationInfo.m_streamGenre[0]); - - for (int i = 1; i < 5; i++) - { - yp2ss.m_stationInfo.m_streamGenre[i] = aolxml::subNodeText(n, "/yp/resp/station/genre" + tos(i + 1), yp2ss.m_stationInfo.m_streamGenre[i]); - } - - yp2ss.m_stationInfo.m_streamLogo = aolxml::subNodeText(n, "/yp/resp/station/logo", yp2ss.m_stationInfo.m_streamLogo); - yp2ss.m_stationInfo.m_broadcasterURL = aolxml::subNodeText(n, "/yp/resp/station/url", (utf8)""); - yp2ss.m_stationInfo.m_radionomyID = aolxml::subNodeText(n, "/yp/resp/station/callsign", (utf8)""); - yp2ss.m_stationInfo.m_advertMode = aolxml::subNodeText(n, "/yp/resp/station/admode", yp2ss.m_stationInfo.m_advertMode); - yp2ss.m_stationInfo.m_allowSSL = aolxml::subNodeText(n, "/yp/resp/station/allowssl", -1); - yp2ss.m_stationInfo.m_allowMaxBitrate = aolxml::subNodeText(n, "/yp/resp/station/allowmaxbitrate", 0); - yp2ss.m_stationInfo.m_allowBackupURL = aolxml::subNodeText(n, "/yp/resp/station/allowbackupurl", -1); - yp2ss.m_stationInfo.m_allowAllFormats = aolxml::subNodeText(n, "/yp/resp/station/allowallformats", -1); - - int peak = aolxml::subNodeText(n, "/yp/resp/peak", -1); - if (peak > 0) - { - stats::updatePeak(yp2ss.m_streamID, peak); - } - - yp2ss.m_addRetries = 0; - m_errorCode = 200; - m_errorMsg = ""; - m_errorMsgExtra = ""; - - yp2ss.m_addState = ADD_SUCCEEDED; - if (q.REQUEST_USR) - { - ILOG(YP2_LOGNAME "Stream #" + tos(yp2ss.m_streamID) + " has been added to the Shoutcast Directory."); - } - - // we get notified of updated DNAS via this on add and update (for long running instances) - updater::verInfo m_verInfo; - updater::getNewVersion(m_verInfo); - m_verInfo.ver = aolxml::subNodeText(n, "/yp/resp/dnas/ver", m_verInfo.ver); - m_verInfo.url = aolxml::subNodeText(n, "/yp/resp/dnas/url", m_verInfo.url); - m_verInfo.log = aolxml::subNodeText(n, "/yp/resp/dnas/log", m_verInfo.log); - m_verInfo.info = aolxml::subNodeText(n, "/yp/resp/dnas/info", m_verInfo.info); - m_verInfo.message = aolxml::subNodeText(n, "/yp/resp/dnas/msg", m_verInfo.message); - m_verInfo.slimmsg = aolxml::subNodeText(n, "/yp/resp/dnas/slim", m_verInfo.slimmsg); - updater::setNewVersion(m_verInfo); - - // YP overridable urls for anything to do with metrics, adverts, etc - yp2ss.m_stationInfo.m_metrics_audience_url = aolxml::subNodeText(n, "/yp/resp/meu", (utf8)METRICS_AUDIENCE_URL); - yp2ss.m_stationInfo.m_metrics_adverts_url = aolxml::subNodeText(n, "/yp/resp/adu", (utf8)METRICS_ADVERTS_URL); - yp2ss.m_stationInfo.m_metrics_reset_url = aolxml::subNodeText(n, "/yp/resp/mer", (utf8)METRICS_RESET_URL); - yp2ss.m_stationInfo.m_metrics_auth_url = aolxml::subNodeText(n, "/yp/resp/aut", (utf8)DNAS_AUTH_URL); - yp2ss.m_stationInfo.m_targetspot_url = aolxml::subNodeText(n, "/yp/resp/tsu", (utf8)TARGETSPOT_URL); - - // this will ensure that the info from the update - // is set asap as this is needed for advert mode. - // as well as only doing metrics if the stream is - // still determined to be accessible at the time. - streamData *sd = streamData::accessStream(yp2ss.m_streamID); - if (sd) - { - metrics::metrics_stream_up (yp2ss.m_streamID, yp2ss.m_stationInfo.m_radionomyID, - yp2ss.m_serverID, yp2ss.m_stationInfo.m_publicIP, sd->getStartTime()); - - sd->YP2_updateInfo(yp2ss.m_stationInfo); - sd->releaseStream(); - } - - // we use this to look at the existing listeners and if - // any have m_group = -1 then we'll 'add' them to the - // metrics since they will otherwise not be known about - stats::catchPreAddClients(yp2ss.m_streamID); - } - else - { - // we're done but have to issue the actual remove command to YP - if (!iskilled()) - { - WLOG(YP2_LOGNAME "Remove called while add was pending. Re-issuing remove. " + logString(key)); - } - yp2ss.m_serverID = aolxml::subNodeText(n, "/yp/resp/id", (utf8)""); - - ypInfo info(key, yp2ss.m_streamID, yp2ss.m_authHash); - info.peakClientConnections = (size_t)-1; - info.maxClientConnections = (size_t)-1; - pvt_queue_remove(info); - } - } - catch(const exception &ex) - { - bool missing = false; - utf8 message = ex.what(); - // skip missing xml response entries to avoid user confusion - if (message.rfind(utf8(" missing")) == utf8::npos) - { - ELOG(string(YP2_LOGNAME) + message); - } - else - { - missing = true; - } - - // if failure occurs and the state was ADD_REMOVEISSUED, we have to delete the entry from the serverMap - if (yp2ss.m_addState == ADD_REMOVEISSUED) - { - m_serverMap.erase(key); - WLOG(YP2_LOGNAME "Remove called while add was pending. Deleting serverMap entry " + logString(key)); - } - else - { - yp2ss.m_addState = ADD_FAILED; - - m_errorCode = aolxml::subNodeText(n, "/yp/resp/error/code", -1); - if (m_errorCode != -1) - { - m_errorMsg = aolxml::subNodeText(n, "/yp/resp/error/message", (utf8)""); - m_errorMsgExtra = aolxml::subNodeText(n, "/yp/resp/error/messagedetail", (utf8)""); - } - else - { - if (!missing) - { - m_errorCode = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 400); - m_errorMsg = aolxml::subNodeText(n, "/yp/resp/status/statustext", utf8("Generic Error")); - m_errorMsgExtra = ""; - } - else - { - m_errorCode = YP_AUTH_ISSUE_CODE; - m_errorMsg = "Required authhash parameter is missing, please contact support to resolve this issue"; - m_errorMsgExtra = ""; - } - } - - ELOG(YP2_LOGNAME "Stream #" + tos(yp2ss.m_streamID) + " connection attempt " + - (m_errorCode == YP_MAINTENANCE_CODE ? "ignored" : "failed") + ". YP2 error code is " + - tos(m_errorCode) + " [" + m_errorMsg + "]"); - if (!m_errorMsgExtra.empty()) - { - ELOG(YP2_LOGNAME + m_errorMsgExtra); - } - } - } - - forget(n); -} - -void yp2::gotResponse(const request &q, const response &r) throw(exception) -{ - // if we've got a response then clear the pass-through flag - gYP2->m_addFailed = false; - - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " Request " + logString(q.REQUEST_KEY) + - " cmd=" + tos(q.REQUEST_CMD) + eol() + - "Response body=[" + eol() + r.m_body + "]" + - eol() + "Response code=[" + tos(r.m_resultCode) + "]"); - - bandWidth::updateAmount(bandWidth::YP_RECV, r.m_received); - - switch (q.REQUEST_CMD) - { - case ADD_CMD: - { - response_add(q, r); - break; - } - case REM_CMD: - { - response_remove(q, r); - break; - } - case UPD_CMD: - { - response_update(q, r); - break; - } - case CHECK_AUTH: - { - // store the response in a sanitised format for when it is then queried - authhashMap_t::iterator i = m_authhashMap.find(q.REQUEST_KEY); - if (i != m_authhashMap.end()) - { - (*i).second.m_response = r.m_body; - (*i).second.m_status = r.m_resultCode; - DEBUG_LOG(YP2_LOGNAME + (*i).second.m_response + " " + tos((*i).second.m_status)); - } - break; - } - case VER_CHECK: - { - aolxml::node *n = 0; - - try - { - n = aolxml::node::parse(&(r.m_body[0]), r.m_body.size()); - - int code = aolxml::subNodeText(n, "/yp/resp/status/statuscode", 200); - utf8 msg = aolxml::subNodeText(n, "/yp/resp/status/statustext", (utf8)""); - if (code != 200) - { - throwEx<runtime_error>("version check error. " + logString(q.REQUEST_KEY) + - " code=" + tos(code) + " text=" + msg); - } - else - { - // we get notified of updated DNAS via this on add and update (for long running instances) - updater::verInfo m_verInfo; - updater::getNewVersion(m_verInfo); - m_verInfo.ver = aolxml::subNodeText(n, "/yp/resp/dnas/ver", m_verInfo.ver); - m_verInfo.url = aolxml::subNodeText(n, "/yp/resp/dnas/url", m_verInfo.url); - m_verInfo.log = aolxml::subNodeText(n, "/yp/resp/dnas/log", m_verInfo.log); - m_verInfo.info = aolxml::subNodeText(n, "/yp/resp/dnas/info", m_verInfo.info); - m_verInfo.message = aolxml::subNodeText(n, "/yp/resp/dnas/msg", m_verInfo.message); - m_verInfo.slimmsg = aolxml::subNodeText(n, "/yp/resp/dnas/slim", m_verInfo.slimmsg); - updater::setNewVersion(m_verInfo); - } - } - catch(const exception &) - { - } - - forget(n); - break; - { - } - - forget(n); - break; - } - default: - { - ELOG(YP2_LOGNAME "Internal error. Unknown cmd value in response (" + tos(q.REQUEST_CMD) + ")"); - break; - } - } -} - -void yp2::gotFailure(const request &q) throw(exception) -{ - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " Request " + - logString(q.REQUEST_KEY) + " cmd=" + tos(q.REQUEST_CMD)); - - bandWidth::updateAmount(bandWidth::YP_RECV, q.m_received); - - switch (q.REQUEST_CMD) - { - case ADD_CMD: - case REM_CMD: - case UPD_CMD: - { - gYP2->m_errorCode = -1; - gYP2->m_addFailed = true; - break; - } - case CHECK_AUTH: - { - // we cannot assume we got anything back in the request if it failed - // so if we've got a pending action then we need to get it cancelled - // and direct people to the log for the cause as too messy otherwise - authhashMap_t::iterator i = m_authhashMap.find(q.REQUEST_KEY); - if (i != m_authhashMap.end()) - { - (*i).second.m_response = utf8("Unable to process the request. Check the server logs for more details."); - (*i).second.m_status = 669; - DEBUG_LOG(YP2_LOGNAME + (*i).second.m_response + " " + tos((*i).second.m_status)); - } - break; - } - default: - { - ELOG(YP2_LOGNAME "Internal error. Unknown cmd value in response (" + tos(q.REQUEST_CMD) + ")"); - break; - } - } -} - -yp2::yp2SessionKey yp2::add(ypInfo& info, const int creating) throw() -{ - stackLock sml(g_YP2Lock); - - yp2SessionKey result = INVALID_SESSION_KEY; - - try - { - // abort asap if there is no authhash present - if (info.authhash.empty()) - { - if (gYP2 && !gYP2->m_ignoreAdd) - { - gYP2->m_ignoreAdd = true; - throwEx<runtime_error>((creating == 2 ? "Manual authhash creation for stream #" + - tos(info.sid) + " is required. Aborting listing the " - "stream in the Shoutcast Directory." : "No authhash " - "specified for stream #" + tos(info.sid) + ". Aborting " - "listing the stream in the Shoutcast Directory. ")); - } - } - else if (!isValidAuthhash(info.authhash)) - { - if (gYP2 && !gYP2->m_ignoreAdd) - { - gYP2->m_ignoreAdd = true; - throwEx<runtime_error>("Invalid authhash specified for stream #" + tos(info.sid) + - ". Aborting listing the stream in the Shoutcast Directory."); - } - } - else - { - if (gYP2) - { - gYP2->m_ignoreAdd = false; - } - } - - if (!iskilled() && gYP2 && !gYP2->m_ignoreAdd) - { - result = gYP2->pvt_add(info); - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } - return result; -} - -void yp2::remove(ypInfo& info) throw() -{ - stackLock sml(g_YP2Lock); - - try - { - if (gYP2) - { - gYP2->pvt_remove(info); - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } -} - -yp2::updateResult yp2::update(ypInfo& info) -{ - stackLock sml(g_YP2Lock); - - yp2::updateResult result; - result.m_maxYPInterval = gOptions.ypReportInterval(); - try - { - if (gYP2) - { - result = gYP2->pvt_update(info); - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } - return result; -} - -yp2::addState_t yp2::addStatus(yp2SessionKey key, int &addFailIgnore, int &errorCode) throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->pvt_addStatus(key, addFailIgnore, errorCode) : ADD_NONE); -} - -void yp2::pvt_runAuthHashAction(const uniString::utf8 &tempId, const int action, - const uniString::utf8 &urlPath, - const httpHeaderMap_t &queryParameters, - const uniString::utf8 &content) throw() -{ - int actionId = tempId.toInt(); - yp2::authhashResult authhash; - authhash.m_action = action; - m_authhashMap[actionId] = authhash; - - webClient::request r; - r.m_method = webClient::request::POST; - r.m_addr = gOptions.ypAddr(); - r.m_port = gOptions.ypPort(); - // adjust the YP path if using non-standard urls so authhash ones work - r.m_path = ((gOptions.ypPath() != utf8("/yp2")) ? "/yp" : "") + urlPath; - r.m_queryVariables = queryParameters; - r.REQUEST_KEY = actionId; - r.REQUEST_CMD = action; - - if (!content.empty()) - { - r.m_content.insert(r.m_content.end(), content.begin(), content.end()); - } - - DEBUG_LOG(YP2_LOGNAME + string(__FUNCTION__) + " Request " + - logString(r.REQUEST_KEY) + " cmd=" + tos(r.REQUEST_CMD)); - - updateYPBandWidthSent(r); - queueRequest(r); -} - -void yp2::runAuthHashAction(const uniString::utf8 &tempId, const int action, - const uniString::utf8 &urlPath, - const httpHeaderMap_t &queryParameters, - const uniString::utf8 &content) throw() -{ - stackLock sml(g_YP2Lock); - - try - { - if (gYP2 && !queryParameters.empty() && !tempId.empty()) - { - gYP2->pvt_runAuthHashAction(tempId, action, urlPath, queryParameters, content); - } - } - catch(const exception &ex) - { - ELOG(string(YP2_LOGNAME) + ex.what()); - } -} - -bool yp2::pvt_authHashActionStatus(const uniString::utf8& tempId, authhashResult &info, const bool remove) throw() -{ - if (!tempId.empty()) - { - size_t actionId = tempId.toInt(); - authhashMap_t::const_iterator i = m_authhashMap.find(actionId); - if (i != m_authhashMap.end()) - { - // copy to the passed structure - info = (*i).second; - // and then remove from the map - if(remove) - { - m_authhashMap.erase(actionId); - } - return true; - } - } - return false; -} - -bool yp2::authHashActionStatus(const uniString::utf8& tempId, authhashResult &info, const bool remove) throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->pvt_authHashActionStatus(tempId, info, remove) : false); -} - -bool yp2::isValidAuthhash(uniString::utf8 authhash) -{ - if (authhash.empty() || (authhash.size() != 20 && authhash.size() != 36)) - return false; - - // check the authhash only contains - int n = -1; - const char *s = (char*)authhash.c_str(); - if (sscanf (s, "%*36[a-fA-F0-9-]%n", &n) == 0 && n == 36 && s[36] == '\0') // match 36-char GUID only - return true; - if (sscanf (s, "%*20[a-zA-Z0-9]%n", &n) == 0 && n == 20 && s[20] == '\0') // match 20-char Hash only - return true; - return false; -} - -int yp2::pvt_getSrvID(yp2SessionKey key) throw() -{ - stackLock sml(m_serverMapLock); - - serverMap_t::const_iterator i = m_serverMap.find(key); - return (i != m_serverMap.end() ? (*i).second.m_serverID.toInt() : 0); -} - -int yp2::getSrvID(yp2SessionKey key) throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->pvt_getSrvID(key) : 0); -} - -int yp2::pvt_getStnID(yp2SessionKey key) throw() -{ - stackLock sml(m_serverMapLock); - - serverMap_t::const_iterator i = m_serverMap.find(key); - return (i != m_serverMap.end() ? (*i).second.m_stationID.toInt() : 0); -} - -int yp2::getStnID(yp2SessionKey key) throw() -{ - stackLock sml(g_YP2Lock); - - return (gYP2 ? gYP2->pvt_getStnID(key) : 0); -} diff --git a/Src/Plugins/DSP/sc_serv3/yp2.h b/Src/Plugins/DSP/sc_serv3/yp2.h deleted file mode 100644 index d0111d94..00000000 --- a/Src/Plugins/DSP/sc_serv3/yp2.h +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#ifndef yp2_H_ -#define yp2_H_ - -#include "webClient.h" - -/* - The operational model for yp2 is somewhat different from that of yp1. - In yp1, there is no reason for the core of sc_serv to wait for result. The - only bit of information that is truly required for correct operation is the serverID - returned by addserv in yp1. This, however, is handled internally by the code dealing with - yp1 since any subsequent yp requests cannot be cleared until the addsrv succeeds and the - serverID is obtained. - - In yp2, the actual streaming to the client cannot proceed until the addition of the server - is complete, since some information like stream title and genre must be obtained from the - database. Therefore, we need to build some sort of waiting mechanism, but one that obviously - does not block processing since the responses from yp2 may not come as fast as required for - code that blocks. - -*/ - -#define YP2_LOGNAME "[YP] " -#define YP_MAINTENANCE_CODE 503 -#define YP_AUTH_ISSUE_CODE 123 -#define YP_NOT_VISIBLE 480 -#define YP_COMMS_FAILURE -1 - -class yp2: public webClient -{ -public: - // stationInfo data gets returned from YP in response to "add" request - struct stationInfo - { - int m_updateFrequency; - int m_advertMode; - int m_allowSSL; - int m_allowAllFormats; - int m_allowMaxBitrate; - int m_allowBackupURL; - int m_responseCode; - uniString::utf8 m_stationID; - uniString::utf8 m_serverID; - uniString::utf8 m_streamTitle; - uniString::utf8 m_streamGenre[5]; - uniString::utf8 m_streamLogo; - uniString::utf8 m_radionomyID; - uniString::utf8 m_advertType; - uniString::utf8 m_advertTrigger; - uniString::utf8 m_metrics_audience_url; - uniString::utf8 m_metrics_adverts_url; - uniString::utf8 m_metrics_reset_url; - uniString::utf8 m_metrics_auth_url; - uniString::utf8 m_tunein_air_api_url; - uniString::utf8 m_targetspot_url; - uniString::utf8 m_broadcasterURL; - uniString::utf8 m_backupServer; - std::vector<uniString::utf8> m_backupServersList; - uniString::utf8 m_publicIP; - - uniString::utf8 logString() const throw() - { - return "title=" + m_streamTitle + " genre=" + m_streamGenre[0] + - " genre2=" + m_streamGenre[1] + " genre3=" + m_streamGenre[2] + - " genre4=" + m_streamGenre[3] + " genre5=" + m_streamGenre[4] + - " logo=" + m_streamLogo; - } - stationInfo() throw(); - }; - - typedef unsigned yp2SessionKey; - static const yp2SessionKey INVALID_SESSION_KEY=0; - - static uniString::utf8 logString(const yp2SessionKey &key) throw(); - - enum addState_t - { - ADD_NONE = 0, - ADD_PENDING = 1, - ADD_SUCCEEDED = 2, - ADD_FAILED = 3, - ADD_REMOVEISSUED = 4, // we issued a remove - UPDATE_FAILED = 5 - }; - - struct ypInfo - { - yp2SessionKey key; - - bool streamPublic; - bool streamArtwork; - bool playingArtwork; - bool vbr; - - size_t sid; - uniString::utf8 authhash; - - int bitrate; - int samplerate; - uniString::utf8 mimeType; - uniString::utf8 relayURL; - - size_t peakClientConnections; - size_t maxClientConnections; - - size_t numListeners; // update only - size_t numUniqueListeners; // update only - time_t avgUserListenTime; // update only - time_t streamStartTime; - size_t numberOfClientsConnectedMoreThanFiveMinutes; // update only - size_t numberOfClientConnectsSinceLastUpdate; // update only - - uniString::utf8 songMetadataForYP2; - uniString::utf8 sourceIdent; - uniString::utf8 sourceUser; - - ypInfo(const yp2SessionKey _key, const size_t _sid, const uniString::utf8& _authhash, - const bool _vbr = false, const bool _streamPublic = true, - const bool _streamArtwork = false, const bool _playingArtwork = false) : - key(_key), streamPublic(_streamPublic), streamArtwork(_streamArtwork), - playingArtwork(_playingArtwork), vbr(_vbr), sid(_sid), - authhash(_authhash), bitrate(0), samplerate(0), - peakClientConnections(0), maxClientConnections(0), - numListeners(0), numUniqueListeners(0), avgUserListenTime(0), - numberOfClientsConnectedMoreThanFiveMinutes(0), - numberOfClientConnectsSinceLastUpdate(0) { streamStartTime = 0; } - }; - - typedef enum - { - CREATE_AUTH = 3, - CHECK_AUTH = 4, - UPDATE_AUTH = 5, - //REMOVE_AUTH = 6, - ALLOW_AUTH = 7, - VER_CHECK = 8 - } authMethodState_t; - - // function result from call to update - struct updateResult - { - int m_maxYPInterval; // touch interval if no title change - int m_requestQueued; // if false, then "add" has not finished so this request was ignored - - updateResult() throw() : m_maxYPInterval(0), m_requestQueued(0) {} - }; - - // structures for handling the authhash management requests - struct authhashResult - { - int m_action; // action - create, check, update, remove - int m_restart; // should we restart the stream - size_t m_status; // status code from response - uniString::utf8 m_response; // response body back from the YP request - - authhashResult() throw() : m_action(0), m_restart(0), m_status(0), m_response("") {} - }; - - typedef std::map<size_t, authhashResult> authhashMap_t; - authhashMap_t m_authhashMap; - -private: - struct yp2_server_state - { - yp2::stationInfo m_stationInfo; - - yp2SessionKey m_sessionKey; - - addState_t m_addState; - - uniString::utf8 m_serverID; // as assigne by YP - uniString::utf8 m_stationID; // as assigne by YP - - uniString::utf8 m_authHash; // needed for reposting removes - - size_t m_streamID; - - time_t m_lastOperationTime; // for error delays - - webClient::request m_lastRequest; // keep a copy of the last request incase it needs to be resent - - size_t m_addRetries; - - yp2_server_state() : m_sessionKey(INVALID_SESSION_KEY), m_addState(ADD_NONE), m_streamID(1), m_lastOperationTime(0), m_addRetries(0) {} - explicit yp2_server_state(const yp2SessionKey &key) : m_sessionKey(key), m_addState(ADD_NONE), m_streamID(1), m_lastOperationTime(0), m_addRetries(0) {} - - uniString::utf8 logString() const throw() - { - return yp2::logString(m_sessionKey) + " state=" + stringUtil::tos((int)m_addState) + " serverId=" + m_serverID + " " + m_stationInfo.logString(); - } - }; - - yp2SessionKey m_sessionKeyCounter; - int m_errorCode; // keeps a copy of the last YP response code (good or bad) - - typedef std::map<yp2SessionKey,yp2_server_state> serverMap_t; - serverMap_t m_serverMap; - uniString::utf8 m_errorMsg; - uniString::utf8 m_errorMsgExtra; - - AOL_namespace::mutex m_serverMapLock; - - bool m_addFailed; - bool m_ignoreAdd; - - virtual void gotResponse(const request &q, const response &r) throw(std::exception); - virtual void gotFailure(const request &q) throw(std::exception); - - void response_add(const request &q, const response &r) throw(std::exception); - void response_remove(const request &q, const response &r) throw(std::exception); - void response_update(const request &q, const response &r) throw(std::exception); - - void getAddUpdateBody(webClient::request& r, const ypInfo& info, const bool update) throw(); - - yp2SessionKey pvt_add(ypInfo& info) throw(std::exception); - - void pvt_queue_remove(const ypInfo& info) throw(); - - void pvt_remove(ypInfo& info) throw(std::exception); - - updateResult pvt_update(const ypInfo& info) throw(std::exception); - - addState_t pvt_addStatus(yp2SessionKey key, int &addFailIgnore, int &errorCode) throw(); - - virtual uniString::utf8 name() const throw() { return "yp2"; } - - void pvt_runAuthHashAction(const uniString::utf8 &tempId, const int action, - const uniString::utf8 &urlPath, - const httpHeaderMap_t &queryParameters, - const uniString::utf8 &content) throw(); - - bool pvt_authHashActionStatus(const uniString::utf8 &tempId, authhashResult &info, const bool remove) throw(); - - int pvt_getSrvID(yp2SessionKey key) throw(); - int pvt_getStnID(yp2SessionKey key) throw(); - - static void updateYPBandWidthSent(webClient::request r) throw(); - -public: - yp2() throw(); - ~yp2() throw(); - - // return new key if yp2_server_state_key == YP2_UNDEFINED_SERVER_STATE_KEY - static yp2SessionKey add(ypInfo& info, const int creating) throw(); - - // return true if add has succeeded - static addState_t addStatus(yp2SessionKey key, int &addFailIgnore, int &errorCode) throw(); - - static void remove(ypInfo& info) throw(); - - static updateResult update(ypInfo& info); - - // used in main during shutdown to wait for request queue to clear out - static size_t requestsInQueue() throw(); - - // used for managing authhashes within the dnas - static void runAuthHashAction(const uniString::utf8 &tempId, const int action, - const uniString::utf8 &urlPath, - const httpHeaderMap_t &queryParameters, - const uniString::utf8 &content = "") throw(); - - static bool authHashActionStatus(const uniString::utf8& tempId, authhashResult &info, bool remove) throw(); - - static bool isValidAuthhash(uniString::utf8 authhash); - - static int getSrvID(yp2SessionKey key) throw(); - static int getStnID(yp2SessionKey key) throw(); -}; - -#endif